PHP ::<form method="post">를 에뮬레이션하여 사용자를 페이지로 전달

StackOverflow https://stackoverflow.com/questions/104872

  •  01-07-2019
  •  | 
  •  

문제

나는 작업 중입니다 PHP 에 연결되는 애플리케이션 Protx VSP Direct payment gateway.신용카드 처리 회사의 "3D Secure" 요청을 처리하려면 게시된 양식을 모방하여 사용자를 다른 웹사이트로 전달해야 합니다.나는 cURL 라이브러리에 문제가 있는 것 같습니다.내 코드는 다음과 같습니다

<?php  
$ch = curl_init();  
// Set the URL  
curl_setopt($ch, CURLOPT_URL, 'http://www.google.com/');  
// Perform a POST  
curl_setopt($ch, CURLOPT_POST, 1);  
// If not set, curl prints output to the browser  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);   
// Set the "form fields"  
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);  
$output = curl_exec($ch);  
curl_close($ch);  
?>  

이 작업은 전달된 URL의 콘텐츠를 가져오는 것 뿐이며 사용자를 어디로도 전달하지 않습니다.나는 인터넷 검색을 시도하고 가능한 한 많이 읽었지만 내가 놓친 것이 무엇인지 알 수 없습니다.어떤 아이디어가 있나요?피할 수 있다면 자동으로 제출되는 HTML 양식을 만들고 싶지 않습니다.

어떤 도움을 주셔서 감사합니다 :-)

도움이 되었습니까?

해결책

3D Secure API를 사용하면 백그라운드에서 요청을 수행할 수 없습니다.사용자를 3D 보안 사이트로 전달해야 합니다.자동으로 양식을 제출하려면 자바스크립트를 사용하세요.우리 공급자가 제안하는 내용은 다음과 같습니다.

<html> 
    <head> 
        <title>Processing your request...</title> 
    </head> 
    <body OnLoad="OnLoadEvent();"> 
        <form name="downloadForm" action="<%=RedirURL%>" method="POST"> 
            <noscript> 
                <br> 
                <br> 
                <div align="center"> 
                    <h1>Processing your 3-D Secure Transaction</h1> 
                    <h2>JavaScript is currently disabled or is not supported by your browser.</h2><BR> 
                    <h3>Please click Submit to continue the processing of your 3-D Secure transaction.</h3><BR> 
                    <input type="submit" value="Submit"> 
                </div> 
            </noscript> 
            <input type="hidden" name="PaReq" value="<%=PAREQ%>"> 
            <input type="hidden" name="MD" value="<%=TransactionID%>"> 
            <input type="hidden" name="TermUrl" value="<%=TermUrl%>"> 
        </form> 
        <SCRIPT LANGUAGE="Javascript"> 
            <!-- 
            function OnLoadEvent() { 
                document.downloadForm.submit(); 
            } 
            //--> 
        </SCRIPT> 
    </body> 
</html>

다른 팁

내 생각에 당신은 컬이 무엇인지에 대해 약간 혼란스러워하는 것 같습니다.설명하신 대로 정확히 수행되며 일종의 브라우저처럼 작동하고 사이트를 호출하고 해당 게시물의 콘텐츠를 반환합니다.실제로 브라우저 서버 측을 리디렉션하고 게시물을 나타낼 수 있는 방법을 모르겠습니다.나는 실제로 그런 일을 하기 위해 Javascript 솔루션을 만들 것입니다.

사용자를 PHP의 다른 페이지로 리디렉션하려면 header("Location: http://example.com/newpage");.그러나 불행하게도 프로그램 리디렉션으로 인해 모든 POST 변수가 제거됩니다(보안상의 이유로).사용자의 브라우저가 다른 URL로 POST 요청을 보내도록 하려면 자체적으로 제출하는 양식을 만들어야 합니다.:(

나는 사용자가 JS를 활성화할 것이라고 보장할 수 없고 양식을 표시하면 피하고 싶은 다른 문제가 발생하므로 cURL과 같은 뒤에서 무언가를 사용하는 것이 좋습니다.그래도 내 계획 B입니다 ;-)

