紫玉坏小子

导航

APP接入微信支付 补充

APP接入微信支付

产品介绍

产品概述
  • APP支付是指商户通过在移动端应用APP中集成开放SDK调起微信支付模块来完成支付。目前微信支付支持手机系统有:IOS(苹果)、Android(安卓)和WP(Windows Phone)

应用场景
  • APP支付适用于在移动端APP中集成微信支付功能的场景。商户APP调用微信提供的SDK调用微信支付模块,商户APP会跳转到微信中完成支付,支付完后跳回到商户APP内,最后展示支付结果。具体操作流程如下:

  • 步骤一 用户进入商户APP,选择商品下单、确认购买,进入支付环节。商户服务后台生成支付订单,签名后将数据传输到APP端。以微信提供的DEMO为例

  •  

  • 步骤二 用户点击后发起支付操作,进入到微信界面,调起微信支付,出现确认支付界面,

  • 步骤三 用户确认收款方和金额,点击立即支付后出现输入密码界面,可选择零钱或银行卡支付

  • 输入正确密码后,支付完成,用户端微信出现支付详情页面

  • 回跳到商户APP中,商户APP根据支付结果个性化展示订单处理结果

接入前的准备

  • 选择接入模式

    商户/服务商在接入前首先要判断自己公司注册区域适用的接入模式,微信支付目前提供两种接入方式:

    直连模式和服务商模式。(一般的企业使用直连模式即可)

  • 直连模式

    信息、资金流:微信支付—>直连商户

    直连模式,商户自行申请入驻微信支付,无需服务商协助。(商户平台申请)成为普通商户

  • 服务商模式

    服务商模式,商户申请成为微信支付服务商,服务商自身无法作为一个普通商户直接发起交易,其发起交易必须传入相关特约商户商户号的参数信息。(服务商平台申请)成为普通服务商

参数申请

  • 直连模式的参数申请

    商户自行申请入驻微信支付,无服务商协助。(商户平台申请)成为普通商户

    • 进入微信支付-->商户平台

    • 点击成为商家 进入下图界面

    • 点击 注册微信支付商户号 ,进行扫码

    • 填写好信息 后进入填写商户资料

    • 填写完商户资料后 提交资料即可(经营场所注意选填,主体类型注意选填)

      

         申请APPID
  • 由于微信支付的产品体系全部搭载于微信的社交体系之上,所以直连商户或服务商商户接入微信支付之前,都需要有一个微信社交载体,该载体对应的ID即为APPID。

    对于直连商户,该社交载体可以是公众号(什么是公众号),小程序(什么是小程序)或APP。

    如申请社交载体为公众号,请前往以下链接: 公众号申请指引

    如申请社交载体为小程序,请前往以下链接: 小程序申请指引

    如商户已拥有自己的APP,且希望该APP接入微信支付,请前往以下地址注册APP: APP注册指引

    商户可根据自己实际的业务需求来选择申请不同的社交载体。

    各类社交载体一旦申请成功后,可以登录对应平台查看账号信息以获取对应的appid。

  • APP注册指引

    • 进入微信->开放平台(如果没有账号的先进行注册,有的直接登录)

    • APP接入微信支付需要先进行“开发者资质认证”,我这里已经在审核中 如果没有的直接根据需要填写资料即可

    • 认证好了之后 进行创建“移动应用” 根据要求填写相应的资料

    • 提交成功后获取到相应的APPID

  • 申请mch_id

    申请mch_id和APPID的操作互不影响,可以并行操作,申请地址如下: 商户号申请平台

    申请成功后,会向机构填写的联系邮箱下发通知邮件,内容包含申请成功的mch_id及其登陆账号密码,请妥善保存。

    注意:一个mch_id只能对应一个结算币种,若需要使用多个币种收款,需要申请对应数量的mch_id。

  • 绑定APPID及mch_id

    PPID和mch_id全部申请完毕后,需要建立两者之间的绑定关系。

    直连模式下,APPID与mch_id之间的关系为多对多,即一个APPID下可以绑定多个mch_id,而一个mch_id也可以绑定多个APPID。

配置API key

