2015-06-17 2 views
0

Существует странное поведение работы php. Я передаю данные json через POST и ожидаю, что данные появятся в php://input. Вместо этого он заполняет $ _POST со странными парами ключ/значение. Вот завиток вызов

$process = curl_init("https://www.myurl.com/script"); 
curl_setopt($process, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt($process, CURLOPT_SSL_VERIFYHOST, FALSE); 


$params = '{"Response":{"Data":{"RMID":"0910403545","QID":"965102499460","RspCode":"000","RspDesc":"Successful Transaction Complete","TrxID":"61801","TrxStatus":"COMPLETE","BID":"61801","TrxRC":"4201","TrxTime":"2015-06-15 14:53:51","TrxValue":"9"}},"Signature":"5bf094adb23e40e1de135c055684dd2098ab18d0","Certificate":"-----BEGIN PGP SIGNED MESSAGE----- 
Hash: SHA1 

5bf094adb23e40e1de135c055684dd2098ab18d0 
-----BEGIN PGP SIGNATURE----- 
Version: GnuPG v1.4.5 (GNU/Linux) 

iD8DBQFVfoSPQ8sozXgiBRURArdkAKCwx5ggf5dE+djAAMIDsHaapLRgOACePyys 
a5scG9GhRFDefGz5CLHrqfI= 
=AWpR 
-----END PGP SIGNATURE----- 
"}'; 

curl_setopt($process, CURLOPT_POST, true); 
curl_setopt($process, CURLOPT_POSTFIELDS, $params); 
curl_setopt($process, CURLOPT_RETURNTRANSFER, 1); 

$return = curl_exec($process); 

А на другом конце я получаю

echo "<pre>"; 
var_export($_POST); 
--------------------------------------------- 
array (
    '{"Response":{"Data":{"RMID":"0910403545","QID":"965102499460","RspCode":"000","RspDesc":"Successful_Transaction_Complete","TrxID":"61801","TrxStatus":"COMPLETE","BID":"61801","TrxRC":"4201","TrxTime":"2015-06-15_14:53:51","TrxValue":"9"}},"Signature":"5bf094adb23e40e1de135c055684dd2098ab18d0","Certificate":"-----BEGIN_PGP_SIGNED_MESSAGE----- 
Hash:_SHA1 

5bf094adb23e40e1de135c055684dd2098ab18d0 
-----BEGIN_PGP_SIGNATURE----- 
Version:_GnuPG_v1_4_5_(GNU/Linux) 

iD8DBQFVfoSPQ8sozXgiBRURArdkAKCwx5ggf5dE_djAAMIDsHaapLRgOACePyys 
a5scG9GhRFDefGz5CLHrqfI' => ' 
=AWpR 
-----END PGP SIGNATURE----- 
"}', 
) 

Почему это делает?

ответ

1

Что касается curl_setopt($process, CURLOPT_POSTFIELDS, $params);

Этот параметр может быть либо принят в качестве urlencoded строки, как 'para1 = знач1 & para2 = val2 & ...' или как массив. (ref)

Curl ожидает пары параметр/значение, и вы поставляется только строку, так Curl принимает параметрвсе, вплоть до первого = знака, а значениеесть все после этого до появления первого знака &, которого нет. Вот почему $_POST выглядит так, когда вы сбрасываете его.

Один из способов облегчить это является UrlEncode в $params строку и передать его в curl_setopt как "data=".rawurlencode($params), а затем получить его с помощью rawurldecode($_POST["data"]);.

Смежные вопросы