Android接入支付寶和微信支付

本文首發於公衆號「AntDream」,歡迎微信搜索「AntDream」或掃描文章底部二維碼關注,和我一塊兒天天進步一點點php

前言

不少APP都須要支付功能,國內通常就是支付寶和微信了。目前這2種接入方式對於APP端來講都已經比較方便了,由於大部分的安全校驗之類的邏輯都在服務端。android

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

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

支付寶接入

首先是接入支付寶的aar文件

比較坑的是支付寶還須要下載aar文件導入,而不是gradle裏面一行依賴就能搞定的。api

咱們須要去官網下載最新的DEMO和SDK,官網地址在這裏安全

而後把下載下來的aar包,放到項目目錄下面的libs目錄下,經過下面的gradle依賴進來bash

// 支付寶 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;
		}
	};
};
複製代碼

須要注意的是,支付結果必定要調用本身的服務端來肯定,不能經過支付寶的回調結果來判斷!app

其餘

實際狀況裏須要考慮用戶手機上有沒有安裝過支付寶異步

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

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

微信支付接入

接入微信的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();
		}
	}
}
複製代碼
其餘

一樣的,微信支付成功與否,也要經過調用本身的服務端來查看,而不能依賴微信的回調狀態,這個要切記。

總結

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


歡迎關注個人微信公衆號,和我一塊兒天天進步一點點!
複製代碼

AntDream
相關文章
相關標籤/搜索