APP接入微信支付

产品介绍

产品概述
  • APP支付是指商户通过在移动端应用APP中集成开放SDK调起微信支付模块来完成支付。目前微信支付支持手机系统有:IOS(苹果)、Android(安卓)和WP(Windows Phone)
应用场景
  • APP支付适用于在移动端APP中集成微信支付功能的场景。商户APP调用微信提供的SDK调用微信支付模块,商户APP会跳转到微信中完成支付,支付完后跳回到商户APP内,最后展示支付结果。具体操作流程如下:
  • 步骤一 用户进入商户APP,选择商品下单、确认购买,进入支付环节。商户服务后台生成支付订单,签名后将数据传输到APP端。以微信提供的DEMO为例
  •  
  • 微信app支付java 微信app支付是什么意思_API

  • 步骤二 用户点击后发起支付操作,进入到微信界面,调起微信支付,出现确认支付界面,
  • 步骤三 用户确认收款方和金额,点击立即支付后出现输入密码界面,可选择零钱或银行卡支付
  • 输入正确密码后,支付完成,用户端微信出现支付详情页面
  • 回跳到商户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。

微信app支付java 微信app支付是什么意思_微信支付_02

配置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、输入要设置的密钥、短信验证码和操作密码

微信app支付java 微信app支付是什么意思_微信app支付java_03

3、密钥设置成功

微信app支付java 微信app支付是什么意思_微信app支付java_04

  • 按照以上步骤操作后你将获取如下内容:
  • 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
  • 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要求请求通过HTTPAuthorizationAuthorization认证类型签名信息两个部分组成。
    下面我们使用命令行演示如何生成签名。
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"