Android開發之----微信支付
就個人總結以下步驟:
1) 提交訂單
2) 獲取訂單返回的數據,裏邊包含的有訂單的數據、以及後臺返回的與微信支付相關的數據例如:
"wxpay": {
"out_trade_no": "TNO2017021718004873800000001",
"appid": "wxaac3a8ac56f6----",
"sign": "D9315EF565DA92394D86984DC57F6914",
"timestamp": "1487325648",
"partnerid": "1402471902",
"prepayid": "wx201702171755326bc49d280f0543668849",
"pkg": "Sign=WXPay",
"noncestr": "u2e2ZM2zWhmW7FRmrQSnTA9wFRFS6tJZ"
}
3) 通過返回過來的數據來調取微信支付
/** * 處理微信支付 * * @param data */ private void weChatResult(WxPay data) { IWXAPI msgApi = WXAPIFactory.createWXAPI(this, NetConfig.WX_APP_ID); msgApi.registerApp(NetConfig.WX_APP_ID); PayReq req = new PayReq(); req.appId = data.getAppid(); req.partnerId = data.getPartnerid(); req.prepayId = data.getPrepayid(); req.nonceStr = data.getNoncestr(); req.timeStamp = data.getTimestamp(); req.packageValue = data.getPkg(); req.sign = data.getSign(); req.extData = "app data"; // optional dialog.setMessage("正常調起支付"); // 在支付之前,如果應用沒有註冊到微信,應該先調用IWXMsg.registerApp將應用註冊到微信 msgApi.sendReq(req); // dialog的銷燬 /*new Handler().postDelayed(new Runnable() { @Override public void run() { dialog.dismiss(); } }, 3000);*/ }
4) 調取微信支付然後跳轉到微信進行支付
5) 接收微信支付的返回碼(String)
1、”0” 支付成功
2、”-1” 可能的原因:簽名錯誤、未註冊APPID、項目設置APPID不正確、註冊的APPID與設置的不匹配、其他異常等。
3、”-2” 支付取消
6)當接收到返回碼爲”0”時,這個就是支付成功,這裏需要做的操作是調取自己服務器的驗證接口,然後進行驗證支付成功。(微信和支付寶支付相似,當客戶支付成功後只是在微信服務器上邊支付成功,但是沒有在app本地服務器上邊支付成功,只有當客戶端調取服務端支付成功,服務端再調取微信的接口,兩者之間進行驗證纔可支付成功)
Android開發要點說明
1、後臺設置
商戶在微信開放平臺申請開發應用後,微信開放平臺會生成APP的唯一標識APPID。由於需要保證支付安全,需要在開放平臺綁定商戶應用包名和應用簽名,設置好後才能正常發起支付。設置界面在【開放平臺】中的欄目【管理中心 / 修改應用 / 修改開發信息】裏面,如圖8.8紅框內所示。
圖8.8
應用包名:是在APP項目配置文件AndroidManifest.xml中聲明的package值,例如DEMO中的package="net.sourceforge.simcpux"。
應用簽名:根據項目的應用包名和編譯使用的keystore,可由簽名工具生成一個32位的md5串,在調試的手機上安裝簽名工具後,運行可生成應用簽名串,如圖8.9所示,綠色串即應用簽名。簽名工具下載地址https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk
圖8.9
基本步驟如上,然後來說下微信支付的配置
1)WXPayEntryActivity 這個activity 是接收微信支付結果的界面,這個界面必須在包名下的 wxapi 包裏邊,如:
也只有這樣放的位置纔可,另在AndroidManifest.xml配置文件中配置:
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"/>
2)在WXPayEntryActivity的onResp方法中將接收到的返回碼 errCode傳遞到支付界面
3)在支付界面PayActivity 接收返回碼:
4)如支付成功調服務器的驗證支付接口即可(不調驗證的話服務器端的支付狀態還是未支付,這樣建議就不會成功)
總結難點:
1) 在微信上邊配置簽名,用微信的簽名工具進行簽名
2) WXPayEntryActivity所放的位置
3) WXPayEntryActivity接收的errCode返回到支付界面(這裏用的是EventBus傳遞,也可用通知)
4) 支付界面獲取到errCode後進行驗證
5) 微信支付還與後臺有關,主要是得後臺返回的數據是正確的,如果返回的數據不正確,就根本調不起微信的。 送給開發安卓的小夥伴們