目录
微信支付组件流程说明.............................................................................................. 3
微信支付组件接入注意事项....................................................................................... 7
微信组件支付问题说明.............................................................................................. 7
更新日志
发布日期版本修订人更新内容
2017.01.201.0.0李伟初稿完成
2017.01.201.0.0李伟1.新增微信组件接入流程说明
2017.01.221.0.0李伟1.完善微信支付组件说明文档
2017.10.10 1.0.0李伟 1.增加微信支付回调
微信支付组件流程说明
微信支付接入文档网址:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
(1)、后台配置
商户在微信开放平台申请开发应用后,微信开放平台会生成APP的唯一标识APPID。由于需要保证支付安全,需要在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付。设置界面在【开放平台】中的栏目【管理中心 / 修改应用 / 修改开发信息】里面,如图8.8红框内所示。
应用包名:是在APP项目配置文件AndroidManifest.xml中声明的package值
应用签名:根据项目的应用包名和编译使用的keystore,可由签名工具生成一个32位的md5串,在调试的手机上安装签名工具后,运行可生成应用签名串
(2)、注册APPID
商户APP工程中引入微信lib库和头文件,调用API前,需要先向微信注册您的APPID 代码如下:
/** * 1.注册APPID */ private void registerAppid(){
msgApi = WXAPIFactory.createWXAPI(this, null);//商户APP工程中引入微信JAR包,调用API前,需要先向微信注册您的APPID
msgApi.registerApp(Constants.APP_ID);// 将该app注册到微信
}
(3)调起支付界面
商户服务器生成支付订单,生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付 代码如下:
/** * 2.调起微信支付界面 */ private void genPayReq() {
LogUtils.i(TAG, "pay order = " + order);
PayReq req = new PayReq();
req.appId = Constants.APP_ID;//微信开放平台审核通过的应用APPID
req.partnerId = Constants.MCH_ID;//微信支付分配的商户号
req.prepayId = order;//微信返回的支付交易会话ID
req.packageValue = "Sign=WXPay";//暂填写固定值Sign=WXPay
req.nonceStr = genNonceStr();//随机字符串,不长于32位。推荐随机数生成算法
req.timeStamp = String.valueOf(genTimeStamp());//时间戳
List signParams = new LinkedList();
signParams.add(new BasicNameValuePair("appid", req.appId));
signParams.add(new BasicNameValuePair("noncestr", req.nonceStr));
signParams.add(new BasicNameValuePair("package", req.packageValue));
signParams.add(new BasicNameValuePair("partnerid", req.partnerId));
signParams.add(new BasicNameValuePair("prepayid", req.prepayId));
signParams.add(new BasicNameValuePair("timestamp", req.timeStamp));
req.sign = genAppSign(signParams);//签名
msgApi.registerApp(Constants.APP_ID);
msgApi.sendReq(req);
finish();
}
(4)支付结果回调
支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。
代码如下:
@Override
public void onResp(BaseResp resp) {
LogUtils.d(TAG, "onPayFinish, errCode = " + resp.errCode);
String errCode = String.valueOf(resp.errCode);
switch (errCode) {
case Constants.PAY_SUCCESS:
sendBroadcast(new Intent("com.wx.broadcast.paysuccess"));
Toast.makeText(this, getResources().getString(R.string.pay_success), Toast.LENGTH_SHORT).show(); finish();
break;
case Constants.PAY_CANCEL:
sendBroadcast(new Intent("com.wx.broadcast.cancel"));
Toast.makeText(this, getResources().getString(R.string.pay_cancel), Toast.LENGTH_SHORT).show(); finish();
break;
case Constants.PAY_FAIL:
sendBroadcast(new Intent("com.wx.broadcast.payfail"));
Toast.makeText(this, getResources().getString(R.string.pay_fail), Toast.LENGTH_SHORT).show(); finish();
break;
default:
break;
}
}
}
(5)接入微信支付的项目manifest配置说明
(6)增加广播
public class WXPayBroadcastReciver extends BroadcastReceiver {
EventBus eventBus = EventBus.getDefault();
public WXPayBroadcastReciver() {}
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("com.wx.broadcast.cancel")) {
Log.d("wx", " wx pay cancel");
eventBus.post(new BJMGFSdkEvent(BJMGFSdkEvent.RECHARGE_CANCEL));
} else if (intent.getAction().equals("com.wx.broadcast.paysuccess")) {
eventBus.post(new BJMGFSdkEvent(BJMGFSdkEvent.RECHARGE_SUCCESS));
Log.d("wx", " wx pay success");
} else if (intent.getAction().equals("com.wx.broadcast.payfail")) {
eventBus.post(new BJMGFSdkEvent(BJMGFSdkEvent.RECHARGE_FAIL));
Log.d("wx", " wx pay fail");
}
}
}
附:微信支付回调结果码说明
结果码描述解决方案
0成功展示成功界面
-1错误可能原因:签名错误,未注册APPID,项目设置APPID不正确等
-2用户取消无需处理,用户支付不了,取消支付。
(5)签名打包
AS中中签名过程如下:Build=>Generate Signed APK界面
如下图:
打包成功后将apk放入到E:\GAME_M_Engine_Proxy\sdkres\android\hwy_android\assets目录下,注意apk名称必须为Wxpay.apk
微信支付组件接入注意事项
(1)APP打包时签名文件keystore与APP包名必须与微信后台配置的包名和签名文件一致。签名文件目录:E:\cocos2d_3\SDKModulesRepo\android\sources\WechatPayPlugin
微信组件支付问题说明
1.调不起支付界面,显示签名错误?
检查支付组件打包时的签名文件是否正确。
网友评论