一:介紹
專案中要用到支付功能,需要支付寶支付、微信支付、銀聯支付,所以打算總結一下,方便以後的查閱,也方便大家, 用到的地方避免再次被坑。 今天我們就主要介紹一下支付寶支付,其他支付也給出了對應的連線。
在做支付之前,在網上也查尋了資料,大多都說,支付接入坑太多,微信坑最多,銀聯文件太複雜。 其實如果接入的多的話,那些套路都可以繞著走。 網上的經驗什麼的大都是比較老的,比較新的能用到的文章不多(但是好文章還是有的,對我幫助也很大),下面給大家詳細介紹一下,幫助大家繞開坑。
二:互動流程
建議先把開發文件仔仔細細看一遍,一定要看,剛開始的時候沒有老老實實地看完,結果遇到很多的坑,浪費的挺多的時間的,所以建議一定要好好看看,特別是互動流程這一部分。
2.1 功能流程
1.第4步:呼叫支付介面:此訊息就是本介面所描述的開發包提供的支付物件PayTask,將商戶簽名後的訂單資訊傳進pay方法喚起支付寶收銀臺,訂單格式具體參見“請求引數說明”。 2.第5步:支付請求:手機支付寶支付開發包將會按照商戶客戶端提供的請求引數傳送支付請求。 3.第8步:介面返回支付結果:商戶客戶端在第4步中呼叫的支付介面,會返回最終的支付結果(即同步通知),參見“同步通知引數說明”。 4.第12步:非同步傳送支付通知:手機支付寶支付伺服器端傳送非同步通知訊息給商戶伺服器端(備註:第12步一定發生在第6步之後,但不一定晚於7~11步),參見“伺服器非同步通知引數說明”。
2.2 資料互動
支付寶支付的功能流程相比較微信支付來說簡單的很,如上面兩張圖展示的,我們的App(也就是商戶客戶端)所做的大概只有三個步驟:
生成訂單 呼叫支付寶介面,傳送訂單 返回訂單支付結果並處理
三:下載支付寶SDK
支付寶業務眾多,真想找到想要的支付sdk還是要費一番功夫的,這裡給出了最新的sdk地址(注意的是下載出來的SDK包裡面並沒有傳說中的開發文件,需要其他地方找或者看網頁上的)。
想要接入支付寶移動支付功能,必須在支付寶商家服務平臺進行申請與稽核。移動支付功能需要企業或者個體工商戶進行申請,稽核通過之後方可使用。 如何與支付寶簽約並稽核請參考官方文件:移動支付-接入指南,裡面詳細介紹了產品簽約與稽核流程。並且詳細介紹了申請成功之後如何檢視或生成必要的一些配置引數。
四:匯入開發SDK
4.1 如果專案開發使用的Eclipse軟體,匯入步驟如下:
1.將alipaySDK-20150602.jar包放入商戶應用工程的libs目錄下,如下圖。
2.進入商戶應用工程的Java Build Path,將libs目錄下的alipaySDK-20150602.jar匯入,如下圖。
3.選中Order and Export,勾選alipaySDK-20150602.jar,如下圖。
4.2 如果專案開發使用的Android Studio軟體,匯入步驟如下:
1.將支付寶SDK拷貝到專案libs資料夾下,如果沒有libs資料夾,就新建一個。
2.如果sdk使用過程中,提示找不到檔案。 進行如下操作,選中sdk檔案,右擊選擇Reveal in Finder
五:修改AndroidManifest.xml配置
1.在商戶應用工程的AndroidManifest.xml檔案裡面新增宣告:
<activity
android:name="com.alipay.sdk.app.H5PayActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind" >
</activity>
<activity
android:name="com.alipay.sdk.auth.AuthActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind" >
</activity>
複製程式碼
和許可權宣告:
<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" />
複製程式碼
六:新增混淆規則
在商戶應用工程的proguard-project.txt裡新增以下相關規則:
-libraryjars libs/alipaySDK-20150602.jar
-keep class com.alipay.android.app.IAlixPay{*;}
-keep class com.alipay.android.app.IAlixPay$Stub{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
-keep class com.alipay.sdk.app.PayTask{ public *;}
-keep class com.alipay.sdk.app.AuthTask{ public *;}
複製程式碼
第一行中的alipaySDK-20150602.jar,其中20150602是此版本釋出的日期,注意將其修改為你匯入的Jar的相應的檔名。
到這裡,支付寶支付的前期配置已經完成,下面需要完成支付程式碼編寫。
七:支付介面呼叫
- 在點選支付按鈕的點選事件中,我提供的是從後端獲取訂單字串,然後呼叫支付寶介面,調起支付。
- 需要在新執行緒中呼叫支付介面。程式碼如下:
// 支付按鈕
public void onClick(View view) {
//起一個執行緒
Runnable payRunnable = new Runnable() {
@Override
public void run() {
String data = null;
PayBean payBean = new PayBean();
payBean.setOrderTime("");
String json = new Gson().toJson(payBean);
//json為獲取後端結果時需要提供給後端訂單資訊,例如:時間、金額、訂單屬性等
Log.i("charge request", json);
try {
//data為後端返回資料,其中包括訂單字串
data = postJson(CHARGE_URL, json);
} catch (IOException e) {
e.printStackTrace();
}
// Json解析data
ChargeBean charge = new Gson().fromJson(data, ChargeBean.class);
//獲取調起支付所需要的字串credential
String credential = (String) charge.getResult().getCredential();
// 調起支付介面
PayTask alipay = new PayTask(ThirdActivity.this);
Map<String, String> result = alipay.payV2(credential, true);
//在mHandler中處理支付寶返回結果
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
// 必須非同步呼叫
Thread payThread = new Thread(payRunnable);
payThread.start();
}
複製程式碼
- 在mHandler中處理支付結果
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == SDK_PAY_FLAG) {
Toast.makeText(ThirdActivity.this, (String) msg.obj,
Toast.LENGTH_LONG).show();
PayResult payResult = new PayResult((Map<String, String>) msg.obj);
/**
對於支付結果,請商戶依賴服務端的非同步通知結果。同步通知結果,僅作為支付結束的通知。
*/
String resultInfo = payResult.getResult();// 同步返回需要驗證的資訊
String resultStatus = payResult.getResultStatus();
// 判斷resultStatus 為“9000”則代表支付成功,具體狀態碼代表含義可參考介面文件
if (resultStatus.equals("9000")) {
Toast.makeText(ThirdActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
}else if (resultStatus.equals("4000")){
// 4000為支付失敗,包括使用者主動取消支付,或者系統返回的錯誤
Toast.makeText(ThirdActivity.this, "支付失敗", Toast.LENGTH_SHORT).show();
}else if (resultStatus.equals("6001")){
// 6001為取消支付,或者系統返回的錯誤
Toast.makeText(ThirdActivity.this, "取消支付", Toast.LENGTH_SHORT).show();
}else if (resultStatus.equals("8000")) {
// "8000"代表支付結果因為支付渠道原因或者系統原因還在等待支付結果確認,最終交易是否成功以服務端非同步通知為準(小概率狀態)
Toast.makeText(ThirdActivity.this, "支付結果確認中", Toast.LENGTH_SHORT).show();
}else {
// 其他為系統返回的錯誤
Toast.makeText(ThirdActivity.this, "支付錯誤", Toast.LENGTH_SHORT).show();
}
}
}
};
複製程式碼
以下四種為常用結果判斷
9000為支付成功 4000為支付失敗 6001為取消支付 8000為支付結果確認中
調起支付頁面截圖
關注 【網羅開發】微信公眾號,網羅天下方法,方便你我開發,更多Android技術乾貨等待領取,所有文件會持續更新,歡迎關注一起成長!
希望可以幫助大家,如有問題可加QQ群: 591625129 交流
如果哪裡有什麼不對或者不足的地方,還望讀者多多提意見或建議
如需轉載請聯絡我,經過授權方可轉載,謝謝
本篇已同步到個人部落格:FBY展菲