2012-12-20 7 views
2

PHP에서 작동하도록 서버 쪽 POST를 얻으려고합니다. 나는 지불 게이트웨이에 트랜잭션 데이터를 전송하기 위해 노력하고 있지만 다음과 같은 오류가 계속 :PHP 서버 쪽 게시물

Message: fopen(https://secure.ogone.com/ncol/test/orderstandard.asp) : failed to open stream: HTTP request failed! HTTP/1.1 411 Length Required

코드 :

$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

나는이 오류가 당신이'Content-length' 헤더를 포함해야한다는 것을 의미한다고 생각한다. 제출 된 데이터의 바이트 수를 계산하고이 헤더를 포함하십시오. –

+0

답장을 보내 주셔서 감사합니다. 메시지를 파일에 쓰고 파일 크기를 가져오고이 값을 사용하는 가장 좋은 방법은 무엇입니까 ??? –

+0

귀하의 POST 데이터는 어디에 있습니까? –

답변

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); 
+0

브라우저에 게시 된 페이지를 표시하도록 요청하는 방법이 있습니까 ?? –

+0

어떤 브라우저입니까? fpassthru()는 POST 요청 내용을 stdout으로 덤프하지 않습니까? – paulgrav

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입니다.
+0

RFC http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html에 따라 콘텐츠 길이 필드는 "메시지 길이가 전송되기 전에 결정될 때마다 전송되어야합니다". 그래서 계산할 수 있다면 보내십시오. – paulgrav

+0

예. PHP는 그 내용을보고 당신을 위해 그것을 계산할 것입니다. –