您好,登錄后才能下訂單哦!
公司項目中需要支付功能,現在支付寶、微信支付很方便,也很多人使用,因此,他們是首選。在此記錄一下支付寶集成過程,下期為微信支付,敬請期待
首先去支付寶官網下載其最新的Android的SDK集成Dmeo
支付寶
選擇SDK&Dmeo進行下載
將支付寶jar包添加項目中
alipaySdk-20160516.jar
可以看到其主要的調用方法在PayDemoActivity類中,下面為主要支付調用方法:
/** * 完整的符合支付寶參數規范的訂單信息 */ final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + getSignType(); Runnable payRunnable = new Runnable() { @Override public void run() { // 構造PayTask 對象 PayTask alipay = new PayTask(PayDemoActivity.this); // 調用支付接口,獲取支付結果 String result = alipay.pay(payInfo, true); Message msg = new Message(); msg.what = SDK_PAY_FLAG; msg.obj = result; mHandler.sendMessage(msg); } }; // 必須異步調用 Thread payThread = new Thread(payRunnable); payThread.start();
注意,我們需要異步發支付請求。可以看到他僅僅需要我們 傳遞好參數
完整的符合支付寶參數規范的訂單信息
這一步,我公司由服務器返回已經處理好的秘鑰,我直接傳遞給支付寶即可
請求后,我們講獲得返回值result
錯誤碼
回調處理
@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); /** * 同步返回的結果必須放置到服務端進行驗證(驗證的規則請看https://doc.open.alipay.com/doc2/ * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665& * docType=1) 建議商戶依賴異步通知 */ String resultInfo = payResult.getResult();// 同步返回需要驗證的信息 String resultStatus = payResult.getResultStatus(); // 判斷resultStatus 為“9000”則代表支付成功,具體狀態碼代表含義可參考接口文檔 if (TextUtils.equals(resultStatus, "9000")) { Toast.makeText(PayDemoActivity.this, "支付成功", Toast.LENGTH_SHORT).show(); } else { // 判斷resultStatus 為非"9000"則代表可能支付失敗 // "8000"代表支付結果因為支付渠道原因或者系統原因還在等待支付結果確認,最終交易是否成功以服務端異步通知為準(小概率狀態) if (TextUtils.equals(resultStatus, "8000")) { Toast.makeText(PayDemoActivity.this, "支付結果確認中", Toast.LENGTH_SHORT).show(); } else { // 其他值就可以判斷為支付失敗,包括用戶主動取消支付,或者系統返回的錯誤 Toast.makeText(PayDemoActivity.this, "支付失敗", Toast.LENGTH_SHORT).show(); } } break; } default: break; } }; };
至此Android客戶端集成支付寶已經完成,是不是So easey!
上面是支付寶Demo的代碼,我自己寫的時候做了優化,畢竟我們集成的支付插件不僅僅只有支付寶,因此需要寫一個統一支付pay,在此基礎上做好相應的封裝,方便后續的拓展,在此說下我的封裝思路。
支持基本一個可拓展的支付功能基本搭建完成,剩余的僅僅是需要一個一個集成其他支付功能,走的路子任然如此,一個pay,然后回調方法里面處理支付結果!!!
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: //請求支付寶 aliPay(bean.signStr); break; case 2: //ToDo 請求微信 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) { // 構造PayTask 對象 PayTask alipay = new PayTask(mContext); // 調用支付接口,獲取支付結果 String result = alipay.pay(mPayInfo, true); return result; } @Override protected void onPostExecute(String result) { mPayResultCallback.payResult(result, Constants.PAY_ALIPAY); } }
4、PayResultCallbackImpl
/** * 支付結果回調 * 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; } } /** * 支付寶支付結果 * * @param result * @param payType */ private void aliPayResult(String result, int payType) { PayResult payResult = new PayResult(result); /** * 同步返回的結果必須放置到服務端進行驗證(驗證的規則請看https://doc.open.alipay.com/doc2/ * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665& * docType=1) 建議商戶依賴異步通知 */ String resultInfo = payResult.getResult();// 同步返回需要驗證的信息 String resultStatus = payResult.getResultStatus(); // 判斷resultStatus 為“9000”則代表支付成功,具體狀態碼代表含義可參考接口文檔 if (TextUtils.equals(resultStatus, "9000")) { onPaySuccess(result, payType); } else { // 判斷resultStatus 為非"9000"則代表可能支付失敗 // "8000"代表支付結果因為支付渠道原因或者系統原因還在等待支付結果確認,最終交易是否成功以服務端異步通知為準(小概率狀態) // 其他值就可以判斷為支付失敗,包括用戶主動取消支付,或者系統返回的錯誤 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); }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。