項目中要用到支付功能,須要支付寶支付、微信支付、銀聯支付,因此打算總結一下,方便之後的查閱,也方便你們, 用到的地方避免再次被坑。 今天咱們就主要介紹一下支付寶支付,其餘支付也給出了對應的鏈接。android
在作支付以前,在網上也查尋了資料,大多都說,支付接入坑太多,微信坑最多,銀聯文檔太複雜。 其實若是接入的多的話,那些套路均可以繞着走。 網上的經驗什麼的大都是比較老的,比較新的能用到的文章很少(可是好文章仍是有的,對我幫助也很大),下面給你們詳細介紹一下,幫助你們繞開坑。git
建議先把開發文檔仔仔細細看一遍,必定要看,剛開始的時候沒有老老實實地看完,結果遇到不少的坑,浪費的挺多的時間的,因此建議必定要好好看看,特別是交互流程這一部分。github
1.第4步:調用支付接口:此消息就是本接口所描述的開發包提供的支付對象PayTask,將商戶簽名後的訂單信息傳進pay方法喚起支付寶收銀臺,訂單格式具體參見「請求參數說明」。 2.第5步:支付請求:手機支付寶支付開發包將會按照商戶客戶端提供的請求參數發送支付請求。 3.第8步:接口返回支付結果:商戶客戶端在第4步中調用的支付接口,會返回最終的支付結果(即同步通知),參見「同步通知參數說明」。 4.第12步:異步發送支付通知:手機支付寶支付服務器端發送異步通知消息給商戶服務器端(備註:第12步必定發生在第6步以後,但不必定晚於7~11步),參見「服務器異步通知參數說明」。json
支付寶支付的功能流程相比較微信支付來講簡單的很,如上面兩張圖展現的,咱們的App(也就是商戶客戶端)所作的大概只有三個步驟:後端
生成訂單 調用支付寶接口,發送訂單 返回訂單支付結果並處理服務器
支付寶業務衆多,真想找到想要的支付sdk仍是要費一番功夫的,這裏給出了最新的sdk地址(注意的是下載出來的SDK包裏面並無傳說中的開發文檔,須要其餘地方找或者看網頁上的)。微信
想要接入支付寶移動支付功能,必須在支付寶商家服務平臺進行申請與審覈。移動支付功能須要企業或者個體工商戶進行申請,審覈經過以後方可以使用。 如何與支付寶簽約並審覈請參考官方文檔:移動支付-接入指南,裏面詳細介紹了產品簽約與審覈流程。而且詳細介紹了申請成功以後如何查看或生成必要的一些配置參數。markdown
1.將alipaySDK-20150602.jar包放入商戶應用工程的libs目錄下,以下圖。app
2.進入商戶應用工程的Java Build Path,將libs目錄下的alipaySDK-20150602.jar導入,以下圖。異步
3.選中Order and Export,勾選alipaySDK-20150602.jar,以下圖。
1.將支付寶SDK拷貝到項目libs文件夾下,若是沒有libs文件夾,就新建一個。
2.若是sdk使用過程當中,提示找不到文件。 進行以下操做,選中sdk文件,右擊選擇Reveal in Finder
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();
}
複製代碼
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技術乾貨等待領取,全部文檔會持續更新,歡迎關注一塊兒成長!
但願能夠幫助你們
若是哪裏有什麼不對或者不足的地方,還望讀者多多提意見或建議
如需轉載請聯繫我,通過受權方可轉載,謝謝
本篇已同步到我的博客:FBY展菲