PayPal 리턴 URL을 설정하고 자동 리턴합니까?


127

다음에 대한 후속 질문입니다. PHP : PayPal 결제를 쉽게 시작할 수 있습니까?

그래서 내 문제는 반환 URL을 지정하고 있다는 것입니다. 그러나 PayPal로 지불 한 후 다음과 같은 화면이 나타납니다.

결제가 완료되었습니다. XXXX 님, 방금 결제를 완료했습니다. 이 결제에 대한 거래 ID는 XXXXXXXXXXXXX입니다.

XX@XXXX.com으로 확인 이메일을 보내드립니다. 이 거래는 명세서에 PAYPAL로 표시됩니다.

Go to PayPal account overview

이 화면을 표시하지 않고 반환 URL로 직접 이동하려면 필요합니다. 나는 가지고있다:

  • "반환"변수 설정
  • "rm"변수를 2로 설정하십시오 (가이드 = " POST 메소드를 사용하여 구매자 브라우저가 리턴 URL로 경로 재 지정되며 모든 지불 변수가 포함됨 ").

사실, 여기 내 전체 형태가 있습니다 :

<form method="post" action="https://www.sandbox.paypal.com/cgi-bin/webscr">
  <input type="hidden" value="_xclick" name="cmd">
  <input type="hidden" value="onlinestore@thegreekmerchant.com" name="business">
  <!-- <input type="hidden" name="undefined_quantity" value="1" /> -->
  <input type="hidden" value="Order at The Greek Merchant:&lt;Br /&gt;Goldfish Flock BLG&lt;br /&gt;" name="item_name">
  <input type="hidden" value="NA" name="item_number">
  <input type="hidden" value="22.16" name="amount">
  <input type="hidden" value="5.17" name="shipping">
  <input type="hidden" value="0" name="discount_amount">        
  <input type="hidden" value="0" name="no_shipping">
  <input type="hidden" value="No comments" name="cn">
  <input type="hidden" value="USD" name="currency_code">
  <input type="hidden" value="http://XXX/XXX/XXX/paypal/return" name="return">
  <input type="hidden" value="2" name="rm">      
  <input type="hidden" value="11255XXX" name="invoice">
  <input type="hidden" value="US" name="lc">
  <input type="hidden" value="PP-BuyNowBF" name="bn">
  <input type="submit" value="Place Order!" name="finalizeOrder" id="finalizeOrder" class="submitButton">
</form>

어떻게 자동으로 돌아갈 수 있습니까? 또는 데이터베이스를 업데이트 할 수 있도록 지불 결과를 내 웹 사이트로 다시 가져 오는 방법은 무엇입니까? IPN이란 무엇입니까?


맞춤 반품 매개 변수의 입력 호스트는 페이팔 계정에 구성된 호스트와 동일해야합니다.
Andreas

답변:


199

PayPal 계정에서 자동 반송을 활성화해야합니다. 그렇지 않으면 해당 return필드 가 무시 됩니다.

설명서에서 (2019 년 1 월 새 레이아웃을 반영하도록 업데이트) :

자동 복귀는 기본적으로 해제되어 있습니다. 자동 복귀를 켜려면

  1. https://www.paypal.com 또는 https://www.sandbox.paypal.com 에서 PayPal 계정에 로그인 하십시오 . 내 계정 개요 페이지가 나타납니다.
  2. 오른쪽 상단의 톱니 바퀴 아이콘을 클릭합니다. 프로필 요약 페이지가 나타납니다.
  3. 왼쪽 열에서 내 판매 환경 설정 링크를 클릭하십시오.
  4. 온라인 판매 섹션에서 웹 사이트 환경 설정 행의 업데이트 링크를 클릭하십시오. 웹 사이트 결제 환경 설정 페이지가 나타납니다.
  5. 웹 사이트 결제를위한 자동 반품에서 켜짐 라디오 버튼을 클릭하여 자동 반품을 활성화합니다.
  6. 반품 URL 필드에 지불이 완료된 후 지불 인이 경로 재 지정할 URL을 입력하십시오. 참고 : PayPal은 입력 한 반송 URL을 확인합니다. URL 형식이 잘못되었거나 유효성을 검사 할 수없는 경우 PayPal은 자동 반환을 활성화하지 않습니다.
  7. 페이지 하단으로 스크롤하여 저장 버튼을 클릭하십시오.

