转自:http://my.oschina.net/u/2308739/blog/371414
1
2
3
|
/**最近在做微信js sdk 接口调用说明*/
***相信很多人都遇见像我这样的问题,再加上自己只能算是半个程序员,所以苦苦摸索了好久终于搞懂了。
****下面就把自己所遇见的各种问题和大家分享一下,都是自己亲手实验过的********/
|
错误一、invalid signature
如果出现 invalid signature,首先可以确定的是你的签名算法有问题。
建议:首先查看微信官方网站给出的解决方案,链接为 http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html
-
invalid signature签名错误。建议按如下顺序检查:
-
确认签名算法正确,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 页面工具进行校验。也就是你自己后台生成签名要和微信校验算法生成的签名一致才可以(可能大小写不同)。
注意:
签名生成规则如下:
参与签名的字段包括有效的 jsapi_ticket(获取方式详见微信 JSSDK 文档), noncestr (随机字符串,由开发者随机生成),timestamp (由开发者生成的当前时间戳), url(当前网页的URL,不包含#及其后面部分。注意:对于没有只有域名没有 path 的 URL ,浏览器会自动加上 / 作为 path,如打开 http://qq.com 则获取到的 URL 为 http://qq.com/)。
特别注意:你在利用参数生成签名的时候,要对所有待签名参数按照字段名的 ASCII 码从小到大排序(字典序)后,使用 URL 键值对的格式(即key1=value1&key2=value2…)拼接成字符串 string1。这里需要注意的是所有参数名均为小写字符。
我的最开始的错误就是没有注意到生成签名的那几个参数要按照key=value的样式连接成一个字符串,然后在sha1加密生成。
-
1
/****Java写的参数拼接算法***/
-
1234567
String[] paramArr =
new
String[] {
"jsapi_ticket="
+ jsapi_ticket,
"timestamp="
+ timestamp,
"noncestr="
+ nonce,
"url="
+ jsurl };
Arrays.sort(paramArr);
// 将排序后的结果拼接成一个字符串
String content = paramArr[
0
].concat(
"&"
+paramArr[
1
]).concat(
"&"
+paramArr[
2
])
.concat(
"&"
+paramArr[
3
]);
System.out.println(
"拼接之后的content为:"
+content);
-
确认config中nonceStr(js中驼峰标准大写S), timestamp与用以签名中的对应noncestr, timestamp一致。
-
确认url是页面完整的url(请在当前页面alert(location.href.split('#')[0])确认),包括'http(s)://'部分,以及'?'后面的GET参数部分,但不包括'#'hash后面的部分。
-
确认 config 中的 appid 与用来获取 jsapi_ticket 的 appid 一致。
-
确保一定缓存access_token和jsapi_ticket。
-
确保你获取用来签名的url是动态生成的,动态页面可参见实例代码中php的实现方式。如果是html的静态页面在前端通过ajax将url传到后台签名,前端需要用js获取当前页面除去'#'hash部分的链接(可用location.href.split('#')[0]获取),因为页面一旦分享,微信客户端会在你的链接末尾加入其它参数,如果不是动态获取当前链接,将导致分享后的页面签名失败。
错误2、每次后台网页更新之后,微信访问效果没有出来。
问题:手机端,网页缓冲导致。
解决方案:重启手机,再试一下。
错误3、微信分享接口,可以在自己的网页上面自定义一个按钮,当用户点击的时候完成分享。
问题:我最开始也是这样想的,后来发现,原来不是这样的,只有当你用微信客户端打开,在最上面右边的 “分享到朋友圈”按钮按的时候效果才会出来。
错误4、微信图像接口 permission denied
首先查看微信给出的错误说明:该公众号没有权限使用这个JSAPI(部分接口需要认证之后才能使用)。
说明:只要通过了公众号认证,都不会有问题。
检查对象:如果出现这个说明程序上基本上不会有问题 微信后台已经返回了数据。
第一、要检查 你的config 文件中相应的 jsapilist 是否包含了该接口哟。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546wx.config({
debug:
true
,
appId:
'wxaab709a7aef25dda'
,
timestamp:data.timestamp,
nonceStr:data.nonce,
signature:data.signature,
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'
'onMenuShareWeibo'
,
'hideMenuItems'
,
'showMenuItems'
,
'hideAllNonBaseMenuItem'
,
'showAllNonBaseMenuItem'
,
-