Android接入支付寶和微信支付的方法
前言
很多APP都需要支付功能,國(guó)內(nèi)一般就是支付寶和微信了。目前這2種接入方式對(duì)于APP端來(lái)說(shuō)都已經(jīng)比較方便了,因?yàn)榇蟛糠值陌踩r?yàn)之類的邏輯都在服務(wù)端。
APP端總結(jié)起來(lái)就是三步走:
- 接入支付的庫(kù)
- 接受服務(wù)端的訂單信息,發(fā)起調(diào)用支付寶和微信
- 接收支付寶和微信的回調(diào)
支付寶接入
首先是接入支付寶的aar文件
比較坑的是支付寶還需要下載aar文件導(dǎo)入,而不是gradle里面一行依賴就能搞定的。
我們需要去官網(wǎng)下載最新的DEMO和SDK,官網(wǎng)地址在這里
然后把下載下來(lái)的aar包,放到項(xiàng)目目錄下面的 libs 目錄下,通過(guò)下面的gradle依賴進(jìn)來(lái)
// 支付寶 SDK AAR 包所需的配置 compile(name: 'alipaySdk-15.6.0-20190226104104-noUtdid', ext: 'aar')
調(diào)用支付寶SDK的方法發(fā)起支付
調(diào)用支付寶SDK發(fā)起支付,只需要一個(gè)參數(shù),就是服務(wù)端返回的訂單信息。所以這里的支付順序是先要我們調(diào)用服務(wù)端的接口創(chuàng)建一個(gè)訂單,然后服務(wù)端把訂單信息返回給我們,我們APP拿著這個(gè)訂單信息去調(diào)用支付寶支付。
//下面的orderInfo就是咱自己的服務(wù)端返回的訂單信息,里面除了訂單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);
}
};
// 必須異步調(diào)用
Thread payThread = new Thread(payRunnable);
payThread.start();
由上面的調(diào)用可見,支付寶是通過(guò)消息機(jī)制來(lái)接收回調(diào)的,所以我們得在Handler的消息中接收回調(diào)信息。
private Handler mHandler = new Handler() {
@SuppressWarnings("unused")
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_PAY_FLAG: {
//這里接收支付寶的回調(diào)信息
//需要注意的是,支付結(jié)果一定要調(diào)用自己的服務(wù)端來(lái)確定,不能通過(guò)支付寶的回調(diào)結(jié)果來(lái)判斷
break;
}
default:
break;
}
};
};
需要注意的是,支付結(jié)果一定要調(diào)用自己的服務(wù)端來(lái)確定,不能通過(guò)支付寶的回調(diào)結(jié)果來(lái)判斷!
其他
實(shí)際情況里需要考慮用戶手機(jī)上有沒有安裝過(guò)支付寶
- 已經(jīng)安裝過(guò)支付寶,會(huì)直接調(diào)用支付寶支付
- 沒有安裝支付寶,會(huì)調(diào)起支付寶的H5頁(yè)面支付
以上就是支付寶的接入了,步驟還是比較簡(jiǎn)單的,也沒有什么坑。下面的微信支付就有坑了...
微信支付接入
接入微信的SDK
相比于支付寶,微信接入SDK就比較簡(jiǎn)單了,一行代碼搞定
//微信支付SDK compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
這里需要注意的是,微信的SDK里面支付和社交登錄等這些是集成在一起的,無(wú)法分開。所以如果項(xiàng)目里之前已經(jīng)集成過(guò)微信登錄的話就不需要重復(fù)集成了!
調(diào)用微信SDK發(fā)起支付
String content = ... (這個(gè)是服務(wù)端返回的訂單信息)
//需要一個(gè)注冊(cè)微信支付的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); //這里就發(fā)起調(diào)用微信支付了
接收微信支付的回調(diào)
可以看到上面的代碼和支付寶就不一樣了,沒有用Handler。
微信支付比較特殊的一個(gè)地方是需要我們用一個(gè)特殊的Activity來(lái)接收回調(diào)的信息。這個(gè)處理不好很容易就碰到接收不到回調(diào)的情況。
我們需要新建一個(gè)名叫 WXPayEntryActivity 的Activity,內(nèi)容的話可以參考微信SDK里面的。需要注意的有幾點(diǎn):
WXPayEntryActivity這個(gè)Activity的路徑要符合要求,比如APP的包名是 com.niubi.company ,那這個(gè)Activity的路徑就需要是 com.niubi.company.wxapi.WXPayEntryActivity
這個(gè)WXPayEntryActivity當(dāng)然需要在 AndroidManifest 文件中注冊(cè)
<activity android:name=".wxapi.WXPayEntryActivity" android:exported="true" android:launchMode="singleTop"/>
特別需要注意的是上面的 exported 屬性和 launchMode 屬性一定要加上,否則是接收不到回調(diào)的
我們?cè)谥Ц锻瓿梢院螅话闶窍M苯踊氐轿覀冏约旱膽?yīng)用里面。這個(gè)時(shí)候我們就需要讓上面的 WXPayEntryActivity 不顯示,否則就會(huì)閃一下或是停留在這個(gè)黑黑頁(yè)面。
不顯示的話要注意2點(diǎn),一個(gè)是不要有布局,另一個(gè)就是要及時(shí)的 finish 掉這個(gè)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一樣彈出對(duì)話框了,而是通知我們發(fā)起支付調(diào)用的頁(yè)面
//然后及時(shí)finish掉這個(gè)頁(yè)面,貼個(gè)偽代碼:
sendPayNotice()
finish();
}
}
}
其他
同樣的,微信支付成功與否,也要通過(guò)調(diào)用自己的服務(wù)端來(lái)查看,而不能依賴微信的回調(diào)狀態(tài),這個(gè)要切記。
總結(jié)
以上就是微信和支付寶的支付接入,基本上按照上述步驟都不會(huì)有問題了。特別是微信支付,一定要特別注意文中提到的注意點(diǎn),那些都是踩過(guò)的坑??!
相關(guān)文章
Android中實(shí)現(xiàn)詞組高亮TextView方法示例
高亮顯示大家應(yīng)該都不陌生,在開發(fā)中經(jīng)常會(huì)遇到這個(gè)需求,所以下面這篇文章主要給大家介紹了關(guān)于Android中實(shí)現(xiàn)詞組高亮TextView的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-10-10
簡(jiǎn)單介紹Android開發(fā)中的Activity控件的基本概念
這篇文章主要介紹了Android開發(fā)中的Activity控件的基本概念,Activity控件的使用是安卓開發(fā)的基礎(chǔ)之一,需要的朋友可以參考下2015-12-12
android PopupWindow 和 Activity彈出窗口實(shí)現(xiàn)方式
本人小菜一個(gè)。目前只見過(guò)兩種彈出框的實(shí)現(xiàn)方式,第一種是最常見的PopupWindow,第二種也就是Activity的方式是前幾天才見識(shí)過(guò),需要的朋友可以參考下2012-11-11
Android 3D旋轉(zhuǎn)動(dòng)畫效果實(shí)現(xiàn)分解
如何實(shí)現(xiàn)View的3D旋轉(zhuǎn)效果,實(shí)現(xiàn)的主要原理就是圍繞Y軸旋轉(zhuǎn),同時(shí)在Z軸方面上有一個(gè)深入的縮放,具體實(shí)現(xiàn)代碼如下,感興趣的朋友可以參考下哈2013-06-06
Android 將文件下載到指定目錄的實(shí)現(xiàn)代碼
本文通過(guò)實(shí)例代碼給大家介紹了android將文件下載到指定目錄的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-06-06
Android實(shí)現(xiàn)登錄郵箱的自動(dòng)補(bǔ)全功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)登錄郵箱的自動(dòng)補(bǔ)全功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-04-04

