Android--快速接入微信支付
前言
最近實習的時候要求我做支付模塊,主要是介入支付寶支付和微信支付的。支付寶支付接入相對來說比較好做,官網文檔也比較容易懂。但是做微信支付的時候,官網文檔就有點懵逼了,不過慢慢讀還是能夠開通的。與是抽時間記錄一下微信支付接入的過程。
這里我不去說明AppID申請的過程,主要記錄一下開發過程。
微信支付
首先一定要清楚微信支付業務流程,這樣接下來就事半功倍了。
主要官方文檔看這:
- 業務流程
- APP端開發步驟
- Android資源下載
- API列表
業務流程如下:
微信支付業務流程
這里我大致用自己的理解把App客戶端的流程分為四步。
1、統一下單
商戶系統先調用該接口在微信支付服務后臺生成預支付交易單,返回正確的預支付交易回話標識后再在APP里面調起支付。
客戶端將支付信息上傳給公司服務端。首先根據具體公司的需求,上傳支付信息給服務端,然后接收服務端還回結果。我們客戶端只需要發送相應的請求提給服務端即可。
更多具體內容參考微信APP支付文檔-統一下單
2、調起支付接口
APP端調起支付的參數列表
根據前一步得到的還回結果跳轉至微信客戶端進行支付操作
3、用戶進行微信支付操作
進入微信支付頁面后可以能會有:輸入密碼支付,取消支付,支付失敗等操作
4、微信客戶端回調支付結果詳情給我們的APP客戶端
完整示例
1、引入微信支付資源
1、引入微信支付依賴
在build.gradle文件中,添加如下依賴即可:
dependencies {compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+' }詳情參考Android資源下載
2、配置WXPayEntryActivity
1、首先我們下載下來官網的demo然后copy其中的一個WXPayEntryActivity類放到 app包下新建一個wxapi包 里面。
注意是WXPayEntryActivity不是WXEntryActivity,WXEntryActivity是微信分享的, WXPayEntryActivity才是支付的
這個頁面是在你調起微信支付完成支付(或取消或失敗)后,再回到你的App時會調用的一個頁面。請務必保證在你項目下他的結果目錄為:
開放平臺綁定的商戶應用包名 + wxapi + WXPayEntryActivity
開放平臺綁定的商戶應用包名
2、AndroidManifest.xml中注冊
<!--wx pay所需權限--><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><!--wx pay--><activityandroid:name=".wxapi.WXPayEntryActivity"android:exported="true"android:launchMode="singleTop"/>3、發送支付信息給服務端
跟服務端協調需要我們客戶端傳遞什么信息過去。詳細請求參數參考API列表-統一下單
我這里,只需要傳遞一些和服務端協商好的數據,其他金額等都是在服務端處理好的。然后服務端還回預支付交易給我們客戶端
3、跳轉微信進行支付
根據上面獲取到的服務端的還回數據,調起微信支付,代碼實例如下:
@Overridepublic void wxpay(Context context, WXPayRsp wxPayRsp, IPayListener iPayListener) {this.iPayListener = iPayListener;IWXAPI api= WXAPIFactory.createWXAPI(context, Constants.APP_ID);api.registerApp(Constants.APP_ID);PayReq payReq=new PayReq();payReq.appId=Constants.APP_ID;payReq.partnerId=wxPayRsp.getPartnerid();payReq.prepayId=wxPayRsp.getPrepayid();payReq.packageValue="Sign=WXPay";payReq.nonceStr=wxPayRsp.getNoncestr();payReq.timeStamp=wxPayRsp.getTimestamp();payReq.sign=wxPayRsp.getSign();api.sendReq(payReq);}具體請求參數如下:
調起支付接口參數
每次調用微信支付的時候都會校驗 appid 、包名 和 應用簽名的。 這三個必須保持一致才能夠成功調起微信!!! (這個bug害我浪費一下午時間!api.sendReq接口,返回true,但微信客戶端并未啟動,后來產品給后臺的appid和給我的不同才知道錯誤在這)
4、微信客戶端回調支付結果處理
我是直接copy的官網demo里面WXPayEntryActivity類的,然后根據自己的需要刪除了一些不必要的東西。其實我們可以安裝微信官網給的demo和文檔編寫我們自己打WXPayEntryActivity,我的示例如下:
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{private IWXAPI api;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);api = WXAPIFactory.createWXAPI(this, Constants.APP_ID, false);try {api.handleIntent(getIntent(), this);} catch (Exception e) {e.printStackTrace();}}@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);setIntent(intent);api.handleIntent(intent, this);}@Overridepublic void onReq(BaseReq req) {}@Overridepublic void onResp(BaseResp resp) {int result = 0;//有時候支付結果還需要發送給服務器確認支付狀態if (resp.getType()== ConstantsAPI.COMMAND_PAY_BY_WX){if (resp.errCode==0){Toast.makeText(this,"支付成功",Toast.LENGTH_LONG).show();}else if (resp.errCode==-2){Toast.makeText(this,"取消支付",Toast.LENGTH_LONG).show();}else {Toast.makeText(this,"支付失敗",Toast.LENGTH_LONG).show();}finish();}}}errCode說明如下:
| 0 | 成功 | 展示成功頁面 |
| -1 | 錯誤 | 可能的原因:簽名錯誤、未注冊APPID、項目設置APPID不正確、注冊的APPID與設置的不匹配、其他異常等。 |
| -2 | 用戶取消 | 無需處理。發生場景:用戶不支付了,點擊取消,返回APP。 |
填坑日記
卸載重裝微信或者清空數據保平安
- 因為業務調整,公司微信接口改變,加上一些其他app的變更。發現之前明明好好通過支付的,結果出現了問題。還回錯誤為-1。后來換個測試機一搞就通過了,在測試機中引起微信支付失敗的原因竟然是,緩存沒有清空導致的。因為包名是一致,然后我的app里面還是用到了webview內嵌。心里有句mmp不知道當講不當講
- 發正式寶的時候微信開發平臺填寫的簽名改了之后,微信掉不起來,后來同樣卸載微信就好了。這句mmp我一定要講
常見坑位收集
Android微信支付徹底掃坑
Android 微信支付詳解與坑
Android常見問題
作者:Swy2w
鏈接:https://www.jianshu.com/p/f577ab65f731
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
總結
以上是生活随笔為你收集整理的Android--快速接入微信支付的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdoj 1013 Digital Ro
- 下一篇: Android JSON数据与实体类之间