You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP发起POST请求时currency字段被截断为cy的问题求助

问题分析与解决方案

你遇到的核心问题是HTML实体解析导致的参数名被错误截断——你在拼接POST参数时用了&(HTML转义后的&),当浏览器解析你输出的字符串时,会把&currency识别成&curren(这是HTML实体¤的写法),剩下的部分就变成了cy=EUR,所以数据库里收到的字段名就变成了cy,自然和签名生成时的currency不匹配,导致错误。

问题根源

&是用于HTML文档中的转义字符,用来避免&被浏览器当作HTML实体的起始符,但它不是URL/POST参数的正确分隔符。POST参数的键值对之间应该用原生的&字符来分隔。

修复方案

方案1:替换&为原生&

直接修改参数拼接的代码,把所有&换成&,这样参数就不会被错误解析了:

$myvars = "api_key=1555222" . "&time=" . $unixepochtime . "&currency=EUR" . "&sign=" . $signvalue;
settype($myvars,"string");
echo " ".$myvars." "; // 现在输出会是正确的api_key=1555222&time=14445454545&currency=EUR&sign=kiokossdsdasdafererasdasd

$ch = curl_init( $url );
curl_setopt( $ch, CURLOPT_POST, 1);
curl_setopt( $ch, CURLOPT_POSTFIELDS, $myvars);
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt( $ch, CURLOPT_HEADER, 0);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec( $ch );
echo $response;

方案2:用数组传递POST参数(更推荐)

curl支持直接传递数组作为CURLOPT_POSTFIELDS的值,它会自动帮你处理参数的编码和分隔,完全避免手动拼接可能出现的错误:

$postData = [
    'api_key' => '1555222',
    'time' => $unixepochtime,
    'currency' => 'EUR',
    'sign' => $signvalue
];

$ch = curl_init( $url );
curl_setopt( $ch, CURLOPT_POST, 1);
curl_setopt( $ch, CURLOPT_POSTFIELDS, $postData); // 直接传递数组,curl自动处理参数格式
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt( $ch, CURLOPT_HEADER, 0);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec( $ch );
echo $response;

为什么浏览器直接访问正常?

当你在浏览器里直接提交URL或表单时,浏览器会自动使用原生&作为参数分隔符,不会加入HTML转义,所以currency参数名能被后端正确识别。

内容的提问来源于stack exchange,提问作者stefanosn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:57:00