POST 변수를 유지하면서 fsockopen()을 사용하여 새 웹 사이트로 리디렉션할 수 있습니다.이 작업을 수행하는 방법에 대한 좋은 튜토리얼이 있습니다. 여기.

웹사이트가 인터넷 괴물에게 먹힐 경우를 대비하여 기능을 복사해서 붙여넣었지만 내용은 원본 웹사이트를 확인하시는 것이 좋습니다.

function sendToHost($host,$method,$path,$data,$useragent=0)
{
    // Supply a default method of GET if the one passed was empty
    if (empty($method)) {
        $method = 'GET';
    }
    $method = strtoupper($method);
    $fp = fsockopen($host, 80);
    if ($method == 'GET') {
        $path .= '?' . $data;
    }
    fputs($fp, "$method $path HTTP/1.1\r\n");
    fputs($fp, "Host: $host\r\n");
    fputs($fp,"Content-type: application/x-www-form- urlencoded\r\n");
    fputs($fp, "Content-length: " . strlen($data) . "\r\n");
    if ($useragent) {
        fputs($fp, "User-Agent: MSIE\r\n");
    }
    fputs($fp, "Connection: close\r\n\r\n");
    if ($method == 'POST') {
        fputs($fp, $data);
    }

    while (!feof($fp)) {
        $buf .= fgets($fp,128);
    }
    fclose($fp);
    return $buf;
}

아, cURL이 무엇인지 오해했다면 JS 자동 제출 기능이 있는 HTML 양식으로 만족할 것 같습니다.나에게 꽤 많은 일이 생기지만, 그것이 유일한 방법이라면 그렇게 해야 할 것입니다.

모두 도움을 주셔서 감사합니다.

이 경우에는 양식을 사용해야 한다고 생각합니다.카드결제사 홈페이지는 서버측 코드가 아닌 사용자의 브라우저로 접속해야 합니다.

예, 3dsecure 등은 통합하기가 상당히 짜증나지만 실제 보안 강화를 제공합니다. 의도한 대로 사용하십시오.

어쩌면 제가 뭔가를 놓치고 있는 것일 수도 있습니다.사용자의 데이터를 수신하고 cURL을 통해 결제 처리자에게 전달한 다음 사용자를 어딘가로 리디렉션하려는 것 같습니다.오른쪽?

그렇다면 코드 끝에 다음을 추가하기만 하면 됩니다.

header("위치: http://www.yoursite.com/yoururl");

그러나 이것이 작동하려면 스크립트가 처리되는 동안 클라이언트에 아무 것도 보낼 수 없습니다.이는 스크립트가 템플릿 중간에 실행되어서는 안 된다는 것을 의미하며, 또 다른 문제는 여는 태그 앞의 파일 시작 부분에 공백이 있다는 것입니다.

원래 POST 트랜잭션의 데이터를 저장해야 하는 경우 세션을 사용하여 저장하세요.

JS가 없는 솔루션에서는 작동합니다.

제가 완전히 틀렸을 수도 있지만 프록시 패턴과 비슷한 작업을 수행하려는 것 같습니다.

나는 내가 함께 일했던 다른 사이트에 대해서도 비슷한 패턴을 구현했으며 제대로 작동하려면 약간의 수정이 필요합니다.

검색된 응답을 분석하고 이에 따라 애플리케이션 수준 작업을 수행할 수 있도록 RETURN_TRANSFER를 TRUE로 설정했습니다.

http://en.wikipedia.org/wiki/Proxy_pattern

행운을 빌어요.

위의 sendToHost() 함수가 매우 유용하다는 것을 알았지만 소스에 디버깅하는 데 시간이 걸리는 오타가 있습니다.Content-type 헤더 값에 'form-'과 'urlencoded' 사이에 공백이 포함되어 있습니다. 'application/x-www-form-urlencoded'여야 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top