การตั้งค่า URL ส่งคืนของ PayPal และทำให้ส่งคืนอัตโนมัติหรือ


127

นี่คือคำถามต่อไปนี้: PHP: วิธีง่ายๆในการเริ่มชำระเงินด้วย PayPal?

ดังนั้นปัญหาของฉันคือฉันกำลังระบุ url ส่งคืน อย่างไรก็ตามหลังจากชำระเงินด้วย PayPal ฉันพบหน้าจอที่ระบุว่า:

คุณเพิ่งชำระเงินเสร็จสิ้น XXXX คุณเพิ่งชำระเงินเสร็จสิ้น รหัสธุรกรรมของคุณสำหรับการชำระเงินนี้คือ XXXXXXXXXXXXX

เราจะส่งอีเมลยืนยันไปที่ XX@XXXX.com ธุรกรรมนี้จะปรากฏในใบแจ้งยอดของคุณเป็น PAYPAL

Go to PayPal account overview

ฉันต้องการให้ไม่แสดงหน้าจอนี้และไปที่ URL ส่งคืนโดยตรง ฉันมี:

  • ตั้งค่าตัวแปร "return"
  • ตั้งค่าตัวแปร "rm" เป็น: 2 (ซึ่งตามคำแนะนำ = " เบราว์เซอร์ของผู้ซื้อจะถูกเปลี่ยนเส้นทางไปยัง URL ส่งคืนโดยใช้วิธี POST และรวมตัวแปรการชำระเงินทั้งหมดไว้ด้วย ")

อันที่จริงนี่คือรูปแบบทั้งหมดของฉัน:

<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 คืออะไร?


โปรดทราบว่าโฮสต์ที่เข้ามาในพารามิเตอร์การส่งคืนที่กำหนดเองของคุณจะต้องเหมือนกับที่กำหนดค่าไว้ในบัญชี paypal ของคุณ
Andreas

คำตอบ:


199

คุณต้องเปิดใช้งานการคืนสินค้าอัตโนมัติในบัญชี PayPal ของคุณมิฉะนั้นจะเพิกเฉยต่อreturnฟิลด์

จากเอกสารประกอบ (อัปเดตเพื่อแสดงเค้าโครงใหม่ ม.ค. 2019):

การส่งคืนอัตโนมัติถูกปิดโดยค่าเริ่มต้น ในการเปิด Auto Return:

  1. ลงชื่อเข้าใช้บัญชี PayPal ของคุณที่https://www.paypal.comหรือhttps://www.sandbox.paypal.com หน้าภาพรวมบัญชีของฉันจะปรากฏขึ้น
  2. คลิกไอคอนรูปเฟืองบนขวา หน้าสรุปโปรไฟล์จะปรากฏขึ้น
  3. คลิกลิงก์ My Selling Preferences ในคอลัมน์ด้านซ้าย
  4. ในส่วนการขายออนไลน์ให้คลิกลิงก์อัปเดตในแถวสำหรับการตั้งค่าเว็บไซต์ หน้าการตั้งค่าการชำระเงินของเว็บไซต์จะปรากฏขึ้น
  5. ภายใต้ Auto Return for Website Payments ให้คลิกปุ่มตัวเลือก On เพื่อเปิดใช้ Auto Return
  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 จะเป็นที่ที่ถูกต้องในการอัปเดตฐานข้อมูลเพื่อทำเครื่องหมายคำสั่งซื้อว่าได้รับการชำระเงินแล้ว


2
ดูได้ที่นี่paypal.com/cgi-bin/webscr?cmd=p/mer/…
Developer

5
ด้วยรูปแบบเว็บไซต์ใหม่ของ Paypal จึงไม่ถูกต้องอีกต่อไป ขั้นตอนที่ 3) คลิกMy Selling Tools ขั้นตอนที่ 4) คลิกด้านWebsite Preferencesล่างSelling Online
Webnet

2
ควรใช้ IPN เพื่อตรวจสอบว่าคำสั่งซื้อนั้นได้รับการจัดการอย่างถูกต้องโดย PayPal อย่างไรก็ตามคุณยังคงต้องใช้ URL ส่งคืนเพื่อแสดงให้ผู้ใช้ทราบถึงความสำเร็จ หลายครั้งที่ผู้ใช้ไม่ได้รับอีเมลที่คุณส่งออกไปดังนั้นจึงเป็นการดีหากพวกเขาสามารถเข้าถึงผลิตภัณฑ์ (ดาวน์โหลด ฯลฯ ) ได้ทันที
pcunite

1
@Kevin Stricker เราจะตั้งค่า return url สำหรับ 2 ไซต์ได้อย่างไร? เช่นถ้าฉันใช้บัญชี paypal หนึ่งบัญชีสำหรับ 2 เว็บไซต์ แต่ฉันสามารถเพิ่ม URL เดียวเป็น URL ส่งคืนโดยใช้ขั้นตอนของคุณ ฉันจะใช้มันกับ 2 ไซต์ได้อย่างไร?
Gaurav

