按照慣例,首先通讀一遍官網文件。
微信支付
前期準備
微信開放平臺
註冊賬號,建立應用,開通微信支付,這些大家都會的。
微信商戶平臺
APP支付文件
pay.weixin.qq.com/wiki/doc/ap… ,如果僅按照文件來,保證每次支付結果都是-1,對,只有-1,沒有任何其他資訊,不得不說,坑比。
APP支付時序圖
大概瞭解下支付流程:
接入SDK
引入libs
SDK下載:pay.weixin.qq.com/wiki/doc/ap… ,將libammsdk.jar放到libs資料夾下
配置debug簽名
建立應用需要填寫應用簽名,配置在debug下直接用的正式的key,這樣就不用每次打包才能調起微信客戶端
signingConfigs {
debug {
storeFile file("你的keystore路徑")
storePassword "xxx"
keyAlias "xxx"
keyPassword "xxx"
}
release {
storeFile file("你的keystore路徑")
storePassword "xxx"
keyAlias "xxx"
keyPassword "xxx"
}
}複製程式碼
WXPayEntryActivity
這個文件沒有半點介紹,WXPayEntryActivity是支付結束的回撥,和微信分享WXEntryActivity類似,必須放在包名.wxapi下,頁面可以自己寫。
AndroidManifest.xml中註冊
<!-- 微信支付 -->
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"/>複製程式碼
網路許可權註冊不用說了。
支付介面呼叫
/**
* 微信支付
* @param data介面返回
*/
private void weixinPay(String data) {
// 通過WXAPIFactory工廠,獲取IWXAPI的例項
IWXAPI api = WXAPIFactory.createWXAPI(this, WEIXIN_APP_ID);
// 將該app註冊到微信
api.registerApp(WEIXIN_APP_ID);
LogUtil.d("data=" + data);
try {
JSONObject json = new JSONObject(data);
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");
req.extData = "app data"; // optional
// 在支付之前,如果應用沒有註冊到微信,應該先呼叫IWXMsg.registerApp將應用註冊到微信
api.sendReq(req);
} catch (JSONException e) {
e.printStackTrace();
}
}複製程式碼
為了安全,APP端調起支付的引數需要商戶後臺系統提供介面返回,引數說明文件:pay.weixin.qq.com/wiki/doc/ap…
問題
以為這樣就可以調起微信客戶端支付了,沒有想到一直返回支付結果為-1,沒有多餘的資訊提示,不虧是微信,Android程式碼就是簡潔!我們看到文件返回-1的提示“可能的原因:簽名錯誤、未註冊APPID、專案設定APPID不正確、註冊的APPID與設定的不匹配、其他異常等。”,我反覆檢查簽名、APPID均沒有錯誤,後臺也確定sign資訊正確,哎,我表示很無奈,iOS也呼叫了,他們提示”支付場景非法“,原來是由於後臺之前做web支付,trade_type沒有改成APP,改了我這邊就能正常調起了。
支付寶接入
前期準備
註冊賬號,建立應用,開通支付功能,這些也不說了。
接入文件
doc.open.alipay.com/docs/doc.ht…
支付互動流程
接入SDK
SDK下載:
doc.open.alipay.com/docs/doc.ht… ,
將alipaySdk-xxxxxxxx.jar包放到libs資料夾下
AndroidManifest.xml
新增許可權
<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" />複製程式碼
新增宣告
<!-- 支付寶 alipay sdk begin -->
<activity
android:name="com.alipay.sdk.app.H5PayActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind">
</activity>
<activity
android:name="com.alipay.sdk.auth.AuthActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind">
</activity>複製程式碼
支付介面呼叫
支付行為需要在獨立的非ui執行緒中執行,程式碼如下:
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);
/**
對於支付結果,請商戶依賴服務端的非同步通知結果。同步通知結果,僅作為支付結束的通知。
*/
String resultInfo = payResult.getResult();// 同步返回需要驗證的資訊
String resultStatus = payResult.getResultStatus();
// 判斷resultStatus 為9000則代表支付成功
if (TextUtils.equals(resultStatus, "9000")) {
// 該筆訂單是否真實支付成功,需要依賴服務端的非同步通知。
Toast.makeText(mActivity, "支付成功", Toast.LENGTH_SHORT).show();
} else {
// 該筆訂單真實的支付結果,需要依賴服務端的非同步通知。
Toast.makeText(mActivity, payResult.getMemo(), Toast.LENGTH_SHORT).show();
}
break;
}
default:
break;
}
}
;
};
/**
* 支付寶
*/
private void alipay(final String orderInfo) {
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask alipay = new PayTask(mActivity);
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();
}複製程式碼
同樣為了安全,這裡orderInfo是後臺介面返回,引數說明文件:
doc.open.alipay.com/docs/doc.ht…
這樣就over了,相比於微信支付,簡單的不能再簡單。
聯絡我
我的微信公眾號:吳小龍同學,歡迎關注交流~