在我的项目中还没有接入这个功能的时候就听说微信支付的接口很坑爹,用完之后发现别人说的一点也没有错,蛋疼归蛋疼,该用还是要用。在这里把遇到的问题记录一下以免以后需要再次介入的话碰到问题浪费时间。
微信支付流程及注意事项
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也就是支付失败,可以清空你手机上的微信的缓存再试试