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

时间:2023-03-08 17:44:02
JSSDK实现微信自定义分享---java 后端获取签名信息

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

1.授权token获取方式:

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

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

2.基础token获取方式:

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

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

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

 private JsSdkDto find() throws Exception{

         JsSdkDto jsSdkDto = new JsSdkDto();

         /** 前端传的 需要授权分享的url **/
String authorizationUrl = "www.baidu.com"; /** 获取微信access_token的url **/
String weChatUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}"; String appId = "1232we3234ew"; //公众号的appId
String secret = "324323dfs3243qew"; //公众号号的密钥 String Url = MessageFormat.format(weChatUrl, appId,secret);
URL url = new URL(Url); /** 获取微信access_token **/
JSONObject jsonObjectAccessToken;
try (InputStream inputStream = url.openStream()) {
jsonObjectAccessToken = JSONObject.parseObject(IOUtils.toString(inputStream));
}
if (jsonObjectAccessToken.containsKey("errmsg")) {
throw new FrankyException("获取token,原因:" + jsonObjectAccessToken.getString("errmsg"));
}
String access_token = jsonObjectAccessToken.getString("access_token"); /** 获取 jsapi_ticket **/
String getUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+access_token+"&type=jsapi";
JSONObject jsonObject = wechatService.urlConnector(getUrl);
if (!jsonObject.get("errmsg").equals("ok")){
throw new FrankyException(ErrorCode.PARAMETER_INVALID,jsonObject.get("errmsg").toString());
}
String jsapi_ticket = jsonObject.getString("ticket"); String noncestr = WXPayUtil.generateNonceStr();
String timestamp = String.valueOf(System.currentTimeMillis()/1000); /** 拼装字符转 注意:对所有待签名参数按照字段名的 ASCII 码从小到大排序(字典序)后,
* 使用 URL 键值对的格式(即key1=value1&key2=value2…)拼接成字符串 string1。
* 这里需要注意的是所有参数名均为小写字符。**/
String str = "jsapi_ticket="+jsapi_ticket+
"&noncestr="+noncestr+"&timestamp="+timestamp+"&url="+url; /** 对字符串进行 Sha1签名 **/
String s = sha1Hex(str); jsSdkDto.setAppId(appId);
jsSdkDto.setNonceStr(noncestr);
jsSdkDto.setTimeStamp(timestamp);
jsSdkDto.setSignature(s);
return jsSdkDto;
}