app微信支付
准备工作
去微信开放平台注册账号,获取必要的参数,流程如下:
准备工作图示说明:
- 注册账号
- 注册app,获得app的唯一标识AppId和AppSecret
- 申请开通微信支付权限,填写相关资料,等待工作人员审核
- 审核通过后,获得商户号PartnerId,商户登录账号和密码
- 商户登录,设置API密钥,这是后续加密的密钥,要保存好
环境配置
首先去官网下载官方SDK,接下来步骤如下:
- 将SDK导入工程
- Build Phases->Link Binary With Libraries中导入依赖库
- 在info.plist->LSApplicationQueriesSchemes配置白名单
- 在info->URL types配置Scheme,URL Scheme填写AppId,这个值直接影响app跳转
业务流程
业务交互的时序图如下(来自官网):
业务流程
商户系统和微信支付系统交互说明:
- 微信客户端:手机中安装的微信app,本地支付
- 商户APP客户端:自己开发的app,后续简称商户客户端
- 商户后台系统:与商户APP客户端对接的服务器后台,处理订单,加密签名,更新用户信息。后续商户后台
- 微信支付系统:微信服务器,处理支付逻辑
下单
用户在商户客户端选择商品后,点击下单。商户客户端将用户的商品信息如购买物品的名称,价格,数量等信息发送给商户后台
生成预支付订单
商户后台向微信支付系统发送订单数据,下面列举一些必须的重要参数:
- 微信平台提供:AppId,PartnerId
- noncestr:随机字符串,商户后台生成,官方推荐使用随机数生成算法
- 商品相关:商品描述,价格等
- sign:签名。商户后台根据官方的签名生成算法,生成签名
微信支付系统收到请求后,校验后,生成一个预支付订单号prepay_id,返回给商户后台
ps:签名生成算法
官方签名生成算法的逻辑大致如下:
- 将所有参数名按ASCII码从小到大排序
- 将参数按照URL键值对的方式拼接(如果有sign参数,sign不参与拼接)
- 拼接API密钥,键名为key,值为API密钥
- 将拼接好的字符串进行MD5运算,然后转大写,生成sign
二次签名
商户后台得到prepay_id后,准备向商户客户端返回微信支付接口必须的参数:
- appid:微信平台提供
- partnerid:微信平台提供
- package:固定值,字符串"sign=WXPay"
- timestamp: 时间戳,10位,防重发
- noncestr: 随机字符串,防重发
- prepay_id:预支付id,微信支付系统生成
- sign:签名
前6个参数商户后台是直接持有的,而根据签名算法,sign需要这6个参数生成,强烈建议生成sign在商户后台而非客户端。
接着,商户后台将这7个参数返回给商户客户端
ps:签名应该在服务器处理的原因
- 业务逻辑更清晰规范。客户端接收后台数据后可以直接使用,商户客户端只专注于跳转微信和支付完成的逻辑
- 安全性。签名过程需要API密钥,如果在客户端签名,那么密钥需要在客户端存储,有安全隐患
- 维护性。两次签名的算法都是遵循官方的规则,如果在客户端签名,那么后台和客户端分别需要维护签名算法
跳转微信支付
用户下单后,商户后台将二次签名后的7个参数返回给商户客户端,商户客户端调用微信SDk的支付接口,将这几个参数传递过去,微信SDK校验签名,然后跳转到微信客户端的支付页面,接着用户进行支付,或者取消支付。
支付
在微信支付页面,用户如果选择取消支付,那么就根据前面设置的URL Scheme跳转回到商户app。
用户如果选择支付,需要输入密码,发送到微信支付系统,微信支付系统支付完成后,支付结果返回给微信客户端,并将结果异步地发送到商户后台,微信客户端收到支付完成的结果后,根据前面设置的URL Scheme跳转回到商户app。
注意:这里得支付成功只是微信客户端向微信支付系统支付成功,商户客户端更关心的是,商户后台是否是支付成功的状态
查询支付结果
微信客户端跳转到商户客户端后,会传递一个包含支付结果的参数,然而不建议直接依据这个支付结果来判断是否支付成功。更推荐的做法是,商户客户端去商户后台查询支付结果,前面说过,微信支付系统会异步发送支付结果给商户客户端,如果由于网络等原因,异步发送失败,商户后台没有收到支付结果,这时商户后台就去微信支付系统查询支付结果,然后将结果返回给商户客户端。
注意:微信跳转回到客户端返回的结果中,只有支付结果这些不太重要的数据,并没有订单号。然而,商户后台查询支付结果是需要订单号,因此,商户客户端应该本地保存订单号,不能存到内存中,因为在微信客户端支付的时候,用户可能在后台杀掉商户客户端的进程。存储订单号的另一个用途是,当微信客户端出现不可预测的问题时,商户后台可以查询校验,避免用户重复支付同一个订单
网友评论