微信支付的事例代码下载链接:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1
下载下来是一个eclipse工程,导入eclipse中会报错,估计是jar包依赖问题,我使用的AS,所以我也没有去管它,只是看了一下代码。使用AS直接用build依赖导入就行了。
示例代码中有一个支付订单的对象:
PayReq req = new PayReq();
按照他的属性把相关的订单属性赋值就OK了
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
有个要求:在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
注册方法很简单:
商户APP工程中引入微信JAR包,调用API前,需要先向微信注册您的APPID,代码如下:
final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, “wxd930ea5d5a258f4f”);
// 将该app注册到微信
msgApi.registerApp("wxd930ea5d5a258f4f");
这里我写到了自己的Application里面。
然后发起支付:msgApi.sendReq(req);
关于支付结果回调微信要求要有一包名为wxapi,然后里面有一个WXPayEntryActivity界面,因为从微信支付页面返回APP,它会主动跳转这个界面并返回结果(很扯淡)。微信文档中也有一个提示:支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。
就是说客户端返回的结果仅供参考,那用户取消支付应该是准确的,明明取消支付,在充值页面弹窗提示一下就OK了,但是还是要跳回调页面。若果说把支付页面直接写到WXPayEntryActivity这个界面也可以,但是APP不只有一个支付页面怎么搞?和支付宝支付也不统一是吧。
我是在回调方法中这样写的:
@Override public void onResp(BaseResp resp) { // Log.d(TAG, "onPayFinish, errCode = " + resp.errCode); if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) { Intent intent = new Intent(); intent.setClass(WXPayEntryActivity.this,mAppContext.getActivity().getClass()); intent.putExtra("resp",resp.errCode); startActivity(intent); finish(); } else { finish(); } }
其中mAppContext是我定义的Application,通过getActivity可以知道是哪个界面支付的,然后通过获取到的结果直接跳转到充值页面,在充值页面通过onNewIntent来获取显示支付结果。有个问题是,支付完以后会闪一下。
最好的办法当然是不写WXPayEntryActivity这个界面,就是说不获取微信客户端返回结果,每次返回到APP,也就是支付页面,都去向后台询问支付结果,因为后台能获取到微信的支付通知。问题就是后台能不能及时的返回了。这也体现了使用Ping++的好处,许多的支付方式都能统一起来,方便开发!