IPN은 즉시 결제 알림을위한 것입니다. 자동 반환에서 얻는 것보다 더 안정적이고 유용한 정보를 제공합니다.

IPN 설명서는 다음과 같습니다. https://www.x.com/sites/default/files/ipnguide.pdf

IPN 온라인 설명서 : https://developer.paypal.com/docs/classic/ipn/gs_IPN/

일반적인 절차는 notify_url요청과 함께 매개 변수 를 전달하고 IPN 알림을 처리하고 유효성 검증하는 페이지를 설정하는 것이며, PayPal은 지불 / 환불 등을 알리기 위해 해당 페이지로 요청을 보냅니다. 통과. 그러면 해당 IPN 핸들러 페이지는 주문을 지불 한 것으로 표시하기 위해 데이터베이스를 업데이트 할 수있는 올바른 위치입니다.



5
Paypal의 새로운 웹 사이트 레이아웃에서는 더 이상 정확하게 정확하지 않습니다. 단계 3) 클릭 My Selling Tools 단계 4) Website Preferences아래 클릭Selling Online
Webnet

2
PayPal에서 주문을 올바르게 처리했는지 확인하기 위해 IPN을 사용해야하지만, 성공 여부를 사용자에게 표시하려면 여전히 리턴 URL이 필요합니다. 사용자가 보낸 이메일을받지 못하는 경우가 많으므로 바로 제품에 액세스 (다운로드 등) 할 수 있다면 좋습니다.
pcunite

1
@Kevin Stricker 2 개의 다른 사이트에 대해 URL을 어떻게 설정합니까? 2 개의 웹 사이트에 하나의 페이팔 계정을 사용하는 경우와 같이 단계를 사용하여 하나의 URL 만 반환 URL로 추가 할 수 있습니다. 두 사이트에 어떻게 사용할 수 있습니까?
Gaurav

4
그것은 것을 매우 정확 아니다 "그렇지 않으면 무시됩니다, 당신은 당신의 페이팔 계정에 자동 복귀를 활성화해야 return필드를." return결제에 전달한 모든 URL 매개 변수는 적용되며 판매자의 PayPal 계정 프로필에 구성된 자동 반환 URL (또는 그 부족)을 무시하지만 자동 반환을 사용하도록 설정하지 않은 경우 구매자는 수동으로 과거를 클릭해야합니다. 자동으로 리디렉션되지 않고 해당 URL로 리디렉션하기 위해 체크 아웃 종료
SubGothius

42

직접 결제에 PHP를 사용하는 샘플 양식.

<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
    <input type="hidden" name="cmd" value="_cart">
    <input type="hidden" name="upload" value="1">
    <input type="hidden" name="business" value="you@youremail.com">

    <input type="hidden" name="item_name_' . $x . '" value="' . $product_name . '">
    <input type="hidden" name="amount_' . $x . '" value="' . $price . '">
    <input type="hidden" name="quantity_' . $x . '" value="' . $each_item['quantity'] . '"> 
    <input type="hidden" name="custom" value="' . $product_id_array . '">
    <input type="hidden" name="notify_url" value="https://www.yoursite.com/my_ipn.php">
    <input type="hidden" name="return" value="https://www.yoursite.com/checkout_complete.php">
    <input type="hidden" name="rm" value="2">
    <input type="hidden" name="cbt" value="Return to The Store">
    <input type="hidden" name="cancel_return" value="https://www.yoursite.com/paypal_cancel.php">
    <input type="hidden" name="lc" value="US">
    <input type="hidden" name="currency_code" value="USD">
    <input type="image" src="http://www.paypal.com/en_US/i/btn/x-click-but01.gif" name="submit" alt="Make payments with PayPal - its fast, free and secure!">
</form>

친절하게 notify_url, return, cancel_return 필드를 살펴보십시오

지불이 완료된 후 페이팔에 의해 요청되는 ipn (my_ipn.php) 처리를위한 샘플 코드.

IPN 생성에 대한 자세한 내용은 링크 를 참조하십시오 .

<?php
// Check to see there are posted variables coming into the script
if ($_SERVER['REQUEST_METHOD'] != "POST")
    die("No Post Variables");
