web-dev-qa-db-ja.com

PHPを使用してHTTPS投稿を送信する方法

カスタムeコマースソリューションを設定しています。使用している支払いシステムでは、HTTPS POSTSを送信する必要があります。

Php(およびCURL)を使用してこれを行うにはどうすればよいですか?http投稿の送信とは何が違うのですか?

更新:

お返事ありがとうございます。とても役に立ちました。これを機能させるにはSSL証明書を購入する必要があると思いますが、最終的なサイトでこれを行うのは明らかですが、購入せずにこれをテストする方法はありますか?

ありがとう、ニコ

17
Nico Burns

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);
39
Brent Baisley

ストリームAPIと http/httpsコンテキストオプション を使用することもできます

$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のいずれかです。

12
VolkerK

いいえ、大きな違いはありません。 Curlは必要なすべてを自分で行います。

curl_setoptリファレンスページのユーザーコメント の例を参照してください。

2
Gumbo

Curlを使用している場合は、パラメーターの-dスイッチを渡すことができます。その結果、HTTPポストが使用されます。何かのようなもの

curl http://foo.com -d bar=baz -d bat=boo

http://foo.com へのHTTPポストが適切なパラメータで行われます

1
Rob Di Marco

同様の質問: 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;

?>
0
Sampson