2

サーバー側のPOSTをPHPで動作させようとしています。トランザクションデータを支払いゲートウェイに送信しようとしていますが、次のエラーが発生し続けます。

メッセージ::fopen(https://secure.ogone.com/ncol/test/orderstandard.asp)ストリームを開くことができませんでした:HTTPリクエストに失敗しました!HTTP /1.1411必要な長さ

コード:

$opts = array(
    'http' => array(
        'Content-Type: text/html; charset=utf-8',
        'method' => "POST",
        'header' => "Accept-language: en\r\n" .
        "Cookie: foo=bar\r\n"
     )
);

$context = stream_context_create($opts);

$fp = fopen('https://secure.ogone.com/ncol/test/orderstandard.asp', 'r', false, $context);
fpassthru($fp);
fclose($fp);

オンラインで見つかったいくつかの解決策を試してみました-ほとんどが暗闇の中でのショットなので、これまでのところ運がありません!

4

2 に答える 2

3

コンテンツの長さを追加するだけです。実際にコンテンツの送信を開始したら、その長さを計算する必要があります。

$data = "";
$opts = array(
    'http' => array(
        'Content-Type: text/html; charset=utf-8',
        'method' => "POST",
        'header' => "Accept-language: en\r\n" .
        "Cookie: foo=bar\r\n" .
        'Content-length: '. strlen($data) . "\r\n",
        'content' => $data
     )
);

$context = stream_context_create($opts);

$fp = fopen('https://secure.ogone.com/ncol/test/orderstandard.asp', 'r', false, $context);
fpassthru($fp);
fclose($fp);
于 2012-12-20T11:32:16.873 に答える
1

contentオプションを指定すると、コードが機能するはずです。指定する必要はありませんContent-length。PHPが自動的に計算します。

$opts = array(
    "http" => array(
        "method" => "POST",
        "header" =>
            "Content-type: application/x-www-form-urlencoded\r\n" .
            "Cookie: foo=bar",
        "content" => http_build_query(array(
            "foo" => "bar",
            "bla" => "baz"
        ))
    )
);

ノート:

  • 上記の例では、サーバーはContent-length: 15明示的に指定されていなくてもヘッダーを受信します。
  • POSTデータのコンテンツタイプは通常application/x-www-form-urlencodedです。
于 2012-12-20T11:33:30.740 に答える