美文网首页
iOS微信支付

iOS微信支付

作者: angry_zxy | 来源:发表于2019-01-13 20:44 被阅读0次

    app微信支付

    准备工作

    微信开放平台注册账号,获取必要的参数,流程如下:

    准备工作

    图示说明:

    1. 注册账号
    2. 注册app,获得app的唯一标识AppId和AppSecret
    3. 申请开通微信支付权限,填写相关资料,等待工作人员审核
    4. 审核通过后,获得商户号PartnerId,商户登录账号和密码
    5. 商户登录,设置API密钥,这是后续加密的密钥,要保存好

    环境配置

    首先去官网下载官方SDK,接下来步骤如下:

    1. 将SDK导入工程
    2. Build Phases->Link Binary With Libraries中导入依赖库
    3. 在info.plist->LSApplicationQueriesSchemes配置白名单
    4. 在info->URL types配置Scheme,URL Scheme填写AppId,这个值直接影响app跳转

    业务流程

    业务交互的时序图如下(来自官网):


    业务流程

    商户系统和微信支付系统交互说明:

    • 微信客户端:手机中安装的微信app,本地支付
    • 商户APP客户端:自己开发的app,后续简称商户客户端
    • 商户后台系统:与商户APP客户端对接的服务器后台,处理订单,加密签名,更新用户信息。后续商户后台
    • 微信支付系统:微信服务器,处理支付逻辑

    下单

    用户在商户客户端选择商品后,点击下单。商户客户端将用户的商品信息如购买物品的名称,价格,数量等信息发送给商户后台

    生成预支付订单

    商户后台向微信支付系统发送订单数据,下面列举一些必须的重要参数:

    • 微信平台提供:AppId,PartnerId
    • noncestr:随机字符串,商户后台生成,官方推荐使用随机数生成算法
    • 商品相关:商品描述,价格等
    • sign:签名。商户后台根据官方的签名生成算法,生成签名

    微信支付系统收到请求后,校验后,生成一个预支付订单号prepay_id,返回给商户后台

    ps:签名生成算法
    官方签名生成算法的逻辑大致如下:

    1. 将所有参数名按ASCII码从小到大排序
    2. 将参数按照URL键值对的方式拼接(如果有sign参数,sign不参与拼接)
    3. 拼接API密钥,键名为key,值为API密钥
    4. 将拼接好的字符串进行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。

    注意:这里得支付成功只是微信客户端向微信支付系统支付成功,商户客户端更关心的是,商户后台是否是支付成功的状态

    查询支付结果

    微信客户端跳转到商户客户端后,会传递一个包含支付结果的参数,然而不建议直接依据这个支付结果来判断是否支付成功。更推荐的做法是,商户客户端去商户后台查询支付结果,前面说过,微信支付系统会异步发送支付结果给商户客户端,如果由于网络等原因,异步发送失败,商户后台没有收到支付结果,这时商户后台就去微信支付系统查询支付结果,然后将结果返回给商户客户端。

    注意:微信跳转回到客户端返回的结果中,只有支付结果这些不太重要的数据,并没有订单号。然而,商户后台查询支付结果是需要订单号,因此,商户客户端应该本地保存订单号,不能存到内存中,因为在微信客户端支付的时候,用户可能在后台杀掉商户客户端的进程。存储订单号的另一个用途是,当微信客户端出现不可预测的问题时,商户后台可以查询校验,避免用户重复支付同一个订单

    相关文章

      网友评论

          本文标题:iOS微信支付

          本文链接:https://www.haomeiwen.com/subject/kiwldqtx.html