// Initialize the $req variable and add CMD key value pair
$req = 'cmd=_notify-validate';
// Read the post from PayPal
foreach ($_POST as $key => $value) {
    $value = urlencode(stripslashes($value));
    $req .= "&$key=$value";
}
// Now Post all of that back to PayPal's server using curl, and validate everything with PayPal
// We will use CURL instead of PHP for this for a more universally operable script (fsockopen has issues on some environments)
//$url = "https://www.sandbox.paypal.com/cgi-bin/webscr";
$url = "https://www.paypal.com/cgi-bin/webscr";
$curl_result = $curl_err = '';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/x-www-form-urlencoded", "Content-Length: " . strlen($req)));
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$curl_result = @curl_exec($ch);
$curl_err = curl_error($ch);
curl_close($ch);

$req = str_replace("&", "\n", $req);  // Make it a nice list in case we want to email it to ourselves for reporting
// Check that the result verifies
if (strpos($curl_result, "VERIFIED") !== false) {
    $req .= "\n\nPaypal Verified OK";
} else {
    $req .= "\n\nData NOT verified from Paypal!";
    mail("you@youremail.com", "IPN interaction not verified", "$req", "From: you@youremail.com");
    exit();
}

/* CHECK THESE 4 THINGS BEFORE PROCESSING THE TRANSACTION, HANDLE THEM AS YOU WISH
  1. Make sure that business email returned is your business email
  2. Make sure that the transaction�s payment status is �completed�
  3. Make sure there are no duplicate txn_id
  4. Make sure the payment amount matches what you charge for items. (Defeat Price-Jacking) */

// Check Number 1 ------------------------------------------------------------------------------------------------------------
$receiver_email = $_POST['receiver_email'];
if ($receiver_email != "you@youremail.com") {
//handle the wrong business url
    exit(); // exit script
}
// Check number 2 ------------------------------------------------------------------------------------------------------------
if ($_POST['payment_status'] != "Completed") {
    // Handle how you think you should if a payment is not complete yet, a few scenarios can cause a transaction to be incomplete
}

// Check number 3 ------------------------------------------------------------------------------------------------------------
$this_txn = $_POST['txn_id'];
//check for duplicate txn_ids in the database
// Check number 4 ------------------------------------------------------------------------------------------------------------
$product_id_string = $_POST['custom'];
$product_id_string = rtrim($product_id_string, ","); // remove last comma
// Explode the string, make it an array, then query all the prices out, add them up, and make sure they match the payment_gross amount
// END ALL SECURITY CHECKS NOW IN THE DATABASE IT GOES ------------------------------------
////////////////////////////////////////////////////
// Homework - Examples of assigning local variables from the POST variables
$txn_id = $_POST['txn_id'];
$payer_email = $_POST['payer_email'];
$custom = $_POST['custom'];
// Place the transaction into the database
// Mail yourself the details
mail("you@youremail.com", "NORMAL IPN RESULT YAY MONEY!", $req, "From: you@youremail.com");
?>

아래 이미지는 페이팔 프로세스를 이해하는 데 도움이됩니다. 페이팔 프로세스 흐름

자세한 내용은 다음 링크를 참조하십시오.

이것이 도움이되기를 바랍니다 .. :)


1
이것이 오늘날의 페이팔 API에서 여전히 유효한지 아는 사람이 있습니까? 나는 그 질문이 2 살이라는 것을 안다.
Matt Welander

1
'반품'및 'cancel_return'URL은 구매자에게 즉각적인 거래 피드백을 제공하는 데 사용되며 이에 대한 PDT 변수를 사용할 수 있습니다. 그러나 PP는 한 번만 시도하므로 중요한 주문 이행에 의존 할 수 없습니다 (예 : 구매자가 결제 후 브라우저를 닫지 만 여전히 PP). 이를 위해 'notify_url'을 통해 신뢰할 수있는 IPN 프로세스로 백업을 완료하여 '완료'상태를 최소한으로 처리 할 수 ​​있습니다 (다른 사항은 실패한 것으로 가정하고 수동 협상이 필요할 수 있음). PDT 및 IPN 서버 처리는 주문이 한 번만 채워지도록해야합니다.
Patanjali

나는 일이 바뀌었고 Paypal success.php는 이제 GET 변수에서만 작동합니다. 여기를보십시오 : stackoverflow.com/questions/45671366/…
Sol

23

내가 찾은 한 가지 방법 :

이 필드를 생성 된 양식 코드에 삽입하십시오.

<input type='hidden' name='rm' value='2'>

rm반환 방법을 의미합니다 .

2 수단 (포스트)

사용자가 구매 한 후 사이트 URL로 돌아간 후 해당 URL은 POST 매개 변수도 가져옵니다.

