React Native微信支付開發(fā)爬坑之旅(ErrCode:-1)

? ? ? ?早聞微信支付一直為移動開發(fā)者所詬病,這次公司項(xiàng)目新增微信支付需求,一試果然是一把辛酸淚,從配置到與后臺調(diào)試真是一波三折,整整花了一天的時(shí)間才從坑里爬出來,效率也是低。所以有必要做下總結(jié),日后再有微信支付,三兩下便可完事。
  因?yàn)楣卷?xiàng)目是RN寫的,我這邊選用了目前在RN上使用較廣泛的微信支付組件,基本上都封裝好了,github直通車:react-native-wechat
? ? ? ?我們只需要實(shí)現(xiàn)兩步就可以調(diào)起微信支付:

  • 在應(yīng)用啟動的時(shí)候注冊APPID
 WeChat.registerApp('appid');
  • 在跳轉(zhuǎn)到微信支付的點(diǎn)擊事件中配置參數(shù):
 wechat.isWXAppInstalled().then( ( isInstalled ) => {
       if ( isInstalled ) {       //判斷手機(jī)是否有安裝微信
           wechat.pay({
                 partnerId: wxinfo.mch_id,  // 商家向財(cái)付通申請的商家id
                 prepayId: wxinfo.prepay_id,   // 預(yù)支付訂單
                 nonceStr: wxinfo.nonce_str,   // 隨機(jī)串,防重發(fā)
                 timeStamp: result.data.time.toString()    ,  // 時(shí)間戳,防重發(fā).
                 package: 'Sign=WXPay',    // 商家根據(jù)財(cái)付通文檔填寫的數(shù)據(jù)和簽名
                 sign: result.data.sign        // 商家根據(jù)微信開放平臺文檔對數(shù)據(jù)做的簽名
                 }).then((requestJson)=>{
                           //支付成功回調(diào)
                           console.log("----微信支付成功----",requestJson);
                           if (requestJson.errCode=="0"){
                            //回調(diào)成功處理
                           }
                       }).catch((err)=>{
                           toastShort('支付失敗')
                       })
                   } else {
                       toastShort( '沒有安裝微信軟件,請您安裝微信之后再試' );
                   }
               } );

? ? ? ?以上就是react native調(diào)用微信支付的過程,使用的開源庫已經(jīng)幫我們封裝好了其他的一些配置,用起來也是非常的方便。
? ? ? ?接下來就是在手機(jī)上跑一遍,魯迅說過:“新鮮事物第一次嘗試就想要成功,幾率還是很小的”。當(dāng)我點(diǎn)擊微信支付,期待著跳出熟悉的微信支付界面時(shí),出現(xiàn)了令我失望的結(jié)果:屏幕閃了一下,然后,然后就沒有然后了,what the f...,好,穩(wěn)定下情緒,開始我的爬坑之旅。
  首先,我先來到這個(gè)開源庫的文檔中尋找下是否有我遺漏的地方,在最后看到了一句話,仿佛看到了曙光:

在安卓機(jī)上測試的同學(xué)經(jīng)常會遇到比如調(diào)用微信支付時(shí)閃一下就沒了的問題,這個(gè)問題100%跟簽名有關(guān),請檢查你的簽名。
debug版本和release版本的簽名是不同的,請注意

? ? ? ?從這段話中,從100%這個(gè)字眼我讀出了作者堅(jiān)定的語氣,自信的情感。于是我立馬讓運(yùn)營小哥查看當(dāng)時(shí)他申請微信支付用的簽名,結(jié)果一對證,我c...,好,穩(wěn)定下情緒,果然真是簽名不對,當(dāng)時(shí)給了一個(gè)dubug的簽名,后面我讓他換成release的簽名,沒換過來。好在微信開放平臺是支持修改的,而且即時(shí)生效。這下應(yīng)該沒問題了吧。。。
  不可能的,不存在的,前方路漫漫。。這時(shí)候我的心態(tài)還是很好的。
  依然還是屏幕閃了一下,一只烏鴉帶著省略號飛過。。所以說凡事不要說什么100%,接下來,繼續(xù)我們的爬坑之旅。
  排除了權(quán)限問題,包括appid,應(yīng)用簽名這些都確定無誤,那么問題應(yīng)該就出在調(diào)用微信支付的那些參數(shù)上,首先引起我的注意的是sign這個(gè)字段,于是來到了微信支付文檔(使用第三方,最主要的還是要回歸到文檔中來),微信支付文檔直通車:微信支付開發(fā)文檔