API Key主要用于对传输信息生成签名,具体使用方式可参见API文档中签名算法章节。

  • 在“签名生成”之前 我们要做两件事

    • 设置API key秘钥

    • 下载并配置商户证书

  • 设置API key秘钥

    • 登录微信商户平台,进入“账户中心”-->“API安全”-->“API安全”目录,点击“设置秘钥”

    • 点击设置秘钥,在弹出的窗口点击“已沟通”

    • 输入API秘钥,内容为32位字符,包括数字及大小写字母,点击获取短信验证码

    • 输入验证码后 就可以点击确认 API key 设置就完成了 复制API key 备用

    • 下载并配置商户证书

      当调用涉及资金回滚或某些敏感操作的接口时(包括退款,撤销,入驻子商户等),需要使用商户证书来校验机构身份。

      机构可登陆微信商户平台,在【账户中心】->【API安全】->【API证书】目录下载证书

      以下为具体下载步骤:

      • 在证书申请页面上点击“申请证书”

      • 在弹出窗口内点击“下载证书工具” 按钮下载证书工具

      • 安装证书工具并打开,选择证书需要存储的路径后点击“申请证书

      • 在证书工具中,将复制的商户信息粘贴并点击下一步

      • 获取请求串

      • 生成证书求串

      • 步骤1 在【商户平台】-“复制证书串”环节,点击“复制证书串”按钮后;

        步骤2 在【证书工具】-“复制请求串”环节,点击“下一步”按钮进入“粘贴证书串”环节;

        步骤3 在【证书工具】-“粘贴证书串”环节,点击“粘贴”按钮后;

        步骤4 点击“下一步”按钮,进入【证书工具】-“生产证书”环节

      • 点击查看证书文件夹 可以看到3个文件

      • 在微信商户号里查看证书 证书序列号 是签名的必要条件

    • 签名生成

    • API 密钥设置

      • 请登录商户平台进入【账户中心】->【账户设置】->【API安全】->【APIv3密钥】中设置 API 密钥

        • 什么是APIv3密钥?

          微信支付APIv3的下载平台证书接口以及回调通知中,为防止报文被他人其他人恶意篡改,服务器会对数据进行加密。商户收到报文后,要解密出明文,解密过程中用的key就是APIv3密钥。

          注意:

          1、APIv3密钥属于敏感信息,请妥善保管不要泄露,如果怀疑信息泄露,请重设密钥。

          2、APIv3密钥与API密钥是隔离的,设置该密钥时,不会导致API密钥发生变化

        • 如何设置APIv3密钥?

          设置APIv3密钥需要商户号的超级管理员才能操作,详细步骤如下:

          1、登录微信支付商户平台,进入【账户中心】->【账户设置】->【API安全】->【APIv3密钥】中设置。

          2、输入要设置的密钥、短信验证码和操作密码

          3、密钥设置成功

    • 按照以上步骤操作后你将获取如下内容:

      • apiKey API 密钥

      • apiKey3 APIv3 密钥

      • mchId 商户号

      • apiclient_key.pem X.509 标准证书的密钥

      • apiclient_cert.p12 X.509 标准的证书+密钥

      • apiclient_cert.pem X.509 标准的证书

    • 签名生成

      可以按照下述步骤生成请求的签名

      • 微信支付API v3要求商户对请求进行签名。微信支付会在收到请求后进行签名的验证。如果签名验证不通过,微信支付API v3将会拒绝处理请求,并返回401 Unauthorized

    • 准备

      当商户需要拥有一个微信支付商户号,并通过超级管理员账号登陆商户平台,获取商户API证书。商户API证书 的压缩包中包含了签名必需的私钥和商户证书

    • 构造签名串

      我们希望商户的技术开发人员按照当前文档约定的规则构造签名串。微信支付会使用同样的方式构造签名串。如果商户构造签名串的方式错误,将导致签名验证不通过。下面先说明签名串的具体格式。

      签名串一共有五行,每一行为一个参数。行尾以 \n(换行符,ASCII编码值为0x0A)结束,包括最后一行。如果参数本身以\n结束,也需要附加一个\n

      HTTP请求方法\n
      URL\n
      请求时间戳\n
      请求随机串\n
      请求报文主体\n
      • 我们通过在命令行中调用"获取微信支付平台证书"接口,一步一步向开发者介绍如何进行请求签名。按照接口文档,获取商户平台证书的URL为 https://api.mch.weixin.qq.com/v3/certificates请求方法为GET,没有查询参数

      • 第一步,获取HTTP请求的方法( GET,POSTPUT

      • GET
      • 第二步,获取请求的绝对URL,并去除域名部分得到参与签名的URL。如果请求中有查询参数,URL末尾应附加有'?'和对应的查询字符串。

      • /v3/certificates
      • 第三步,获取发起请求时的系统当前时间戳,即格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数,作为请求时间戳。微信支付会拒绝处理很久之前发起的请求,请商户保持自身系统的时间准确。

      • $ date +%s 1554208460
      • 第四步,生成一个请求随机串(我们推荐生成随机数算法如下:调用随机数函数生成,将得到的值转换为字符串) 。这里,我们使用命令行直接生成一个。

      • $ hexdump -n 16 -e '4/4 "%08X" 1 "\n"' /dev/random 
        593BEC0C930BF1AFEB40B4A08C8FB242
      • 第五步,获取请求中的请求报文主体(request body)。

      • 请求方法为GET时,报文主体为空。
        当请求方法为POST或PUT时,请使用真实发送的JSON报文。
        图片上传API,请使用meta对应的JSON报文。
      • 对于下载证书的接口来说,请求报文主体是一个空串

      • 第六步,按照前述规则,构造的请求签名串为

      • GET\n 
        /v3/certificates\n
        1554208460\n
        593BEC0C930BF1AFEB40B4A08C8FB242\n
        \n
    计算签名值
    • 绝大多数编程语言提供的签名函数支持对签名数据 进行签名。强烈建议商户调用该类函数,使用商户私钥对待签名串进行SHA256 with RSA签名,并对签名结果进行Base64编码得到签名值

    • 下面我们使用命令行演示如何生成签名

    • $ echo -n -e \
      "GET\n/v3/certificates\n1554208460\n593BEC0C930BF1AFEB40B4A08C8FB242\n\n" \
       | openssl dgst -sha256 -sign apiclient_key.pem \
       | openssl base64 -A
       uOVRnA4qG/MNnYzdQxJanN+zU+lTgIcnU9BxGw5dKjK+VdEUz2FeIoC+D5sB/LN+nGzX3hfZg6r5wT1pl2ZobmIc6p0ldN7J6yDgUzbX8Uk3sD4a4eZVPTBvqNDoUqcYMlZ9uuDdCvNv4TM3c1WzsXUrExwVkI1XO5jCNbgDJ25nkT/c1gIFvqoogl7MdSFGc4W4xZsqCItnqbypR3RuGIlR9h9vlRsy7zJR9PBI83X8alLDIfR1ukt1P7tMnmogZ0cuDY8cZsd8ZlCgLadmvej58SLsIkVxFJ8XyUgx9FmutKSYTmYtWBZ0+tNvfGmbXU7cob8H/4nLBiCwIUFluw==
    设置HTTP头
    • 微信支付商户API v3要求请求通过HTTPAuthorization 头来传递签名。Authorization认证类型签名信息两个部分组成。

      下面我们使用命令行演示如何生成签名。

      Authorization: 认证类型 签名信息
    • 具体组成为:

      1.认证类型,目前为WECHATPAY2-SHA256-RSA2048

      2.签名信息

        • 发起请求的商户(包括直连商户、服务商或渠道商)的商户号mchid

        • 商户API证书serial_no,用于声明所使用的证书

        • 请求随机串nonce_str

        • 时间戳timestamp

        • 签名值signature

      注:以上五项签名信息,无顺序要求。

      Authorization 头的示例如下:(注意,示例因为排版可能存在换行,实际数据应在一行)

    Authorization: WECHATPAY2-SHA256-RSA2048 mchid="1900009191",nonce_str="593BEC0C930B
    • 最终我们可以组一个包含了签名的HTTP请求了

    • $ curl https://api.mch.weixin.qq.com/v3/certificates -H 'Authorization: WECHATPAY2-SHA256-RSA2048 mchid="1900009191",nonce_str="593BEC0C930BF1AFEB40B4A08C8FB242",signature="uOVRnA4qG/MNnYzdQxJanN+zU+lTgIcnU9BxGw5dKjK+VdEUz2FeIoC+D5sB/LN+nGzX3hfZg6r5wT1pl2ZobmIc6p0ldN7J6yDgUzbX8Uk3sD4a4eZVPTBvqNDoUqcYMlZ9uuDdCvNv4TM3c1WzsXUrExwVkI1XO5jCNbgDJ25nkT/c1gIFvqoogl7MdSFGc4W4xZsqCItnqbypR3RuGIlR9h9vlRsy7zJR9PBI83X8alLDIfR1ukt1P7tMnmogZ0cuDY8cZsd8ZlCgLadmvej58SLsIkVxFJ8XyUgx9FmutKSYTmYtWBZ0+tNvfGmbXU7cob8H/4nLBiCwIUFluw==",timestamp="1554208460",serial_no="1DDE55AD98ED71D6EDD4A4A16996DE7B47773A8C"

posted on 2021-01-13 09:50  紫玉坏小子  阅读(846)  评论(0编辑  收藏  举报