微信支付接入完全解析之Android客戶端(2)
前段時間在一個App中接入了微信支付功能,想來也穩定執行快一個月了,回頭想想自己接入微信支付時候踩過的坑,決定寫一篇自己當初想要搜尋的文章,文章準備分3篇完成。
第一篇:微信支付前期準備
第二篇:微信支付接入客戶端部分(以Android為例)
第三篇:微信支付接入服務端部分
客戶端接入流程介紹
只要清楚了接入流程,微信支付客戶端的接入是很簡單的。
- 點選你APP的一個按鈕,呼叫你向APP後臺發起生成訂單的請求介面函式。
- 後臺介面生成自己平臺的訂單,然後呼叫騰訊後臺生成微信預支付訂單後將資料返回給前端。
- 前端拿到需要的資料後,調起微信支付
- 輸入密碼,確認支付
向後臺確認支付狀態後展示結果。(此步很重要,雖然微信支付前端也會產生回撥,但是微信官方說那個不準確,需要主動向後端驗證)
完成上面5步即可輕鬆完成支付,是不是巨簡單。
具體接入步驟
先閱讀開發文件,瞭解概況,並下載示例程式碼。
第一步: 在AndroidStudio 裡面開啟 app模組下的build.gradle
檔案,在依賴裡面配置
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
第二步: 在包名下面建立wxapi
資料夾,然後將WXPayEntryActivity
檔案放入其中,注意路徑一定要正確,java/你的包名/wxapi/WXPayEntryActivity.java
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler
{
private static final String TAG = "WXPayEntryActivity";
private IWXAPI api;
private Activity mAct;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.pay_result);
mAct=this;
api = WXAPIFactory.createWXAPI(this, KeyStore.WE_CHAT_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) {
if (req instanceof PayReq)
{
Logger.t(TAG).d("是子類");
}
}
@Override
public void onResp(BaseResp resp) {
//Logger.t(TAG).d("onPayFinish, errCode = " + resp.errCode);
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX)
{
switch (resp.errCode) {
case 0:
mAct.sendBroadcast(new Intent(AppConstant.BROAD_ANCTION_PAY_SUCCESS));
break;
case -1:
ToastUtils.showShort("支付失敗");
break;
case -2:
ToastUtils.showShort("支付取消");
break;
default:
ToastUtils.showShort("支付失敗");
break;
}
finish();
}
}
}
支付完成後會回撥onResp()
方法
第三步: 呼叫你自己的生成訂單的後臺介面,這個介面生成自己的訂單,然後呼叫微信支付後臺,獲得需要的引數。 所需引數參考下面的javabean
public class WeChatBean
{
private String appId;
private String partnerId;
private String prepayId;
private String nonceStr;
private String timeStamp;
private String sign;
private String extData;
private String signType;
****
}
第四步: 使用後臺返回來的資料調起微信支付
public void weChatPay(WeChatBean weChatBean)
{
IWXAPI payApi = WXAPIFactory.createWXAPI(mAct, weChatBean.getAppId());
if (payApi != null)
payApi.registerApp(weChatBean.getAppId());
PayReq payReq = new PayReq();
payReq.appId = weChatBean.getAppId();
payReq.partnerId = weChatBean.getPartnerId();
payReq.prepayId = weChatBean.getPrepayId();
payReq.packageValue = "Sign=WXPay";
payReq.nonceStr = weChatBean.getNonceStr();
payReq.timeStamp = weChatBean.getTimeStamp();
payReq.sign = weChatBean.getSign();
payReq.extData = weChatBean.getExtData();
myRechargeOrderId = weChatBean.getExtData();
payApi.sendReq(payReq);
}
第五步:輸入密碼支付後,會回撥WXPayEntryActivity
裡面的onResp()
方法。
public void onResp(BaseResp resp) {
//Logger.t(TAG).d("onPayFinish, errCode = " + resp.errCode);
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX)
{
switch (resp.errCode) {
case 0:
//mAct.sendBroadcast(new Intent(AppConstant.BROAD_ANCTION_PAY_SUCCESS));
break;
case -1:
ToastUtils.showShort("支付失敗");
break;
case -2:
ToastUtils.showShort("支付取消");
break;
default:
ToastUtils.showShort("支付失敗");
break;
}
finish();
}
}
第六步: 當支付成功時,呼叫自己的後臺介面,查詢支付結果。向後臺查詢支付結果需要等待一定時間,例如1秒,因為微信回撥支付結果給我們後臺是需要時間的,如果立刻查詢有可能查詢不到結果。我是發了個廣播,然後在我發起支付的頁面接收廣播,處理了支付結果。
private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
String action = intent.getAction();
Logger.t(TAG).d("接收到了廣播》action:" + action);
//支付成功狀態確認
if (action.equals(AppConstant.BROAD_ANCTION_PAY_SUCCESS))
{
new Handler().postDelayed(new Runnable()
{
@Override
public void run()
{
if (mPresenter != null)
mPresenter.queryOrderPayState(myRechargeOrderId);
}
}, 1000);
}
}
};
注意:一定要注意簽名要和騰訊後臺配置一致,不然會調起失敗。
很簡單,沒有騙你吧,本文原始碼下載
預知伺服器端如何,且看下篇博文。