如何在Android App中集成支付寶和微信支付功能
前言
本文主要介紹如何在 Android App 里集成支付寶和微信支付的功能,文中將實(shí)現(xiàn)的步驟一步步介紹的非常詳細(xì),對(duì)同樣遇到這個(gè)問(wèn)題的朋友相信會(huì)是一個(gè)很好的參考,下面話(huà)不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。
集成支付寶支付
沒(méi)想到現(xiàn)在 App 里集成支付寶是這么的簡(jiǎn)單,我還折騰了好久…
好了,開(kāi)始,假設(shè)你已經(jīng)完成了支付寶那些繁雜的申請(qǐng)啥的工作,進(jìn)入開(kāi)發(fā)了。
首先,去下載官方的 DEMO :
導(dǎo)入開(kāi)發(fā)資源
解壓后把里面的 jar 包拿出來(lái)放到你工程的 lib 目錄下,如圖
然后進(jìn)入工程的“Project Structure”,在app module下選擇“File dependency”,將libs目錄下的alipaySDK-xxxxxxxx.jar導(dǎo)入,或者在app module下的build.gradle下手動(dòng)添加依賴(lài),如下代碼所示:
...... compile files('libs/alipaySdk-20170725.jar') ......
修改 AndroidManifest 文件
復(fù)制進(jìn)去就行
<activity android:name="com.alipay.sdk.app.H5PayActivity" android:configChanges="orientation|keyboardHidden|navigation|screenSize" android:exported="false" android:screenOrientation="behind" android:windowSoftInputMode="adjustResize|stateHidden" > </activity> <activity android:name="com.alipay.sdk.app.H5AuthActivity" android:configChanges="orientation|keyboardHidden|navigation" android:exported="false" android:screenOrientation="behind" android:windowSoftInputMode="adjustResize|stateHidden" > </activity>
聲明權(quán)限
<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" />
好了,準(zhǔn)備工作基本完成。
支付接口的調(diào)用
這里參考下給的 Demo。
由于支付包的 Demo 給的是本地加密的方式,并且不推薦使用這種方法,所以我們只需要用的其中的部分代碼就好了。
首先,把 PayResult.java這個(gè)類(lèi)復(fù)制到你的項(xiàng)目里。代碼如下:
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; } }
然后調(diào)支付接口。PayTask對(duì)象主要為商戶(hù)提供訂單支付、查詢(xún)功能,及獲取當(dāng)前開(kāi)發(fā)包版本號(hào)。獲取PayTask支付對(duì)象調(diào)用支付(支付行為需要在獨(dú)立的非ui線(xiàn)程中執(zhí)行),
private static final int SDK_PAY_FLAG = 1; // 訂單信息 final String orderInfo = info; Runnable payRunnable = new Runnable() { @Override public void run() { PayTask alipay = new PayTask(PayDemoActivity.this); 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();
注意下 orderInfo這個(gè)變量,這個(gè)值是由通過(guò)向后臺(tái)請(qǐng)求返回的值。
這里需要后臺(tái)注意的是,寫(xiě)的時(shí)候看好App支付請(qǐng)求參數(shù)說(shuō)明這個(gè)文檔。
然后是支付結(jié)果的獲取與處理。
@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); /** 對(duì)于支付結(jié)果,請(qǐng)商戶(hù)依賴(lài)服務(wù)端的異步通知結(jié)果。同步通知結(jié)果,僅作為支付結(jié)束的通知。 */ String resultInfo = payResult.getResult();// 同步返回需要驗(yàn)證的信息 String resultStatus = payResult.getResultStatus(); // 判斷resultStatus 為9000則代表支付成功 if (TextUtils.equals(resultStatus, "9000")) { // 該筆訂單是否真實(shí)支付成功,需要依賴(lài)服務(wù)端的異步通知。 Toast.makeText(PayDemoActivity.this, "支付成功", Toast.LENGTH_SHORT).show(); } else { // 該筆訂單真實(shí)的支付結(jié)果,需要依賴(lài)服務(wù)端的異步通知。 Toast.makeText(PayDemoActivity.this, "支付失敗", Toast.LENGTH_SHORT).show(); } break; } default: break; } }; };
然后就好了。
結(jié)束。
集成微信支付
微信支付還是好弄的,就是先該注冊(cè)的注冊(cè),該申請(qǐng)的申請(qǐng),這個(gè)不是本文的重點(diǎn)。
因?yàn)槲⑿庞袀€(gè)支付回調(diào)的問(wèn)題,我的做法就是在項(xiàng)目的x.x.x.wxapi包路徑中實(shí)現(xiàn) WXPayEntryActivity 類(lèi)(切記包名或類(lèi)名一定要一致,否則會(huì)造成無(wú)法回調(diào))。代碼如下:
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{ private static final String TAG = "WXPayEntryActivity"; private IWXAPI api; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.pay_result); api = WXAPIFactory.createWXAPI(this, Constants.APP_ID); api.handleIntent(getIntent(), this); /* * 在這里去做跟后臺(tái)服務(wù)器的請(qǐng)求, * 獲取需要的簽名信息,然后調(diào)起微信支付。 **/ } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); api.handleIntent(intent, this); } @Override public void onReq(BaseReq req) { } @Override public void onResp(BaseResp resp) { Log.d(TAG, "onPayFinish, errCode = " + resp.errCode); switch(resp.errCode){ case 0: //支付成功,做自己想做的處理 break; case -1: //可能的原因:簽名錯(cuò)誤、未注冊(cè)APPID、項(xiàng)目設(shè)置APPID不正確、注冊(cè)的APPID與設(shè)置的不匹配、其他異常等。 break; case -2: //用戶(hù)取消.無(wú)需處理。發(fā)生場(chǎng)景:用戶(hù)不支付了,點(diǎn)擊取消,返回APP。 break; default: break } } }
后記
這是第一次接入支付寶支付,一開(kāi)始還很起勁的參照一個(gè)庫(kù)去進(jìn)行封裝,然后發(fā)現(xiàn)好像多此一舉,并且還不成功,和后臺(tái)捯飭了好久然后看Demo才弄出來(lái)。
參考:
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- Android App支付系列(一):微信支付接入詳細(xì)指南(附官方支付demo)
- android app跳轉(zhuǎn)到微信的示例
- Android制作微信app頂部menu菜單(ActionBar)
- 詳解Android中ListView實(shí)現(xiàn)圖文并列并且自定義分割線(xiàn)(完善仿微信APP)
- Android實(shí)現(xiàn)使用微信登錄第三方APP的方法
- Android開(kāi)發(fā)微信APP支付功能的要點(diǎn)小結(jié)
- Android App仿微信界面切換時(shí)Tab圖標(biāo)變色效果的制作方法
- 如何在Android App中接入微信支付
相關(guān)文章
Android性能優(yōu)化之JVMTI與內(nèi)存分配
這篇文章主要為大家介紹了Android性能優(yōu)化之JVMTI與內(nèi)存分配,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10Android詳解之NoHttp最基本使用(無(wú)封裝)
這篇文章主要介紹了Android詳解之NoHttp最基本使用,無(wú)封裝,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09詳解Android 全局彈出對(duì)話(huà)框SYSTEM_ALERT_WINDOW權(quán)限
本篇文章主要介紹了詳解Android 全局彈出對(duì)話(huà)框SYSTEM_ALERT_WINDOW權(quán)限,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03Android獲取手機(jī)配置信息具體實(shí)現(xiàn)代碼
下面為大家介紹下使用android獲取手機(jī)配置信息的具體過(guò)程,感興趣的朋友可以參考下哈,希望對(duì)你有所幫助2013-06-06Android Studio配合WampServer完成本地Web服務(wù)器訪(fǎng)問(wèn)的問(wèn)題
這篇文章主要介紹了Android Studio配合WampServer完成本地Web服務(wù)器訪(fǎng)問(wèn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10Flutter如何完成路由攔截,實(shí)現(xiàn)權(quán)限管理
本篇介紹了利用 Fluro 路由管理實(shí)現(xiàn)路由權(quán)限攔截的兩種方式,兩種方式各有好處,使用過(guò)程中可以根據(jù)實(shí)際情況決定使用哪一種方法。2021-06-06融會(huì)貫通Android?Jetpack?Compose中的Snackbar
這篇文章主要為大家介紹了融會(huì)貫通Android?Jetpack?Compose中的Snackbar方法及使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01AndroidQ(10)分區(qū)存儲(chǔ)完美適配方法
這篇文章主要介紹了AndroidQ(10)分區(qū)存儲(chǔ)完美適配方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12