Android微信支付接入
一、 前期准备
- 申请开发者账号
- 在微信开放平台申请一个开发者账号,并开通开发者资质,一年300人民币,这个资质如果不开通就无法获取微信支付的功能。
- 在微信开放平台申请一个开发者账号,并开通开发者资质,一年300人民币,这个资质如果不开通就无法获取微信支付的功能。
申请应用
点击创建应用,创建一个移动应用
获取支付权限
这里需要绑定微信商户号,微信商户号需要单独申请。这些工作一般都是商务人员来做。
前期准备资料链接: https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317780&token=&lang=zh_CN微信开放平台配置相关参数
这里有详细的说明。
二、微信支付业务流程
统一下单API、支付结果通知API和查询订单API等都涉及签名过程,调用都必须在服务器端完成。
商户系统和微信支付系统主要交互说明:
步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。
步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。
步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appid,partnerid,prepayid,noncestr,timestamp,package。注意:package的值格式为Sign=WXPay
步骤4:商户APP调起微信支付。
步骤5:商户后台接收支付通知。
步骤6:商户后台查询支付结果。
三、接入步骤
步骤一:在微信开放平台现在最新sdk,并集成到项目中。
步骤二:在应用启动的时候初始化api
IWXAPI msgApi = WXAPIFactory.createWXAPI(context, APP_ID);
msgApi.registerApp("wxd930ea5d5a258f4f");
步骤三:调起支付
PayReq req = new PayReq();
PayResult.DataBean data = payResult.getData();
req.appId = data.getAppId();
req.partnerId = data.getPartnerId();
req.prepayId = data.getPrepayId();
req.packageValue = data.getPackageX();
req.nonceStr = data.getNonceStr();
req.timeStamp = data.getTimeStamp();
req.sign = data.getSign();
// 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
LogUtil.logByD("PAY_GET", req.toString());
if (!api.isWXAppInstalled()) {
AppUtil.showToastMsg(view.getFragment().getContext(), "您还未安装微信客户端,请先安装微信客户端");
return;
}
api.sendReq(req);
在调用支付之前需要统一下单,这个操作在服务端进行,上面的payResult就是服务端返回的统一下单结果。
步骤四、支付结果回调
参照微信SDK Sample,在net.sourceforge.simcpux.wxapi包路径中实现WXPayEntryActivity类(包名或类名不一致会造成无法回调),在WXPayEntryActivity类中实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。
publicvoidonResp(BaseRespresp){
if(resp.getType()==ConstantsAPI.COMMAND_PAY_BY_WX){
Log.d(TAG,"onPayFinish,errCode="+resp.errCode);
AlertDialog.Builderbuilder=newAlertDialog.Builder(this);
builder.setTitle(R.string.app_tip);
}
}
返回结果码
回调中errCode值列表:
名称 描述 解决方案
0 成功 展示成功页面
-1 错误 可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
-2 用户取消 无需处理。发生场景:用户不支付了,点击取消,返回APP。
接受到结果后展示不同的结果。至此,维信支付就全部完成了。