4
ไม่ถูกต้องนักที่"คุณต้องเปิดใช้งานการคืนสินค้าอัตโนมัติในบัญชี PayPal ของคุณมิฉะนั้นจะไม่สนใจreturnฟิลด์นี้" returnพารามิเตอร์ URL ใด ๆ ที่คุณส่งไปชำระเงินจะได้รับเกียรติและแทนที่ URL การคืนสินค้าอัตโนมัติ (หรือไม่มี) ที่กำหนดค่าไว้ในโปรไฟล์บัญชี PayPal ของผู้ขาย แต่หากไม่ได้เปิดใช้งานการส่งคืนอัตโนมัติที่นั่นผู้ซื้อจะต้องคลิกด้วยตนเองผ่าน สิ้นสุดการชำระเงินเพื่อที่จะเปลี่ยนเส้นทางไปยัง 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>

กรุณาไปที่ช่อง alert_url, return, Cancel_return

ตัวอย่างรหัสสำหรับจัดการ ipn (my_ipn.php) ที่ paypal ร้องขอหลังจากชำระเงินแล้ว

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการสร้าง 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");
?>

ภาพด้านล่างนี้จะช่วยคุณในการทำความเข้าใจกระบวนการ paypal ขั้นตอนกระบวนการ Paypal

สำหรับการอ่านเพิ่มเติมโปรดดูลิงค์ต่อไปนี้

หวังว่านี่จะช่วยคุณได้ .. :)


1
ใครทราบบ้างว่าสิ่งนี้ยังใช้ได้กับ paypal API ในปัจจุบันหรือไม่ ฉันเห็นว่าคำถามมีอายุ 2 ปี
Matt Welander

1
URL 'return' และ 'Cancel_return' ใช้เพื่อให้ข้อเสนอแนะเกี่ยวกับธุรกรรมแก่ผู้ซื้อในทันทีและสามารถใช้ตัวแปร PDT สำหรับสิ่งนั้นได้ อย่างไรก็ตาม PP พยายามกับพวกเขาเพียงครั้งเดียวดังนั้นจึงไม่สามารถพึ่งพาการปฏิบัติตามคำสั่งซื้อที่สำคัญได้ (กล่าวว่าผู้ซื้อปิดเบราว์เซอร์หลังจากชำระเงิน แต่ยังอยู่ที่ PP) ด้วยเหตุนี้คุณอาจต้องการสำรองข้อมูลด้วยกระบวนการ IPN ที่เชื่อถือได้ผ่านทาง 'alert_url' เพื่อประมวลผลสถานะ 'เสร็จสมบูรณ์' เป็นอย่างต่ำ (สมมติว่าสิ่งอื่นล้มเหลวอาจต้องมีการเจรจาด้วยตนเอง) การประมวลผลเซิร์ฟเวอร์ PDT และ IPN ของคุณจะต้องตรวจสอบให้แน่ใจว่ามีการเติมคำสั่งซื้อเพียงครั้งเดียว
Patanjali

ฉันเชื่อว่ามีการเปลี่ยนแปลงและความสำเร็จของ Paypal ตอนนี้ใช้งานได้กับตัวแปร GET เท่านั้น ดูที่นี่: stackoverflow.com/questions/45671366/…
Sol

23

วิธีหนึ่งที่ฉันพบ:

พยายามแทรกฟิลด์นี้ลงในโค้ดฟอร์มที่คุณสร้างขึ้น:

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

RMหมายถึงวิธีการกลับ ;

2หมายถึง(โพสต์)

หลังจากที่ผู้ใช้ซื้อและกลับไปที่ url ไซต์ของคุณแล้ว url นั้นก็รับพารามิเตอร์ POST ด้วยเช่นกัน

ps หากใช้ php ให้ลองใส่var_dump($_POST);url ส่งคืน (สคริปต์) ของคุณจากนั้นทำการซื้อทดสอบและเมื่อคุณกลับไปที่ไซต์ของคุณคุณจะเห็นว่ามีตัวแปรใดบ้างใน url ของคุณ


คุณใช้สิ่งนี้จริงหรือไม่?
Simon Gibbs

มันเยี่ยมมาก ตราบใดที่ปิดการถ่ายโอนข้อมูลการชำระเงินใน paypal คุณจะได้รับการตั้งค่าโพสต์ทั้งหมดที่ส่งไปยัง URL ส่งคืน
JulianJ

4

กำลังแชร์สิ่งนี้เนื่องจากฉันเพิ่งพบปัญหาที่คล้ายกับชุดข้อความนี้

เป็นเวลานานสคริปต์ของฉันทำงานได้ดี (แบบฟอร์มการชำระเงินพื้นฐาน) และส่งคืนตัวแปร POST ไปยังหน้า success.php ของฉันและข้อมูล IPN เป็นตัวแปร POST ด้วย อย่างไรก็ตามเมื่อเร็ว ๆ นี้ฉันสังเกตเห็นว่าเพจส่งคืน (success.php) ไม่ได้รับ POST vars อีกต่อไป ฉันทดสอบใน Sandbox และใช้งานจริงและฉันค่อนข้างมั่นใจว่า PayPal ได้เปลี่ยนแปลงอะไรบางอย่าง!

