[php] POST 데이터로 PHP 리디렉션

나는이 주제에 대해 약간의 연구를했으며 불가능 하다고 말한 전문가가 있으므로 다른 해결책을 요청하고 싶습니다.

내 상황 :

페이지 A : [checkout.php] 고객이 결제 세부 정보를 작성합니다.

페이지 B : [process.php] 송장 번호를 생성하고 고객 정보를 데이터베이스에 저장하십시오.

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

고객은 세부 사항을 작성하고 페이지 A에 장바구니를 설정 한 다음 페이지 B에 POST합니다. process.php 내부에서 POST 된 데이터를 데이터베이스에 저장하고 송장 번호를 생성하십시오. 그런 다음 고객 데이터 및 송장 번호를 thirdparty.com 지불 게이트웨이에 게시하십시오. 문제는 페이지 B에서 POST를 수행하는 것입니다. cURL은 데이터를 페이지 C에 게시 할 수 있지만 페이지가 페이지 C로 리디렉션되지 않은 것입니다. 고객은 페이지 C의 신용 카드 세부 정보를 작성해야합니다.

타사 결제 게이트웨이에서 API 샘플을 제공했으며 샘플은 고객 세부 정보와 함께 인보이스 번호를 POST합니다. 시스템이 원치 않는 송장 번호를 과도하게 생성하는 것을 원하지 않습니다.

이에 대한 해결책이 있습니까? 현재 솔루션은 고객이 페이지 A에서 세부 사항을 채우는 것입니다. 그런 다음 페이지 B에서 모든 고객 세부 사항을 보여주는 다른 페이지를 작성합니다. 여기서 사용자는 확인 단추를 클릭하여 페이지 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>

또한 자바 스크립트가없는 사용자가 서비스를 사용할 수 있도록 noscript 태그 안에 간단한 “확인”양식이 있어야합니다.


답변

/**
 * Redirect with POST data.
 *
 * @param string $url URL.
 * @param array $post_data POST data. Example: array('foo' => 'var', 'id' => 123)
 * @param array $headers Optional. Extra headers to send.
 */
public function redirect_post($url, array $data, array $headers = null) {
    $params = array(
        'http' => array(
            '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");
    }
}


답변

이것을 가능하게하는 또 다른 해결책이 있습니다. 클라이언트가 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
  }
});


답변

Javascript를 망치고 싶지 않은 경우 $ _SESSION은 친구입니다.

이메일을 전달하려고한다고 가정 해 보겠습니다.

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();


답변

PHP는 POST를 할 수 있지만 PHP는 모든 종류의 합병증과 함께 리턴을 얻습니다. 실제로 가장 간단한 방법은 사용자가 POST를 수행하는 것입니다.

그래서, 당신이 제안한 종류의, 당신은 실제로이 부분을 얻을 것입니다 :

페이지 A에서 고객 채우기 세부 사항, 그런 다음 페이지 B에서 모든 고객 세부 사항을 보여주는 다른 페이지를 작성하고 확인 단추를 클릭 한 다음 페이지 C로 POST를 클릭하십시오.

그러나 실제로 B 페이지에서 자바 스크립트 제출을 수행 할 수 있으므로 클릭 할 필요가 없습니다. 로드 애니메이션이있는 “리디렉션”페이지로 설정하면 설정됩니다.


답변

나는 이것이 오래된 질문이라는 것을 알고 있지만 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 데이터가 첨부 된 양식 대상 페이지로 전달됩니다.

이 경우 ps JavaScript 및 jQuery가 필요합니다. 다른 답변의 의견에서 제안한 것처럼 <noscript>JS가 비활성화 된 경우 태그를 사용하여 표준 HTML 양식을 만들 수 있습니다.


답변

간단한 해킹 이 있으며 게시 된 값을 사용 $_SESSION하고 작성 array하며 일단 사용하면 해당 값 File_C.php을 사용할 수 있습니다.