PHP发起POST请求时currency字段被截断为cy的问题求助
问题分析与解决方案
你遇到的核心问题是HTML实体解析导致的参数名被错误截断——你在拼接POST参数时用了&(HTML转义后的&),当浏览器解析你输出的字符串时,会把&currency识别成¤(这是HTML实体¤的写法),剩下的部分就变成了cy=EUR,所以数据库里收到的字段名就变成了cy,自然和签名生成时的currency不匹配,导致错误。
问题根源
&是用于HTML文档中的转义字符,用来避免&被浏览器当作HTML实体的起始符,但它不是URL/POST参数的正确分隔符。POST参数的键值对之间应该用原生的&字符来分隔。
修复方案
方案1:替换&为原生&
直接修改参数拼接的代码,把所有&换成&,这样参数就不会被错误解析了:
$myvars = "api_key=1555222" . "&time=" . $unixepochtime . "¤cy=EUR" . "&sign=" . $signvalue; settype($myvars,"string"); echo " ".$myvars." "; // 现在输出会是正确的api_key=1555222&time=14445454545¤cy=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
相关产品推荐
相关产品推荐

