Realex是常用的支付处理服务商,在集成其支付接口时,SHA1哈希校验是保障请求合法性的核心环节,一旦出现哈希不匹配,接口会直接返回错误拒绝请求,需要开发者逐一核对生成逻辑排查问题。

Realex SHA1哈希的生成规则
Realex要求的SHA1哈希是将指定字段按照固定顺序拼接后,加上商户密钥,再对整个字符串做SHA1计算得到的,不同接口类型的拼接字段略有差异,以支付请求为例,标准拼接顺序为:时间戳+商户ID+订单号+金额+货币+密钥,拼接完成后计算SHA1值,再将结果转为小写字符串作为哈希参数传入。
生成哈希的示例代码如下:
import hashlib
def generate_realex_sha1(timestamp, merchant_id, order_id, amount, currency, secret_key):
# 按照Realex要求的顺序拼接字段
hash_str = f"{timestamp}{merchant_id}{order_id}{amount}{currency}{secret_key}"
# 计算SHA1哈希
sha1 = hashlib.sha1(hash_str.encode("utf-8")).hexdigest()
# 转为小写返回
return sha1.lower()
# 示例参数
timestamp = "20240520123045"
merchant_id = "test_merchant"
order_id = "ORD123456"
amount = "100"
currency = "CNY"
secret_key = "your_secret_key_here"
hash_value = generate_realex_sha1(timestamp, merchant_id, order_id, amount, currency, secret_key)
print(f"生成的SHA1哈希值:{hash_value}")常见的哈希不匹配原因
1. 字段拼接顺序错误
这是最常见的问题,部分开发者会按照自己习惯的参数顺序排列字段,或者漏加、多加了某个字段,比如把金额放在订单号前面,或者忘记拼接密钥,都会导致最终哈希值和接口预期的不一致。
2. 字符编码不一致
Realex要求所有字段拼接前使用UTF-8编码,如果开发者使用了GBK或者其他编码处理字符串,计算出来的哈希值就会和接口侧的结果不同,尤其是参数中包含中文的时候,编码问题会更明显。
3. 密钥配置错误
商户密钥是哈希生成的核心参数,如果使用了测试环境的密钥对接生产环境,或者密钥本身输入有误,哪怕其他字段都正确,哈希值也会不匹配,需要核对商户后台的密钥配置是否和代码中使用的完全一致。
4. 参数值格式不符合要求
比如金额字段要求是整数,单位是分,如果传入的是带小数点的金额,或者时间戳格式不符合接口要求,都会导致拼接后的字符串和预期不同,进而哈希不匹配。
排查和修复步骤
- 第一步,核对接口文档,确认当前对接的接口类型需要的拼接字段和顺序,严格按照文档要求排列字段,不要自行调整顺序。
- 第二步,检查所有参与拼接的参数值,确认格式和接口要求一致,比如金额是否为整数分,时间戳是否为接口指定的格式,没有多余的空格或者特殊字符。
- 第三步,确认字符串编码为UTF-8,拼接前将所有字段统一转为UTF-8编码的字符串,避免编码不一致的问题。
- 第四步,核对商户密钥,确认代码中使用的密钥和Realex商户后台配置的密钥完全一致,注意区分测试和生产环境的密钥。
- 第五步,如果仍然不匹配,可以将拼接完成的原始字符串打印出来,和Realex官方提供的哈希校验工具对比,定位具体是哪个环节出了问题。
注意事项
不要将密钥硬编码在客户端代码中,避免密钥泄露带来安全风险,建议将密钥存储在服务端的安全配置中。另外,每次接口升级后要重新核对哈希生成规则,避免规则变更导致哈希不匹配。如果排查后仍然无法解决问题,可以联系Realex技术支持,提供拼接的原始字符串和生成的哈希值,让对方协助定位问题。