Răsfoiți Sursa

feat:生成jsdk签名

wrj 11 luni în urmă
părinte
comite
1b76294f2f

+ 14 - 19
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/WeChatController.java

@@ -25,6 +25,7 @@ import com.ylx.massage.service.CouponReceiveService;
 import com.ylx.massage.service.TWxUserService;
 import com.ylx.massage.service.TbFileService;
 import com.ylx.massage.utils.DateTimeUtils;
+import com.ylx.massage.utils.JsSignUtil;
 import com.ylx.massage.utils.StringUtilsMassage;
 import com.ylx.massage.utils.WeChatUtil;
 import io.swagger.annotations.Api;
@@ -131,25 +132,19 @@ public class WeChatController extends BaseController {
 
     }
 
-//    @PostMapping("/verifyToken")
-//    @Log(title = "公众号pverifyToken", businessType = BusinessType.OTHER)
-//    public void pverifyToken(@RequestParam(value = "signature") String signature,
-//                             @RequestParam(value = "timestamp") String timestamp,
-//                             @RequestParam(value = "nonce") String nonce) {
-//
-//        log.info("11111111111111111111111111111111111111111111");
-//        // 参数排序
-//        String[] params = new String[]{timestamp, nonce, TOKEN};
-//        Arrays.sort(params);
-//
-////        {
-////            "signature": "63c8f3e1fb23d0d18f6d7ddf8019dc8a8737a04b",
-////                "openid": "oPYgb6qoOUXYIQLbB7f6zOF40kwk",
-////                "nonce": "1376426761",
-////                "timestamp": "1717569593"
-////        }
-//
-//    }
+    @GetMapping("/getSignature")
+    @ApiOperation("前端获取jssdk签名")
+    @Log(title = "前端获取jssdk签名", businessType = BusinessType.OTHER)
+    public Map<?,?> getSignature(String url) {
+
+        //获取access_token
+        String token = weChatUtil.getToken();
+        //获取jsapi_ticket
+        String jsapiTicket = weChatUtil.getJsapiTicket(token);
+        //生成签名
+        return JsSignUtil.sign(url,jsapiTicket);
+    }
+
 
     /**
      * 处理微信公众号请求信息

+ 99 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/utils/JsSignUtil.java

@@ -0,0 +1,99 @@
+package com.ylx.massage.utils;
+
+/**
+ * @author jianlong
+ * @date 2024-06-20 16:35
+ */
+
+import java.util.*;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.io.UnsupportedEncodingException;
+
+/**
+ * 官方给的使用js的验证工具
+ */
+public class JsSignUtil {
+
+    public static Map<String, String> sign(String url,String jsapi_ticket) {
+
+        Map<String, String> ret = new HashMap<String, String>();
+        String nonce_str = create_nonce_str();
+        String timestamp = create_timestamp();
+        String string1;
+        String signature = "";
+
+        //注意这里参数名必须全部小写,且必须有序
+        string1 = "jsapi_ticket=" + jsapi_ticket +
+                "&noncestr=" + nonce_str +
+                "&timestamp=" + timestamp +
+                "&url=" + url;
+        System.out.println("string1="+string1);
+
+        try
+        {
+            MessageDigest crypt = MessageDigest.getInstance("SHA-1");
+            crypt.reset();
+            crypt.update(string1.getBytes("UTF-8"));
+            signature = byteToHex(crypt.digest());
+        }
+        catch (NoSuchAlgorithmException e)
+        {
+            e.printStackTrace();
+        }
+        catch (UnsupportedEncodingException e)
+        {
+            e.printStackTrace();
+        }
+
+        ret.put("url", url);
+        ret.put("jsapi_ticket", jsapi_ticket);
+        ret.put("nonceStr", nonce_str);
+        ret.put("timestamp", timestamp);
+        ret.put("signature", signature);
+        ret.put("appId", "appid");//公众号appid
+
+        System.out.println("1.ticket(原始)="+jsapi_ticket);
+        System.out.println("2.url="+ret.get("url"));
+        System.out.println("3.jsapi_ticket(处理后)="+ret.get("jsapi_ticket"));
+        System.out.println("4.nonceStr="+ret.get("nonceStr"));
+        System.out.println("5.signature="+ret.get("signature"));
+        System.out.println("6.timestamp="+ret.get("timestamp"));
+
+        return ret;
+    }
+
+
+    /**
+     * 随机加密
+     * @param hash
+     * @return
+     */
+    private static String byteToHex(final byte[] hash) {
+        Formatter formatter = new Formatter();
+        for (byte b : hash)
+        {
+            formatter.format("%02x", b);
+        }
+        String result = formatter.toString();
+        formatter.close();
+        return result;
+    }
+
+    /**
+     * 产生随机串--由程序自己随机产生
+     * @return
+     */
+    private static String create_nonce_str() {
+        return UUID.randomUUID().toString();
+    }
+
+    /**
+     * 由程序自己获取当前时间
+     * @return
+     */
+    private static String create_timestamp() {
+        return Long.toString(System.currentTimeMillis() / 1000);
+    }
+}
+

+ 23 - 4
nightFragrance-massage/src/main/java/com/ylx/massage/utils/WeChatUtil.java

@@ -95,10 +95,10 @@ public class WeChatUtil {
     /**
      * 获取微信AccessToken
      *
-     *
      * @return 返回包含微信AccessToken的Map
      */
     public String getToken() {
+        //todo 缓存公众号全局token凭证
         StringBuffer url = new StringBuffer();
         url.append("https://api.weixin.qq.com/cgi-bin/token")
                 .append("?grant_type=").append("client_credential")
@@ -114,6 +114,25 @@ public class WeChatUtil {
         }
     }
 
+    /**
+     * 获取jsticke
+     */
+    public String getJsapiTicket(String token) {
+        //todo 缓存公众号全局token凭证
+        StringBuffer url = new StringBuffer();
+        url.append("https://api.weixin.qq.com/cgi-bin/ticket/getticket")
+                .append("?access_token=").append(token)
+                .append("&type=").append("jsapi");
+        String rs = HttpUtil.get(url.toString());
+        Map<?, ?> map = JSONObject.parseObject(rs, Map.class);
+        if ("ok".equals(map.get("errmsg"))) {
+            return map.get("ticket").toString();
+        } else {
+            log.error("获取jsticke出错:{}", map);
+            throw new ServiceException("获取jsticke出错");
+        }
+    }
+
     /**
      * 刷新AccessToken
      *
@@ -158,7 +177,7 @@ public class WeChatUtil {
      * @param token access_token
      * @return 返回包含微信公众号码ticket的Map
      */
-    public Map<?, ?> getTicket(String token, String openId){
+    public Map<?, ?> getTicket(String token, String openId) {
 
         String url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + token;
 
@@ -252,11 +271,11 @@ public class WeChatUtil {
      */
     public static String mapToXml(Map<String, String> data) throws Exception {
         DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
-        DocumentBuilder documentBuilder= documentBuilderFactory.newDocumentBuilder();
+        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
         org.w3c.dom.Document document = documentBuilder.newDocument();
         org.w3c.dom.Element root = document.createElement("xml");
         document.appendChild(root);
-        for (String key: data.keySet()) {
+        for (String key : data.keySet()) {
             String value = data.get(key);
             if (value == null) {
                 value = "";