추신 : PHP를 사용하는 경우 var_dump($_POST);반환 URL (스크립트) 에 삽입 한 다음 테스트 구매를하고 사이트로 돌아올 때 URL에 어떤 변수가 있는지 볼 수 있습니다.


실제로 이것을 사용 했습니까?
Simon Gibbs

대단 했어. 페이팔에서 결제 데이터 전송이 해제되어 있으면 모든 게시물 설정이 반환 URL로 전송됩니다.
JulianJ

4

이 스레드와 비슷한 문제가 최근에 발생했을 때 이것을 공유

오랫동안 내 스크립트는 잘 작동했으며 (기본 결제 양식) POST 변수를 success.php 페이지에 IPN 데이터를 POST 변수로 반환했습니다. 그러나 최근에 반환 페이지 (success.php)에 더 이상 POST 변수가 수신되지 않는 것으로 나타났습니다. 샌드 박스에서 테스트를 해봤는데 PayPal이 무언가를 변경했다고 확신합니다!

notify_url은 여전히 ​​올바른 IPN 데이터를 수신하여 DB를 업데이트 할 수 있지만 리턴 URL (success.php) 페이지에 성공 메시지를 표시 할 수 없습니다.

PayPal 웹 사이트 결제 환경 설정 및 IPN에서 옵션을 켜고 끄는 많은 조합을 시도했지만 메시지를 계속 처리 할 수 ​​있도록 스크립트를 약간 변경해야했습니다. 이 훌륭한 안내서를 따른 후 PDT 및 자동 복귀를 설정하여이 작업을 수행했습니다 .

이제는 모두 잘 작동하지만 유일한 문제는 반환 URL에 추악한 모든 PDT 변수가 포함되어 있다는 것입니다!

도움이 될 수도 있습니다.


3

Kevin이 위에서 설명한대로 자동 반환 값을 설정하는 아이디어는 약간 이상하다고 생각합니다!

예를 들어, 동일한 PayPal 계정을 사용하여 결제를 처리하는 웹 사이트가 여러 개 있거나 한 웹 사이트에 여러 구매 작업을 수행하고 결제시 다른 반송 주소가 필요한 섹션이 있다고 가정합니다. 완성 됐습니다. 위의 '직접 지불을 위해 PHP를 사용하는 샘플 양식'섹션에 설명 된대로 단추를 페이지에 놓으면 거기에 선이 있음을 알 수 있습니다.

input type="hidden" name="return" value="https://www.yoursite.com/checkout_complete.php"

개별 반환 값을 설정합니다. 프로필 섹션에서 왜 일반적으로 설정해야합니까?!?!

또한 프로필 섹션에서 하나의 값만 설정할 수 있기 때문에 (AFAIK)는 여러 작업이있는 사이트에서 자동 반환을 사용할 수 없음을 의미합니다.

댓글 부탁드립니다 ??


3
반환 매개 변수는 페이팔 설정에 자동 반환 URL 설정을 오버라이드 (override) 각 양식을 위해 전달 될 수 있습니다
DropHit

1
예, DropHit이 말한 것, 즉 매개 변수로 전달하는 것을 잊어 버린 경우 기본 자동 반환 값입니다. 매개 변수로 전달하면 각 웹 사이트에 대해 반환 URL을 사용합니다.
hamish

도움이 되나요? codeseekah.com/2012/02/11/…
hamish

@DropHit PDT는 여전히 버튼별로 오버라이드 된 return값으로 작동합니까 ? 그래도 여전히 모든 PDT 데이터를 수신하는 다른 리턴 페이지를 가질 수 있습니까?
Dai

답장을 늦게 미안합니다-그것이 효과가
있을지

1

결제 페이지에서 'cancel_return'숨겨진 양식 요소를 찾으십시오.

cancel_return 양식 요소의 값을 리턴하려는 URL로 설정하십시오.


실제로 '취소 취소'는 거래가 실패한 경우에만 사용됩니다. 또한 성공적으로 완료된 거래를 처리하려면 '반환'URL을 제공해야합니다. 그렇지 않으면 기본 URL이 사용됩니다.
Patanjali

거래가 실패 할 때가 아니라 체크 아웃 중에 구매자가 "취소 후 [판매자 이름]으로 돌아 가기"링크를 클릭하면 주문 완료를 포기할 때가 아닙니다.
SubGothius
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.