本文档面向第三方接入方技术人员,重点说明开放平台 API 的 签名与验签机制。
SHA256 with RSA(RSA 2048,签名结果 Base64 编码)WXH-SHA256-RSA2048application/jsonAPPID、密钥交换通过线下业务对接完成,请联系平台商务/技术对接人。| 密钥 | 持有方 | 用途 |
|---|---|---|
| 接入方私钥 | 接入方(严格保密,切勿外传) | 对请求进行签名 |
| 接入方公钥 | 提交给平台 | 平台对请求进行验签 |
| 平台私钥 | 平台持有 | 平台对响应进行签名 |
| 平台公钥 | 平台线下提供给接入方 | 接入方对响应进行验签 |
APPID(16 位字符串);接入方 平台
│ │
│ 1. 用接入方私钥对请求内容签名 │
│ Authorization: WXH-SHA256-RSA2048 ... │
│ ────────────────────────────────────────────> │
│ 2. 平台用接入方公钥验签 │
│ │
│ 响应头: Wxh-Timestamp / Wxh-Nonce / │
│ Wxh-Signature(平台私钥签名) │
│ <──────────────────────────────────────────── │
│ 3. 接入方用平台公钥对响应验签 │\n:{HTTPMethod}
{URI}
{Timestamp}
{Nonce}
{Body}
| 字段 | 说明 |
|---|---|
HTTPMethod | HTTP 方法,大写,如 GET、POST、PUT |
URI | 请求 URI,包含接口路径与 Query String,如 /v1/open/orders、/v1/open/orders?order_no=123 |
Timestamp | Unix 时间戳(秒,纯数字),如 1756700000 |
Nonce | 随机字符串,长度不超过 128,建议使用随机数并保证不重复(防重放) |
Body | 请求体原始字符串(application/json 序列化后的原文);GET 等无请求体的方法使用空字符串 |
注意:参与签名的 Body必须与实际发送的请求体逐字节一致(包括字段顺序、空格、转义等),否则验签失败。建议先序列化出最终请求体字符串,再用该字符串发起请求。
POST
/v1/open/orders
1756700000
a1b2c3d4e5f6
{"order_no":"SN202609010001","receiver":{"name":"张三"}}\n,包括最后一行)SHA256withRSA 签名,并将签名结果进行 Base64 编码:Signature = Base64( RSA_SHA256_Sign( 待签名串, 接入方私钥 ) )Authorization 请求头,格式如下:WXH-SHA256-RSA2048 appid="{APPID}",timestamp="{Timestamp}",nonce="{Nonce}",signature="{Signature}"WXH-SHA256-RSA2048 开头,后跟一个空格;, 分隔(逗号后无空格);appid、timestamp、nonce、signature 四个参数;appid 为 16 位字符串;timestamp 为秒级 Unix 时间戳;nonce 长度 ≤ 128;signature 为 Base64 字符串。Authorization: WXH-SHA256-RSA2048 appid="Ks92mXwQ7pLz3VbN",timestamp="1756700000",nonce="a1b2c3d4e5f6",signature="dGhpcyBpcyBhIGJhc2U2NCBzaWduYXR1cmU..."| 响应头 | 说明 |
|---|---|
Wxh-Timestamp | 平台签名时使用的时间戳(秒) |
Wxh-Nonce | 平台签名时使用的随机串 |
Wxh-Signature | 响应签名(Base64 编码) |
\n):{Wxh-Timestamp}\n{Wxh-Nonce}\n{ResponseBody}\nResponseBody 为响应体原始字符串(不要先反序列化再重新序列化)。SHA256withRSA 验签:RSA_SHA256_Verify( 待验证串, Base64Decode(Wxh-Signature), 平台公钥 ) == true{
"code": "000000",
"msg": "请求处理成功",
"data": { }
}| 字段 | 说明 |
|---|---|
code | 业务状态码,字符串。000000 表示成功 |
msg | 提示信息 |
data | 业务数据 |
| code | 说明 |
|---|---|
000000 | 成功 |
100102 | 签名/授权校验失败,msg 中为具体原因 |
100102 常见原因:| msg | 可能原因 |
|---|---|
| 签名格式错误! | Authorization 未以 WXH-SHA256-RSA2048 开头 |
| 请求签名包含无效信息! | 携带了 appid/timestamp/nonce/signature 之外的参数 |
| 请求签名信息错误! | 缺少必填参数或参数为空 |
| appid格式错误! | appid 不是 16 位 |
| timestamp格式错误! | timestamp 不是秒级 Unix 时间戳 |
| nonce格式错误! | nonce 长度超过 128 |
| signature格式错误! | signature 超长 |
| 应用不存在 | appid 未在平台登记 |
| 签名验证失败 | 待签名串拼装错误或使用了错误的私钥/公钥 |
GET 请求 Body 参与签名时使用空字符串,注意待签名串末尾仍需保留对应换行符:GET
/v1/open/orders?order_no=SN202609010001
{timestamp}
{nonce}