字节跳动⼩程序担保⽀付请求签名算法-Java实现
最近在做字节跳动⼩程序⽀付相关的功能,官⽅提供的⽀付接⼝,调⽤需要使⽤请求签名,但是官⽅给的加签⽰例没有Java的实现。这⾥记录⼀下Java实现的加签算法。
官⽅要求的请求签名算法:
1. sign, app_id , thirdparty_id 字段⽤于标识⾝份字段,不参与签名。将其他字段内容(不包含 key)与⽀付 SALT ⼀起进⾏字典序排序后,使⽤&符号链接
2. 使⽤ md5 算法对该字符串计算摘要,作为结果
3. 参与加签的字段均以 POST 请求中的 body 内容为准, 不考虑参数默认值等规则. 对于对象类型与数组类型的参数, 使⽤ POST 中的字符串原串进⾏左右去除 空格后进⾏加签
4. 如有其他安全性需要, 可以在请求中添加 nonce 字段, 该字段⽆任何业务影响, 仅影响加签内容, 使统⼀请求的多次签名不同
5. 空字符串与省略参数不参与加签
以如下的分账请求典型值为例:
{
"settle_params": "[{\"merchant_uid\":\"123345\",\"amount\":1}]",
"thirdparty_id": "ttc72cb19158066a6b",
"settle_desc": "开始结算与分账",
"out_settle_no": "mock_settle_no",
"out_order_no": "mock_settle_no",
"notify_url": "callback",
"app_id": "ttabcdefg123456",
"sign": "3c9421d0268a974138f4b36e9cefa1f1"
}
假设⽀付秘钥值为 your_payment_salt,经过剔除参数排序,得到 MD5 前的字符串为
[{"merchant_uid":"123345","amount":1}]&callback&mock_settle_no&mock_settle_no&your_payment_salt&开始结算与分账
MD5 计算后得到最终签名 3c9421d0268a974138f4b36e9cefa1f1
以下是Java⽰例加签
借助⼯具类Hutool
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.6.3</version>
</dependency>
/**
*
* @Title: getSign
* @Description: 字节跳动⼩程序请求签名算法
* @param paramsMap
* @return
* @author
* @date 2021-04-27 17:19:08
*/
public static String getSign(Map<String,Object> paramsMap) {
String [] skipArray= {"app_id", "sign", "thirdparty_id"};
Map<String, Object> map = veAny(paramsMap, skipArray);  List<String> list = new ArrayList<String>();
for (String key : map.keySet()) {
list.Str(map, key));
有趣的java小程序}
CollUtil.sort(list, null);
String str=CollUtil.join(list, "&");
return DigestUtil.md5Hex(str);
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。