在個人項目中尚未接入這個功能的時候就據說微信支付的接口很坑爹,用完以後發現別人說的一點也沒有錯,蛋疼歸蛋疼,該用仍是要用。在這裏把遇到的問題記錄一下以避免之後須要再次介入的話碰到問題浪費時間。android
微信支付流程及注意事項
1.後臺設置:在微信開放平臺申請開發應用,得到APP-ID
2.引入微信支付SDK
3.在你須要支付的頁面註冊微信APP-ID,通常在oncreat裏,代碼以下
wxApi = WXAPIFactory.createWXAPI(mContext, APP_ID, true);
wxApi.registerApp(APP_ID);
4.調用支付接口:
/**
* 微信支付業務
*/
private void wxPay(String result) {
Toast.makeText(mContext, "獲取訂單中...", Toast.LENGTH_SHORT).show();
try {
org.json.JSONObject json = new org.json.JSONObject(result);
if (null != json && !json.has("retcode")) {
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
Toast.makeText(mContext, "正常調起支付", Toast.LENGTH_SHORT).show();
wxApi.sendReq(req);
} else {
Log.d("PAY_GET", "返回錯誤" + json.getString("retmsg"));
Toast.makeText(mContext, "返回錯誤" + json.getString("retmsg"), Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
Log.e("PAY_GET", "異常:" + e.getMessage());
Toast.makeText(mContext, "異常:" + e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
(方法的構造函數result爲支付訂單所須要的json數據)
5.獲取微信支付的返回結果(返回結果碼0爲成功,-1爲失敗,-2爲取消支付)
須要注意的是微信支付的返回結果只能用WXPayEntryActivity類來接受收,且該類的包名爲:你的主包名.wxapi.WXPayEntryActivity
例如你的主包名爲com.wxpay則該類的路徑爲:com.wxpay.wxapi.WXPayEntryActivity(必須這樣作,不然接收不到返回結果)
註冊到Manifest中
<activity
android:name="你的主包名.wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"/>
該類的代碼以下:
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{
private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.empty);
api = WXAPIFactory.createWXAPI(this, "你的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) {
Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
int errCord = resp.errCode;
//這裏接收到了返回的狀態碼能夠進行相應的操做,若是不想在這個頁面操做能夠把狀態碼存在本地而後finish掉這個頁面,這樣就回到了你調起支付的那個頁面
//獲取到你剛剛存到本地的狀態碼進行相應的操做就能夠了
}
}
}
PS:若是什麼都對了返回的狀態碼仍是-1也就是支付失敗,能夠清空你手機上的微信的緩存再試試json