其實很多問題,騰訊都給出了答案,只是騰訊的文檔不是很集中,通常看不到。整理下我看到的官方文檔連接。php
http://kf.qq.com/faq/140225MveaUz150413VNj6nm.html 【常見問題】html
http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html 【JSSDK說明及常見問題】前端
https://mp.weixin.qq.com/wiki/6/01405db0092f76bb96b12a9f954cd866.html 【報錯排查指引】算法
http://mp.weixin.qq.com/wiki/17/fa4e1434e57290788bde25603fa2fcbd.html 【全局返回碼說明】segmentfault
1、申請公衆號,並開通支付等接口(公司行政處理的,我只管拿來用)後端
2、獲取appid、商戶號、AppSecret等信息api
3、自行設置API安全密鑰瀏覽器
一、登陸微信商戶平臺(http://pay.weixin.qq.com),依次進入 帳戶設置-->API安全-->API證書-->下載證書 下載並保存證書到本地。安全
二、帳戶設置-->API安全-->設置API密鑰 ,本身設置一個密鑰,32位字符。自行保存(設置後就不可見了,只能修改)微信
4、本地調試準備工做(支付測試,須要外網域名,準備工做主要就是在本地設置外網可訪問的域名)
方法一、ngrok 內網穿透工具,此工具能夠方便的爲本機設置一個外網域名,不過因爲是國外的產品,因此可能被牆,參考 http://www.tuicool.com/articles/e63Ebm6
使用方法: 1)解壓壓縮包(如:d:/ngrok) 2)CMD切換到d:/ngrok目錄, 運行命令「ngrok -config ngrok.cfg -subdomain 你想要的域名 服務端口」 3)瀏覽器輸入 http://你想要的域名.ngrok.natapp.cn/ 便可訪問默認頁面。
方法二、 微信官方推薦的方法,詳情參考連接: http://blog.qqbrowser.cc/start/ http://blog.qqbrowser.cc/wei-xin-gong-zhong-hao-ben-di-diao-shi/
5、相關域名設置
一、支付目錄設置,根據 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_3 配置受權目錄,須要特別注意的是,目錄要配置到精確目錄,而不是二級或者三級目錄,而且區分大小寫。目錄指的是確認付款的頁面目錄而不是調用支付的接口目錄。
好比商品支付頁面連接爲 http://www.XXX.com.cn/pay/payorder/a.html 須要配置爲 www.XXX.com.cn/pay/payorder/
二、受權回調權限域名設置。 公衆平臺--》開發--》接口權限--》網頁受權獲取用戶基本信息--》修改 輸入域名便可(只需輸入 www.XXX.com.cn)
三、 JS接口安全域名設置。 公衆平臺--》設置--》公衆號設置--》功能設置--》JS接口安全域名。 同上,只需輸入www.XXX.com.cn
各類坑,有不少,我的蒐集比較經典的參考連接以下:、
1) error: invalid signature
https://segmentfault.com/q/1010000002502269/a-1020000002549180
https://segmentfault.com/q/1010000002520634
摘錄以作備份:
signature 的值是用多個參數 sha1 加密的結果,詳細流程即:
1, 經過 appid + appsecert 獲取公衆號的 access_token(不是用戶的 access_token)官方文檔 http://mp.weixin.qq.com/wiki/15/54ce45d8d30b6bf6758f68d2e95bc627.html
2, 根據 1 的access_token 來獲取 jsapi_ticket
3, 生成一個隨機字符串 nonceStr(16)位
4, 生成一當前時間綴 timestamp
5, 獲取當前網頁 URL(#號後不要)
獲取到以上 5 步以後,將 jsapi_ticket,nonceStr, timestamp,URL 組成 Query String(GET 參數),即:
$queryString = "jsapi_ticket=XXX&noncestr=XXX×tamp=XXX&url=XXX";
生成 Query String 要注意:
1,Query String 的順序不能變(按我給的示例)
2,Query String 中的 key 要全小寫
3,Query String 中的 value 區分大小寫
4,URL 要確保只獲取 # 號以前部分(有 # 號的話)
5,Query String 要確保沒有被 urlencode(若是使用 http_build_query 的話須要 urldecode 一次)
signature 的值就是 sha1 加密後的結果,即:
$signature = sha1($queryString);
詳見微信官方文檔 - JS-SDK使用權限簽名算法:
http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd
本人認爲比較關鍵的地方還有: 隨機字符串以及時間戳,最好和支付簽名保持一致。
"errMsg":"chooseWXPay:fail"
參考連接列表:
http://tieba.baidu.com/p/3961646394
http://www.liball.me/wxpay-is-shit/
這個問題,主要是支付目錄配置有誤或者參數有誤。 網上主要蒐集的解決方案以下:
一、配置受權 測試目錄的時候地址的大小寫要和代碼裏保持一致
二、運行測試不行,必須正式打apk包才能用
三、一個是支付受權目錄的配置,一個是生成簽名時用timeStamp,前端js用timestamp。
四、支付目錄配到二級或三級是不行的,必定要配到最後一級
五、引用微信js <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
六、要在 微信公衆平臺 ---》微信支付----》開發配置----下面設置測試的路徑便可
七、開發者中心 -》網頁受權獲取用戶基本信息-》js安全域名
八、這個問題產生的緣由頗有多是微信受權域名和微信支付域名設置的不同,好比一個有www一個沒有。
九、支付目錄,指的是付款頁面目錄,而不是後臺支付連接目錄。
最終前端調用代碼以下:
// js-sdk配置
wx.config({ debug: true, appId: '', // 必填,公衆號的惟一標識 timestamp: '', // 必填,生成簽名的時間戳,後端注意返回string類型 nonceStr: '', // 必填,生成簽名的隨機串,本身生成,最長32位。 signature: '', // 必填,微信簽名,這個簽名,和下面的paySign,所需用到的隨機字符串和時間戳,最好和生成paySgin的保持一致。不是同一個。生成方法參考 http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html,可在頁面 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 進行校驗。 jsApiList: [ 'chooseWXPay' ] // 必填,須要使用的JS接口列表,列表可選參數,參考 http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html 附錄2. });
// js-sdk配置驗證成功 wx.ready(function(){
// 調用支付函數 wx.chooseWXPay({ timestamp: '', // 支付簽名時間戳,注意微信jssdk中的全部使用timestamp字段均爲小寫。但最新版的支付後臺生成簽名使用的timeStamp字段名需大寫其中的S字符 nonceStr: '', // 支付簽名隨機串,不長於 32 位 package: '', // 統一支付接口返回的prepay_id參數值,提交格式如:prepay_id=***) signType: 'MD5', // 簽名方式,默認爲'SHA1',使用新版支付需傳入'MD5' paySign: '', // 支付簽名 success: function (res) { // 支付成功後的回調函數 alert('pay success'); }, cencel:function(res){
// 支付取消回調函數 alert('cencel pay'); }, fail: function(res){
// 支付失敗回調函數 alert('pay fail'); alert(JSON.stringify(res)); } }); });
// js-sdk調用異常回調函數 wx.error(function(res){ alert(res.err_msg); });
調用統一下單接口,拋出超時異常 (28,'Rosolving timed out after 30014 milliseconds')
解決辦法: 將DNS設置爲 182.254.116.116, 參考連接:https://mp.weixin.qq.com/wiki/6/01405db0092f76bb96b12a9f954cd866.html