Android集成支付寶支付功能

公司項目中需要支付功能,現(xiàn)在支付寶、微信支付很方便,也很多人使用,因此,他們是首選。在此記錄一下支付寶集成過程,下期為微信支付,敬請期待

授人以魚不如授人以漁

授人以魚不如授人以漁

首先去支付寶官網(wǎng)下載其最新的Android的SDK集成Dmeo

將支付寶jar包添加項目中

  • alipaySdk-20160516.jar
支付寶SDK Demo

可以看到其主要的調(diào)用方法在PayDemoActivity類中,下面為主要支付調(diào)用方法:

        /**
         * 完整的符合支付寶參數(shù)規(guī)范的訂單信息
         */
        final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + getSignType();

        Runnable payRunnable = new Runnable() {

            @Override
            public void run() {
                // 構造PayTask 對象
                PayTask alipay = new PayTask(PayDemoActivity.this);
                // 調(diào)用支付接口,獲取支付結果
                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ā)支付請求??梢钥吹剿麅H僅需要我們 傳遞好參數(shù)

  • 完整的符合支付寶參數(shù)規(guī)范的訂單信息

這一步,我公司由服務器返回已經(jīng)處理好的秘鑰,我直接傳遞給支付寶即可

partner="2088101568358171"&seller_id="xxx@alipay.com"&out_trade_no="0819145412-6177"&subject="測試"&body="測試測試"&total_fee="0.01"&notify_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"

請求后,我們講獲得返回值result

resultStatus={9000};memo={};result={partner="2088101568358171"&seller_id="xxx@alipay.com"&out_trade_no="0819145412-6177"&subject="測試"&body="測試測試"&total_fee="0.01"&notify_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="}

錯誤碼

  • 9000 -> 訂單支付成功
  • 8000 -> 正在處理中
  • 4000 -> 訂單支付失敗
  • 6001 -> 用戶中途取消
  • 6002 ->網(wǎng)絡連接出錯

回調(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);
                /**
                 * 同步返回的結果必須放置到服務端進行驗證(驗證的規(guī)則請看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”則代表支付成功,具體狀態(tài)碼代表含義可參考接口文檔
                if (TextUtils.equals(resultStatus, "9000")) {
                    Toast.makeText(PayDemoActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
                } else {
                    // 判斷resultStatus 為非"9000"則代表可能支付失敗
                    // "8000"代表支付結果因為支付渠道原因或者系統(tǒng)原因還在等待支付結果確認,最終交易是否成功以服務端異步通知為準(小概率狀態(tài))
                    if (TextUtils.equals(resultStatus, "8000")) {
                        Toast.makeText(PayDemoActivity.this, "支付結果確認中", Toast.LENGTH_SHORT).show();

                    } else {
                        // 其他值就可以判斷為支付失敗,包括用戶主動取消支付,或者系統(tǒng)返回的錯誤
                        Toast.makeText(PayDemoActivity.this, "支付失敗", Toast.LENGTH_SHORT).show();

                    }
                }
                break;
            }
            default:
                break;
            }
        };
    };

至此Android客戶端集成支付寶已經(jīng)完成,是不是So easey!

上面是支付寶Demo的代碼,我自己寫的時候做了優(yōu)化,畢竟我們集成的支付插件不僅僅只有支付寶,因此需要寫一個統(tǒng)一支付pay,在此基礎上做好相應的封裝,方便后續(xù)的拓展,在此說下我的封裝思路。

  • 新建一個IPay借口,里面僅僅只有pay方法
  • 新建一個Pay實現(xiàn)IPay,重寫pay方法,實現(xiàn)支付功能,在Pay里面,統(tǒng)一做網(wǎng)絡請求操作,如需要從服務器獲取==完整的符合支付寶參數(shù)規(guī)范的訂單信息==,微信一樣需要這樣,因此可以在此類中統(tǒng)一做請求,獲得返回值之后,根據(jù)調(diào)用支付類型,執(zhí)行相應pay方法。
  • 當然也可以建立一個PayHelper 專門用于實現(xiàn)各個支付類型的pay方法,然后在Pay中調(diào)用,減少代碼量
  • 我們要新建一個IPayResultCallBack接口,定義onSuccess、onFail方法,表示支付成功失敗的回調(diào)
  • 新建一個抽象類PayResultCallBack實現(xiàn)IPayResultCallBack,講onSuceess、onFail放到支付成功/失敗相應中,表明支付成功、失敗回調(diào)方法,到時調(diào)用pay方法是,即要傳遞實現(xiàn)好的回調(diào)類對象

支持基本一個可拓展的支付功能基本搭建完成,剩余的僅僅是需要一個一個集成其他支付功能,走的路子任然如此,一個pay,然后回調(diào)方法里面處理支付結果!??!

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);
            // 調(diào)用支付接口,獲取支付結果
            String result = alipay.pay(mPayInfo, true);
            return result;
        }

        @Override
        protected void onPostExecute(String result) {
            mPayResultCallback.payResult(result, Constants.PAY_ALIPAY);
        }
    }

4、PayResultCallbackImpl

/**
 * 支付結果回調(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;
        }

    }
    /**
     * 支付寶支付結果
     *
     * @param result
     * @param payType
     */
    private void aliPayResult(String result, int payType) {
        PayResult payResult = new PayResult(result);
        /**
         * 同步返回的結果必須放置到服務端進行驗證(驗證的規(guī)則請看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”則代表支付成功,具體狀態(tài)碼代表含義可參考接口文檔
        if (TextUtils.equals(resultStatus, "9000")) {
            onPaySuccess(result, payType);
        } else {
            // 判斷resultStatus 為非"9000"則代表可能支付失敗
            // "8000"代表支付結果因為支付渠道原因或者系統(tǒng)原因還在等待支付結果確認,最終交易是否成功以服務端異步通知為準(小概率狀態(tài))
            // 其他值就可以判斷為支付失敗,包括用戶主動取消支付,或者系統(tǒng)返回的錯誤
            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);
}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容