android開發第三方App接入微信支付(項目必用,面試必問)

前言

在App中接入微信支付其實很簡單,大部分工作主要都是後臺來完成,客戶端只需要調用後臺,得到後臺返回的字符串後在調用微信的api即可。但是會有些坑,稍不注意就會掉坑裏,下面會講到。

一、接入流程

微信開發平臺上有詳細介紹,這個就不多說了。
交互時序圖
這裏寫圖片描述

商戶系統和微信支付系統主要交互說明:
1.用戶在商戶App中選擇商品,提交訂單,選擇微信支付。
2商戶後臺收到用戶支付單,調用微信支付統一下單接口(後臺處理,客戶端不需要做)。
3統一下單接口返回正常的prepay_id,再按簽名規範重新生成簽名後,將數據傳輸給App。參與簽名的字段爲appid,partnerid,paepayid,nonceStr,timeStamp,package.注意:package的值格式爲Sign=WXPay。客戶端拿到這些字段後就可以發起支付了。

二.APP端開發步驟

1.導入sdk包。微信支付SDK包
2.在調用api之前需要向微信註冊你的appid,代碼如下:

{ IWXAPI api; api= WXAPIFactory.createWXAPI(this, null); IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
//xxx爲你的appid
msgApi.registerApp("xxx");}

3.調用微信api
調後臺接口,將後臺返回的字段做如下處理:

{ PayReq req = new PayReq();
req.packageValue = "package"; req.sign = "sign"; req.timeStamp = "timestamp"; req.appId = "appid"; req.nonceStr = "noncestr"; req.partnerId = "partnerid"; req.prepayId = "prepayid"; api.sendReq(req); }

這些字段最好是在後臺獲取,不要放在本地。

4.在androidManifest.xml中配置以下權限:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

開發者可參考微信支付官方Demo

5.支付結果回調
參照微信支付demo,在net.sourceforge.simcpux.wxapi包路徑中實現
WXPayEntryActivity類(包名或類名不一致會造成無法回調),在WXPayEntryActivity類中實現onResp函數,支付完成後,微信App會返回到商戶App中並回調onResp函數,開發者需要在該函數中接收通知,判斷返回錯誤碼,如果支付成功則去後臺查詢支付結果再展示用戶實際支付結果。注意一定不能以客戶端返回作爲用戶支付的結果,應以服務器端的接收的支付通知或查詢API返回的結果爲準。代碼示例如下:

publicvoidonResp(BaseRespresp){ if(resp.getType()==ConstantsAPI.COMMAND_PAY_BY_WX){ Log.d(TAG,"onPayFinish,errCode="+resp.errCode); AlertDialog.Builderbuilder=newAlertDialog.Builder(this); builder.setTitle(R.string.app_tip); }

然後再配置文件中註冊WXPayEntryActivity

<activity android:name=".wxapi.WXPayEntryActivity" android:label="@string/app_name" android:exported="true" android:launchMode= "singleTop" />

返回值:
0:成功
-1:失敗,可能原因:簽名錯誤、未註冊APPID 項目設置APPID不正確、註冊的APPID與設置的不匹配、其他異常等。
–2:用戶取消,無需處理。發生場景:用戶不支付了,點擊取消,返回App。

三.開發中遇到的問題

1 回調結果返回-1,首先檢查appid是否正確,然後就是簽名問題了,app的簽名必須是正式打包好的簽名,而且必須和微信開放平臺填的一樣。
這裏寫圖片描述
應用簽名的keystory要固定,否則簽名會不一樣。
安裝打包好的apk就可以調用微信了但是在編譯器run的時候卻又還是返回-1,這是因爲編譯器run的是debug版的簽名,和正式的不一樣,當然會錯了。但是每次調試都要打包一次嗎?這豈不是很麻煩,其實只要在build.grade配置幾行代碼即可搞定:

signingConfigs{ release{storeFile file(“C:/Users/dell/Desktop/xxx.jks”) //該路徑爲keystore的保存路徑 //以下3個根據你的keystore自行配置 storePassword “xxx” keyAlias “xxx” keyPassword “xxx”}
buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’} debug{ signingConfig signingConfigs.release}

這樣一來就可直接run了,非常方便調試。

2回調類名和包名

回調類名必須是WXPayEnteryActivity,而且在該類中要實現WXAPIEventHandler接口
包名必須是你app包名+wxapi。例如com.test.main.wxapi
WXPayEnterActivity必須放到該路徑下。
如果與上述條件不一致很可能造成支付後無法回調。如果你不想回調,那麼上述包名和類名可不創建,微信支付後會默認返回當前支付的頁面。如果想要支付成功後跳轉到別的頁面,那麼則要創建。
源碼地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章