签名生成

商户可以按照下述步骤生成请求的签名。在本节的最后,我们准备了多种常用编程语言的演示代码供开发者参考。

微信支付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秒)起至现在的总秒数,作为请求时间戳。微信支付会拒绝处理很久之前发起的请求,请商户保持自身系统的时间准确。

第四步,生成一个请求随机串,可参见生成随机数算法。这里,我们使用命令行直接生成一个。

第五步,获取请求中的请求报文主体(request body)。

  • 请求方法为GET时,报文主体为空。

  • 当请求方法为POSTPUT时,请使用真实发送JSON报文。

  • 图片上传API,请使用meta对应的JSON报文。

对于下载证书的接口来说,请求报文主体是一个空串。

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

计算签名值

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

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

设置HTTP头

微信支付商户API v3要求请求通过HTTPAuthorization头来传递签名。Authorization认证类型签名信息两个部分组成。

具体组成为:

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

  2. 签名信息

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

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

    • 请求随机串nonce_str

    • 时间戳timestamp

    • 签名值signature

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

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

最终我们可以组一个包含了签名的HTTP请求了。

演示代码

开发者可以查看开发工具相关章节,获取对应语言的库。如何在程序中加载私钥,请参考常见问题

计算签名的示例代码如下。

如果您的请求返回了签名错误401 Unauthorized,请参考常见问题之签名相关

最后更新于

这有帮助吗?