本人使用Android開發有一段時間了,但是本身沒有系統學,而且多年專註服務端開發,總覺得因為項目需要接觸Android移動端開發只是暫時的,所以沒有太上心,結果碰到一個大難題折騰了一天,最後被有經驗的小伙伴提示了一下才迎刃而解,感覺無地自容的同時,又非常竊喜,畢竟跨過一個一個的坎,就成長了,在這裡 ...
本人使用Android開發有一段時間了,但是本身沒有系統學,而且多年專註服務端開發,總覺得因為項目需要接觸Android移動端開發只是暫時的,所以沒有太上心,結果碰到一個大難題折騰了一天,最後被有經驗的小伙伴提示了一下才迎刃而解,感覺無地自容的同時,又非常竊喜,畢竟跨過一個一個的坎,就成長了,在這裡丟人等換個地方就成牛了也未可知,哈哈。閑言就絮叨到這裡,趕緊分享:
微信支付調用介面整體的流程有必要簡述一下(目前網上的資料大部分都是適配微信支付舊版的代碼,最新的微信支付官方文檔中並沒有服務端的Demo,而且一些介面都變了,參數名稱也有變化,希望小伙伴們能夠註意):
1. 微信支付不需要訪問獲取Token那個介面了;
2. 直接訪問https://api.mch.weixin.qq.com/pay/unifiedorder 獲得Prepayid,參數以 xml格式傳輸就可以;
3. 有了Prepayid再加上一些其他的官網中提到的參數就可以調起客戶端的微信支付介面了;
此時就出現問題了:第一次調用非常OK,看到了微信支付界面,有自己生成的訂單號還有金額,但是放棄支付後再進入,就連微信客戶端都調用不起來了,換個訂單也是這樣,換個手機也是第一單可以調用微信客戶端,展示訂單號,金額,但是第二單說什麼也不行了,定格在自己APP的支付界面,不報錯,任何反應也沒有。
原因就出現在這裡: 我們申請微信支付的時候,有個地方會讓你填寫你的應用Key:
申請以後你看到的就是圖片上的應用簽名,這個簽名是如何生成的在這裡有介紹: https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
問題是這個Key的生成是跟正式發佈時打包做簽名有關的,我們把Android應用公開release的時候會將這個Key加進去作為應用的key防止被惡意覆蓋等等,我們在申請註冊微信應用的時候必然要提供正式生成的這個應用的Key給微信官網。
因此這件事就被忽略了,以至於在開發的過程中,我們在自己的本地運行打包,訪問微信伺服器調起支付的時候,微信第一次拿到了我們的應用發來的請求,仿佛建立了連接開始了心跳,
這時微信會非同步地根據留存的應用包名和應用Key與你現在發送的包名和應用Key進行驗證,我相信即使你第一次進行付款,也是很有可能不成功的,但是這塊我就沒有驗證了,因為這個時候已經有驗證結果回調回來了。
所以跟運維人員拿了Release時把Key打到APK安裝包里的命令,進行包含正式Key的打包,命令如下:
1 ``` cordova build --release android 2 3 jarsigner -verbose -sigalg SHA256withRSA -digestalg SHA1 -keystore E:\android-release-key.keystore E:\項目名稱\platforms\android\build\outputs\apk\android-release-unsigned.apk android-release-key.keystore 4 5 //運行完這條命令需要輸入密碼 6 7 zipalign -v 4 E:\項目名稱\platforms\android\build\outputs\apk\android-release-unsigned.apk a.apk 8 9 ```
問題就解決了。每次訪問都能順利地調用微信支付了。 不得不感慨下,微信用這一手也嚴格控制了在他那裡註冊的應用,註冊一個Key用一個,再想用,那麼重新走流程吧。