android開發如何集成支付寶sdk

項目集成支付寶支付有挺長一段時間了,閒來沒事總結下,給心存疑惑的人以指導,大神無視即可。

android集成支付寶其實是一件很簡單的事情。後臺的事情咱們不考慮。對於客戶端而言,總結四步:

第一步:拷貝支付寶sdk到你的項目中,並做相關配置。
第二步:根據後臺提供的訂單接口創建訂單。
第三步:如果創建訂單成功直接調sdk進行支付
第四步:根據支付的結果進行相關操作處理。一般支付成功後要再進行一次後臺請求,因爲支付結果應該以異步爲準。

所用到的主要的類如下:

AliPayAPI.java 是封裝的用於調用支付寶支付的工具類。創建訂單成功後直接調用startPay即可。當然要看後臺怎麼給你返回了。。。

/**
 * 進行支付寶支付先獲得AliPayAPI的實例,然後調用startPay方法
 * 
 * @author let
 */
public class AliPayAPI {

    private static AliPayAPI aliPayAPI;
    private OnAliPayListener mOnAliPayListener;
    private static final int SDK_PAY_FLAG = 1;

    private AliPayAPI() {
    }

    public static AliPayAPI getInstance(OnAliPayListener mOnAliPayListener) {
        if (aliPayAPI == null) {
            aliPayAPI = new AliPayAPI();
        }
        aliPayAPI.mOnAliPayListener = mOnAliPayListener;
        return aliPayAPI;
    }

    @SuppressLint("HandlerLeak")
    private Handler mHandler = new Handler() {
        @SuppressWarnings("unused")
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case SDK_PAY_FLAG:
                @SuppressWarnings("unchecked")
                PayResult payResult = new PayResult((Map<String, String>) msg.obj);

                // 對於支付結果,請商戶依賴服務端的異步通知結果。同步通知結果,僅作爲支付結束的通知。
                String resultInfo = payResult.getResult();// 同步返回需要驗證的信息
                String resultStatus = payResult.getResultStatus();
                // 判斷resultStatus 爲“9000”則代表支付成功,具體狀態碼代表含義可參考接口文檔
                if (TextUtils.equals(resultStatus, "9000")) {
                    if (mOnAliPayListener != null)
                        mOnAliPayListener.onAliPaySuccess();
                } else {
                    // 判斷resultStatus 爲非“9000”則代表可能支付失敗
                    // “8000”代表支付結果因爲支付渠道原因或者系統原因還在等待支付結果確認,最終交易是否成功以服務端異步通知爲準(小概率狀態)
                    // “6004”支付結果未知(有可能已經支付成功)
                    if (TextUtils.equals(resultStatus, "8000") || TextUtils.equals(resultStatus, "6004")) {

                        if (mOnAliPayListener != null)
                            mOnAliPayListener.onAliPayConfirming();

                    } else {
                        // 其他值就可以判斷爲支付失敗,包括用戶主動取消支付,或者系統返回的錯誤
                        if (mOnAliPayListener != null)
                            mOnAliPayListener.onAliPayFailure();
                    }
                }
                break;
            default:
                break;
            }
        };
    };

    /**
     * 進行支付寶支付
     * 
     * @param activity
     * @param orderModel
     */
    public void startPay(final Activity activity, OrderModel orderModel) {
        AlipayPayOrderModel alipayPayOrderModel = orderModel.getAlipayPayOrderModel();
        Map<String, String> orderParamMap = OrderInfoUtil2_0.buildOrderParamMap(alipayPayOrderModel);
        final String orderInfo = OrderInfoUtil2_0.buildOrderParam(orderParamMap) + "&" + alipayPayOrderModel.getSign();
        Runnable payRunnable = new Runnable() {

            @Override
            public void run() {
                PayTask alipay = new PayTask(activity);
                Map<String, String> result = alipay.payV2(orderInfo, true);
                Message msg = new Message();
                msg.what = SDK_PAY_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }

    public interface OnAliPayListener {

        /**
         * 支付成功
         */
        public void onAliPaySuccess();

        /**
         * 支付失敗
         */
        public void onAliPayFailure();

        /**
         * 等待確認
         */
        public void onAliPayConfirming();

    }

}

然後OrderInfoUtil2_0 .java如下。 該類其實是從Demo拷貝來並修改的

public class OrderInfoUtil2_0 {

    /**
     * 構造支付訂單參數列表
     * 
     * @param aliOrder
     * @return
     */
    public static Map<String, String> buildOrderParamMap(AlipayPayOrderModel aliOrder) {
        Map<String, String> keyValues = new HashMap<String, String>();

        keyValues.put("app_id", aliOrder.getApp_id());

        keyValues.put("biz_content", aliOrder.getBiz_content());

        keyValues.put("charset", aliOrder.getCharset());

        keyValues.put("method", aliOrder.getMethod());

        keyValues.put("sign_type", aliOrder.getSign_type());

        keyValues.put("timestamp", aliOrder.getTimestamp());

        keyValues.put("version", aliOrder.getVersion());

        return keyValues;
    }

    /**
     * 構造支付訂單參數信息
     * 
     * @param map
     *            支付訂單參數
     * @return
     */
    public static String buildOrderParam(Map<String, String> map) {
        List<String> keys = new ArrayList<String>(map.keySet());

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < keys.size() - 1; i++) {
            String key = keys.get(i);
            String value = map.get(key);
            sb.append(buildKeyValue(key, value, true));
            sb.append("&");
        }

        String tailKey = keys.get(keys.size() - 1);
        String tailValue = map.get(tailKey);
        sb.append(buildKeyValue(tailKey, tailValue, true));

        return sb.toString();
    }

    /**
     * 拼接鍵值對
     * 
     * @param key
     * @param value
     * @param isEncode
     * @return
     */
    private static String buildKeyValue(String key, String value, boolean isEncode) {
        StringBuilder sb = new StringBuilder();
        sb.append(key);
        sb.append("=");
        if (isEncode) {
            try {
                sb.append(URLEncoder.encode(value, "UTF-8"));
            } catch (UnsupportedEncodingException e) {
                sb.append(value);
            }
        } else {
            sb.append(value);
        }
        return sb.toString();
    }

}

PayResult 也是從Demo裏拷貝來的

public class PayResult {
    private String resultStatus;
    private String result;
    private String memo;

    public PayResult(Map<String, String> rawResult) {
        if (rawResult == null) {
            return;
        }

        for (String key : rawResult.keySet()) {
            if (TextUtils.equals(key, "resultStatus")) {
                resultStatus = rawResult.get(key);
            } else if (TextUtils.equals(key, "result")) {
                result = rawResult.get(key);
            } else if (TextUtils.equals(key, "memo")) {
                memo = rawResult.get(key);
            }
        }
    }

    @Override
    public String toString() {
        return "resultStatus={" + resultStatus + "};memo={" + memo
                + "};result={" + result + "}";
    }

    /**
     * @return the resultStatus
     */
    public String getResultStatus() {
        return resultStatus;
    }

    /**
     * @return the memo
     */
    public String getMemo() {
        return memo;
    }

    /**
     * @return the result
     */
    public String getResult() {
        return result;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章