Bladeren bron

JS-SDK使用权限签名算法

duyj 3 jaren geleden
bovenliggende
commit
0b61dc015d

+ 9 - 0
suishenbang-wxportal/suishenbang-wxportal-api/src/main/java/com/dgtly/wxportal/controller/WxController.java

@@ -1,5 +1,6 @@
 package com.dgtly.wxportal.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.dgtly.common.annotation.ApiPassToken;
 import com.dgtly.common.core.controller.ApiBaseController;
@@ -457,5 +458,13 @@ public class WxController extends ApiBaseController {
         }
     }
 
+    @ApiOperation(value = "JS-SDK使用权限签名算法", notes = "参数:agent,非必填值为1获取应用签名, 否则获取企业签名")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "params", paramType = "body")
+    })
+    @GetMapping("/ticket")
+    public Object getJsApiTicket(String url, String agent) {
+        return AjaxResult.success(JSON.parseObject(qyWxUserUtil.getJsApiTicket(url, agent)));
+    }
 
 }

+ 93 - 0
suishenbang-wxportal/suishenbang-wxportal-common/src/main/java/com/dgtly/wxportal/utils/qywxutils/QyWxAccessTokenUtil.java

@@ -2,13 +2,17 @@ package com.dgtly.wxportal.utils.qywxutils;
 
 import com.alibaba.fastjson.JSONObject;
 import com.dgtly.common.exception.BusinessException;
+import com.dgtly.common.utils.StringUtils;
 import com.dgtly.wxportal.exception.QyWeixinException;
 import com.dgtly.common.utils.http.HttpUtils;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.lang.RandomStringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
+import java.util.Arrays;
 import java.util.Date;
 
 /**
@@ -30,6 +34,17 @@ public class QyWxAccessTokenUtil {
      */
     private long expires;
 
+    private String jsapiTicket;
+
+    private long jsapiCreateTime;
+
+    private long jsapiExpires;
+
+    private String jsapiAgentTicket;
+
+    private long jsapiAgentCreateTime;
+
+    private long jsapiAgentExpires;
 
     @Value(value = "${qiyeweixin.corpid:none}")
     private String corpid;
@@ -81,6 +96,84 @@ public class QyWxAccessTokenUtil {
         return token;
     }
 
+    public String getWXSign(String url, String agent) {
+        long timeStampSec = System.currentTimeMillis() / 1000;
+        String timestamp = String.format("%010d", timeStampSec);
+        String nonceStr = RandomStringUtils.randomAlphanumeric(8);
+        String[] urls = url.split("#");
+        String newUrl = urls[0];
+        JSONObject respJson = new JSONObject();
+        String ticket;
+        if("1".equals(agent)){
+            ticket = getWXJsapiTicketAgent();
+        }else{
+            ticket = getWXJsapiTicket();
+        }
+
+        String[] signArr = new String[]{"url=" + newUrl, "jsapi_ticket=" + ticket, "noncestr=" + nonceStr, "timestamp=" + timestamp};
+        Arrays.sort(signArr);
+        String signStr = StringUtils.join(signArr, "&");
+        String resSign = DigestUtils.sha1Hex(signStr);
+        respJson.put("appId", this.corpid);
+        respJson.put("timestamp", timestamp);
+        respJson.put("nonceStr", nonceStr);
+        respJson.put("signature", resSign);
+        if ("1".equals(agent)) {
+            respJson.put("agentId", this.agentId);
+        }
+
+        return respJson.toJSONString();
+    }
+
+    private String getWXJsapiTicket() {
+
+        //token未过期使用缓存的token
+        long currentTiem = new Date().getTime();
+        log.info("jsapiTicket线程id{}", Thread.currentThread().getId());
+        log.info("jsapiTicket过期时间为{}", this.jsapiCreateTime + this.jsapiExpires * 1000);
+        log.info("jsapiTicket当前时间为{}", currentTiem);
+        if (this.jsapiTicket != null && (currentTiem - jsapiCreateTime) < (this.jsapiExpires - 10) * 1000) {
+            log.info("jsapiTicket{}", this.jsapiTicket);
+            return this.jsapiTicket;
+        }
+
+
+        String url = QyWxServiceUrl.JSAPI_TICKET_URL.getformatUrl(getAccessToken());
+        log.info("getWXJsapiTicket url ", url);
+        String resp = HttpUtils.sendSSLGet(url);
+        log.info("getWXJsapiTicket resp ", resp);
+        JSONObject resJson = JSONObject.parseObject(resp);
+        jsapiCreateTime = new Date().getTime();
+        jsapiExpires = resJson.getInteger("expires_in");
+        jsapiTicket = resJson.getString("ticket");
+        return jsapiTicket;
+
+    }
+
+    private String getWXJsapiTicketAgent() {
+
+        //token未过期使用缓存的token
+        long currentTiem = new Date().getTime();
+        log.info("agentTicket线程id{}", Thread.currentThread().getId());
+        log.info("agentTicket过期时间为{}", this.jsapiAgentTicket + this.jsapiAgentExpires * 1000);
+        log.info("agentTicket当前时间为{}", currentTiem);
+        if (this.jsapiAgentTicket != null && (currentTiem - jsapiAgentCreateTime) < (this.jsapiAgentExpires - 10) * 1000) {
+            log.info("agentTicket{}", this.jsapiAgentTicket);
+            return this.jsapiAgentTicket;
+        }
+
+
+        String url = QyWxServiceUrl.JSAPI_TICKET_AGENT_URL.getformatUrl(getAccessToken());
+        log.info("getAgentTicket url ", url);
+        String resp = HttpUtils.sendSSLGet(url);
+        log.info("getAgentTicket resp ", resp);
+        JSONObject resJson = JSONObject.parseObject(resp);
+        jsapiAgentCreateTime = new Date().getTime();
+        jsapiAgentExpires = resJson.getInteger("expires_in");
+        jsapiAgentTicket = resJson.getString("ticket");
+        return jsapiAgentTicket;
+    }
+
     public String getCorpid() {
         return corpid;
     }

+ 2 - 0
suishenbang-wxportal/suishenbang-wxportal-common/src/main/java/com/dgtly/wxportal/utils/qywxutils/QyWxServiceUrl.java

@@ -40,7 +40,9 @@ public enum QyWxServiceUrl {
      */
     ,SEND_MESSAGE_URL("https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s")
 
+    ,JSAPI_TICKET_URL("https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=%s")
 
+    ,JSAPI_TICKET_AGENT_URL("https://qyapi.weixin.qq.com/cgi-bin/ticket/get?access_token=%s&type=agent_config")
 
 
     ;

+ 4 - 0
suishenbang-wxportal/suishenbang-wxportal-common/src/main/java/com/dgtly/wxportal/utils/qywxutils/QyWxUserUtil.java

@@ -29,6 +29,10 @@ public class QyWxUserUtil {
     private String redis_qywxtoken_key="QYWX_ACCESS_TOKEN";
 
 
+    public String getJsApiTicket(String url, String agent) {
+        return qyWxAccessTokenUtil.getWXSign(url, agent);
+    }
+
     /**
      * 获取企业微信用户的userId
      * @return