package com.hx.mp.util; import com.hx.util.HttpMethodUtil; import com.hx.util.StringUtils; import net.sf.json.JSONException; import net.sf.json.JSONObject; import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.IOUtils; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.sql.Timestamp; import java.text.MessageFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * 微信小程序工具类 */ public class MpUtil { /** 请求access_token */ public static final String URL_ACCESS_TOKEN = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}"; /** 请求服务器IP地址 */ public static final String URL_SERVER_ADDR = "https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token="; /** 微信js的code换去sessionKey */ public static final String JSCODE2SESSION_URL = "https://api.weixin.qq.com/sns/jscode2session?appid={0}&secret={1}&grant_type=authorization_code&js_code="; /** 请求小程序码 **/ public static final String URL_WXACODE = "https://api.weixin.qq.com/wxa/getwxacode?access_token="; /** 请求小程序码-无数量限制 **/ public static final String URL_WXACODEUNLIMIT = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="; /** 请求小程序二维码 */ public static final String URL_QRCODE = "https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token="; /** 发模版消息 */ public static final String URL_SEND_TEMP_MSG = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token="; /** 设置发票授权字段 */ public static final String URL_SET_TICKET_FIELD = "https://api.weixin.qq.com/card/invoice/setbizattr?action=set_auth_field&access_token="; /** 获取发票ticket */ public static final String URL_GET_TICKET_TICKET = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=wx_card&access_token="; /** 获取发票授权页链接 */ public static final String URL_GET_TICKET_AUTH_LINK = "https://api.weixin.qq.com/card/invoice/getauthurl?access_token="; /** 查询发票授权字段 */ public static final String URL_GET_AUTH_FIELD = "https://api.weixin.qq.com/card/invoice/getauthdata?access_token="; /** 设置 支付后开发票 */ public static final String URL_SET_PAY_INVOICE = "https://api.weixin.qq.com/card/invoice/setbizattr?action=set_pay_mch&access_token="; /** 查询支付后开发票 */ public static final String URL_GET_PAY_INVOICE = "https://api.weixin.qq.com/card/invoice/setbizattr?action=get_pay_mch&access_token="; /** 发送客服消息 */ public static final String URL_SEND_KF_MSG = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token="; /************************************************* * 小程序 *************************/ /** 利用code换取sessionKey */ public static JSONObject jsCode2session(String code, String appId, String appSecret) { JSONObject obj = new JSONObject(); String url = StringUtils.format(JSCODE2SESSION_URL, appId, appSecret) + code; obj = HttpURLUtil(url, null); return obj; } /** 获取小程序二维码图片 */ public static String getQrCode(String accessToken, String jsonParam) throws Exception { JSONObject obj = HttpURLUtilJson(URL_QRCODE + accessToken, jsonParam); String qrStr = obj.optString("data"); return qrStr; } /** 从weixin接口获取Access_token **/ public static JSONObject getApplication_Access_tokenForUrl(String appId, String appSecret) throws Exception { String url = MessageFormat.format(URL_ACCESS_TOKEN, appId, appSecret); JSONObject obj = HttpURLUtil(url, null); return obj; } /** 请求http协议 获取信息工具 **/ public static InputStream HttpURLUtilStream(String url, String data) { HttpURLConnection con = null; URL u = null; try { u = new URL(url); con = (HttpURLConnection) u.openConnection(); con.setRequestMethod("POST"); con.setDoOutput(true); con.setDoInput(true); con.setUseCaches(false); con.setReadTimeout(200000); con.setRequestProperty("Charset", "UTF-8"); con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); if (data != null) { OutputStream os = con.getOutputStream(); os.write(data.getBytes("utf-8")); } if (con.getResponseCode() != 200) throw new RuntimeException("请求url失败"); return con.getInputStream(); } catch (Exception e) { e.printStackTrace(); } finally { if (con != null) { con.disconnect(); } } return null; } /** 获取二维码图片 **/ public static JSONObject HttpURLUtilJson(String urlx, String objx) { JSONObject jo = new JSONObject(); try { // 创建url资源 URL url = new URL(urlx); // 建立http连接 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 设置允许输出 conn.setDoOutput(true); conn.setDoInput(true); // 设置不用缓存 conn.setUseCaches(false); // 设置传递方式 conn.setRequestMethod("POST"); // 设置维持长连接 conn.setRequestProperty("Connection", "Keep-Alive"); // 设置文件字符集: conn.setRequestProperty("Charset", "UTF-8"); // 设置文件类型: conn.setRequestProperty("contentType", "application/json"); // 开始连接请求 conn.connect(); OutputStream out = conn.getOutputStream(); // 写入请求的字符串 out.write(objx.getBytes()); out.flush(); out.close(); // 请求返回的状态 if (conn.getResponseCode() == 200) { // 请求返回的数据 InputStream in = conn.getInputStream(); try { ByteArrayOutputStream swapStream = new ByteArrayOutputStream(); byte[] temp = new byte[1024]; int rc = 0; while ((rc = in.read(temp, 0, 100)) > 0) { swapStream.write(temp, 0, rc); } byte[] buffer = swapStream.toByteArray(); String base64 = Base64.encodeBase64String(buffer); jo.put("data", base64); } catch (Exception e1) { e1.printStackTrace(); } } else { // System.out.println("no++"); } } catch (Exception e) { e.printStackTrace(); } return jo; } /** 请求http协议 获取信息工具 **/ public static JSONObject HttpURLUtil(String url, String data) { HttpURLConnection con = null; URL u = null; String wxMsgXml = null; JSONObject obj = null; try { u = new URL(url); con = (HttpURLConnection) u.openConnection(); con.setRequestMethod("POST"); con.setDoOutput(true); con.setDoInput(true); con.setUseCaches(false); con.setReadTimeout(5000); con.setRequestProperty("Charset", "UTF-8"); con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); if (data != null) { OutputStream os = con.getOutputStream(); os.write(data.getBytes("utf-8")); } if (con.getResponseCode() != 200) throw new RuntimeException("请求url失败"); // 读取返回内容 wxMsgXml = IOUtils.toString(con.getInputStream(), "utf-8"); obj = JSONObject.fromObject(wxMsgXml); // //System.out.println("HttpURLUtil:"+wxMsgXml); } catch (Exception e) { e.printStackTrace(); obj = new JSONObject(); try { obj.put("status", 1); obj.put("errMsg", e.getMessage()); } catch (JSONException e1) { e1.printStackTrace(); } } finally { if (con != null) { con.disconnect(); } } return obj; } /** 发送模版消息 **/ public static JSONObject sendTempMsg(String accessToken, String jsonStr) { JSONObject obj = HttpURLUtil(URL_SEND_TEMP_MSG + accessToken, jsonStr); return obj; } public static Integer DateToTimestamp(Date time) { Timestamp ts = new Timestamp(time.getTime()); return (int) ((ts.getTime()) / 1000); } /** * 发送链接客服消息 * * @throws JSONException */ public static String sendKfLinkMsg(String at, String openId, String title, String description, String url, String imgUrl) throws JSONException { String result = "fail"; JSONObject obj = new JSONObject(); obj.put("touser", openId); obj.put("msgtype", "link"); JSONObject pObj = new JSONObject(); pObj.put("title", title); pObj.put("description", description); pObj.put("url", url); pObj.put("thumb_url", imgUrl); obj.put("link", pObj); JSONObject rObj = HttpURLUtil(URL_SEND_KF_MSG + at, obj.toString()); // System.out.println("rObj==="+rObj); if (rObj != null) { if (rObj.optInt("errcode", -1) == 0) { result = "suc"; } else { result = rObj.optString("errmsg"); } } rObj = null; obj = null; return result; } /** * 发送图片客户消息 * * @param access_token * access_token * @param toUser * 用户openid * @param media_id * 素材id * @return */ public static String sendKfImageMsg(String access_token, String toUser, String media_id) { String result = "fail"; try { JSONObject obj = new JSONObject(); obj.put("touser", toUser); obj.put("msgtype", "image"); JSONObject pObj = new JSONObject(); pObj.put("media_id", media_id); obj.put("image", pObj); JSONObject rObj = HttpURLUtil(URL_SEND_KF_MSG + access_token, obj.toString()); System.out.println("rObj==" + rObj.toString()); if (rObj != null) { if (rObj.optInt("errcode", -1) == 0) { result = "suc"; } else { result = rObj.optString("errmsg"); } } rObj = null; obj = null; } catch (Exception e) { e.printStackTrace(); } return result; } /** * 发送文本客户消息 * * @param access_token * access_token * @param toUser * 用户openid * @return */ public static String sendKfTextMsg(String access_token, String toUser, String content) { String result = "fail"; try { JSONObject obj = new JSONObject(); obj.put("touser", toUser); obj.put("msgtype", "text"); JSONObject pObj = new JSONObject(); pObj.put("content", content); obj.put("text", pObj); JSONObject rObj = HttpURLUtil(URL_SEND_KF_MSG + access_token, obj.toString()); if (rObj != null) { if (rObj.optInt("errcode", -1) == 0) { result = "suc"; } else { result = rObj.optString("errmsg"); } } rObj = null; obj = null; } catch (Exception e) { e.printStackTrace(); } return result; } /** 获取小程序码图片 */ public static String getWXACode(String accessToken, String jsonParam, String path) throws Exception { JSONObject obj = HttpURLUtilJson(URL_WXACODE + accessToken, jsonParam); String qrStr = obj.optString("data"); return qrStr; } /** 获取小程序码图片 */ public static String getWXACodeUnlimit(String accessToken, String jsonParam, String path) throws Exception { JSONObject obj = HttpURLUtilJson(URL_WXACODEUNLIMIT + accessToken, jsonParam); String qrStr = obj.optString("data"); return qrStr; } /** * 获取小程序链接 * @param token 小程序token * @param path 小程序页面路径 * @param query 传值参数 * @param env_version * @return 要打开的小程序版本。正式版为 "release",体验版为"trial",开发版为"develop",仅在微信外打开时生效 */ public static String getAooLetUrl(String token, String path, String query, String env_version) { Map map = new HashMap<>(); map.put("access_token", token); JSONObject data = new JSONObject(); data.put("path", path); data.put("query", query); data.put("env_version", env_version); return HttpMethodUtil.HttpURLUtilJson("https://api.weixin.qq.com/wxa/generate_urllink", data.toString(), map, null, "POST"); } /** * 公众号发送小程序卡片客户消息 * @param access_token access_token * @param toUser 用户openid * @param title 标题 * @param appid 小程序appid * @param pagepath 跳转页面路径 * @param thumb_media_id 缩略图/小程序卡片图片的媒体ID,小程序卡片图片建议大小为520*416 * @return */ public static String sendMpMsg(String access_token, String toUser, String title,String appid,String pagepath,String thumb_media_id) { String result = "fail"; try { JSONObject obj = new JSONObject(); obj.put("touser", toUser); obj.put("msgtype", "miniprogrampage"); JSONObject pObj = new JSONObject(); pObj.put("title", title); pObj.put("appid", appid); pObj.put("pagepath", pagepath); pObj.put("thumb_media_id", thumb_media_id); obj.put("miniprogrampage", pObj); JSONObject rObj = HttpURLUtil(URL_SEND_KF_MSG + access_token, obj.toString()); if (rObj != null) { if (rObj.optInt("errcode", -1) == 0) { result = "suc"; } else { result = rObj.optString("errmsg"); } } rObj = null; obj = null; } catch (Exception e) { e.printStackTrace(); } return result; } }