参数名ASCII码从小到大排序(字典序)

本文介绍微信JSAPI支付中签名生成的具体步骤,包括参数排序、拼接及MD5加密等过程。通过示例代码展示了如何实现签名算法。

签名生成的通用步骤如下:

对接微信JSAPI支付时需要安全规则的签名算法,记录下:

第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

特别注意以下重要规则:

◆ 参数名ASCII码从小到大排序(字典序); ◆ 如果参数的值为空不参与签名; ◆ 参数名区分大小写; ◆
验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。 ◆
微信接口可能增加字段,验证签名时必须支持增加的扩展字段
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。

◆ key设置路径:微信商户平台(pay.weixin.qq.com)–>账户设置–>API安全–>密钥设置

public static void main(String[] args) {
   
   
        SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();
        String marChant_id="555555";
        String appId = "444444";
        String timeStamp = "333333";
        String nonceStr = "222222";
        String signType = "MD5";
        parameters.put("marChant_id"
### 参数按照ASCII排序的实现方法 在处理如API请求等场景时,需要对参数按照参数ASCII顺序进行排序。这通常用于生成请求签,以确保参数的完整性和顺序的正确性。具体来说,参数按照ASCII从小到大排序,可以确保生成的签在不同平台和实现中保持一致[^1]。 #### 实现逻辑 1. **提取参数键**:从参数对象中提取所有的键(参数)。 2. **排序参数键**:将这些键按照ASCII顺序从小到大排序。 3. **拼接参数字符串**:将排序后的参数按照`key=value`的格式拼接成一个字符串。 4. **添加签密钥**:在拼接字符串的末尾追加`&key=API密钥`,其中`API密钥`是预先定义的密钥。 5. **生成签**:使用MD5算法对最终字符串进行哈希处理,生成32位小写的签。 #### 示例代 以下是一个使用Node.js实现的完整示例: ```javascript const crypto = require('crypto'); // 生成签 function generateSign(params, apiKey) { const keys = Object.keys(params).sort(); // 按ASCII字典序排序 const str = keys.map(k => `${k}=${params[k]}`).join('&') + `&key=${apiKey}`; return crypto.createHash('md5').update(str).digest('hex'); } // 示例参数 const params = { re_openid: 'oTBP85Rexxxxxxxxxxxxxxxxx', total_amount: 100, mch_billno: '20230901123456789', nonce_str: 'randomstring123', mch_id: '1900000101', wxappid: 'wx8888888888888888' }; const apiKey = 'your_api_key_here'; // 替换为你的API密钥 // 生成签 const sign = generateSign(params, apiKey); console.log('生成的签:', sign); ``` 在上述代中,通过`Object.keys(params).sort()`实现了参数ASCII排序,并通过`crypto`模块生成了MD5签。 #### 注意事项 - **忽略空**:在实际应用中,空和签字段通常会被忽略。 - **编处理**:某些场景下需要对参数进行URL编,但微信支付接口通常要求不编。 - **签验证**:生成签后,可以通过与接口返回的签对比,验证请求的合法性。 #### 参数排序的扩展应用 除了用于生成签参数按照ASCII排序还可以用于其他场景,例如: - **日志记录**:按固定顺序记录参数,便于日志分析。 - **缓存键生成**:确保相同参数生成相同的缓存键。 - **数据一致性校验**:在分布式系统中校验数据一致性。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值