Android集成支付寶支付功能示例
公司項(xiàng)目中需要支付功能,現(xiàn)在支付寶、微信支付很方便,也很多人使用,因此,他們是首選。在此記錄一下支付寶集成過(guò)程,下期為微信支付,敬請(qǐng)期待
首先去支付寶官網(wǎng)下載其最新的Android的SDK集成Dmeo
將支付寶jar包添加項(xiàng)目中
alipaySdk-20160516.jar
可以看到其主要的調(diào)用方法在PayDemoActivity類(lèi)中,下面為主要支付調(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) 建議商戶依賴(lài)異步通知 */ 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的代碼,我自己寫(xiě)的時(shí)候做了優(yōu)化,畢竟我們集成的支付插件不僅僅只有支付寶,因此需要寫(xiě)一個(gè)統(tǒng)一支付pay,在此基礎(chǔ)上做好相應(yīng)的封裝,方便后續(xù)的拓展,在此說(shuō)下我的封裝思路。
- 新建一個(gè)IPay借口,里面僅僅只有pay方法
- 新建一個(gè)Pay實(shí)現(xiàn)IPay,重寫(xiě)pay方法,實(shí)現(xiàn)支付功能,在Pay里面,統(tǒng)一做網(wǎng)絡(luò)請(qǐng)求操作,如需要從服務(wù)器獲取==完整的符合支付寶參數(shù)規(guī)范的訂單信息==,微信一樣需要這樣,因此可以在此類(lèi)中統(tǒng)一做請(qǐng)求,獲得返回值之后,根據(jù)調(diào)用支付類(lèi)型,執(zhí)行相應(yīng)pay方法。
- 當(dāng)然也可以建立一個(gè)PayHelper 專(zhuān)門(mén)用于實(shí)現(xiàn)各個(gè)支付類(lèi)型的pay方法,然后在Pay中調(diào)用,減少代碼量
- 我們要新建一個(gè)IPayResultCallBack接口,定義onSuccess、onFail方法,表示支付成功失敗的回調(diào)
- 新建一個(gè)抽象類(lèi)PayResultCallBack實(shí)現(xiàn)IPayResultCallBack,講onSuceess、onFail放到支付成功/失敗相應(yīng)中,表明支付成功、失敗回調(diào)方法,到時(shí)調(diào)用pay方法是,即要傳遞實(shí)現(xiàn)好的回調(diào)類(lèi)對(duì)象
支持基本一個(gè)可拓展的支付功能基本搭建完成,剩余的僅僅是需要一個(gè)一個(gè)集成其他支付功能,走的路子任然如此,一個(gè)pay,然后回調(diào)方法里面處理支付結(jié)果?。。?/p>
1、IPay
/** * 支付接口 * Created by kingpeng on 16/5/19. */ public interface IPay { void pay(int payType,String orderInfo); }
2、Pay
/** * 支付工具類(lèi) * 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
/** * 支付幫助類(lèi) * 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) 建議商戶依賴(lài)異步通知 */ 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-04Android開(kāi)發(fā)之TabActivity用法實(shí)例詳解
這篇文章主要介紹了Android開(kāi)發(fā)之TabActivity用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android擴(kuò)展Activity實(shí)現(xiàn)標(biāo)簽頁(yè)效果的具體步驟與相關(guān)技巧,需要的朋友可以參考下2016-03-03Android實(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-01Android Webview添加網(wǎng)頁(yè)加載進(jìn)度條實(shí)例詳解
這篇文章主要介紹了Android Webview添加網(wǎng)頁(yè)加載進(jìn)度條實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-01-01Android 實(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