天天看點

Android接入支付寶和微信支付

本文首發于公衆号“AntDream”,歡迎微信搜尋“AntDream”或掃描文章底部二維碼關注,和我一起每天進步一點點

前言

很多APP都需要支付功能,國内一般就是支付寶和微信了。目前這2種接入方式對于APP端來說都已經比較友善了,因為大部分的安全校驗之類的邏輯都在服務端。

APP端總結起來就是三步走:

  1. 接入支付的庫
  2. 接受服務端的訂單資訊,發起調用支付寶和微信
  3. 接收支付寶和微信的回調

支付寶接入

首先是接入支付寶的aar檔案

比較坑的是支付寶還需要下載下傳aar檔案導入,而不是gradle裡面一行依賴就能搞定的。

我們需要去官網下載下傳最新的DEMO和SDK,

官網位址在這裡

然後把下載下傳下來的aar包,放到項目目錄下面的

libs

目錄下,通過下面的gradle依賴進來

// 支付寶 SDK AAR 包所需的配置
compile(name: 'alipaySdk-15.6.0-20190226104104-noUtdid', ext: 'aar')           
調用支付寶SDK的方法發起支付

調用支付寶SDK發起支付,隻需要一個參數,就是服務端傳回的訂單資訊。是以這裡的支付順序是先要我們調用服務端的接口建立一個訂單,然後服務端把訂單資訊傳回給我們,我們APP拿着這個訂單資訊去調用支付寶支付。

//下面的orderInfo就是咱自己的服務端傳回的訂單資訊,裡面除了訂單ID等,還有簽名等安全資訊
//使用方式基本按照支付寶的DEMO裡面就行了
        
final Runnable payRunnable = new Runnable() {

    @Override
    public void run() {
        PayTask alipay = new PayTask(PayDemoActivity.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();           
由上面的調用可見,支付寶是通過消息機制來接收回調的,是以我們得在Handler的消息中接收回調資訊。
private Handler mHandler = new Handler() {
    @SuppressWarnings("unused")
    public void handleMessage(Message msg) {
        switch (msg.what) {
        case SDK_PAY_FLAG: {
            //這裡接收支付寶的回調資訊
            //需要注意的是,支付結果一定要調用自己的服務端來确定,不能通過支付寶的回調結果來判斷
            break;
        }
        default:
            break;
        }
    };
};           

需要注意的是,支付結果一定要調用自己的服務端來确定,不能通過支付寶的回調結果來判斷!

其他

實際情況裡需要考慮使用者手機上有沒有安裝過支付寶

  • 已經安裝過支付寶,會直接調用支付寶支付
  • 沒有安裝支付寶,會調起支付寶的H5頁面支付

以上就是支付寶的接入了,步驟還是比較簡單的,也沒有什麼坑。下面的微信支付就有坑了...

微信支付接入

接入微信的SDK
官網在這

相比于支付寶,微信接入SDK就比較簡單了,一行代碼搞定

//微信支付SDK
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'           

這裡需要注意的是,微信的SDK裡面支付和社交登入等這些是內建在一起的,無法分開。是以如果項目裡之前已經內建過微信登入的話就不需要重複內建了!

調用微信SDK發起支付
String content = ...    (這個是服務端傳回的訂單資訊)
//需要一個注冊微信支付的APPID
IWXAPI api = WXAPIFactory.createWXAPI(mContext, APPID);
JSONObject json = new JSONObject(content); 
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");
api.sendReq(req); //這裡就發起調用微信支付了           
接收微信支付的回調

可以看到上面的代碼和支付寶就不一樣了,沒有用Handler。

微信支付比較特殊的一個地方是需要我們用一個特殊的Activity來接收回調的資訊。這個處理不好很容易就碰到接收不到回調的情況。

我們需要建立一個名叫

WXPayEntryActivity

的Activity,内容的話可以參考微信SDK裡面的。需要注意的有幾點:

  • WXPayEntryActivity這個Activity的路徑要符合要求,比如APP的包名是

    com.niubi.company

    ,那這個Activity的路徑就需要是

    com.niubi.company.wxapi.WXPayEntryActivity

  • 這個WXPayEntryActivity當然需要在

    AndroidManifest

    檔案中注冊
<activity
    android:name=".wxapi.WXPayEntryActivity"
    android:exported="true"
    android:launchMode="singleTop"/>           

特别需要注意的是上面的

exported

屬性和

launchMode

屬性一定要加上,否則是接收不到回調的

  • 我們在支付完成以後,一般是希望直接回到我們自己的應用裡面。這個時候我們就需要讓上面的

    WXPayEntryActivity

    不顯示,否則就會閃一下或是停留在這個黑黑頁面。

    不顯示的話要注意2點,一個是不要有布局,另一個就是要及時的

    finish

    掉這個Activity
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{
    
    ...

    @Override
    public void onResp(BaseResp resp) {
        Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);

        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            <!--AlertDialog.Builder builder = new AlertDialog.Builder(this);-->
            <!--builder.setTitle(R.string.app_tip);-->
            <!--builder.setMessage(getString(R.string.pay_result_callback_msg, String.valueOf(resp.errCode)));-->
            <!--builder.show();-->
            //這裡肯定不能是像上面的DEMO一樣彈出對話框了,而是通知我們發起支付調用的頁面
            //然後及時finish掉這個頁面,貼個僞代碼:
            sendPayNotice()
            finish();
        }
    }
}           

同樣的,微信支付成功與否,也要通過調用自己的服務端來檢視,而不能依賴微信的回調狀态,這個要切記。

總結

以上就是微信和支付寶的支付接入,基本上按照上述步驟都不會有問題了。特别是微信支付,一定要特别注意文中提到的注意點,那些都是踩過的坑啊!

歡迎關注我的微信公衆号,和我一起每天進步一點點!           

繼續閱讀