美文网首页
iOS 微信支付

iOS 微信支付

作者: 若水water | 来源:发表于2021-10-20 16:58 被阅读0次

    在开发中我们会经常遇到微信支付的场景,不管是 从微信付钱到商户,还是从商户提现到微信 都属于支付。都需要在微信开放平台注册应用,申请支付权限,对接SDK。下面,我们就来了解一下具体的支付流程。
    对于支付过程,请看开放平台文档:https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Resource_Center_Homepage.html?action=dir_list&t=resource%2Fres_list&verify=1&lang=zh_CN

    支付模式
    • 付款码支付
      付款码支付是用户展示微信钱包内的“刷卡条码/二维码”给商户系统扫描后直接完成支付的模式。主要用于线下的面对面收银的场景。
    • Native 支付
      Native支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于PC网站支付,实体店单品或订单支付,媒体广告支付等场景。
    • JSAPI支付
      JSAPI支付 是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付。应用场景有:
      1> 用户在微信公众号内进入商家公众号,打开某个页面,完成支付。
      2> 用户的好友在朋友圈,聊天窗口等分享商家页面链接,用户点击链接打开商家页面,完成支付
      3> 将商户页面转换成二维码,用户扫描二维码后在微信浏览器中打开页面后完成支付。
    • APP支付
      APP 支付又称移动端支付,是商户通过在移动端应用APP中集成开放SDK调起微信支付模块完成支付的模式
    • H5支付
      H5支付主要是在手机,iPad等移动设备中通过浏览器来唤起微信支付产品
    • 小程序支付
      小程序支付是专门被定义使用在小程序中的支付产品。目前在小程序中能且只能使用小程序支付的方式来唤起微信支付。
    接口规则
    • 传输方式
      为保证交易安全性,采用HTTPS传输
    • 提交方式
      采用post方法提交
    • 数据格式
      提交和返回数据都为xml 格式,节点为xml
    • 字符编码
      微信支付API 仅支持UTF-8 字符编码的一个子集: 使用一到三个字节编码的字符。也就是说 不支持Unicode辅助平面中的四至六字节编码的字符
    • 签名算法
      MD5
    • 签名要求
      请求和接收数据均需要校验签名
    • 证书要求
      调用申请退款,撤销订单接口需要商户证书
    • 判断逻辑
      先判断协议字段返回,再判断业务返回,最后判断交易状态
    签名算法 (https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_3
    • 设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(key1=value1&key2=value2),拼接成字符串stringA
    • 在stringA最后拼接上key得到stringSing temp 字符串,并对stringSign Temp 进行MD5云算,再将得到的字符串所有字符转换为大写,得到sign值 signValue。注意 秘钥的长度为32字节
      **** key 设置路径:审核后的邮件有返回 或者 微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
      例如: 传送的参数如下
    appid: wxd930ea5d5a258f4f
    
    mch_id: 10000100
    
    device_info: 1000
    
    body: test
    
    nonce_str: ibuaiVcKdpRxkhJA
    

    1> 对参数按照key = value 的格式,并按照参数名ASCII字典排序如下:

    stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";
    

    2> 拼接API秘钥

    MD5签名方式:
    
    stringSignTemp=stringA+"&key=192006250b4c09247ec02edce69f6a2d" [//注:key为商户平台设置的密钥key](https://kf.qq.com/faq/180830UVRZR7180830Ij6ZZz.html)
    
    sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A9CF3B7" //注:MD5签名方式
    
    

    3> 最终得到最终发送的数据:

    <xml>
    
    <appid>wxd930ea5d5a258f4f</appid>
    
    <mch_id>10000100</mch_id>
    
    <device_info>1000</device_info>
    
    <body>test</body>
    
    <nonce_str>ibuaiVcKdpRxkhJA</nonce_str>
    
    <sign>9A0A8659F005D6984697E2CA0A9CF3B7</sign>
    
    </xml>
    

    以下就是APP 支付流程图:


    image.png
    • 用户使用商户APP 客户端,选择商品进行下单,将订单信息给 商户后台系统,请求生成支付订单

    • 商户后台收到用户订单信息,生成平台订单,调用微信支付统一下单接口,请求创建订单

    • 微信统一下单接口 会返回正常的prepay_id, 然后再按照签名规范重新生成签名,将数据传输给APP。参与签名的字段为,appid, partnerid,prepayid,noncestr,timestamp,package,其中package 的格式为Sign=WXPay
      这些参数都会返回给APP


      123.png
    • 商户APP 用这些参数,调起微信客户端,发起支付

    • 微信客户端向微信后台发起支付请求,微信后台验证支付授权权限,向微信客户端返回支付授权

    • 用户输入密码,提交授权,微信后台验证授权,完成支付

    • 获取支付结果
      在方法onResq 中会获取回调,如果支付成功,则去后台查询支付结果再展示用户实际支付结果。注意一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。

    参考:
    [1] https://blog.csdn.net/zhouxiangyu666666/article/details/71136906
    [2] https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_3

    相关文章

      网友评论

          本文标题:iOS 微信支付

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