1. 程式人生 > >Android 微信支付和支付寶支付 快速接入

Android 微信支付和支付寶支付 快速接入

先放上接入兩個支付平臺的官方文件地址
一、支付寶支付
匯入開發資源
這裡寫圖片描述
在商戶應用工程的AndroidManifest.xml檔案裡面新增宣告:

    <activity
                android:name="com.alipay.sdk.app.H5PayActivity"
                android:configChanges="orientation|keyboardHidden|navigation"
                android:exported="false"
                android:screenOrientation="behind" >
    </activity>
    <activity
                android:name="com.alipay.sdk.auth.AuthActivity"
                android:configChanges="orientation|keyboardHidden|navigation"
                android:exported="false"
                android:screenOrientation="behind" >
     </activity>

和許可權宣告:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

新增混淆規則

-libraryjars libs/alipaySingle-20161222.jar

-keep class com.alipay.android.app.IAlixPay{*;}
-keep class com.alipay.android.app.IAlixPay$Stub{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
-keep class com.alipay.sdk.app.PayTask{ public *;}
-keep class com.alipay.sdk.app.AuthTask{ public *;}

二、微信支付
匯入開發資源

這裡寫圖片描述

商戶在微信開放平臺申請開發應用後,微信開放平臺會生成APP的唯一標識APPID。由於需要保證支付安全,需要在開放平臺繫結商戶應用包名和應用簽名,設定好後才能正常發起支付。設定介面在【開放平臺】中的欄目【管理中心 / 修改應用 / 修改開發資訊】裡面,如圖所示:

這裡寫圖片描述

應用包名:是在APP專案配置檔案AndroidManifest.xml中宣告的package值,例如DEMO中的package=”net.sourceforge.simcpux”。

這裡寫圖片描述

商戶APP工程中引入微信JAR包,呼叫API前,需要先向微信註冊您的APPID,程式碼如下:

public class MyApplication extends Application {

    IWXAPI msgApi = null;

    @Override
    public void onCreate()
    {
            msgApi = WXAPIFactory.createWXAPI(this, null);
            // 將該app註冊到微信
            msgApi.registerApp(Constant.WX_APP_ID);
    }
}

Constant.java程式碼

public class Constant {
    //appid 微信分配的公眾賬號ID              
    public static final String WX_APP_ID = "wxc2d0381e95948db6";
    //商戶號 微信分配的公眾賬號ID
    public static final String WX_MCH_ID = "1432223602";
    //API金鑰,在商戶平臺設定
    public static final String WX_API_KEY = "";
}

下面是集合呼叫兩種支付方法的統一方法(僅適用於伺服器返回支付引數orderInfo):

//伺服器返回加密引數
    private String orderInfo;

    /**
     * 支付寶
     */
    private void alipay(final String orderInfo) {
        Runnable payRunnable = new Runnable() {
            @Override
            public void run() {
                PayTask alipay = new PayTask(PayActivity.this);
                Map<String, String> result = alipay.payV2(orderInfo, true);
                Log.i("msp", result.toString());
                Message msg = new Message();
                msg.what = SDK_PAY_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };

        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }
 /**
     * 微信支付
     *
     * @param data
     */
    private void weixinPay(String data) {
        // 通過WXAPIFactory工廠,獲取IWXAPI的例項
        IWXAPI api = WXAPIFactory.createWXAPI(this, null);
        // 將該app註冊到微信
        api.registerApp(ConstantValue.WX_ID);
        LogUtil.d("data=" + data);
        try {
            JSONObject json = new JSONObject(data);
            PayReq req = new PayReq();
            req.appId = json.getString("appid");
            req.partnerId = json.getString("partnerid");
            req.prepayId = json.getString("prepayid");
            req.nonceStr = json.getString("noncestr");
            req.timeStamp = json.getString("timestamp");
            req.packageValue = json.getString("package");
            req.sign = json.getString("sign");
            req.extData = "app data"; // optional
            // 在支付之前,如果應用沒有註冊到微信,應該先呼叫IWXMsg.registerApp將應用註冊到微信
            api.sendReq(req);
            finish();
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

返回呼叫的執行緒

 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")) {
                        // 該筆訂單是否真實支付成功,需要依賴服務端的非同步通知。
                        Toast.makeText(PayActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
                        startActivity(new Intent(PayActivity.this, PayEndActivity.class));
                        finish();
                    } else {
                        // 該筆訂單真實的支付結果,需要依賴服務端的非同步通知。
                        Toast.makeText(PayActivity.this, payResult.getMemo(), Toast.LENGTH_SHORT).show();
                    }
                    break;
                case 0:

                    orderList = orderdetails.getOrders();
                    for (OrderDetailsBean.OrdersBean ordersBean : orderList) {
                        if (ordersBean.getProducts().size() != 0) {
                            productsBeanList = ordersBean.getProducts();
                            for (OrderDetailsBean.OrdersBean.ProductsBean productsBean : productsBeanList) {
                                if (productsBean.getSkus().size() != 0) {
                                    datas = productsBean.getSkus();
                                    allSkudatas.addAll(datas);
                                }
                            }
                        }
                    }
                    ordersbean = orderList.get(0);
                    order_priceTv.setText("¥" + orderdetails.getTotalPay() + "");
                    orderAdapter = new OrderAdapter(context, allSkudatas);
                    goods_Lv.setAdapter(orderAdapter);
                    dialogUtils1.dismiss();
                    break;
                default:
                    break;
            }
        }
    };

所有程式碼都貼在上面了,大家不懂的可以多看下官網。