在我的項目中還沒有接入這個功能的時候就聽說微信支付的接口很坑爹,用完之后發現別人說的一點也沒有錯,蛋疼歸蛋疼,該用還是要用。在這里把遇到的問題記錄一下以免以后需要再次介入的話碰到問題浪費時間。
微信支付流程及注意事項
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也就是支付失敗,可以清空你手機上的微信的緩存再試試