alert_url ยังคงได้รับข้อมูล IPN ที่ถูกต้องซึ่งทำให้ฉันสามารถอัปเดต DB ได้ แต่ฉันไม่สามารถแสดงข้อความแสดงความสำเร็จในหน้า URL ส่งคืน (success.php) ของฉันได้

แม้จะลองใช้ชุดค่าผสมต่างๆเพื่อเปิดและปิดตัวเลือกในการตั้งค่าการชำระเงินของเว็บไซต์ PayPal และ IPN ฉันต้องทำการเปลี่ยนแปลงสคริปต์ของฉันเพื่อให้แน่ใจว่าฉันยังสามารถประมวลผลข้อความได้ ฉันทำได้สำเร็จโดยเปิด PDT และ Auto Return หลังจากทำตามคำแนะนำที่ยอดเยี่ยมนี้

ตอนนี้ทุกอย่างใช้งานได้ดี แต่ปัญหาเดียวคือ URL ส่งคืนมีตัวแปร PDT ทั้งหมดซึ่งน่าเกลียด!

คุณอาจพบว่าสิ่งนี้มีประโยชน์


3

ฉันคิดว่าแนวคิดในการตั้งค่า Auto Return ตามที่ Kevin อธิบายไว้ข้างต้นนั้นค่อนข้างแปลก!

ตัวอย่างเช่นสมมติว่าคุณมีเว็บไซต์จำนวนหนึ่งที่ใช้บัญชี PayPal เดียวกันในการจัดการการชำระเงินของคุณหรือกล่าวว่าคุณมีหลายส่วนในเว็บไซต์เดียวที่ดำเนินการจัดซื้อที่แตกต่างกันและต้องการที่อยู่สำหรับคืนสินค้าที่แตกต่างกันเมื่อชำระเงิน เสร็จสมบูรณ์ หากฉันใส่ปุ่มบนหน้าของฉันตามที่อธิบายไว้ข้างต้นในส่วน 'แบบฟอร์มตัวอย่างโดยใช้ PHP สำหรับการชำระเงินโดยตรง' คุณจะเห็นว่ามีบรรทัดอยู่ที่นั่น:

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

ที่คุณตั้งค่าผลตอบแทนแต่ละรายการ ทำไมต้องตั้งโดยทั่วไปในส่วนของโปรไฟล์ด้วย!?!

นอกจากนี้เนื่องจากคุณสามารถตั้งค่าได้เพียงค่าเดียวในส่วนโปรไฟล์หมายความว่า (AFAIK) คุณไม่สามารถใช้การส่งคืนอัตโนมัติบนไซต์ที่มีการดำเนินการหลายอย่าง

คอมเม้นหน่อย ??


3
พารามิเตอร์ return สามารถส่งผ่านสำหรับแต่ละแบบฟอร์มที่แทนที่การตั้งค่า auto return url ในการกำหนดค่า paypal
DropHit

1
ใช่สิ่งที่ DropHit กล่าวนั่นเป็นเพียงค่าส่งคืนอัตโนมัติเริ่มต้นในกรณีที่คุณลืมส่งเป็นพารามิเตอร์ หากคุณส่งเป็นพารามิเตอร์ก็จะใช้ URL ส่งคืนของคุณสำหรับแต่ละเว็บไซต์ของคุณ
hamish

สิ่งนี้ช่วยได้ไหม codeeekah.com/2012/02/11/…
hamish

@DropHit PDT ยังคงทำงานกับค่าต่อปุ่มแทนที่returnหรือไม่? ดังนั้นฉันสามารถมีหน้าแสดงผลที่แตกต่างกันซึ่งทั้งหมดจะยังคงรับข้อมูล PDT อยู่หรือไม่
Dai

ขออภัยสำหรับการตอบกลับล่าช้า - ฉันไม่แน่ใจว่าจะใช้งานได้ แต่การผสานรวมปัจจุบันของฉันยังคงทำงานตามที่คาดไว้แม้ว่าจะไม่รับประกันว่ากรณีการใช้งานของคุณจะทำงานได้เหมือนของฉันก็ตาม
DropHit

1

ในหน้าชำระเงินให้มองหาองค์ประกอบแบบฟอร์มที่ซ่อนอยู่ "ยกเลิกการส่งคืน":

กำหนดค่าขององค์ประกอบแบบฟอร์มยกเลิกการส่งคืนเป็น URL ที่คุณต้องการกลับไป:


จริงๆแล้ว 'ยกเลิกการคืนสินค้า' จะใช้เฉพาะเมื่อการทำธุรกรรมล้มเหลว คุณต้องระบุ URL 'ส่งคืน' เพื่อจัดการธุรกรรมที่เสร็จสมบูรณ์มิฉะนั้นจะใช้ URL เริ่มต้นสำหรับพวกเขา
Patanjali

ไม่ใช่เมื่อการทำธุรกรรมล้มเหลว แต่เป็นเมื่อผู้ซื้อคลิกลิงก์ "ยกเลิกและกลับไปที่ [ชื่อผู้ขาย]" ในระหว่างการชำระเงินเพื่อละทิ้งการดำเนินการสั่งซื้อให้เสร็จสิ้น
SubGothius
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.