我之前集成过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:
android:name=".wxapi.WXPayEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
需要注意的是,如果你的应用之前有集成过第三方的微信分享,那么久不需要导入libammsdk.jar这个jar包了,否则会报如下错误: Error:(10, 8) 错误: WXEntryActivity不是抽象的, 并且未覆盖IWXAPIEventHandler中的抽象方法onResp(BaseResp)