PAYATHON 2026

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 中的”成功”字段发货。

备注:内容仅供参考。