如何使用PHP发送HTTPS帖子

时间:2009-07-20 15:13:41

标签: php https

我正在设置自定义电子商务解决方案,我正在使用的支付系统要求我发送HTTPS POSTS。

我怎么能用php(和CURL?)来做这件事,与发送http帖子有什么不同?

更新

感谢您的回复,他们非常有用。我假设我需要购买一个SSL证书才能使用,我显然会在最终网站上进行此操作,但有没有办法让我在不购买的情况下进行测试?

谢谢,Nico

5 个答案:

答案 0 :(得分:38)

PHP / Curl会正常处理https请求。您可能需要做的事情,特别是在针对开发服务器时,关闭CURLOPT_SSL_VERIFYPEER。这是因为开发服务器可能是自签名的,并且无法通过验证测试。

$postfields = array('field1'=>'value1', 'field2'=>'value2');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://foo.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_POST, 1);
// Edit: prior variable $postFields should be $postfields;
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // On dev server only!
$result = curl_exec($ch);

答案 1 :(得分:12)

您还可以使用流API和http/https context options

$postdata = http_build_query(
  array(
    'FieldX' => '1234',
    'FieldY' => 'yaddayadda'
  )
);

$opts = array(
  'http' => array(
    'method'  => 'POST',
    'header'  => 'Content-type: application/x-www-form-urlencoded',
    'content' => $postdata
  )
);
$context  = stream_context_create($opts);
$result = file_get_contents('https://example.com', false, $context);

您仍需要提供SSL加密的扩展程序。这可以是php_openssl或( if 以这种方式编译)php_curl。

答案 2 :(得分:2)

不,没有太大区别。 Curl自己做了一切必要的事情。

请参阅user comments on the curl_setopt reference page中的示例。

答案 3 :(得分:1)

如果您使用curl,则可以为参数传入-d开关。这导致使用HTTP帖子。像

这样的东西
curl http://foo.com -d bar=baz -d bat=boo

将导致使用适当的参数

http://foo.com发送HTTP帖子

答案 4 :(得分:0)

类似的问题:POST to URL with PHP and Handle Response

使用已接受的解决方案(Snoopy PHP Class),您可以执行以下操作:

<?php

  $vars = array("fname"=>"Jonathan","lname"=>"Sampson");
  $snoopy = new Snoopy();

  $snoopy->curl_path = "/usr/bin/curl";  # Or whatever your path to curl is - 'which curl' in terminal will give it to you.  Needed because snoopy uses standalone curl to deal with https sites, not php_curl builtin.

  $snoopy->httpmethod = "POST";
  $snoopy->submit("https://www.somesite.com", $vars);
  print $snoopy->results;

?>