PHP Postback回传验证失败求助:MD5哈希校验始终返回500错误
问题分析与解决方案
你遇到的500返回问题,核心是参数获取错误+校验逻辑完全不符合官方规则导致的,咱们一步步来修正:
1. 先修正参数获取的两处错误
你的$_GET取值存在大小写/参数名不匹配的问题,PHP的$_GET是严格区分大小写且对应URL参数名的:
- 请求URL里的校验哈希参数是
hash,但你用了$_GET['secure_hash'],这会直接拿到空值; - URL里的offer参数是
offer_id,但你写的是$_GET['offer_ID'],这里会获取不到正确的offer ID值。
修正后的参数获取代码:
$status = $_GET['status']; $trans_id = $_GET['trans_id']; $user_id = $_GET['user_id']; $amount_local = $_GET['amount_local']; $amount_usd = $_GET['amount_usd']; $offer_id = $_GET['offer_id']; // 修正大小写匹配问题 $hash = $_GET['hash']; // 修正参数名匹配问题 $ip_click = $_GET['ip_click'];
2. 完全重构校验逻辑(核心错误点)
官方文档明确说明:请求里的hash参数,是对方用md5({trans_id}-yourappsecurehash)生成的校验值,你的校验逻辑完全搞反了方向,还错误拼接了一堆无关参数。
正确的校验逻辑应该是:
- 用请求中的
trans_id,加上你的私有密钥,按照trans_id-你的密钥的格式拼接字符串; - 对这个拼接字符串生成MD5哈希;
- 将生成的哈希和请求里的
hash参数对比,一致则请求合法。
修正后的校验代码:
$app_secure_hash = "xxxxxxxxxxx"; // 替换成你控制台的私有密钥 // 按照官方规则生成校验哈希 $generated_verify_hash = md5($trans_id . '-' . $app_secure_hash); // 用严格比较判断哈希是否匹配 if ($generated_verify_hash !== $hash) { echo "500"; // 校验失败 } else { echo "200"; // 校验成功 }
额外优化建议
- 为了避免参数缺失导致的报错,可以给参数加上默认值,比如用PHP7+的空合并运算符:
$trans_id = $_GET['trans_id'] ?? ''; - 始终用严格比较符
!==/===,避免自动类型转换带来的意外问题。
内容的提问来源于stack exchange,提问作者busooCombo
相关产品推荐
相关产品推荐

