我之前集成过Ping++这种第三方的支付,但没有单单针对微信官方的支付集成过,这次做遇到很多坑,记录下。
微信支付的过程:
首先在微信开放平台上申请AppID,在开放平台的应用管理中将你的应用启用支付功能,这是前提。交互过程是服务端根据商品名称价格等信息向微信的sdk请求生成一个prepayid
,给app提供一个接口,在app带着商品信息调用这个接口时,将prepayid返回给app,然后app用这个prepayid调用本地的sdk,唤起微信支付页面,后面的过程基本都是微信sdk去处理了,我们只需要在WXPayEntryActivity
中处理支付的回调方法即可。
除了prepayid外,还需要其他一些数据,服务端也要返回到app,这些字段的具体含义在官方文档上可以查看。
JSONObject prapay = new JSONObject(data);weChatPay.setAppid(prapay.getString("appid"));weChatPay.setNoncestr(prapay.getString("noncestr"));weChatPay.setPackageValue(prapay.getString("package"));weChatPay.setPartnerid(prapay.getString("partnerid"));weChatPay.setPrepayid(prapay.getString("prepayid"));weChatPay.setSign(prapay.getString("sign"));weChatPay.setTimestamp(prapay.getString("timestamp"));weChatPay.setTrade_no(prapay.getString("trade_no"));
我这里是将这些信息封装起来了,拿到信息之后,就要向微信sdk服务器发送支付请求了。
private void sendRequestToWechat(WeChatPay weChatPay) { api = WXAPIFactory.createWXAPI(this, weChatPay.getAppid()); api.registerApp(weChatPay.getAppid()); PayReq request = new PayReq(); request.appId = weChatPay.getAppid(); request.partnerId = weChatPay.getPartnerid(); request.prepayId = weChatPay.getPrepayid(); request.packageValue = weChatPay.getPackageValue(); request.nonceStr = weChatPay.getNoncestr(); request.timeStamp = weChatPay.getTimestamp(); request.sign = weChatPay.getSign(); api.sendReq(request);}
这样就调起了微信支付页面,支付完成后的回调是在WXPayEntryActivity
中,在onResp方法中根据返回的结果码来判断支付结果:
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler { private static final String TAG = "WXPayEntryActivity"; private IWXAPI api; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.pay_result); api = WXAPIFactory.createWXAPI(this, AppId); 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) { Log.d(TAG, "-------------" + req.getType()); } @Override public void onResp(BaseResp resp) { Log.d(TAG, "微信支付回调:---------" + resp.errCode); if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) { if (resp.errCode == 0) { LogUtil.d(TAG, "支付成功"); } else if (resp.errCode == -1) { ToastBlack.showText(this, "支付失败:" + String.valueOf(resp.errStr), false); } else if (resp.errCode == -2) { ToastBlack.showText(this, "取消支付", false); } finish(); } }}
另外还需要在AndroidManifest中配置activity:
需要注意的是,如果你的应用之前有集成过第三方的微信分享,那么久不需要导入
libammsdk.jar
这个jar包了,否则会报如下错误: Error:(10, 8) 错误: WXEntryActivity不是抽象的, 并且未覆盖IWXAPIEventHandler中的抽象方法onResp(BaseResp)