一:介紹
支付之前,在網上也查尋了資料, 支付接入坑太多,微信坑最多,api文檔太複雜。
二:交互流程
建議先把開發文檔仔仔細細看一遍,一定要看,剛開始的時候沒有老老實實地看完,結果遇到很多的坑,浪費的挺多的時間的,所以建議一定要好好看看,特別是交互流程這一部分。
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>
- 1
- 2
- 3
- 4
和權限聲明:
<uses android:name="android.permission.INTERNET">
<uses android:name="android.permission.ACCESS_NETWORK_STATE">
<uses android:name="android.permission.ACCESS_WIFI_STATE">
<uses android:name="android.permission.READ_PHONE_STATE">
<uses android:name="android.permission.WRITE_EXTERNAL_STORAGE">
- 1
- 2
- 3
- 4
- 5
六:添加混淆規則
在商戶應用工程的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 *;}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
第一行中的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> 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();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 在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>) 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();
}
}
}
};