Đặt URL trả lại PayPal và làm cho nó tự động trở lại?


127

Đây là câu hỏi tiếp theo: PHP: Cách dễ dàng để bắt đầu thanh toán PayPal?

Vì vậy, vấn đề của tôi là tôi chỉ định url trả về. Tuy nhiên, sau khi thanh toán bằng PayPal, tôi kết thúc tại một màn hình có nội dung:

Bạn vừa hoàn thành thanh toán của mình. XXXX, bạn vừa hoàn thành thanh toán của mình. ID giao dịch của bạn cho khoản thanh toán này là: XXXXXXXXXXXXX.

Chúng tôi sẽ gửi email xác nhận đến XX@XXXX.com. Giao dịch này sẽ xuất hiện trên bảng sao kê của bạn dưới dạng PAYPAL.

Go to PayPal account overview

Tôi cần nó để không hiển thị màn hình này và đi thẳng đến URL trả lại. Tôi có:

  • Đặt biến "trả lại"
  • Đặt biến "rm" thành: 2 (theo hướng dẫn = " trình duyệt của người mua được chuyển hướng đến URL trả về bằng cách sử dụng phương thức POST và bao gồm tất cả các biến thanh toán ")

Trên thực tế, đây là toàn bộ mẫu của tôi:

<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>

Bất cứ ý tưởng làm thế nào tôi có thể làm cho nó tự động quay trở lại? Ngoài ra, làm cách nào để tôi nhận được kết quả thanh toán trở lại trang web của mình để tôi có thể cập nhật cơ sở dữ liệu? IPN là gì?


Xin lưu ý rằng máy chủ lưu trữ trong tham số trả về tùy chỉnh của bạn phải giống như được định cấu hình trong tài khoản paypal của bạn.
Andreas

Câu trả lời:


199

Bạn phải kích hoạt tự động trở lại trong tài khoản PayPal của mình, nếu không nó sẽ bỏ qua returntrường này.

Từ tài liệu (được cập nhật để phản ánh bố cục mới tháng 1 năm 2019):

Tự động trở lại được tắt theo mặc định. Để bật Tự động trả về:

  1. Đăng nhập vào tài khoản PayPal của bạn tại https://www.paypal.com hoặc https://www.sandbox.paypal.com Trang Tổng quan về tài khoản của tôi xuất hiện.
  2. Nhấp vào biểu tượng bánh răng trên cùng bên phải. Trang Tóm tắt hồ sơ xuất hiện.
  3. Nhấp vào liên kết Tùy chọn bán hàng của tôi ở cột bên trái.
  4. Trong phần Bán hàng trực tuyến, nhấp vào liên kết Cập nhật trong hàng cho Tùy chọn trang web. Trang Tùy chọn thanh toán trang web xuất hiện
  5. Trong Tự động trả lại cho thanh toán trang web, nhấp vào nút Bật radio để bật Tự động trở lại.
  6. Trong trường Trả về URL, nhập URL mà bạn muốn người trả tiền được chuyển hướng sau khi họ hoàn tất thanh toán. LƯU Ý: PayPal kiểm tra URL trả về mà bạn nhập. Nếu URL không được định dạng chính xác hoặc không thể xác thực, PayPal sẽ không kích hoạt Tự động trả lại.
  7. Cuộn xuống cuối trang và nhấp vào nút Lưu.

IPN là để thông báo thanh toán ngay lập tức. Nó sẽ cung cấp cho bạn thông tin đáng tin cậy / hữu ích hơn những gì bạn sẽ nhận được từ tự động quay lại.

Tài liệu cho IPN có tại đây: https://www.x.com/sites/default/files/ipnguide.pdf

Tài liệu trực tuyến cho IPN: https://developer.paypal.com/docs/classic/ipn/gs_IPN/

Quy trình chung là bạn chuyển một notify_urltham số với yêu cầu và thiết lập trang xử lý và xác thực thông báo IPN và PayPal sẽ gửi yêu cầu đến trang đó để thông báo cho bạn khi thanh toán / hoàn tiền / v.v. đi xuyên qua. Trang xử lý IPN đó sau đó sẽ là nơi chính xác để cập nhật cơ sở dữ liệu để đánh dấu các đơn đặt hàng đã được thanh toán.



5
Với bố cục trang web mới của Paypal, điều này không còn chính xác nữa. Bước 3) Nhấp vào My Selling Tools Bước 4) Nhấp vào Website Preferencesbên dướiSelling Online
Webnet 18/03/13

