作者:wiggin | 来源:互联网 | 2023-09-15 18:55
微信支付是需要签名的,跟支付宝一样,可以在客户端签名,也可以在后台签名(当然,为了安全还是推荐在服务器上做签名,逻辑也比较好理解)
时序图:
![交互时序图](https://mmbiz.qpic.cn/mmbiz_png/82jN7o40p6knyLscJ1CYgwEqHxTcSibRZQ3ZrOFCQg7dkeriaUjOXoN7dyOmaN9miaEp6bia3TuVmczYUcM2gDyicFw/640?wx_fmt=png&wxfrom=5&wx_lazy=1)
统一下单API、支付结果通知API和查询订单API等都涉及签名过程,调用都必须在商户服务器端完成。
商户系统和微信支付系统主要交互说明:
1. 用户在商户APP中选择商品,提交订单,选择微信支付。
2. 商户后台收到用户支付单,调用微信支付统一下单接口。
3. 统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appid,partnerid,prepayid,noncestr,timestamp,package。
4. 商户APP调起微信支付。
5. 商户后台接收支付通知。
6. 商户后台查询支付结果。
商户在微信开放平台申请开发应用后,微信开放平台会生成APP的唯一标识APPID。由于需要保证支付安全,需要在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付。设置界面在【开放平台】中的栏目【管理中心 / 修改应用 / 修改开发信息】里面。
应用签名:根据项目的应用包名和编译使用的keystore,可由签名工具生成一个32位的md5串,在调试的手机上安装签名工具后,运行可生成应用签名串
参照微信SDK Sample,在net.sourceforge.simcpux.wxapi包路径中实现WXPayEntryActivity类(包名或类名不一致会造成无法回调),在WXPayEntryActivity类中实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。(net.sourceforge.simcpux为你的项目包名)代码示例如下:
@Override
public void onResp(BaseResp resp) {
Log.d(TAG,"onPayFinish,errCode="+resp.errCode);
// 判断resultStatus 为“0”则代表支付成功,具体状态码代表含义可参考接口文档
if (resp.errCode.equals("0")) {
Toast.makeText(ThirdActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
}else if (resp.errCode.equals("-1")){
// -1为支付失败,包括用户主动取消支付,或者系统返回的错误
Toast.makeText(ThirdActivity.this, "支付失败", Toast.LENGTH_SHORT).show();
}else if (resp.errCode.equals("-2")){
// -2为取消支付,或者系统返回的错误
Toast.makeText(ThirdActivity.this, "取消支付", Toast.LENGTH_SHORT).show();
}else {
// 其他为系统返回的错误
Toast.makeText(ThirdActivity.this, "支付错误", Toast.LENGTH_SHORT).show();
}
}
以下三种为常用结果判断
0为支付成功
-1为支付失败
-2为取消支付