首先奉上調(diào)起支付頁面截圖
一:介紹
項(xiàng)目中要用到支付功能通今,需要支付寶支付爆班、微信支付矩乐、銀聯(lián)支付,所以打算總結(jié)一下傀蚌,方便以后的查閱,也方便大家蘸吓, 用到的地方避免再次被坑善炫。
今天我們就主要介紹一下支付寶支付,其他支付也給出了對(duì)應(yīng)的連接美澳。
在做支付之前销部,在網(wǎng)上也查尋了資料摸航,大多都說制跟,支付接入坑太多舅桩,微信坑最多,銀聯(lián)文檔太復(fù)雜雨膨。
其實(shí)如果接入的多的話擂涛,那些套路都可以繞著走。
網(wǎng)上的經(jīng)驗(yàn)什么的大都是比較老的聊记,比較新的能用到的文章不多(但是好文章還是有的撒妈,對(duì)我?guī)椭埠艽螅旅娼o大家詳細(xì)介紹一下排监,幫助大家繞開坑狰右。
二:交互流程
建議先把開發(fā)文檔仔仔細(xì)細(xì)看一遍,一定要看舆床,剛開始的時(shí)候沒有老老實(shí)實(shí)地看完棋蚌,結(jié)果遇到很多的坑,浪費(fèi)的挺多的時(shí)間的挨队,所以建議一定要好好看看谷暮,特別是交互流程這一部分。
2.1 功能流程
1.第4步:調(diào)用支付接口:此消息就是本接口所描述的開發(fā)包提供的支付對(duì)象PayTask盛垦,將商戶簽名后的訂單信息傳進(jìn)pay方法喚起支付寶收銀臺(tái)湿弦,訂單格式具體參見“請(qǐng)求參數(shù)說明”。
2.第5步:支付請(qǐng)求:手機(jī)支付寶支付開發(fā)包將會(huì)按照商戶客戶端提供的請(qǐng)求參數(shù)發(fā)送支付請(qǐng)求腾夯。
3.第8步:接口返回支付結(jié)果:商戶客戶端在第4步中調(diào)用的支付接口颊埃,會(huì)返回最終的支付結(jié)果(即同步通知),參見“同步通知參數(shù)說明”蝶俱。
4.第12步:異步發(fā)送支付通知:手機(jī)支付寶支付服務(wù)器端發(fā)送異步通知消息給商戶服務(wù)器端(備注:第12步一定發(fā)生在第6步之后班利,但不一定晚于7~11步),參見“服務(wù)器異步通知參數(shù)說明”跷乐。
2.2 數(shù)據(jù)交互
支付寶支付的功能流程相比較微信支付來說簡單的很肥败,如上面兩張圖展示的,我們的App(也就是商戶客戶端)所做的大概只有三個(gè)步驟:
生成訂單
調(diào)用支付寶接口愕提,發(fā)送訂單
返回訂單支付結(jié)果并處理
三:下載支付寶SDK
支付寶業(yè)務(wù)眾多馒稍,真想找到想要的支付sdk還是要費(fèi)一番功夫的,這里給出了最新的sdk地址(注意的是下載出來的SDK包里面并沒有傳說中的開發(fā)文檔浅侨,需要其他地方找或者看網(wǎng)頁上的)纽谒。
想要接入支付寶移動(dòng)支付功能,必須在支付寶商家服務(wù)平臺(tái)進(jìn)行申請(qǐng)與審核如输。移動(dòng)支付功能需要企業(yè)或者個(gè)體工商戶進(jìn)行申請(qǐng)鼓黔,審核通過之后方可使用央勒。
如何與支付寶簽約并審核請(qǐng)參考官方文檔:移動(dòng)支付-接入指南,里面詳細(xì)介紹了產(chǎn)品簽約與審核流程澳化。并且詳細(xì)介紹了申請(qǐng)成功之后如何查看或生成必要的一些配置參數(shù)崔步。
四:導(dǎo)入開發(fā)SDK
4.1 如果項(xiàng)目開發(fā)使用的Eclipse軟件,導(dǎo)入步驟如下:
1.將alipaySDK-20150602.jar包放入商戶應(yīng)用工程的libs目錄下缎谷,如下圖井濒。
2.進(jìn)入商戶應(yīng)用工程的Java Build Path,將libs目錄下的alipaySDK-20150602.jar導(dǎo)入列林,如下圖瑞你。
3.選中Order and Export,勾選alipaySDK-20150602.jar希痴,如下圖者甲。
4.2 如果項(xiàng)目開發(fā)使用的Android Studio軟件,導(dǎo)入步驟如下:
1.將支付寶SDK拷貝到項(xiàng)目libs文件夾下砌创,如果沒有l(wèi)ibs文件夾虏缸,就新建一個(gè)。
2.如果sdk使用過程中纺铭,提示找不到文件寇钉。
進(jìn)行如下操作,選中sdk文件舶赔,右擊選擇Reveal in Finder
五:修改AndroidManifest.xml配置
1.在商戶應(yīng)用工程的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>
和權(quán)限聲明:
<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" />
六:添加混淆規(guī)則
在商戶應(yīng)用工程的proguard-project.txt里添加以下相關(guān)規(guī)則:
-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是此版本發(fā)布的日期,注意將其修改為你導(dǎo)入的Jar的相應(yīng)的文件名竟纳。
到這里撵溃,支付寶支付的前期配置已經(jīng)完成,下面需要完成支付代碼編寫锥累。
七:支付接口調(diào)用
- 在點(diǎn)擊支付按鈕的點(diǎn)擊事件中缘挑,我提供的是從后端獲取訂單字符串,然后調(diào)用支付寶接口桶略,調(diào)起支付语淘。
- 需要在新線程中調(diào)用支付接口。代碼如下:
// 支付按鈕
public void onClick(View view) {
//起一個(gè)線程
Runnable payRunnable = new Runnable() {
@Override
public void run() {
String data = null;
PayBean payBean = new PayBean();
payBean.setOrderTime("");
String json = new Gson().toJson(payBean);
//json為獲取后端結(jié)果時(shí)需要提供給后端訂單信息际歼,例如:時(shí)間惶翻、金額、訂單屬性等
Log.i("charge request", json);
try {
//data為后端返回?cái)?shù)據(jù)鹅心,其中包括訂單字符串
data = postJson(CHARGE_URL, json);
} catch (IOException e) {
e.printStackTrace();
}
// Json解析data
ChargeBean charge = new Gson().fromJson(data, ChargeBean.class);
//獲取調(diào)起支付所需要的字符串credential
String credential = (String) charge.getResult().getCredential();
// 調(diào)起支付界面
PayTask alipay = new PayTask(ThirdActivity.this);
Map<String, String> result = alipay.payV2(credential, true);
//在mHandler中處理支付寶返回結(jié)果
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
// 必須異步調(diào)用
Thread payThread = new Thread(payRunnable);
payThread.start();
}
- 在mHandler中處理支付結(jié)果
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);
/**
對(duì)于支付結(jié)果吕粗,請(qǐng)商戶依賴服務(wù)端的異步通知結(jié)果。同步通知結(jié)果旭愧,僅作為支付結(jié)束的通知颅筋。
*/
String resultInfo = payResult.getResult();// 同步返回需要驗(yàn)證的信息
String resultStatus = payResult.getResultStatus();
// 判斷resultStatus 為“9000”則代表支付成功宙暇,具體狀態(tài)碼代表含義可參考接口文檔
if (resultStatus.equals("9000")) {
Toast.makeText(ThirdActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
}else if (resultStatus.equals("4000")){
// 4000為支付失敗,包括用戶主動(dòng)取消支付议泵,或者系統(tǒng)返回的錯(cuò)誤
Toast.makeText(ThirdActivity.this, "支付失敗", Toast.LENGTH_SHORT).show();
}else if (resultStatus.equals("6001")){
// 6001為取消支付占贫,或者系統(tǒng)返回的錯(cuò)誤
Toast.makeText(ThirdActivity.this, "取消支付", Toast.LENGTH_SHORT).show();
}else if (resultStatus.equals("8000")) {
// "8000"代表支付結(jié)果因?yàn)橹Ц肚涝蚧蛘呦到y(tǒng)原因還在等待支付結(jié)果確認(rèn),最終交易是否成功以服務(wù)端異步通知為準(zhǔn)(小概率狀態(tài))
Toast.makeText(ThirdActivity.this, "支付結(jié)果確認(rèn)中", Toast.LENGTH_SHORT).show();
}else {
// 其他為系統(tǒng)返回的錯(cuò)誤
Toast.makeText(ThirdActivity.this, "支付錯(cuò)誤", Toast.LENGTH_SHORT).show();
}
}
}
};
以下四種為常用結(jié)果判斷
9000為支付成功
4000為支付失敗
6001為取消支付
8000為支付結(jié)果確認(rèn)中