PayMate 支付成功后 return URL 未收到输出参数
结论
PayMate 的 Output parameters 通常会在浏览器重定向时作为 URL 查询参数返回,请求方式是 HTTP GET,不是 POST。因此,回跳页面应从 $_GET 或 $_SERVER['QUERY_STRING'] 中读取数据。
提交给 PayMate 的 return 地址还需要经过 URL 编码。不要手工拼接完整的支付地址,否则回跳 URL 中的 ?、& 等字符可能被 PayMate 当作支付请求本身的参数。
正确构造支付 URL
可以用 http_build_query() 对参数统一编码:
<?php
$params = [
'mid' => 'mypaymateID',
'amt' => '100',
'ref' => '123',
'return' => 'https://bondiclassifieds.com/paymatereturn.php',
'popup' => 'true',
];
$paymentUrl = 'https://www.paymate.com/PayMate/ExpressPayment?'
. http_build_query($params, '', '&', PHP_QUERY_RFC3986);
header('Location: ' . $paymentUrl);
exit;
编码后的 return 参数类似这样:
return=https%3A%2F%2Fbondiclassifieds.com%2Fpaymatereturn.php
如果必须手工拼接,至少要使用 rawurlencode() 编码回跳地址:
$returnUrl = rawurlencode(
'https://bondiclassifieds.com/paymatereturn.php'
);
在回跳页面读取参数
先不要预设字段名,可以直接查看 PayMate 实际附加了哪些查询参数:
<?php
header('Content-Type: text/plain; charset=utf-8');
echo "Request method: ";
echo $_SERVER['REQUEST_METHOD'] ?? 'unknown';
echo "\nQuery string: ";
echo $_SERVER['QUERY_STRING'] ?? '';
echo "\n\nGET parameters:\n";
print_r($_GET);
echo "\nPOST parameters:\n";
print_r($_POST);
确认已经收到数据后,再按照 PayMate 集成文档中的实际 Output parameter 名称读取:
<?php
$reference = $_GET['ref'] ?? null;
$status = $_GET['status'] ?? null; // 仅为示例,字段名以文档为准
if ($reference === null) {
http_response_code(400);
exit('Missing payment reference');
}
这里的 status 只是示例,不代表 PayMate 一定会返回该字段。不同接口或账户配置可能使用不同的字段名,应以当前接口文档和实际请求为准。
为什么不建议依赖 $_REQUEST
$_REQUEST 的内容取决于 PHP 的 request_order 和 variables_order 配置。不同服务器收集到的 GET、POST 和 Cookie 数据可能不同,同名参数也可能相互覆盖。
处理支付回跳时,最好明确区分参数来源:
$valueFromQuery = $_GET['parameter_name'] ?? null;
$valueFromPost = $_POST['parameter_name'] ?? null;
如果 $_GET 仍然为空,可以检查 Web 服务器访问日志,或者暂时记录原始请求信息:
<?php
$logData = [
'time' => date(DATE_ATOM),
'method' => $_SERVER['REQUEST_METHOD'] ?? null,
'request_uri' => $_SERVER['REQUEST_URI'] ?? null,
'query_string' => $_SERVER['QUERY_STRING'] ?? null,
'get' => $_GET,
'post' => $_POST,
];
error_log('PayMate return: ' . json_encode(
$logData,
JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE
));
不要在日志中记录银行卡信息、认证令牌或其他敏感数据。
还需要检查的事项
- 回跳地址应使用 HTTPS,并确保可以从公网访问。
- 检查反向代理、Rewrite 规则或框架路由是否在跳转过程中丢弃了查询字符串。
- 查看浏览器最终地址栏,确认 PayMate 是否确实附加了
?name=value参数。 - 暂时关闭
popup=true做对比,排除弹窗关闭或 JavaScript 跳转对回跳流程的影响。 - 确认 PayMate 后台是否还要求配置返回地址、通知地址,或启用相关功能。
- 如果原始 HTTP 请求中的
QUERY_STRING为空,说明问题出现在 PHP 收到请求之前。此时应向 PayMate 支持提供交易参考号、时间和回跳地址,请其确认该账户及接口是否已启用 Output parameters。
浏览器回跳只适合展示支付结果,不能作为确认到账的唯一依据。用户可能关闭窗口或重复刷新,也可以自行伪造查询参数。如果 PayMate 提供服务器通知、交易查询或签名校验接口,应通过这些机制确认交易状态后再更新订单,不要仅凭 $_GET 中的”成功”字段发货。
备注:内容仅供参考。
