APP接入微信支付 补充
产品介绍
产品概述
-
APP支付是指商户通过在移动端应用APP中集成开放SDK调起微信支付模块来完成支付。目前微信支付支持手机系统有:IOS(苹果)、Android(安卓)和WP(Windows Phone)
应用场景
-
-
步骤一 用户进入商户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安全】->【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
,POST
,PUT
等 -
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.签名信息
注:以上五项签名信息,无顺序要求。
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"
-