按照慣例,首先通讀一遍官網文檔。php
註冊帳號,建立應用,開通微信支付,這些你們都會的。java
APP支付文檔
pay.weixin.qq.com/wiki/doc/ap… ,若是僅按照文檔來,保證每次支付結果都是-1,對,只有-1,沒有任何其餘信息,不得不說,坑比。android
APP支付時序圖
大概瞭解下支付流程:
web
SDK下載:pay.weixin.qq.com/wiki/doc/ap… ,將libammsdk.jar放到libs文件夾下json
建立應用須要填寫應用簽名,配置在debug下直接用的正式的key,這樣就不用每次打包才能調起微信客戶端api
signingConfigs {
debug {
storeFile file("你的keystore路徑") storePassword "xxx" keyAlias "xxx" keyPassword "xxx" } release {
storeFile file("你的keystore路徑") storePassword "xxx" keyAlias "xxx" keyPassword "xxx" } }複製代碼
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,改了我這邊就能正常調起了。
app
註冊帳號,建立應用,開通支付功能,這些也不說了。
doc.open.alipay.com/docs/doc.ht…
SDK下載:
doc.open.alipay.com/docs/doc.ht… ,
將alipaySdk-xxxxxxxx.jar包放到libs文件夾下
添加權限
<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了,相比於微信支付,簡單的不能再簡單。
個人微信公衆號:吳小龍同窗,歡迎關注交流~