我们提供了职乐一物一码官方SDK(目前包含了java版本),使用官方 SDK 调用平台接口,无需关心签名生成和验证,接入更方便。商户可以按照下述步骤生成请求的签名。在本节的最后,我们准备了多种常用编程语言的演示代码供开发者参考。平台接口要求商户对请求进行签名,平台会在收到请求后进行签名的验证。如果签名验证不通过,平台将会拒绝处理请求,并返回401 Unauthorized。#1. 准备
商户需要拥有一个职乐商户号,并向平台运营获取商户API对接参数。商户API对接参数包含了签名必需的私钥和商户证书。#2. 构造签名串
我们希望商户的技术开发人员按照当前文档约定的规则构造签名串。我们平台会使用同样的方式构造签名串。如果商户构造签名串的方式错误,将导致签名验证不通过。下面先说明签 名串的具体格式。签名串一共有五行,每一行为一个参数。结尾以\n(换行符,ASCII编码值为0x0A)结束,包括最后一行。如果参数本身以\n结束,也需要附加一个\n。HTTP请求方法\n
URL\n
请求时间戳\n
请求随机串\n
请求报文主体\n
我们通过在命令行中调用"通过商家批次单号查询批次单"接口,一步一步向开发者介绍如何进行请求签名。第一步,获取HTTP请求的方法(GET,POST,PUT)等GET
第二步,获取请求的绝对URL,并去除域名部分得到参与签名的URL。如果请求中有查询参数,URL末尾应附加有'?'和对应的查询字符串。/v3/transfer/batches/out-batch-no/CARRY70020230907001?detail_status=SUCCESS&limit=20
第三步,获取发起请求时的系统当前时间戳,即格林威治时间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/transfer/batches/out-batch-no/CARRY70020230907001?detail_status=SUCCESS&limit=20\n
1554208460\n
593BEC0C930BF1AFEB40B4A08C8FB242\n
\n
#3. 计算签名值
绝大多数编程语言提供的签名函数支持对签名数据进行签名。强烈建议商户调用该类函数,使用商户私钥对待签名串进行SHA256 with RSA签名,并对签名结果进行Base64编码得到签名值。$ echo -n -e
"GET\n/v3/transfer/batches/out-batch-no/CARRY70020230907001?detail_status=SUCCESS&limit=20\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==
#4. 设置HTTP头
平台要求请求通过HTTP Authorization头来传递签名。Authorization由认证类型和签名信息两个部分组成。Authorization: 认证类型 签名信息
具体组成为:认证类型,目前为WECHATPAY2-SHA256-RSA2048
签名信息
发起请求的商户(包括直连商户、服务商或渠道商)的商户号mchid
商户API证书序列号serial_no,用于声明所使用的证书
请求随机串nonce_str
时间戳timestamp
签名值signature
提示Authorization头的示例如下:(注意,示例因为排版可能存在换行,实际数据应在一行)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"
最终我们可以组一个包含了签名的HTTP请求了。$curl https://api.oioc.gzlle.com/v3/transfer/batches/out-batch-no/CARRY70020230907001?detail_status=SUCCESS&limit=20 -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"' 修改于 2024-02-26 07:10:18