2
IPN nên được sử dụng để xác minh đơn hàng đã được PayPal xử lý chính xác, tuy nhiên, bạn vẫn cần url trả về để hiển thị cho người dùng biết về sự thành công của bạn. Vì vậy, nhiều lần người dùng không nhận được email bạn gửi đi, thật tuyệt nếu họ có thể truy cập vào sản phẩm (tải xuống, v.v.) ngay lập tức.
pcunite

1
@Kevin Stricker Làm cách nào chúng tôi có thể thiết lập url trả về cho 2 trang web khác nhau? giống như nếu tôi sử dụng một tài khoản paypal cho 2 trang web, nhưng tôi chỉ có thể thêm một URL làm url trả về bằng các bước của mình. Làm thế nào tôi có thể sử dụng cho 2 trang web?
Gaurav

4
Nó không hoàn toàn chính xác rằng "Bạn phải kích hoạt tự động trở lại trong tài khoản PayPal của mình, nếu không nó sẽ bỏ qua returntrường này." Bất kỳ returntham số URL nào bạn chuyển qua thanh toán sẽ được vinh danh và ghi đè bất kỳ URL Trả lại tự động (hoặc thiếu) nào được định cấu hình trong hồ sơ tài khoản PayPal của người bán, nhưng nếu họ không bật Tự động trả lại ở đó, người mua sẽ cần phải nhấp qua thủ công kết thúc thanh toán để được chuyển hướng đến URL đó, thay vì được chuyển hướng tự động.
SubGothius

42

Mẫu mẫu sử dụng PHP để thanh toán trực tiếp.

<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>

vui lòng đi qua các trường notify_url, return, Canc_return

mã mẫu để xử lý ipn (my_ipn.php) được paypal yêu cầu sau khi thanh toán được thực hiện.

Để biết thêm thông tin về việc tạo IPN, vui lòng tham khảo liên kết này .

<?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");
?>

Hình ảnh dưới đây sẽ giúp bạn hiểu được quá trình paypal. Luồng quy trình Paypal

Để đọc thêm tham khảo các liên kết sau đây;

hy vọng điều này sẽ giúp bạn .. :)


1
Bất cứ ai cũng biết nếu điều này vẫn còn hiệu lực với các API paypal ngày nay? Tôi thấy rằng câu hỏi là 2 tuổi.
Matt Welander

1
Các URL 'return' và 'Canc_return' được sử dụng để cung cấp phản hồi giao dịch ngay lập tức cho người mua và có thể sử dụng các biến PDT cho điều đó. Tuy nhiên, PP chỉ thử một lần với họ, vì vậy họ không thể dựa vào việc thực hiện đơn hàng quan trọng (giả sử người mua đóng trình duyệt sau khi thanh toán, nhưng vẫn ở PP). Vì thế, bạn cũng có thể muốn sao lưu nó bằng quy trình IPN đáng tin cậy, thông qua 'notify_url', xử lý trạng thái 'Đã hoàn thành' ở mức tối thiểu (giả sử mọi thứ khác đều thất bại, có lẽ phải thương lượng thủ công). Xử lý máy chủ PDT và IPN của bạn sẽ cần đảm bảo rằng đơn hàng chỉ được điền một lần.
Patanjali

Tôi tin rằng mọi thứ đã thay đổi và Paypal thành công bây giờ chỉ hoạt động với các biến GET. Xem tại đây: stackoverflow.com/questions/45671366/ Kẻ
Sol

23

một cách tôi đã tìm thấy:

hãy thử chèn trường này vào mã biểu mẫu đã tạo của bạn:

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

rm có nghĩa là phương thức trả về ;

2 phương tiện (bài)

Hơn sau khi người dùng mua và quay lại url trang web của bạn, thì url đó cũng nhận được các tham số POST

ps nếu sử dụng php, hãy thử chèn var_dump($_POST);url trả về (tập lệnh) của bạn, sau đó thực hiện mua thử nghiệm và khi bạn quay lại trang web của mình, bạn sẽ thấy những biến nào có trên url của mình.


Bạn đã thực sự sử dụng này?
Simon Gibbs

Điều này thật tuyệt Miễn là việc chuyển dữ liệu thanh toán bị tắt trong paypal thì bạn sẽ nhận được tất cả các cài đặt bài đăng được gửi đến url trả về.
JulianJ

4

Chia sẻ điều này vì gần đây tôi đã gặp phải các vấn đề tương tự như chủ đề này

