Android整合支付——微信支付,能調啟微信為何調啟不了微信支付問題
整合微信支付的時候會遇到很多問題,此文章只介紹處理【能調啟微信為何調啟不了微信支付】問題。
1、微信能調啟來,說明你的整合已經成功。但還是注意商戶的微信id是否統一,因為在調啟支付介面的時候需要註冊微信id。
2、調啟不了微信支付/調啟微信支付閃退並跳轉到回撥頁進行提示失敗問題,這個問題的多半是簽名的問題!!!
簽名問題的由來:
這個簽名問題出在哪裡,需要去定位。因為官方的開發文件並沒有說的那麼清楚(或許我的理解能力差),導致了簽名錯誤的問題。通過官方文件的APP端開發步驟和調啟支付API這兩處來說明調啟App支付的引數和簽名,我個人讀了很久,沒有明白意思,如圖劃線部分
當我看了簽名生成演算法的時候(一個生成簽名的規則),才有點明白了。下圖畫紅線部分
但是現在最大的疑惑,我該怎麼用這個簽名
看到這裡基本上也就大概明白了,但是怎麼去使用,看個人的理解能力和對官方文件的閱讀能力,本人表示能力差點,還是沒讀懂。不過我在瀏覽的一些前車之鑑的部落格中找到了方法。
實現步驟:
- 首先呼叫IWXMsg.registerApp將應用註冊到微信;
- 獲取後臺傳送過來的預訂單資訊;
- 根據資訊生成預支付訂單簽名;
- 進行調啟微信App支付
注意:統一下訂單後,微信返回資料中的簽名,並不是調啟微信支付的簽名!!!
重點:生成調啟微信支付API所使用的簽名,生成方式如下(我個人使用的硬拼接方式)
// 簽名生成 // 當前順序為微信提供的順序(引數以ASCII碼排序),最後新增商戶的key(金鑰) // 生成簽名後,按照調啟微信App支付引數一一對應,sign為按微信順序+key生成的新簽名 // 進行調啟支付 api.sendReq(req); String signStr = "appid=" + appid + "&noncestr=" + nonceStr + "&package=Sign=WXPay" + "&partnerid=" + partnerId + "&prepayid=" + prepayId + "×tamp=" + timeStamp + "&key=" + "YUAN2018YUAN2018YUAN2018YUAN2018"; //進行MD5加密,並轉為大寫 String packageSign = MD5.getMessageDigest(signStr.getBytes()); LogUtil.i(TAG, "signStr = " + signStr); LogUtil.i(TAG, "packageSign = " + packageSign.toUpperCase());
調啟微信支付API的簽名,推薦服務生成的簽名(生成簽名這一步,用到了商戶的key(金鑰),所以,將生成新簽名的這一步讓後臺實現)。
PayReq req = new PayReq(); req.appId = appid; req.partnerId = partnerId; req.prepayId = prepayId; req.nonceStr = nonceStr; req.timeStamp = timeStamp; req.packageValue = packageValue; req.sign = sign; // 服務生成的簽名(生成簽名這一步,用到了商戶的私鑰,所以,將生成新簽名的這一步讓後臺實現) Toast.makeText(PayActivity.this, "正常調起支付", Toast.LENGTH_SHORT).show(); // 在支付之前,如果應用沒有註冊到微信,應該先呼叫IWXMsg.registerApp將應用註冊到微信 api.sendReq(req);
根據官方給的demo來調啟微信支付。我只用了demo裡的回撥頁,配置好就可以了。
注意事項:
- 首先需要在微信開放平臺申請開發應用,微信開放平臺會生成APP的唯一標識APPID。此處需要填寫應用包名和應用簽名。此處這個應用簽名需要使用微信平臺提供的app獲取。
- 在支付之前,如果應用沒有註冊到微信,應該先呼叫IWXMsg.registerApp將應用註冊到微信
- 調啟微信支付API的簽名,是根據微信返回的預訂單的資料,按照ASCII順序從小到大排序拼接,最後加上商戶的key(金鑰)製作而成的。
參考文獻:
《Android微信支付整合流程及其常見錯誤》·····························葫蘆娃CSDN部落格
《微信支付整合簡介》··························································陸羽_ CSDN部落格