uniapp微信APP支付踩坑指南:報錯errMsg: "requestPayment:fail errors"


  起因:uni-app微信app支付一直報錯“errMsg“: “requestPayment:fail errors“,但是坑的是沒有具體的原因,微信APP支付官方文檔也很坑。我們看看有多坑:

  返回結果-1,包含所有情況,至於什么情況,您自己猜去吧,唉~~

  網上查了很多別人也是很多遇到這個問題,但是所說解決方案都無用,當然我們記錄一下,也未嘗不可,有可能也能解決別人的問題。下面就一步一步踩坑指南吧。

一、“errMsg”: “requestPayment:fail errors”

  uni-app 報 “errMsg”: “requestPayment:fail errors”,調不起微信,返回 -1 大部分原因出在包名,簽名,和參數部分為空。

var orderInfo = { "appid":res.map.appid, "noncestr":res.map.nonceStr, "package":res.map.package, "partnerid":res.map.partnerid, "prepayid":res.map.prepayid, "timestamp":res.map.timestamp, "sign":res.map.sign } uni.requestPayment({ provider: 'wxpay', orderInfo: orderInfo, //微信、支付寶訂單數據
 success: function (res) { console.log("微信調起支付成功") console.log(res); }, fail: function (err) { console.log("微信調起支付失敗") console.log(err); } });

1、為空判斷

  首先,你必須確定appid,noncestr,package,partnerid,prepayid,timestamp,sign 都不為空或者不為undefind。

  這個一般沒啥問題,可以打印一下,確保每個參數都不為空(先不考慮其正確性)。

2、參數類型(orderInfo)

  如果是微信支付,上傳參數需要是 Object 對象,而不能是 String 類型。不然可能只會出現一個加載框,就是不跳轉到支付頁面。

  App端,支付寶支付 orderInfo 為 String 類型。

  App端,微信支付 orderInfo 為 Object 類型。

3、參數名全為小寫。

  這點也是微信支付的一個大坑:很多參數都不規范,一個簡單的支付有好幾種命名規范,比如商戶號有的要傳mch_id,有的要傳mchId,而app支付這個是partnerid。你就說坑不坑。

  appid,noncestr,package,partnerid,prepayid,timestamp,sign 這些參數都為小寫,注意大小寫。最后直接從微信文檔里復制,省得又掉坑:

  調起支付接口文檔:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12&index=2

  然后我們傳的這7個字段必須是小寫,最好直接從文檔里復制吧。

  最開始后端給的是駝峰,所以有問題,但是問題也不全在這,換了小寫之后還是有問題,那么繼續:

4、二次簽名問題

  所以我懷疑是不是簽名有問題,用微信的簽名工具對一下就可以發現后端返回的簽名對不對,結果發現不對,問題在哪呢?

  還是之前說的二次簽名的商戶號字段是partnerid,而不是mch_id,由於統一下單的商戶號字段是mch_id,所以二次簽名的時候還是用的這個,那就不對了,更換字段之后簽名正常了。但是還是喚不起app支付。

5、timestamp

  timestap就要好好看下接口規則-參數規范,timestamp單位是秒,而不是毫秒,所以需要除以1000

6、還有查到一些其他的操作,不確定有無用

下面這個是微信技術助手回復:

3)調用支付使用的noncestr這個參數必須和商家服務器調用統一下單接口返回的那個noncestr一致
4)從預支付訂單返回的數據 ,沒有重新簽名,也會引起這個問題。
5)重新安裝微信后試試。

  上面這2個也都無用。

7、考慮商戶號綁定、app支付開通等一類的問題

  這些是微信APP支付的前提,先去微信開放平台申請移動app應用,這里會要求填寫app的包名和簽名(這個地方是之前埋下的一個坑,因為之前剛開始就隨便起了個demo的app填了,后面需要改),等app審核通過之后,就會獲取到appId和appSecret,然后需要申請開通微信支付,然后需要綁定商戶號,這些都沒有問題。

  相當於就是商戶號綁定,app支付開通等問題。這些對於我這個問題來說也沒有問題。但是還是喚不起支付。

8、app包名和簽名

  在網上看到說

剛剛碰到這個問題,看了微信官方文檔,明白了,掉了一個步驟,需要測試機上生成應用簽名。 生成簽名提交給微信公眾平台,請等待幾分鍾,再次調用就成功了

  然后我拿的是md5的簽名,大寫且有冒號,據說是要去掉冒號,然后全部改成小寫。改了還是沒有用。

9、不能使用標准基座,得使用自定義基座以及相關支付權限開通,那么就再試吧

(1)打包或使用自定義基座測試(很重要)。

  既是上面配置正確,也沒辦法調起支付,你需要打一個包測試,或者使用自定義基座測試(有打印信息)。

  自定義基座配置教程地址:https://ask.dcloud.net.cn/article/35115

 (2)權限和模塊配置。

  一般選擇后會自動添加相應支付權限,老版本可能需要自己選擇。

  登錄鑒權功能按需添加:這里的 appid 和 appsecret 在微信開放平台獲取。

(3)清除微信緩存。

  個別時候,緩存也會造成支付失敗,比如包名和簽名之前測試過,后來又修改了等。

  這些都是對的,還是無用。

二、添加微信分享確定疑惑

  以上那些做了都是對的,所以我懷疑問題必定出在app的包名以及簽名上,但是無法確認。這時候看到一個博客說,只要微信分享能夠成功,那么就能確定微信里app簽名和包名是對的。

  那么我就來引入一下微信分享來看看對不對。

  微信分享按要求引入:share模塊需勾選。

  具體怎么引入不多說,在標准基座是可以分享成功的,但是這樣就別以為是對的了。

  注意:需要的是打自定義基座,那么打一個,然后再分享下,報錯:“微信:包名不對,請檢查包名是否與開放平台填寫一致”。

  到這里基本可以確認包名是一個問題,也比較能確認就是這個包名的問題影響了,那么就來一步一步排查。

三、最后解決坑

  包名和簽名需要在微信開放平台配置,在app打包時,你需要為其提供正確的包名和簽名。

  包名是在哪里配置,我們都知道在uni-app的manifest.json里配置

  但是忽略了及其重要的一點就是:打包和自定義基座的時候包名也需要同步修改(因為最早之前我沒有修改,所以一直都是使用的默認的dclod的appid,真是大坑啊,相當於你在微信開放平台怎么改包名兩邊都是對不上的,唉)

  修改好之后再打個包,微信APP支付和微信分享就都正常了,不容易啊,踩了一天坑,終於解決了,給大家做個參考吧。(順便吐槽一下微信社區和Dcloud社區的一些交流,非常多的人遇到了這樣的問題,有的搞了幾天問了好多問題,最后說解決了就消失了,但是又不說怎么解決了,唉,真是大坑,花點時間總結下自己的處理過程,給別人一個參考,也為生態做點貢獻,是挺好的)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM