无法使用fopen进行发布请求

时间:2016-09-10 15:52:32

标签: php http post request fopen

我尝试使用fopen进行发布请求,但我无法更改请求的标头,无法完成。我需要帮助,请看我的代码:

$data_array = array(
   'MerchantOrderId'=>'2014111703',
   'Customer'=>array(  
      'Name'=>'Comprador Teste'     
   ),
   'Payment'=>array(  
     'Type'=>'CreditCard',
     'Amount'=> '100',
     'Provider'=>'Simulado',
     'Installments'=>1,
     'CreditCard'=>array(  
         'CardNumber'=>'4461561220666711',
         'Holder'=>'Pablo Pablo',
         'ExpirationDate'=>'01/2019',
         'SecurityCode'=>'101',
         'Brand'=>'Master'
     )
   )
);

$data = json_encode($data_array);

$header = 'Content-Type : application/json\r\n'.
          'Content-Length :'. strlen($data).'\r\n'.
          'MerchantId : 3a361c55-2feb-4c8d-a0e9-1cf24fb31242\r\n'.
          'MerchantKey : VXXIKMBOZHBZACKKJHHTYLECTACKIYQXAXYHOJNI\r\n'.
          'RequestId : 4e361c55-2feb-4c8d-a0e9-1cf24fb31244';

$context_opt = array(
    'https' => array (
        'method'  => "POST",
    'header'  => $header,
    'content' => $data
    )
);

$url = 'https://apisandbox.braspag.com.br/v2/sales';

$fp = fopen(
  $url, 
  'r', 
  false, 
  stream_context_create($context_opt)
);

if (!$fp)
{
    throw new Exception('Problem with $url, $php_errormsg');
}

$result = stream_get_contents($fp);

fclose($fp);

print_r($result);

我使用rest console chrome扩展程序测试了此配置并且工作正常 我做错了什么?

1 个答案:

答案 0 :(得分:0)

在您的上下文选项数组中,您需要使用键http,而不是https。 https不是它自己的包装器,它是http包装器+ ssl包装器的组合。

$context_opt = array(
    'http' => array (
        'method'  => "POST",
        'header'  => $header,
        'content' => $data
    )
);

除此之外,您还需要修复标头定义。首先,您需要使用双引号字符串,以便\r\n转义创建新行。使用单引号,您将获得分隔标题的文字'\r\n'。其次,您需要删除标题名称和冒号之间的空格,标题名称中不允许使用空格。

$header = "Content-Type: application/json\r\n".
          "Content-Length: ". strlen($data)."\r\n".
          "MerchantId: 3a361c55-2feb-4c8d-a0e9-1cf24fb31242\r\n".
          "MerchantKey: VXXIKMBOZHBZACKKJHHTYLECTACKIYQXAXYHOJNI\r\n".
          "RequestId: 4e361c55-2feb-4c8d-a0e9-1cf24fb31244";