Android集成支付寶支付功能示例
公司項(xiàng)目中需要支付功能,現(xiàn)在支付寶、微信支付很方便,也很多人使用,因此,他們是首選。在此記錄一下支付寶集成過(guò)程,下期為微信支付,敬請(qǐng)期待
首先去支付寶官網(wǎng)下載其最新的Android的SDK集成Dmeo
將支付寶jar包添加項(xiàng)目中
alipaySdk-20160516.jar

可以看到其主要的調(diào)用方法在PayDemoActivity類中,下面為主要支付調(diào)用方法:
/**
* 完整的符合支付寶參數(shù)規(guī)范的訂單信息
*/
final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + getSignType();
Runnable payRunnable = new Runnable() {
@Override
public void run() {
// 構(gòu)造PayTask 對(duì)象
PayTask alipay = new PayTask(PayDemoActivity.this);
// 調(diào)用支付接口,獲取支付結(jié)果
String result = alipay.pay(payInfo, true);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
// 必須異步調(diào)用
Thread payThread = new Thread(payRunnable);
payThread.start();
注意,我們需要異步發(fā)支付請(qǐng)求。可以看到他僅僅需要我們 傳遞好參數(shù)
完整的符合支付寶參數(shù)規(guī)范的訂單信息
這一步,我公司由服務(wù)器返回已經(jīng)處理好的秘鑰,我直接傳遞給支付寶即可
partner="2088101568358171"&seller_id="xxx@alipay.com"&out_trade_no="0819145412-6177"&subject="測(cè)試"&body="測(cè)試測(cè)試"&total_fee="0.01"¬ify_url="http://notify.msp.hk/notify.htm"&service="mobile.securitypay.pay"&payment_type="1"&_input_charset="utf-8"&it_b_pay="30m"&sign="lBBK%2F0w5LOajrMrji7DUgEqNjIhQbidR13GovA5r3TgIbNqv231yC1NksLdw%2Ba3JnfHXoXuet6XNNHtn7VE%2BeCoRO1O%2BR1KugLrQEZMtG5jmJIe2pbjm%2F3kb%2FuGkpG%2BwYQYI51%2BhA3YBbvZHVQBYveBqK%2Bh8mUyb7GM1HxWs9k4%3D"&sign_type="RSA"
請(qǐng)求后,我們講獲得返回值result
resultStatus={9000};memo={};result={partner="2088101568358171"&seller_id="xxx@alipay.com"&out_trade_no="0819145412-6177"&subject="測(cè)試"&body="測(cè)試測(cè)試"&total_fee="0.01"¬ify_url="http://notify.msp.hk/notify.htm"&service="mobile.securitypay.pay"&payment_type="1"&_input_charset="utf-8"&it_b_pay="30m"&success="true"&sign_type="RSA"&sign="hkFZr+zE9499nuqDNLZEF7W75RFFPsly876QuRSeN8WMaUgcdR00IKy5ZyBJ4eldhoJ/2zghqrD4E2G2mNjs3aE+HCLiBXrPDNdLKCZgSOIqmv46TfPTEqopYfhs+o5fZzXxt34fwdrzN4mX6S13cr3UwmEV4L3Ffir/02RBVtU="}
錯(cuò)誤碼
- 9000 -> 訂單支付成功
- 8000 -> 正在處理中
- 4000 -> 訂單支付失敗
- 6001 -> 用戶中途取消
- 6002 ->網(wǎng)絡(luò)連接出錯(cuò)
回調(diào)處理
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
@SuppressWarnings("unused")
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_PAY_FLAG: {
PayResult payResult = new PayResult((String) msg.obj);
/**
* 同步返回的結(jié)果必須放置到服務(wù)端進(jìn)行驗(yàn)證(驗(yàn)證的規(guī)則請(qǐng)看https://doc.open.alipay.com/doc2/
* detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
* docType=1) 建議商戶依賴異步通知
*/
String resultInfo = payResult.getResult();// 同步返回需要驗(yàn)證的信息
String resultStatus = payResult.getResultStatus();
// 判斷resultStatus 為“9000”則代表支付成功,具體狀態(tài)碼代表含義可參考接口文檔
if (TextUtils.equals(resultStatus, "9000")) {
Toast.makeText(PayDemoActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
} else {
// 判斷resultStatus 為非"9000"則代表可能支付失敗
// "8000"代表支付結(jié)果因?yàn)橹Ц肚涝蚧蛘呦到y(tǒng)原因還在等待支付結(jié)果確認(rèn),最終交易是否成功以服務(wù)端異步通知為準(zhǔn)(小概率狀態(tài))
if (TextUtils.equals(resultStatus, "8000")) {
Toast.makeText(PayDemoActivity.this, "支付結(jié)果確認(rèn)中", Toast.LENGTH_SHORT).show();
} else {
// 其他值就可以判斷為支付失敗,包括用戶主動(dòng)取消支付,或者系統(tǒng)返回的錯(cuò)誤
Toast.makeText(PayDemoActivity.this, "支付失敗", Toast.LENGTH_SHORT).show();
}
}
break;
}
default:
break;
}
};
};
至此Android客戶端集成支付寶已經(jīng)完成,是不是So easey!
上面是支付寶Demo的代碼,我自己寫的時(shí)候做了優(yōu)化,畢竟我們集成的支付插件不僅僅只有支付寶,因此需要寫一個(gè)統(tǒng)一支付pay,在此基礎(chǔ)上做好相應(yīng)的封裝,方便后續(xù)的拓展,在此說(shuō)下我的封裝思路。
- 新建一個(gè)IPay借口,里面僅僅只有pay方法
- 新建一個(gè)Pay實(shí)現(xiàn)IPay,重寫pay方法,實(shí)現(xiàn)支付功能,在Pay里面,統(tǒng)一做網(wǎng)絡(luò)請(qǐng)求操作,如需要從服務(wù)器獲取==完整的符合支付寶參數(shù)規(guī)范的訂單信息==,微信一樣需要這樣,因此可以在此類中統(tǒng)一做請(qǐng)求,獲得返回值之后,根據(jù)調(diào)用支付類型,執(zhí)行相應(yīng)pay方法。
- 當(dāng)然也可以建立一個(gè)PayHelper 專門用于實(shí)現(xiàn)各個(gè)支付類型的pay方法,然后在Pay中調(diào)用,減少代碼量
- 我們要新建一個(gè)IPayResultCallBack接口,定義onSuccess、onFail方法,表示支付成功失敗的回調(diào)
- 新建一個(gè)抽象類PayResultCallBack實(shí)現(xiàn)IPayResultCallBack,講onSuceess、onFail放到支付成功/失敗相應(yīng)中,表明支付成功、失敗回調(diào)方法,到時(shí)調(diào)用pay方法是,即要傳遞實(shí)現(xiàn)好的回調(diào)類對(duì)象
支持基本一個(gè)可拓展的支付功能基本搭建完成,剩余的僅僅是需要一個(gè)一個(gè)集成其他支付功能,走的路子任然如此,一個(gè)pay,然后回調(diào)方法里面處理支付結(jié)果?。?!
1、IPay
/**
* 支付接口
* Created by kingpeng on 16/5/19.
*/
public interface IPay {
void pay(int payType,String orderInfo);
}
2、Pay
/**
* 支付工具類
* Created by kingpeng on 16/5/19.
*/
public class Pay implements IPay {
private Activity mContext;
private MyCallback mCallback = new MyCallback();
private int mPayType;
private PayHelper mPayHelper;
private IPayResultCallback mPayResultCallback;
public Pay(Activity context, IPayResultCallback payResultCallback) {
mContext = context;
mPayResultCallback = payResultCallback;
mPayHelper = new PayHelper();
}
@Override
public void pay(int payType, String orderInfo) {
mPayType = payType;
ReqParam param = new ReqParam();
param.setAlertProgressDialog(mContext, true);
param.put("orderInfo", orderInfo);
param.put("payway", payType);
RequestUtil.getInstance().postApi3(R.string.payment_app_require, param, mCallback);
}
/**
* 支付寶支付
*
* @param payInfo
*/
private void aliPay(final String payInfo) {
mPayHelper.aliPay(mContext, payInfo, mPayResultCallback);
}
private class MyCallback extends ReqCallbackIml {
@Override
public void onSuccess(int action, String response) {
switch (action) {
case R.string.payment_app_require:
PayParseBean bean = (PayParseBean) GsonUtil.jsonToBean(response, PayParseBean.class);
if (bean != null && bean.errcode == 0) {
switch (mPayType) {
case 1:
//請(qǐng)求支付寶
aliPay(bean.signStr);
break;
case 2:
//ToDo 請(qǐng)求微信
break;
}
} else {
ToastUtils.showDefaultToastCenter(mContext.getApplicationContext(), "獲取訂單信息失敗");
}
break;
}
}
@Override
public void onFail(int action, Throwable e) {
ToastUtils.showDefaultToastCenter(mContext.getApplicationContext(), "獲取訂單信息失敗");
}
}
3、PayHelper
/**
* 支付幫助類
* Created by kingpeng on 16/5/19.
*/
public class PayHelper {
public PayHelper() {
}
/**
* 支付寶支付
*
* @param activity
* @param payInfo
*/
public void aliPay(Activity activity, String payInfo, IPayResultCallback payResultCallback) {
new AlipayTask(activity, payInfo, payResultCallback).execute();
}
private class AlipayTask extends AsyncTask<String, Integer, String> {
private Activity mContext;
private String mPayInfo;
private IPayResultCallback mPayResultCallback;
public AlipayTask(Activity context, String payInfo, IPayResultCallback payResultCallback) {
super();
mContext = context;
mPayInfo = payInfo;
mPayResultCallback = payResultCallback;
}
@Override
protected String doInBackground(String... params) {
// 構(gòu)造PayTask 對(duì)象
PayTask alipay = new PayTask(mContext);
// 調(diào)用支付接口,獲取支付結(jié)果
String result = alipay.pay(mPayInfo, true);
return result;
}
@Override
protected void onPostExecute(String result) {
mPayResultCallback.payResult(result, Constants.PAY_ALIPAY);
}
}
4、PayResultCallbackImpl
/**
* 支付結(jié)果回調(diào)
* Created by kingpeng on 16/5/19.
*/
public abstract class PayResultCallbackImpl implements IPayResultCallback {
public void payResult(String result, int payType) {
switch (payType) {
case Constants.PAY_ALIPAY:
aliPayResult(result, payType);
break;
case Constants.PAY_WX:
wxPayResult(result, payType);
break;
}
}
/**
* 支付寶支付結(jié)果
*
* @param result
* @param payType
*/
private void aliPayResult(String result, int payType) {
PayResult payResult = new PayResult(result);
/**
* 同步返回的結(jié)果必須放置到服務(wù)端進(jìn)行驗(yàn)證(驗(yàn)證的規(guī)則請(qǐng)看https://doc.open.alipay.com/doc2/
* detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
* docType=1) 建議商戶依賴異步通知
*/
String resultInfo = payResult.getResult();// 同步返回需要驗(yàn)證的信息
String resultStatus = payResult.getResultStatus();
// 判斷resultStatus 為“9000”則代表支付成功,具體狀態(tài)碼代表含義可參考接口文檔
if (TextUtils.equals(resultStatus, "9000")) {
onPaySuccess(result, payType);
} else {
// 判斷resultStatus 為非"9000"則代表可能支付失敗
// "8000"代表支付結(jié)果因?yàn)橹Ц肚涝蚧蛘呦到y(tǒng)原因還在等待支付結(jié)果確認(rèn),最終交易是否成功以服務(wù)端異步通知為準(zhǔn)(小概率狀態(tài))
// 其他值就可以判斷為支付失敗,包括用戶主動(dòng)取消支付,或者系統(tǒng)返回的錯(cuò)誤
onPayFail(result, payType);
}
}
/**
* 支付成功
*
* @param result
* @param payType
*/
public abstract void onPaySuccess(String result, int payType);
/**
* 支付失敗
*
* @param result
* @param payType
*/
public abstract void onPayFail(String result, int payType);
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android 設(shè)置應(yīng)用全屏的兩種解決方法
本篇文章小編為大家介紹,Android 設(shè)置應(yīng)用全屏的兩種解決方法。需要的朋友參考下2013-04-04
Android開發(fā)之TabActivity用法實(shí)例詳解
這篇文章主要介紹了Android開發(fā)之TabActivity用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android擴(kuò)展Activity實(shí)現(xiàn)標(biāo)簽頁(yè)效果的具體步驟與相關(guān)技巧,需要的朋友可以參考下2016-03-03
Android實(shí)現(xiàn)環(huán)形進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)環(huán)形進(jìn)度條,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
詳解如何在Android中實(shí)現(xiàn)懸浮Activity
本篇文章主要介紹詳解如何在Android中實(shí)現(xiàn)懸浮Activity,通過(guò)修改Activity的實(shí)現(xiàn)來(lái)適配平板設(shè)備,已達(dá)到代碼的最大利用率。有興趣的可以了解一下。2017-01-01
Android Webview添加網(wǎng)頁(yè)加載進(jìn)度條實(shí)例詳解
這篇文章主要介紹了Android Webview添加網(wǎng)頁(yè)加載進(jìn)度條實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-01-01
Android 實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)
android使用Intent來(lái)實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn),接下來(lái)通過(guò)本文給大家分享Android 實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)的實(shí)例代碼,需要的的朋友參考下吧2017-09-09

