programing

POST 데이터를 사용한 PHP 리다이렉트

randomtip 2022. 9. 5. 22:39
반응형

POST 데이터를 사용한 PHP 리다이렉트

저는 이 주제에 대해 몇 가지 조사를 했습니다만, 그것이 불가능하다고 하는 전문가도 있기 때문에, 다른 해결책을 요구하고 싶습니다.

내 상황:

페이지 A: [체크아웃]php] 고객님께서 청구내역을 기입해 주세요.

페이지 B: [프로세스]php] 청구서 번호를 생성하여 고객 정보를 데이터베이스에 저장합니다.

페이지 C: [thirdparty.com]세 번째 지불 게이트웨이 (POST 데이터만 수락)

고객은 상세 내용을 입력하고 A페이지에서 카트를 셋업한 후 B페이지로 POST합니다.내부 프로세스php, POST된 데이터를 데이터베이스에 저장하고 청구서 번호를 생성합니다.그런 다음 고객 데이터와 청구서 번호를 thirdparty.com 결제 게이트웨이에 게시합니다.문제는 B페이지에서 POST를 하는 것입니다.cURL은 데이터를 C페이지에 POST 할 수 있지만, 문제는 페이지가 C페이지로 리다이렉트 되지 않았다는 것입니다.고객은 C페이지에 신용카드 세부사항을 기입해야 합니다.

서드파티 결제 게이트웨이에서 API 샘플을 받았습니다.샘플은 고객 상세 정보와 함께 POST 청구서 번호입니다.시스템이 불필요한 송장 번호를 과도하게 생성하는 것을 원치 않습니다.

이에 대한 해결책이 있습니까?현재의 솔루션은 고객이 A페이지에 상세 내용을 기입하는 것입니다.그 후, B페이지에 고객의 모든 상세 내용을 표시하는 다른 페이지를 작성합니다.여기에서 사용자는 [CONFIRM]버튼을 클릭하여 C페이지에 POST 할 수 있습니다.

델의 목표는 고객이 클릭을 한 번만 하면 되는 것입니다.

질문이 명확하기를 바랍니다:)

필요한 모든 데이터와 액션을 페이지 C로 설정한 상태에서 페이지 B에 폼을 생성하여 페이지 로드 시 JavaScript와 함께 제출합니다.데이터는 사용자에게 큰 번거로움 없이 페이지 C로 전송됩니다.

이 방법밖에 없어요.리다이렉트는 http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html,에서 읽을 수 있는303 HTTP 헤더입니다만, 그 중 일부를 인용하겠습니다.

요청에 대한 응답은 다른 URI에서 찾을 수 있으며 해당 리소스에서 GET 방식을 사용하여 검색해야 합니다.이 방법은 주로 POST 활성화 스크립트의 출력이 사용자 에이전트를 선택한 리소스로 리디렉션할 수 있도록 하기 위해 존재합니다.새 URI는 원래 요청된 리소스의 대체 참조가 아닙니다.303 응답은 캐시해서는 안 되지만 두 번째(리다이렉트) 요구에 대한 응답은 캐시할 수 있습니다.

사용자를 페이지 C로 보내는 중간 페이지를 사용하는 방법밖에 없습니다.이를 실현하는 방법은 다음과 같습니다.

<form id="myForm" action="Page_C.php" method="post">
<?php
    foreach ($_POST as $a => $b) {
        echo '<input type="hidden" name="'.htmlentities($a).'" value="'.htmlentities($b).'">';
    }
?>
</form>
<script type="text/javascript">
    document.getElementById('myForm').submit();
</script>

또한 Javascript가 없는 사용자가 서비스를 사용할 수 있도록 하기 위해 noscript 태그에 간단한 "확인" 양식을 포함해야 합니다.

/**
  * Redirect with POST data.
  *
  * @param string $url URL.
  * @param array $post_data POST data. Example: ['foo' => 'var', 'id' => 123]
  * @param array $headers Optional. Extra headers to send.
  */
public function redirect_post($url, array $data, array $headers = null) {
  $params = [
    'http' => [
      'method' => 'POST',
      'content' => http_build_query($data)
    ]
  ];

  if (!is_null($headers)) {
    $params['http']['header'] = '';
    foreach ($headers as $k => $v) {
      $params['http']['header'] .= "$k: $v\n";
    }
  }

  $ctx = stream_context_create($params);
  $fp = @fopen($url, 'rb', false, $ctx);

  if ($fp) {
    echo @stream_get_contents($fp);
    die();
  } else {
    // Error
    throw new Exception("Error loading '$url', $php_errormsg");
  }
}