? ? ? ?簡單描述下調(diào)用流程:

  • app端先調(diào)用自家后臺的支付接口,把金額,支付類型等一些參數(shù)傳過去
  • 后臺收到這些參數(shù),去調(diào)用微信服務(wù)端統(tǒng)一下單接口,將金額,商戶訂單號等等這些傳給微信服務(wù)端,這時(shí)候微信服務(wù)端返回成功或失敗,成功會附帶sign,prepay_id等參數(shù)給我們后臺。
  • 后臺再將微信返回的這些參數(shù)返給app端,也就是上文配置中傳的那些參數(shù)。app端再把這些參數(shù)傳給微信。整個(gè)過程是不是一(fei)氣(chang)呵(dan)成(teng)

? ? ? ?那么我們推測問題就出現(xiàn)在這些參數(shù)里,讓我們一個(gè)一個(gè)來分析:

  • partnerId 商家ID,這個(gè)是申請微信支付的時(shí)候,微信分配的ID,直接獲取后臺返回即可,可以與運(yùn)營小哥那邊再核對下。
  • prepayId 預(yù)支付訂單,微信服務(wù)端返給我們后臺的訂單,app端直接獲取后臺返回即可。
  • nonceStr 隨機(jī)數(shù),沒什么好說的,直接獲取后臺返回即可。
  • timeStamp 時(shí)間戳,這是個(gè)要小心的地方,之前我們后臺沒給我返回這個(gè)字段,我自以為app端自己獲取即時(shí)時(shí)間戳即可,直接
    結(jié)果錯(cuò)了,必須使用后臺給的時(shí)間戳。你說這個(gè)鍋誰背,55開吧
  • package 文檔上說直接寫死即可,package: 'Sign=WXPay'
  • sign 這是個(gè)大咖,當(dāng)然計(jì)算工作交給后臺來做就行,網(wǎng)上看了幾篇文章說屏幕一閃,有可能就是sign計(jì)算錯(cuò)誤,后臺小哥跟我講這個(gè)sign是微信返給他的,然后又直接返給我,emmmm,應(yīng)該有點(diǎn)問題,再去文檔看看:微信支付APP端開發(fā)步驟,里邊第三部有四個(gè)字

商戶服務(wù)器生成支付訂單,先調(diào)用【統(tǒng)一下單API】生成預(yù)付單,獲取到prepay_id后將參數(shù)再次簽名傳輸給APP發(fā)起支付。以下是調(diào)起微信支付的

是的,就是這四個(gè)字“再次簽名”,需要再次簽名!!所以我又讓后臺小哥處理完sign在發(fā)給我。
  到此,我們把這些參數(shù)都給分析了一遍過去,這次要再閃一下我就...我就再找找其他原因,但是事實(shí)上,我的app已經(jīng)成功調(diào)起了微信支付,并且成功回調(diào)。
  好了,這波總結(jié)進(jìn)入尾聲了,是不是覺得我寫技術(shù)文章很啰嗦,就是啰嗦咋滴。不過說回來,還是總結(jié)下主題要義:

  • 檢查你的APPID,應(yīng)用簽名是否正確
  • 檢查你的參數(shù)傳遞是否正確(包括字段大小寫),更多地與后臺進(jìn)行調(diào)試
  • 以上都確認(rèn)OK了,重裝你的微信再試一遍
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容