使用Fatzebra支付网关:PHP中基于共享密钥生成HMAC_MD5哈希值的问题
解决PHP中使用HMAC_MD5生成Fatzebra哈希的问题
嘿,我明白你现在的困惑了——hash_hmac需要三个参数确实容易让人摸不着头脑,但其实这正是符合HMAC算法要求的,咱们一步步来解决:
先搞懂hash_hmac的参数逻辑
HMAC算法本身就需要三个核心要素:
- 哈希算法类型(这里是
md5) - 待签名的消息(Fatzebra会要求你用请求里的特定内容,比如请求体、时间戳或者拼接的请求参数,不是直接把共享密钥当消息哦)
- 你的共享密钥(也就是你手里的
234567erty)
针对Fatzebra的PHP实现示例
假设Fatzebra要求你对请求的JSON体生成HMAC_MD5哈希(这是支付网关常见的做法),代码可以这么写:
// 你的共享密钥 $sharedSecret = '234567erty'; // 假设这是你要发送给Fatzebra的请求数据(比如订单信息) $requestData = [ 'amount' => 1000, 'currency' => 'AUD', 'card_number' => '4111111111111111' ]; // 把请求数据转成JSON字符串(Fatzebra通常要求用原始请求体来签名) $message = json_encode($requestData); // 生成HMAC_MD5哈希 $hmacHash = hash_hmac('md5', $message, $sharedSecret); // 输出结果 echo $hmacHash;
关键注意事项
- 一定要严格按照Fatzebra文档里的要求来确定消息内容:有些网关会要求拼接URL、HTTP方法、时间戳和请求体,有些只需要请求体,千万别自己瞎猜格式
- 确保消息的编码和格式和网关要求一致:比如是否要去除空格、是否用特定的JSON编码选项(比如
JSON_UNESCAPED_SLASHES) - 如果文档里要求哈希结果是十六进制字符串,上面的代码直接输出的就是;如果需要base64编码,就用
base64_encode(hash_hmac('md5', $message, $sharedSecret, true))(最后一个true参数返回原始二进制数据,再转base64)
如果还是不确定消息的具体内容,再仔细核对Fatzebra的文档细节,重点找“签名生成”“请求验证”相关的章节,里面肯定会明确告诉你要把哪些内容拼接成消息来签名~
内容的提问来源于stack exchange,提问作者Peace
相关产品推荐
相关产品推荐

