然后哦 用這個校驗和輸出的是一致的也就是說 簽名應(yīng)該沒問題吧 但是為什么手機上會顯示無效呢 那個環(huán)節(jié)又出錯了
學(xué)習(xí)是最好的投資!
出現(xiàn)問題的原因是參與簽名的URL地址不正確,需要動態(tài)獲取當(dāng)前頁面完整的URL地址(包括?后面的參數(shù),但不能包含#號),如若URL地址為:http://www.xxx.xxx/payment/wxpay/jspay?oid=xxxx&attr=xxxx#wechat,那么完整的URL地址應(yīng)該是截取#號之前的部份。為什么會出現(xiàn)#號呢?因為你的URL在被分享到朋友圈等微信系統(tǒng)自動會添加一些參數(shù)。
看我把這些坑都總結(jié)了一下:
要命的invalid signature。其實騰訊的文檔已經(jīng)寫了,只能怪我自己理解能力太差,掉了好幾次坑。
簽名要用到的jsapi_ticket需要保存的,2小時有效期。如果在2小時內(nèi)出現(xiàn)問題需要刪除才能工作,一般是自身程序的問題,請檢查。
nonceStr和noncestr的大小寫,當(dāng)心!
url一定要當(dāng)心,如果是"http://x.com/jspay?oid=0&attr=1#wechat"的形式,那么應(yīng)該保留的是"http://x.com/jspay?oid=0&attr=1"。
據(jù)此,url在JavaScript中是location.href.split('#')[0]獲取。
據(jù)此,url在php中用$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]拼裝,
據(jù)說會有多余的80端口問題,但是記錄者沒有遇到過,總之請小心。
url在JavaScript中千萬別忘記“encodeURIComponent”!否則后果很詭異,遇到過初始化的時候報invalid
signature,但是API接口又能調(diào)用的情況。
官方已經(jīng)提供了微信 JS 接口簽名校驗工具(http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign),填入相應(yīng)的參數(shù)就能出來相應(yīng)的值,然后對比下,就能發(fā)現(xiàn)具體是那塊錯了。 我之前碰到一個因為域名后面沒有/而導(dǎo)致失敗的情況
請參考我的另一個回答:
http://segmentfault.com/q/1010000002502269/a-1020000002549180
我也遇到這個問題了, 發(fā)起微信支付的時候提示 invalid signature , 本地程序生成的 簽名 跟 官網(wǎng)通過的簽名工具生成的簽名 對比 也是一致的, 哪位朋友 也遇到了,并解決了,還望不吝賜教。
我的也一樣,把我自己成生的與校驗工具生成的對比,沒任務(wù)差別:79e9778274e7ed0503666aeee4b9dfb350a56b54
79e9778274e7ed0503666aeee4b9dfb350a56b54
我現(xiàn)在也蛋疼了,一直提示config:invalid signature
通過ajax把URL傳到服務(wù)端,簽名也是正確的,就是報config invalid signature,這個可以從哪里調(diào)試啊?
<script type="text/javascript">
var targetUrl=location.href.split("#")[0];
alert("target url is:" + targetUrl);
var aj=$.ajax({
type: "post",
url: "http://XXXXXXX.com/wx?targetUrl="+targetUrl,
dataType: "json",
contentType: "application/json; charset=utf-8",
data:{},
success: function (msg) {
alert("appid: "+msg.appid+"; timestamp:" + msg.timestamp+" ; nonceStr:" + msg.nonceStr+"; signature:" + msg.signature);
wx.config({
debug:true,
appId:msg.appid,
timestamp:msg.timestamp,
nonceStr:msg.nonceStr,
signature:msg.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'
]
});
wx.ready(function () {
alert("config ok...");
});
wx.error(function (res) {
alert("err....:"+res.errMsg);
});
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("error ....."+errorThrown);
}
});
從百度搜這個問題,就進來了。 你們特么就會copy官方文檔,有錢賺嗎? 沒看見lz已經(jīng)去 接口簽名校驗工具 驗證過了嗎? 官方demo有問題,至少php的有問題, 動態(tài)取url的時候自動給加了80端口。 比如一般我們訪問 www.sss.com/dir/1.php 他會在getSignPackage() 里"$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]" 變成 www.sss.com:80/dir/1.php ,所以就一直報invalid signature 。 這是我遇到的問題,上來搜,沒找到答案,又自己解決了。 我說的不一定跟lz遇到的問題一樣,但比你們這些瞎瘠薄拷貝耽誤老子時間的強。
剛剛解決類似的問題。最終發(fā)現(xiàn),代碼所在的頁面的地址一定要與生成簽名里的url一模一樣,對一個字都不能錯,
比如你當(dāng)前頁面是 http://www.abc.com/a.html 那生成signature里傳遞的url的參數(shù)也必須和這個一名模一樣,不能差一個字。。我弄了。。半天,哭了