$_SESSION은 Javascript를 조작하고 싶지 않다면 당신의 친구입니다.

예를 들어 이메일을 전달하려고 합니다.

A페이지:

// Start the session
session_start();

// Set session variables
$_SESSION["email"] = "awesome@email.com";

header('Location: page_b.php');

그리고 B페이지:

// Start the session
session_start();

// Show me the session!  
echo "<pre>";
print_r($_SESSION);
echo "</pre>";

세션을 파기하려면

unset($_SESSION['email']);
session_destroy();

이것을 가능하게 하는 다른 해결책이 있습니다.고객님이 Javascript를 실행하셔야 합니다(요즘은 이것이 공정한 요건이라고 생각합니다).

A페이지의 AJAX 요청을 사용하여 백그라운드에서 청구서 번호와 고객 세부 정보를 생성하고(이전 페이지 B), 요청이 올바른 정보로 반환되면 양식을 결제 게이트웨이로 제출(C페이지)하기만 하면 됩니다.

이렇게 하면 사용자가 버튼을 하나만 클릭하고 결제 게이트웨이로 이동하면 결과가 나타납니다.다음은 몇 가지 의사 코드입니다.

HTML:

<form id="paymentForm" method="post" action="https://example.com">
  <input type="hidden" id="customInvoiceId" .... />
  <input type="hidden" .... />

  <input type="submit" id="submitButton" />
</form>

JS(편의상 jQuery를 사용하지만 순수 Javascript를 만들기 위해서는 사소한 것) :

