iOS微信支付

2019-01-13  本文已影响0人  angry_zxy

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跳转

业务流程

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


业务流程

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

下单

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

生成预支付订单

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

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

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

  1. 将所有参数名按ASCII码从小到大排序
  2. 将参数按照URL键值对的方式拼接(如果有sign参数,sign不参与拼接)
  3. 拼接API密钥,键名为key,值为API密钥
  4. 将拼接好的字符串进行MD5运算,然后转大写,生成sign

二次签名

商户后台得到prepay_id后,准备向商户客户端返回微信支付接口必须的参数:

前6个参数商户后台是直接持有的,而根据签名算法,sign需要这6个参数生成,强烈建议生成sign在商户后台而非客户端
接着,商户后台将这7个参数返回给商户客户端

ps:签名应该在服务器处理的原因

跳转微信支付

用户下单后,商户后台将二次签名后的7个参数返回给商户客户端,商户客户端调用微信SDk的支付接口,将这几个参数传递过去,微信SDK校验签名,然后跳转到微信客户端的支付页面,接着用户进行支付,或者取消支付。

支付

在微信支付页面,用户如果选择取消支付,那么就根据前面设置的URL Scheme跳转回到商户app。
用户如果选择支付,需要输入密码,发送到微信支付系统,微信支付系统支付完成后,支付结果返回给微信客户端,并将结果异步地发送到商户后台,微信客户端收到支付完成的结果后,根据前面设置的URL Scheme跳转回到商户app。

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

查询支付结果

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

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

上一篇 下一篇

猜你喜欢

热点阅读