Trong một thời gian dài, tập lệnh của tôi hoạt động tốt (hình thức thanh toán cơ bản) và trả lại các biến POST cho trang thành công của tôi và dữ liệu IPN dưới dạng các biến POST. Tuy nhiên, gần đây, tôi nhận thấy trang trả về (thành công.php) không còn nhận được bất kỳ bình POST nào nữa. Tôi đã thử nghiệm trong Sandbox và trực tiếp và tôi khá chắc chắn PayPal đã thay đổi điều gì đó!

Thông báo_url vẫn nhận được dữ liệu IPN chính xác cho phép tôi cập nhật DB, nhưng tôi không thể hiển thị thông báo thành công trên trang URL trả về (thành công).

Mặc dù đã thử nhiều kết hợp để bật và tắt tùy chọn trong tùy chọn thanh toán trên trang web của PayPal và IPN, tôi đã phải thực hiện một số thay đổi cho tập lệnh của mình để đảm bảo tôi vẫn có thể xử lý tin nhắn. Tôi đã hoàn thành việc này bằng cách bật PDT và Tự động trở lại, sau khi làm theo hướng dẫn tuyệt vời này .

Bây giờ tất cả đều hoạt động tốt, nhưng vấn đề duy nhất là URL trả về chứa tất cả các biến PDT rất xấu!

Bạn cũng có thể thấy điều này hữu ích


3

Tôi nghĩ rằng ý tưởng thiết lập các giá trị Trả về tự động như được mô tả ở trên của Kevin là hơi lạ!

Ví dụ: giả sử bạn có một số trang web sử dụng cùng một tài khoản PayPal để xử lý các khoản thanh toán của mình hoặc nói rằng bạn có một số phần trong một trang web thực hiện các tác vụ mua khác nhau và yêu cầu các địa chỉ trả lại khác nhau khi thanh toán Đã được hoàn thành. Nếu tôi đặt một nút trên trang của mình như được mô tả ở trên trong phần 'Mẫu mẫu sử dụng PHP cho thanh toán trực tiếp', bạn có thể thấy rằng có một dòng ở đó:

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

nơi bạn đặt giá trị trả về riêng lẻ. Tại sao nó cũng phải được đặt chung, trong phần hồ sơ?!?!

Ngoài ra, vì bạn chỉ có thể đặt một giá trị trong Phần Hồ sơ, điều đó có nghĩa là (AFAIK) rằng bạn không thể sử dụng Trả về tự động trên một trang web có nhiều hành động.

Xin vui lòng cho ý kiến ​​??


3
tham số trả về có thể được truyền cho mỗi biểu mẫu ghi đè thiết lập url trả về tự động trong cấu hình paypal
DropHit

1
yeah những gì DropHit đã nói, đó chỉ là giá trị trả về tự động mặc định, trong trường hợp bạn quên truyền nó dưới dạng tham số. nếu bạn chuyển nó dưới dạng tham số, nó sẽ sử dụng url trả về cho mỗi trang web của bạn.
ham

không giúp đỡ à? Codeeekah.com/2012/02/11/ từ
hamish

@DropHit PDT có còn hoạt động với returncác giá trị ghi đè trên mỗi nút không? Vì vậy, tôi có thể có các trang trả lại khác nhau mà vẫn sẽ nhận được tất cả dữ liệu PDT?
Đại

Xin lỗi vì đã trả lời trễ - tôi không chắc chắn rằng nó sẽ hoạt động NHƯNG các tích hợp hiện tại của tôi vẫn hoạt động như mong đợi mặc dù điều đó không đảm bảo rằng trường hợp sử dụng của bạn sẽ hoạt động như của tôi
DropHit

1

trên trang thanh toán, hãy tìm phần tử biểu mẫu ẩn 'Canc_return':

đặt giá trị của phần tử biểu mẫu Canc_return thành URL bạn muốn quay lại:


Trên thực tế, 'hủy bỏ hoàn trả' chỉ được sử dụng khi giao dịch thất bại. Bạn PHẢI cung cấp URL 'trả lại' để xử lý các giao dịch đã hoàn thành thành công, nếu không, URL mặc định sẽ được sử dụng cho chúng.
Patanjali

Không phải khi giao dịch thất bại mà thay vào đó, khi người mua nhấp vào liên kết "Hủy và quay lại [tên người bán]" trong khi thanh toán để từ bỏ hoàn thành đơn hàng của họ.
SubGothius
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.