JSSDK实现微信自定义分享---java 后端获取签名信息

一、首先说下关于微信Access_token的问题,微信Access_token分为2中:

1.授权token获取方式:

这种token需要code值(如何获取code值查看官方文档)

 1 "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appId + "&secret=" + appsecret 2 + "&code=" + code + "&grant_type=authorization_code";  

2.基础token获取方式:

 1 "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appsecret; 

我们下面用token获取分享签名 jsapi_ticket 就是使用基础token,如果用错了token会错以为token过期。

二、下面是获取jssdk 签名的代码

 1 private JsSdkDto find() throws Exception{
 2 
 3         JsSdkDto jsSdkDto = new JsSdkDto();
 4 
 5         /** 前端传的 需要授权分享的url **/
 6         String authorizationUrl = "www.baidu.com";
 7 
 8         /** 获取微信access_token的url **/
 9         String weChatUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}";
10 
11         String appId = "1232we3234ew";  //公众号的appId
12         String secret = "324323dfs3243qew";  //公众号号的密钥
13 
14         String Url = MessageFormat.format(weChatUrl, appId,secret);
15         URL url = new URL(Url);
16 
17         /** 获取微信access_token **/
18         JSONObject jsonObjectAccessToken;
19         try (InputStream inputStream = url.openStream()) {
20             jsonObjectAccessToken = JSONObject.parseObject(IOUtils.toString(inputStream));
21         }
22         if (jsonObjectAccessToken.containsKey("errmsg")) {
23             throw new FrankyException("获取token,原因:" + jsonObjectAccessToken.getString("errmsg"));
24         }
25         String access_token = jsonObjectAccessToken.getString("access_token");
26 
27         /** 获取 jsapi_ticket **/
28         String getUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+access_token+"&type=jsapi";
29         JSONObject jsonObject = wechatService.urlConnector(getUrl);
30         if (!jsonObject.get("errmsg").equals("ok")){
31             throw new FrankyException(ErrorCode.PARAMETER_INVALID,jsonObject.get("errmsg").toString());
32         }
33         String jsapi_ticket = jsonObject.getString("ticket");
34 
35         String noncestr = WXPayUtil.generateNonceStr();
36         String timestamp = String.valueOf(System.currentTimeMillis()/1000);
37 
38         /** 拼装字符转 注意:对所有待签名参数按照字段名的 ASCII 码从小到大排序(字典序)后,
39          * 使用 URL 键值对的格式(即key1=value1&key2=value2…)拼接成字符串 string1。
40          * 这里需要注意的是所有参数名均为小写字符。**/
41         String str = "jsapi_ticket="+jsapi_ticket+
42                 "&noncestr="+noncestr+"&timestamp="+timestamp+"&url="+url;
43 
44         /** 对字符串进行 Sha1签名 **/
45         String s = sha1Hex(str);
46 
47         jsSdkDto.setAppId(appId);
48         jsSdkDto.setNonceStr(noncestr);
49         jsSdkDto.setTimeStamp(timestamp);
50         jsSdkDto.setSignature(s);
51         return jsSdkDto;
52     }

 

posted @ 2018-04-24 09:59  低调的小白  阅读(704)  评论(0编辑  收藏  举报