上一篇,我們已經(jīng)詳細講解了Android微信支付,今天接著為大家?guī)碇Ц秾氈Ц叮Ц秾氈Ц断鄬ξ⑿胖Ц兑唵我恍┳还梗虏垡幌拢抑Ц秾毼臋n確實比微信的文檔好了不少框都,下面開始講解支付流程搬素。
1、首先給出官方文檔的地址
Android集成支付寶流程
2、在開始集成和開發(fā)前熬尺,首先了解一下常用的接入方式和架構建議:
在開始下一步之前摸屠,給大家看看網(wǎng)上的很多操作.
這一大堆代碼,后面還有猪杭,百來行吧餐塘,而且支付寶Demo貌似也是這么干的,估計一些新司機就有點懵逼了皂吮,至于嗎戒傻?集成一個第三方的,不應該是調(diào)用越簡潔越好嗎蜂筹,而且還是大廠的第三方需纳,不應該啊艺挪?所以不翩,筆者有必要出面說明一下,那些老司機麻裳,你們弄好了口蝠,也不能這么嚇唬新司機啊,說正經(jīng)的津坑,網(wǎng)上代碼那么長妙蔗,是因為他們在本地區(qū)生成的訂單簽名,這個訂單簽名也就是一個字符串疆瑰,他由訂單信息眉反,支付金額,訂單號穆役,商戶信息等拼接起來的
下面是APP支付請求所需的參數(shù)
APP支付請求所需的參數(shù)
然而筆者告訴你寸五,這一大堆,你并不需要耿币,你只要了解一下就行了梳杏。因為實際開發(fā)中幾乎都是在服務器端生成支付的訂單簽名和訂單信息,因為在后臺的安全性比前端要好掰读,在APP生成秘狞,危險性很高,如果你們后臺大哥不給你弄蹈集,讓你自己生成烁试,我建議你找他喝點小酒,嘮嘮嗑拢肆,好好說說减响,他估計就同意了靖诗。所以網(wǎng)上那種寫一大堆代碼的,實際上是在本地去生成簽名
接下來的事情嘛支示,就比較簡單了刊橘,
3、清單文件做如下配置
<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" />
<activity
android:name="com.alipay.sdk.app.H5PayActivity"
android:configChanges="orientation|keyboardHidden|navigation|screenSize"
android:exported="false"
android:screenOrientation="behind"
android:windowSoftInputMode="adjustResize|stateHidden" />
<activity
android:name="com.alipay.sdk.app.H5AuthActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind"
android:windowSoftInputMode="adjustResize|stateHidden" />
4颂鸿、請求自己服務器促绵,獲取訂單簽名字符串,然后調(diào)用支付寶SDK嘴纺,發(fā)起支付請求
/**
* 顯示支付寶簽名
*
* @param aliPayBean 自己服務器返回的訂單簽名字符串
*/
public void aliPayData(AliPayBean aliPayBean) {
//支付寶支付請求所需的簽名字符串
final String orderInfo = aliPayBean.getResult().getMessage();
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(PaymentActivity.this);
Map<String, String> result = alipay.payV2(orderInfo, true);
Log.i("msp", result.toString());
Message msg = new Message();
msg.what = SDK_ALI_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
// 必須異步調(diào)用
Thread payThread = new Thread(payRunnable);
payThread.start();
}
5败晴、支付寶支付結(jié)果的回調(diào)
//支付寶返回數(shù)據(jù)handler
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
@SuppressWarnings("unused")
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_ALI_PAY_FLAG: {
@SuppressWarnings("unchecked")
PayResult payResult = new PayResult((Map<String, String>) msg.obj);
/**
對于支付結(jié)果,請商戶依賴服務端的異步通知結(jié)果栽渴。同步通知結(jié)果尖坤,僅作為支付結(jié)束的通知。
*/
String resultInfo = payResult.getResult();// 同步返回需要驗證的信息
String resultStatus = payResult.getResultStatus();
String result = "";
// 判斷resultStatus 為9000則代表支付成功
Log.i(TAG, resultStatus);
if (TextUtils.equals(resultStatus, "9000")) {
//支付成功
result = "支付成功";
aliPaySuccess();
} else if ("6001".equals(resultStatus)) {
result = "您取消了支付";
} else {
// 該筆訂單真實的支付結(jié)果闲擦,需要依賴服務端的異步通知慢味。
result = "支付失敗";
}
ToastUtils.showToast(mContext, result);
break;
}
}
}
};
注意:這里支付成功,我只是以客戶端作為標準墅冷,實際傳支付結(jié)果纯路,最好以服務端為標準,我們調(diào)用支付寶支付的時候寞忿,支付寶會有2個回調(diào)感昼,一個是APP的回調(diào),就是我們上面這個罐脊,9000代表支付成功,一個是支付寶服務器通知我們自己的服務器蜕琴,所以萍桌,我們自己的服務器也有個回調(diào)。所以APP可以請求后臺的接口來獲取支付結(jié)果凌简。