소스 검색

新增JSConfig微信接口

fangzhen 5 달 전
부모
커밋
b0a267b4da

+ 11 - 0
ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java

@@ -56,4 +56,15 @@ public class CacheConstants
      * 登录账户密码错误次数 redis key
      */
     public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:";
+
+    /**
+     * wx的token缓存
+     */
+    public static final String WX_TOKEN = "wx_token:";
+
+
+    /**
+     * wx的ticket缓存
+     */
+    public static final String WX_TICKET = "wx_ticket:";
 }

+ 25 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/SHA1Utils.java

@@ -0,0 +1,25 @@
+package com.ruoyi.common.utils.sign;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+public class SHA1Utils {
+    public static String encrypt(String input) {
+        try {
+            MessageDigest digest = MessageDigest.getInstance("SHA-1");
+            byte[] encodedHash = digest.digest(input.getBytes());
+
+            StringBuilder hexString = new StringBuilder();
+            for (byte b : encodedHash) {
+                String hex = Integer.toHexString(0xff & b);
+                if (hex.length() == 1) hexString.append('0');
+                hexString.append(hex);
+            }
+
+            return hexString.toString();
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+}

+ 45 - 0
ruoyi-generator/src/main/java/com/ruoyi/generator/controller/WxController.java

@@ -0,0 +1,45 @@
+package com.ruoyi.generator.controller;
+
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.sign.SHA1Utils;
+import com.ruoyi.common.utils.uuid.UUID;
+import com.ruoyi.generator.domain.Wx.JsConfig;
+import com.ruoyi.generator.util.WxUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RestController
+@RequestMapping("/api/wx")
+public class WxController extends BaseController {
+
+    private static final String appId = "wx04df75135e207090";
+    private static final String appSecret = "bb6c56779af605c7d734900435f1bda5";
+
+    @GetMapping("/getJsConfig")
+    public AjaxResult getJsConfig() {
+        long timestamp = System.currentTimeMillis();
+        String nonceStr = UUID.fastUUID().toString();
+
+
+        //获取token
+        String token = WxUtils.token(appId, appSecret);
+        if (token == null) {
+            return AjaxResult.error("获取微信token失败!");
+        }
+
+        //获取ticket
+        String ticket = WxUtils.ticket(appId, token, "2");
+        String signature = SHA1Utils.encrypt("appid=" + appId + "&noncestr=" + nonceStr + "&sdk_ticket=" + ticket + "&timestamp=" + timestamp);
+        System.out.println("signature:" + signature);
+        JsConfig jsConfig = new JsConfig();
+        jsConfig.setAppId(appId);
+        jsConfig.setTimestamp(String.valueOf(timestamp));
+        jsConfig.setNonceStr(nonceStr);
+        jsConfig.setSignature(signature);
+
+        return AjaxResult.success(jsConfig);
+    }
+}

+ 16 - 0
ruoyi-generator/src/main/java/com/ruoyi/generator/domain/Wx/JsConfig.java

@@ -0,0 +1,16 @@
+package com.ruoyi.generator.domain.Wx;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class JsConfig {
+    private String appId;
+    private String timestamp;
+    private String nonceStr;
+    private String signature;
+}

+ 66 - 0
ruoyi-generator/src/main/java/com/ruoyi/generator/util/WxUtils.java

@@ -0,0 +1,66 @@
+package com.ruoyi.generator.util;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.ruoyi.common.constant.CacheConstants;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.utils.spring.SpringUtils;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.concurrent.TimeUnit;
+
+public class WxUtils {
+
+    private static final String prefix = "https://api.weixin.qq.com";
+    private static final RestTemplate restTemplate = new RestTemplate();
+
+    /**
+     * 获取微信token数据
+     *
+     * @param appId  微信appId
+     * @param secret 记录值
+     * @return token
+     */
+    public static String token(String appId, String secret) {
+        //查询redis是否已有数值
+        String token = (String) SpringUtils.getBean(RedisCache.class).getCacheObject(CacheConstants.WX_TOKEN + appId);
+        if (token == null) {
+            String url = prefix + "/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + secret;
+            JSONObject result = restTemplate.getForObject(url, JSONObject.class);
+            if (result == null) {
+                return token;
+            }
+            token = result.getString("access_token");
+            SpringUtils.getBean(RedisCache.class).setCacheObject(CacheConstants.WX_TOKEN + appId, token, Constants.CAPTCHA_EXPIRATION, TimeUnit.HOURS);
+        }
+        return token;
+    }
+
+    /**
+     * 获取ticket
+     *
+     * @param token 微信token
+     * @param type  类型  默认2
+     * @return ticket
+     */
+    public static String ticket(String appId, String token, String type) {
+        //查询redis是否已有数值
+        String ticket = (String) SpringUtils.getBean(RedisCache.class).getCacheObject(CacheConstants.WX_TICKET + appId);
+        if (ticket == null) {
+            String url = prefix + "/cgi-bin/ticket/getticket?access_token=" + token + "&type=" + type;
+            JSONObject result = restTemplate.getForObject(url, JSONObject.class);
+            if (result == null) {
+                return ticket;
+            }
+
+            Integer errCode = result.getInteger("errcode");
+            String errMsg = result.getString("errmsg");
+            if (errCode != 0 && errMsg != "ok") {
+                return ticket;
+            }
+            ticket = result.getString("ticket");
+            SpringUtils.getBean(RedisCache.class).setCacheObject(CacheConstants.WX_TICKET + appId, ticket, Constants.CAPTCHA_EXPIRATION, TimeUnit.HOURS);
+        }
+        return ticket;
+    }
+}