1. 程式人生 > >android開發如何整合支付寶sdk

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;
    }
}