Android接入支付SDK
最近公司項目做到支付模塊,之前也做過,沒整理成博客,這次整理一下。
微信支付
前期準備
- 注冊賬號,創建應用,開通微信支付。
- 查看APP支付文檔: https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1
- 了解支付流程:
接入SDK
- 引入libs,下載 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1 ,并將libammsdk.jar放到libs文件夾下。
- 配置簽名
在debug下直接配置key,這樣就可以在debug下調試了。signingConfigs { debug { storeFile file("你的keystore文件路徑") storePassword "xxx" keyAlias "xxx" keyPassword "xxx" } release { storeFile file("你的keystore文件路徑") storePassword "xxx" keyAlias "xxx" keyPassword "xxx" } } buildTypes { debug { signingConfig signingConfigs.debug } release { signingConfig signingConfigs.release } }
- 創建WXPayEntryActivity
在報名下創建如下圖的Activity,demo里也有,WXPaEntryActivity是支付的回調,WXEntryActivity是微信登錄和分享的回調。 - AndroidManifest.xml中注冊
<activity android:name=".wxapi.WXPayEntryActivity" android:exported="true" android:launchMode="singleTop" android:screenOrientation="portrait" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:windowSoftInputMode="stateHidden"/>
- 加入混淆
-libraryjars libs/libammsdk.jar -keep class com.tencent.** { *;}
接口調用
/**
* 調用微信支付
* @param datas 微信支付數據
*/
private void toWXPay(String datas) {
IWXAPI api = WXAPIFactory.createWXAPI(PayActivity.this, WX_APP_ID);
api.registerApp(WX_APP_ID);
try {
JSONObject jsonObject = new JSONObject(datas);
PayReq req = new PayReq();
req.appId = jsonObject.getString("appid");// 微信開放平臺appid
req.nonceStr = jsonObject.getString("noncestr");// 隨機字符串
req.packageValue = jsonObject.getString("package");// 支付內容
req.partnerId = jsonObject.getString("partnerid");// 財付通id
req.prepayId = jsonObject.getString("prepayid");// 微信預支付編號
req.sign = jsonObject.getString("sign");// 簽名
req.timeStamp = jsonObject.getString("timestamp");// 時間戳
req.extData = "app data"; // optional
// 在支付之前,如果應用沒有注冊到微信,應該先調用IWXMsg.registerApp將應用注冊到微信
api.sendReq(req);
} catch (JSONException e) {
e.printStackTrace();
}
}
支付回調
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
api = WXAPIFactory.createWXAPI(this, Config.WX_APP_ID);
api.handleIntent(getIntent(), this);
}
@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) {
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
switch (resp.errCode) {
case 0:
Toast.makeText(this, "支付成功", Toast.LENGTH_SHORT).show();
break;
case -1:
Toast.makeText(this, "支付失敗,請檢查", Toast.LENGTH_SHORT).show();
break;
case -2:
Toast.makeText(this, "已取消支付", Toast.LENGTH_SHORT).show();
break;
default:
Toast.makeText(this, "支付失敗,請檢查", Toast.LENGTH_SHORT).show();
break;
}
finish();
}
}
}
遇到的問題
-
未安裝微信客戶端的情況下使用,然后會發現提示 E/ActivityThread: Failed to find provider info for com.tencent.mm.sdk.plugin.provider ,因為微信沒有html5頁面能使用支付,所以我們必須要在使用支付之前做個判斷,因為微信sdk有提供個參數可以判斷,所以應該加上:
private boolean isWXAppInstall() { IWXAPI api = WXAPIFactory.createWXAPI(PayActivity.this, WX_APP_ID); api.registerApp(WX_APP_ID); boolean isWXAppInstalled = api.isWXAppInstalled() && api.isWXAppSupportAPI(); return isWXAppInstalled; } if (isWXAppInstall()) { DialogUtil.showProDialog(PayActivity.this); toWXPay(datas); } else { Toast.makeText(this, "未安裝微信客戶端", Toast.LENGTH_SHORT).show(); }
-
Android7.0上會出現回調成功重復多次,這個待再次確認,可能是微信的bug。
支付寶支付
前期準備
- 注冊賬號,創建應用,開通支付功能。
- 查看文檔: 支付文檔
- 了解支付流程:
接入SDK
- 引入libs,下載 支付寶SDK及DEMO ,并將alipaySdk-xx.jar包放到libs文件夾下
- AndroidManifest.xml中注冊
<activity android:name="com.alipay.sdk.app.H5PayActivity" android:configChanges="orientation|keyboardHidden|navigation" android:exported="false" android:screenOrientation="behind"/> <activity android:name="com.alipay.sdk.auth.AuthActivity" android:configChanges="orientation|keyboardHidden|navigation" android:exported="false" android:screenOrientation="behind"/>
- 加入權限
<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/alipaySdk-xx.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 *;}
接口調用
支付寶的demo已經寫得很明了易懂了,這里簡單列出接口調用的主要代碼,其他代碼請看支付寶DEMO。/** * 調取支付寶SDK * * @param payInfo 支付信息 */ private void alipay(final String payInfo) { Runnable payRunnable = () -> { PayTask alipay = new PayTask(PayActivity.this); String result = alipay.pay(payInfo, true); Message msg = new Message(); msg.what = SDK_PAY_FLAG; msg.obj = result; mHandler.sendMessage(msg); }; Thread payThread = new Thread(payRunnable); payThread.start(); } /** * 支付寶支付回調處理 */ @SuppressLint("HandlerLeak") private Handler mHandler = new Handler() { @SuppressWarnings("unused") public void handleMessage(Message msg) { switch (msg.what) { case SDK_PAY_FLAG: { PayResult payResult = new PayResult((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(); } else { if (TextUtils.equals(resultStatus, "8000")) { Toast.makeText(PayActivity.this, "支付結果確認中", Toast.LENGTH_SHORT).show(); } else { // 其他值就可以判斷為支付失敗,包括用戶主動取消支付,或者系統返回的錯誤 Toast.makeText(PayActivity.this, "支付失敗", Toast.LENGTH_SHORT).show(); } } break; } default: break; } } };
遇到的問題
- 很容易遇到的問題就是支付參數遺漏,可以直接 查看文檔
- 還會可能遇到支付錯誤,可以直接 查看文檔
來自:http://www.jianshu.com/p/fcd1c36f6230
本文由用戶 lsyh0673 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!