$('#submitButton').click(function(e) {
  e.preventDefault(); //This will prevent form from submitting

  //Do some stuff like build a list of things being purchased and customer details

  $.getJSON('setupOrder.php', {listOfProducts: products, customerDetails: details }, function(data) {
  if (!data.error) {
    $('#paymentForm #customInvoiceID').val(data.id);
    $('#paymentForm').submit();   //Send client to the payment processor
  }
});

오래된 질문인 것은 알지만 jQuery에 대한 또 다른 해결책이 있습니다.

var actionForm = $('<form>', {'action': 'nextpage.php', 'method': 'post'}).append($('<input>', {'name': 'action', 'value': 'delete', 'type': 'hidden'}), $('<input>', {'name': 'id', 'value': 'some_id', 'type': 'hidden'}));
actionForm.submit();

위의 코드는 jQuery를 사용하여 폼태그를 만들고 숨김 필드를 포스트 필드로 추가한 후 마지막으로 전송합니다.이 페이지는 POST 데이터가 첨부된 폼 타깃 페이지로 전송됩니다.

JavaScript jQuery 。된 바와 , 하실 수 .<noscript>태그를 지정하여 JS가 비활성화되어 있는 경우 표준 HTML 폼을 만듭니다.

은 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.php 수정 oriented oriented 、 a 、 이 、 이 、 이 、 이 、 이 a a a a a a a a a a.POST은 아마 '어느 정도'를 사용하고 입니다..htaccess (표준:)

RewriteEngine on
RewriteCond %{REQUEST_URI} string_to_match_in_url
RewriteCond %{REQUEST_METHOD} POST
RewriteRule ^(.*)$ https://domain.tld/$1 [L,R=307]

설명:

하는 는 "POST"를 사용하여 .302 redirect이것에 의해, 요구에 관련 붙여진 모든 POST 데이터도 폐기됩니다.브라우저는 POST 트랜잭션의 의도하지 않은 재전송을 방지하기 위한 예방책으로 이를 수행합니다.

그러나 POST 요청을 해당 데이터로 리다이렉트하려면 어떻게 해야 합니까?HTTP 1.1에는 이 상태 코드가 있습니다.상태 코드는 동일한 HTTP 메서드와 데이터로 요청을 반복해야 함을 나타냅니다.따라서 이 상태 코드를 사용하면 POST 요청과 해당 데이터가 반복됩니다.

SRC

PHP가 POST를 실행하도록 할 수 있지만, PHP는 여러 가지 복잡한 문제를 안고 반환됩니다.가장 간단한 것은 실제로 사용자에게 POST를 시키는 것이라고 생각합니다.

그래서, 당신이 제안한 것과 같은, 당신은 정말로 이 부분을 얻게 될 것입니다.

A페이지에서 고객 정보를 입력한 후 B페이지에서 고객 정보를 모두 표시하는 다른 페이지를 만듭니다.확인 버튼을 클릭한 후 C페이지로 POST합니다.

하지만 실제로 B페이지에서 Javascript를 제출할 수 있기 때문에 클릭할 필요가 없습니다.애니메이션을 로드하는 "리다이렉트" 페이지로 만들면 됩니다.

간단한 해킹이 있습니다.$_SESSION를 만듭니다.array투고된 값 중 하나이며,File_C.php그것을 사용할 수 있습니다.그리고 그것을 파괴한 후에 처리를 합니다.

POST Request에서도 GET Request가 백엔드로 정상적으로 동작하고 있는 것과 같은 문제에 직면했습니다.문제는 백엔드가 많은 리다이렉트를 한다는 데 있습니다.이것은 fopen 또는 php 헤더 방식에서는 동작하지 않습니다.

따라서 페이지가 로드되면 숨겨진 폼을 삽입하고 POST 제출로 값을 푸시하는 방법밖에 없었습니다.

echo
'<body onload="document.redirectform.submit()">   
    <form method="POST" action="http://someurl/todo.php" name="redirectform" style="display:none">
    <input name="var1" value=' . $var1. '>
    <input name="var2" value=' . $var2. '>
    <input name="var3" value=' . $var3. '>
    </form>
</body>';

세션을 사용하여 저장할 수 있습니다.$_POST데이터를 검색하여 로 설정합니다.$_POST다음 요청 시.

사용자가 /dirty-submission-url.php에 요청을 제출합니다.
작업:

if (session_status()!==PHP_SESSION_ACTIVE)session_start();
     $_SESSION['POST'] = $_POST;
}
header("Location: /clean-url");
exit;

그런 다음 브라우저는 로 리다이렉트하여 요구합니다./clean-submission-url를 참조해 주세요.이것을 어떻게 할지를 결정하기 위해서, 내부 루팅을 몇개인가 실시합니다.
요청 시작 시 다음을 수행합니다.

if (session_status()!==PHP_SESSION_ACTIVE)session_start();
if (isset($_SESSION['POST'])){
    $_POST = $_SESSION['POST'];
    unset($_SESSION['POST']);
}

이제, 요청의 나머지 부분을 통해$_POST첫 번째 요청으로 가능한 한.

이것을 시험해 보세요.

B페이지에 http 헤더가 있는 데이터와 요청을 전송하여 게이트웨이로 리디렉션합니다.

<?php
$host = "www.example.com";
$path = "/path/to/script.php";
$data = "data1=value1&data2=value2";
$data = urlencode($data);

header("POST $path HTTP/1.1\\r\
" );
header("Host: $host\\r\
" );
header("Content-type: application/x-www-form-urlencoded\\r\
" );
header("Content-length: " . strlen($data) . "\\r\
" );
header("Connection: close\\r\
\\r\
" );
header($data);
?>

추가 헤더:

Accept: \*/\*
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like 
Gecko) Chrome/74.0.3729.169 Safari/537.36
function post(path, params, method) {
    method = method || "post"; // Set method to post by default if not specified.



    var form = document.createElement("form");
    form.setAttribute("method", method);
    form.setAttribute("action", path);

    for(var key in params) {
        if(params.hasOwnProperty(key)) {
            var hiddenField = document.createElement("input");
            hiddenField.setAttribute("type", "hidden");
            hiddenField.setAttribute("name", key);
            hiddenField.setAttribute("value", params[key]);

            form.appendChild(hiddenField);
         }
    }

    document.body.appendChild(form);
    form.submit();
}

예제:

 post('url', {name: 'Johnny Bravo'});

여기 나에게 도움이 되는 또 다른 접근법이 있습니다.

다른 Web 페이지로 리다이렉트 할 필요가 있는 경우(user.phpPHP 변수( )를 포함합니다.$user[0]):

header('Location:./user.php?u_id='.$user[0]);

또는

header("Location:./user.php?u_id=$user[0]");

언급URL : https://stackoverflow.com/questions/5576619/php-redirect-with-post-data

반응형