WxQrcodeUtil.java 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package com.care.common.util;
  2. import cn.hutool.json.JSONObject;
  3. import cn.hutool.json.JSONUtil;
  4. import com.care.client.dto.WxTemplateDTO;
  5. import com.care.client.dto.WxUniformTemplateDTO;
  6. import com.care.client.vo.WxAccessTokenVO;
  7. import com.care.common.cache.RedisKeyConstant;
  8. import com.google.gson.Gson;
  9. import com.google.gson.JsonSyntaxException;
  10. import org.apache.commons.lang3.ObjectUtils;
  11. import org.apache.commons.lang3.StringUtils;
  12. import org.springframework.web.bind.annotation.RequestMethod;
  13. import javax.net.ssl.HttpsURLConnection;
  14. import javax.net.ssl.SSLContext;
  15. import javax.net.ssl.SSLSocketFactory;
  16. import javax.net.ssl.TrustManager;
  17. import java.io.*;
  18. import java.net.ConnectException;
  19. import java.net.URL;
  20. import java.net.URLEncoder;
  21. import java.security.SecureRandom;
  22. import java.util.HashMap;
  23. import java.util.Map;
  24. import java.util.Set;
  25. import java.util.TreeMap;
  26. /**
  27. * 微信接口访问工具封装
  28. */
  29. public class WxQrcodeUtil {
  30. // 临时二维码
  31. private final static String QR_SCENE = "QR_SCENE";
  32. /**
  33. * 创建二维码
  34. */
  35. public final static String GEN_QRCODE_URL = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=ACCESS_TOKEN";
  36. /**
  37. * 创建二维码
  38. */
  39. public final static String SHOW_QRCODE_URL = "https://mp.weixin.qq.com/cgi-bin/showqrcode";
  40. /**
  41. * 创建临时带参数二维码
  42. * @param accessToken
  43. * @expireSeconds 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。
  44. * @param sceneId 场景Id
  45. * @return
  46. */
  47. public static String createTempTicket(String accessToken, String expireSeconds, Integer sceneId) {
  48. TreeMap<String,String> params = new TreeMap<>();
  49. params.put("access_token", accessToken);
  50. Map<String,Integer> intMap = new HashMap<>();
  51. intMap.put("scene_id",sceneId);
  52. Map<String,Map<String,Integer>> mapMap = new HashMap<>();
  53. mapMap.put("scene", intMap);
  54. //
  55. Map<String,Object> paramsMap = new HashMap<>();
  56. paramsMap.put("expire_seconds", expireSeconds);
  57. paramsMap.put("action_name", QR_SCENE);
  58. paramsMap.put("action_info", mapMap);
  59. String url = GEN_QRCODE_URL.replace("ACCESS_TOKEN", accessToken);
  60. JSONObject resultJsonObj = WxTemplateUtil.httpRequest(url, "POST", JSONUtil.toJsonStr(paramsMap));
  61. return resultJsonObj == null ? null : showQrcode(resultJsonObj.getStr("ticket"));
  62. }
  63. /**
  64. * 获取二维码ticket后,通过ticket换取二维码图片展示
  65. * @param ticket
  66. * @return
  67. */
  68. public static String showQrcode(String ticket) {
  69. Map<String,String> params = new TreeMap<>();
  70. try {
  71. params.put("ticket", URLEncoder.encode(ticket, "utf-8"));
  72. return setParmas(params, SHOW_QRCODE_URL,"utf-8");
  73. } catch (Exception e) {
  74. e.printStackTrace();
  75. }
  76. return "";
  77. }
  78. // public static void main(String[] args) {
  79. //
  80. // WxQrcodeUtil.createTempTicket("51_D55rGmfv71A8PjThis1K2V4ffC6xz1V-uE-VJiOvyA31P0zISnCsTrM319NDNLP5h-EEXIAZeVqCrpkA4VmglSRdUUNAKX2pdav7ayhwLHQh3BsdkDGF2MvcFRKIXdqCT1wla1R-3yYkKYqYXZJaAGABDN", "172800", 799);
  81. // }
  82. /**
  83. * 设置参数
  84. *
  85. * @param map
  86. * 参数map
  87. * @param path
  88. * 需要赋值的path
  89. * @param charset
  90. * 编码格式 默认编码为utf-8(取消默认)
  91. * @return 已经赋值好的url 只需要访问即可
  92. */
  93. public static String setParmas(Map<String, String> map, String path, String charset) throws Exception {
  94. String result = "";
  95. boolean hasParams = false;
  96. if (path != null && !"".equals(path)) {
  97. if (map != null && map.size() > 0) {
  98. StringBuilder builder = new StringBuilder();
  99. Set<Map.Entry<String, String>> params = map.entrySet();
  100. for (Map.Entry<String, String> entry : params) {
  101. String key = entry.getKey().trim();
  102. String value = entry.getValue().trim();
  103. if (hasParams) {
  104. builder.append("&");
  105. } else {
  106. hasParams = true;
  107. }
  108. if(charset != null && !"".equals(charset)){
  109. //builder.append(key).append("=").append(URLDecoder.(value, charset));
  110. builder.append(key).append("=").append(URLEncoder.encode(value, "utf-8"));
  111. }else{
  112. builder.append(key).append("=").append(value);
  113. }
  114. }
  115. result = builder.toString();
  116. }
  117. }
  118. return doUrlPath(path, result).toString();
  119. }
  120. /**
  121. * 设置连接参数
  122. *
  123. * @param path
  124. * 路径
  125. * @return
  126. */
  127. private static URL doUrlPath(String path, String query) throws Exception {
  128. URL url = new URL(path);
  129. if (StringUtils.isEmpty(path)) {
  130. return url;
  131. }
  132. if (StringUtils.isEmpty(url.getQuery())) {
  133. if (path.endsWith("?")) {
  134. path += query;
  135. } else {
  136. path = path + "?" + query;
  137. }
  138. } else {
  139. if (path.endsWith("&")) {
  140. path += query;
  141. } else {
  142. path = path + "&" + query;
  143. }
  144. }
  145. return new URL(path);
  146. }
  147. }