微信JSSDK分享接口中wx.config 出现invalid signature问题的解决办法
2015-07-31 21:52
906 查看
先看下面的JSP代码:
String rand = StringUtil.getUUID(); //随机字符串
//String timestamp = Long.toString(new Date().getTime());
String timestamp = Long.toString(System.currentTimeMillis() / 1000);// Long.toString(new Date().getTime());
String url = "http://m.kuaixuetuan.com/portal/apps/wd/vip/product.jsp?rowId="+proRowId;
String sign = CommonUtil.createShareSign( "jiacheng",rand,timestamp,url);
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '<%=appId%>', // 必填,公众号的唯一标识
nonceStr: '<%=rand%>', // 必填,生成签名的随机串
signature: '<%=sign%>',// 必填,签名,见附录1
timestamp: <%=Long.parseLong(timestamp)%>, // 必填,生成签名的时间戳
jsApiList: [
'checkJsApi',
'onMenuShareTimeline',
'onMenuShareAppMessage',
'onMenuShareQQ',
'onMenuShareWeibo',
'hideMenuItems',
'showMenuItems',
'hideAllNonBaseMenuItem',
'showAllNonBaseMenuItem',
'translateVoice',
'startRecord',
'stopRecord',
'onRecordEnd',
'playVoice',
'pauseVoice',
'stopVoice',
'uploadVoice',
'downloadVoice',
'chooseImage',
'previewImage',
'uploadImage',
'downloadImage',
'getNetworkType',
'openLocation',
'getLocation',
'hideOptionMenu',
'showOptionMenu',
'closeWindow',
'scanQRCode',
'chooseWXPay',
'openProductSpecificView',
'addCard',
'chooseCard',
'openCard'
]
});
其中时间戳timestamp可以用 Long.toString(System.currentTimeMillis() / 1000); 获取,timestamp的长度是10位数字;
url是当前网页的url地址。
我今天从上午调试到傍晚,调用wx.config一直出现invalid signature的问题,最后发现问题还是出现在计算签名的算法上。仔细阅读了微信文档,发现自己误将token当做jsapi_ticket了,实际上要做两次微信接口调用,第一次调用获取access_token,第二次调用根据access_token计算jsapi_ticket,下面是自己写的CommonUtil类中关于计算签名的算法:
public static String createShareSign(String accountId,String rand,String timestamp,String url) throws Exception
{
//首先获得一个accessToken
String token = WeixinAccessTokenUtil.getAccessToken(accountId);//自己写的获取缓存access_token,大家可按自己的方式获取accessToken
//根据token获取jsapi
String jsapiUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
jsapiUrl = jsapiUrl.replace("ACCESS_TOKEN", token);
//
JSONObject jsonObject = httpsRequest(jsapiUrl, "GET", null);//调用jsapi接口获取jsapi_ticket
String jsapiTicket = jsonObject.getString("ticket");
log.info("返回的jsapiticket::"+jsapiTicket);
log.info(jsonObject.toString());
String string1="";
String signature="";
//System.out.println("SHA1签名 :"+str);
string1 = "jsapi_ticket=" + jsapiTicket +
"&noncestr=" + rand +
"×tamp=" + timestamp +
"&url=" + url;
System.out.println(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();
}
System.out.println("签名1:"+signature);
// System.out.println("签名2:"+ SHA1Util.encode(string1) );
return signature;
}
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;
}
String rand = StringUtil.getUUID(); //随机字符串
//String timestamp = Long.toString(new Date().getTime());
String timestamp = Long.toString(System.currentTimeMillis() / 1000);// Long.toString(new Date().getTime());
String url = "http://m.kuaixuetuan.com/portal/apps/wd/vip/product.jsp?rowId="+proRowId;
String sign = CommonUtil.createShareSign( "jiacheng",rand,timestamp,url);
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '<%=appId%>', // 必填,公众号的唯一标识
nonceStr: '<%=rand%>', // 必填,生成签名的随机串
signature: '<%=sign%>',// 必填,签名,见附录1
timestamp: <%=Long.parseLong(timestamp)%>, // 必填,生成签名的时间戳
jsApiList: [
'checkJsApi',
'onMenuShareTimeline',
'onMenuShareAppMessage',
'onMenuShareQQ',
'onMenuShareWeibo',
'hideMenuItems',
'showMenuItems',
'hideAllNonBaseMenuItem',
'showAllNonBaseMenuItem',
'translateVoice',
'startRecord',
'stopRecord',
'onRecordEnd',
'playVoice',
'pauseVoice',
'stopVoice',
'uploadVoice',
'downloadVoice',
'chooseImage',
'previewImage',
'uploadImage',
'downloadImage',
'getNetworkType',
'openLocation',
'getLocation',
'hideOptionMenu',
'showOptionMenu',
'closeWindow',
'scanQRCode',
'chooseWXPay',
'openProductSpecificView',
'addCard',
'chooseCard',
'openCard'
]
});
其中时间戳timestamp可以用 Long.toString(System.currentTimeMillis() / 1000); 获取,timestamp的长度是10位数字;
url是当前网页的url地址。
我今天从上午调试到傍晚,调用wx.config一直出现invalid signature的问题,最后发现问题还是出现在计算签名的算法上。仔细阅读了微信文档,发现自己误将token当做jsapi_ticket了,实际上要做两次微信接口调用,第一次调用获取access_token,第二次调用根据access_token计算jsapi_ticket,下面是自己写的CommonUtil类中关于计算签名的算法:
public static String createShareSign(String accountId,String rand,String timestamp,String url) throws Exception
{
//首先获得一个accessToken
String token = WeixinAccessTokenUtil.getAccessToken(accountId);//自己写的获取缓存access_token,大家可按自己的方式获取accessToken
//根据token获取jsapi
String jsapiUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
jsapiUrl = jsapiUrl.replace("ACCESS_TOKEN", token);
//
JSONObject jsonObject = httpsRequest(jsapiUrl, "GET", null);//调用jsapi接口获取jsapi_ticket
String jsapiTicket = jsonObject.getString("ticket");
log.info("返回的jsapiticket::"+jsapiTicket);
log.info(jsonObject.toString());
String string1="";
String signature="";
//System.out.println("SHA1签名 :"+str);
string1 = "jsapi_ticket=" + jsapiTicket +
"&noncestr=" + rand +
"×tamp=" + timestamp +
"&url=" + url;
System.out.println(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();
}
System.out.println("签名1:"+signature);
// System.out.println("签名2:"+ SHA1Util.encode(string1) );
return signature;
}
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;
}
相关文章推荐
- 没有对公账户微信认证方法
- 没有组织机构代码证、公章怎么认证微信公众号?
- 营业执照没公司名字、字号怎么认证微信
- 微信公众平台新增图文内容中图片上传接口,并过滤外链图片(这是封闭么?)
- 微信获取用户基本信息
- 微信公众账号 点击返回页面刷新页面得到两个相同的code导致程序报错的问题
- 使用VBScript实现设置系统环境变量的小程序
- [微信营销企划之路]002.二维码一码多用
- 微信支付参考资料。
- 分享一个用于统计MATLAB代码行数的小程序
- 微信支付开发--名词解释
- 微信-支付模式
- 报表与微信公众号(企业号)集成方案
- 报表与微信公众号(企业号)集成方案
- 微信公众平台完整开发教程
- 微信二维码1-服务号推广(将网页存储为图片存储到服务器)
- 获取微信openID 的步骤
- Android开发模仿微信发表朋友圈图片多选及图片浏览实现-Assur
- 微信红包随机生成算法(PHP版)
- 模仿仿微信发表朋友圈图片多选实现