第三方配置不做介紹,APP支付流程:
調用項目后臺接口生成訂單
通過訂單id調用項目后臺接口獲取訂單信息(為了安全,訂單信息一般交由后臺處理提供)
調用第三方(微信、支付寶)api通過訂單信息進行支付
微信支付:payInfoWechatBean對象就是通過第二步獲取到的訂單信息
private void callWechatToPay(PayInfoWechatBean payInfoWechatBean, String extData) {
IWXAPI iwxapi = WXAPIFactory.createWXAPI(this, WechatConstants.getWXAppId());
iwxapi.registerApp(WechatConstants.getWXAppId());
PayReq req =new PayReq();
req.appId = WechatConstants.getWXAppId();
req.partnerId = payInfoWechatBean.getPartner();
req.prepayId = payInfoWechatBean.getPrepay_id();
req.nonceStr = payInfoWechatBean.getNonceStr();
req.timeStamp = payInfoWechatBean.getTimeStamp();
req.packageValue = payInfoWechatBean.getPackages();
req.sign = payInfoWechatBean.getFinalsign();
req.extData = extData; // optional
iwxapi.sendReq(req);
btnSurepayPayorder.setEnabled(true);
}
然后在微信規(guī)定的回調類進行結果處理
public class WXPayEntryActivity extends Activityimplements IWXAPIEventHandler {
private IWXAPI api;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
api = WXAPIFactory.createWXAPI(this, WechatConstants.getWXAppId());
api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
@Override
public void onReq(BaseReq baseReq) {
}
@Override
public void onResp(BaseResp resp) {
LLog.d("微信支付回調", "" + resp.toString() +"\n" + resp.getType()
+"\n" + ((PayResp) resp).extData +"\n" + resp.errCode);
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
if (resp.errCode == BaseResp.ErrCode.ERR_OK) {
EventBus.getDefault().post(new PayEvent(true, ((PayResp) resp).extData));
}else {
EventBus.getDefault().post(new PayEvent(false, ((PayResp) resp).extData));
}
finish();
}
}
}
支付寶支付: orderInfo 就是第二步獲取的訂單信息
private void callAlipayToPay(String orderInfo) {
if (!TextUtils.isEmpty(orderInfo)) {
Runnable payRunnable =new Runnable() {
@Override
public void run() {
PayTask alipay =new PayTask(PayOrderActivity.this);
Map 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();
}
}
然后通過 Handler 處理支付回調
@SuppressLint("HandlerLeak")
private HandlermHandler =new Handler() {
@SuppressWarnings("unused")
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_PAY_FLAG: {
@SuppressWarnings("unchecked")
PayResult payResult =new PayResult((Map) msg.obj);
/**
對于支付結果,請商戶依賴服務端的異步通知結果。同步通知結果,僅作為支付結束的通知。
*/
String resultInfo = payResult.getResult();// 同步返回需要驗證的信息
String resultStatus = payResult.getResultStatus();
// 判斷resultStatus 為9000則代表支付成功
if (TextUtils.equals(resultStatus, "9000")) {
// 該筆訂單是否真實支付成功,需要依賴服務端的異步通知。
// Toast.makeText(PayDemoActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
EventBus.getDefault().post(new PayEvent(true, payType));
}else {
// 該筆訂單真實的支付結果,需要依賴服務端的異步通知。
// Toast.makeText(PayDemoActivity.this, "支付失敗", Toast.LENGTH_SHORT).show();
EventBus.getDefault().post(new PayEvent(false, payType));
}
break;
}
default:
break;
}
}
};