Mengatur URL pengembalian PayPal dan menjadikannya otomatis kembali?

127

Ini adalah pertanyaan tindak lanjut ke: PHP: Cara mudah untuk memulai checkout PayPal?

Jadi, masalah saya adalah saya menentukan url pengembalian. Namun, setelah membayar dengan PayPal, saya berakhir di layar yang mengatakan:

Anda baru saja menyelesaikan pembayaran Anda. XXXX, Anda baru saja menyelesaikan pembayaran. ID transaksi Anda untuk pembayaran ini adalah: XXXXXXXXXXXXX.

Kami akan mengirim email konfirmasi ke [email protected]. Transaksi ini akan muncul pada pernyataan Anda sebagai PAYPAL.

Go to PayPal account overview

Saya membutuhkannya untuk tidak menampilkan layar ini dan langsung ke URL kembali. Saya sudah:

  • Setel variabel "kembali"
  • Atur variabel "rm" ke: 2 (yang sesuai dengan panduan = " browser pembeli diarahkan ke URL kembali dengan menggunakan metode POST, dan semua variabel pembayaran termasuk ")

Bahkan, inilah seluruh bentuk saya:

<form method="post" action="https://www.sandbox.paypal.com/cgi-bin/webscr">
  <input type="hidden" value="_xclick" name="cmd">
  <input type="hidden" value="[email protected]" 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>

Adakah yang tahu bagaimana saya bisa mendapatkannya kembali secara otomatis? Atau, bagaimana saya mendapatkan hasil pembayaran kembali ke situs web saya sehingga saya dapat memperbarui database? Apa itu IPN?

coderama
sumber
Harap dicatat, bahwa host yang masuk dalam parameter pengembalian kustom Anda harus sama dengan yang dikonfigurasi di akun paypal Anda.
Andreas

Jawaban:

199

Anda harus mengaktifkan pengembalian otomatis di akun PayPal Anda, jika tidak maka akan mengabaikan returnbidang.

Dari dokumentasi (diperbarui untuk mencerminkan tata letak baru Jan 2019):

Pengembalian Otomatis dimatikan secara default. Untuk mengaktifkan Pengembalian Otomatis:

  1. Masuk ke akun PayPal Anda di https://www.paypal.com atau https://www.sandbox.paypal.com Halaman Ikhtisar Akun Saya muncul.
  2. Klik ikon roda gigi di kanan atas. Halaman Ringkasan Profil muncul.
  3. Klik tautan Preferensi Jual Saya di kolom kiri.
  4. Di bawah bagian Jual Online, klik tautan Perbarui di baris untuk Preferensi Situs Web. Halaman Preferensi Pembayaran Situs Web muncul
  5. Di bawah Pengembalian Otomatis untuk Pembayaran Situs Web, klik tombol Di radio untuk mengaktifkan Pengembalian Otomatis.
  6. Di bidang URL Pengembalian, masukkan URL yang Anda inginkan agar pembayar Anda dialihkan setelah mereka menyelesaikan pembayaran mereka. CATATAN: PayPal memeriksa URL Pengembalian yang Anda masukkan. Jika URL tidak diformat dengan benar atau tidak dapat divalidasi, PayPal tidak akan mengaktifkan Pengembalian Otomatis.
  7. Gulir ke bagian bawah halaman, dan klik tombol Simpan.

IPN untuk pemberitahuan pembayaran instan. Ini akan memberi Anda informasi yang lebih dapat diandalkan / berguna daripada apa yang akan Anda dapatkan dari pengembalian otomatis.

Dokumentasi untuk IPN ada di sini: https://www.x.com/sites/default/files/ipnguide.pdf

Dokumentasi Online untuk IPN: https://developer.paypal.com/docs/classic/ipn/gs_IPN/

Prosedur umumnya adalah Anda melewatkan notify_urlparameter dengan permintaan, dan mengatur halaman yang menangani dan memvalidasi pemberitahuan IPN, dan PayPal akan mengirim permintaan ke halaman itu untuk memberi tahu Anda ketika pembayaran / pengembalian uang / dll. melewati. Halaman pengendali IPN itu kemudian akan menjadi tempat yang tepat untuk memperbarui database untuk menandai pesanan yang telah dibayarkan.

Kevin Stricker
sumber
2
Lihat di sini paypal.com/cgi-bin/webscr?cmd=p/mer/…
Pengembang
5
Dengan tata letak situs web baru Paypal, ini tidak lagi tepat akurat. Langkah 3) Klik My Selling Tools Langkah 4) Klik di Website PreferencesbawahSelling Online
Webnet
2
IPN harus digunakan untuk memverifikasi bahwa pesanan ditangani dengan benar oleh PayPal, namun, Anda masih memerlukan url pengembalian untuk menunjukkan kepada pengguna Anda bahwa Anda mengetahui keberhasilannya. Sering kali pengguna tidak mendapatkan email yang Anda kirim, jadi bagus jika mereka bisa mendapatkan akses ke produk (unduh, dll) segera.
pcunite
1
@Kevin Stricker Bagaimana cara kami mengatur url kembali untuk 2 situs yang berbeda? seperti jika saya menggunakan satu akun paypal untuk 2 situs web, tetapi saya hanya dapat menambahkan satu URL sebagai url pengembalian menggunakan langkah-langkah Anda. bagaimana saya bisa menggunakannya untuk 2 situs?
Gaurav
4
Tidak terlalu akurat bahwa "Anda harus mengaktifkan pengembalian otomatis di akun PayPal Anda, jika tidak maka akan mengabaikan returnbidang." Setiap returnURL parameter Anda lulus ke kasir akan merasa terhormat dan menimpa Auto Kembali URL (atau ketiadaan) dikonfigurasi dalam profil akun PayPal penjual, tetapi jika mereka tidak memiliki Auto Kembali diaktifkan sana, pembeli akan perlu untuk mengklik secara manual masa lalu akhir checkout untuk diarahkan ke URL itu, daripada diarahkan secara otomatis.
SubGothius
42

Formulir sampel menggunakan PHP untuk pembayaran langsung.

<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="[email protected]">

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

silakan pergi melalui bidang notify_url, return, cancel_return

kode sampel untuk menangani ipn (my_ipn.php) yang diminta oleh paypal setelah pembayaran dilakukan.

Untuk informasi lebih lanjut tentang cara membuat IPN, silakan merujuk ke tautan ini .

<?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("[email protected]", "IPN interaction not verified", "$req", "From: [email protected]");
    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 != "[email protected]") {
//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("[email protected]", "NORMAL IPN RESULT YAY MONEY!", $req, "From: [email protected]");
?>

Gambar di bawah ini akan membantu Anda dalam memahami proses paypal. Alur proses Paypal

Untuk bacaan lebih lanjut, lihat tautan berikut;

semoga ini membantu kamu .. :)

Prashanth Pratapagiri
sumber
1
Adakah yang tahu apakah ini masih berlaku dengan API paypal hari ini? Saya melihat bahwa pertanyaannya adalah 2 tahun.
Matt Welander
1
URL 'return' dan 'cancel_return' digunakan untuk memberikan umpan balik transaksi langsung kepada pembeli, dan dapat menggunakan variabel PDT untuk itu. Namun, PP hanya mencoba sekali dengan mereka, sehingga mereka tidak dapat diandalkan untuk pemenuhan pesanan kritis (mis. Pembeli menutup browser setelah pembayaran, tetapi masih di PP). Untuk itu, Anda mungkin ingin juga mencadangkannya dengan proses IPN yang andal, melalui 'notify_url', memproses status 'Selesai' sekurang-kurangnya (anggap hal lain gagal, mungkin memerlukan negosiasi manual). Pemrosesan server PDT dan IPN Anda perlu memastikan bahwa pesanan hanya diisi satu kali.
Patanjali
Saya percaya hal-hal telah berubah dan Paypal success.php sekarang hanya berfungsi dengan variabel GET. Lihat di sini: stackoverflow.com/questions/45671366/…
Sol
23

satu cara saya telah menemukan:

coba masukkan bidang ini ke dalam kode formulir yang dibuat:

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

rm berarti metode pengembalian ;

2 berarti (posting)

Daripada setelah pengguna membeli dan kembali ke url situs Anda, maka url itu mendapatkan parameter POST juga

ps jika menggunakan php, cobalah untuk memasukkan var_dump($_POST);url pengembalian Anda (skrip), kemudian lakukan pembelian tes dan ketika Anda kembali ke situs Anda, Anda akan melihat variabel apa yang didapat pada url Anda.

T.Todua
sumber
Apakah Anda benar-benar menggunakan ini?
Simon Gibbs
Ini bagus. Selama transfer data pembayaran dimatikan dalam paypal maka Anda mendapatkan semua pengaturan posting dikirim ke url kembali.
JulianJ
4

Berbagi ini karena saya baru-baru ini mengalami masalah yang mirip dengan utas ini

Untuk waktu yang lama, skrip saya berfungsi dengan baik (formulir pembayaran dasar) dan mengembalikan variabel POST ke halaman success.php saya dan data IPN sebagai variabel POST juga. Namun, belakangan ini, saya perhatikan halaman kembali (success.php) tidak lagi menerima POST vars. Saya menguji di Sandbox dan hidup dan saya cukup yakin PayPal telah mengubah sesuatu!

Notify_url masih menerima data IPN yang benar yang memungkinkan saya untuk memperbarui DB, tetapi saya tidak dapat menampilkan pesan sukses di halaman URL kembalinya (success.php).

Meskipun mencoba banyak kombinasi untuk mengaktifkan dan menonaktifkan opsi di preferensi pembayaran dan IPN situs web PayPal, saya harus membuat beberapa perubahan pada skrip saya untuk memastikan saya masih dapat memproses pesan. Saya telah menyelesaikan ini dengan menyalakan PDT dan Pengembalian Otomatis, setelah mengikuti panduan yang sangat bagus ini .

Sekarang semuanya berfungsi dengan baik, tetapi satu-satunya masalah adalah URL kembali berisi semua variabel PDT yang jelek!

Anda juga dapat menemukan ini bermanfaat

Sol
sumber
3

Saya pikir ide pengaturan nilai-nilai Pengembalian Otomatis seperti dijelaskan di atas oleh Kevin agak aneh!

Katakan, misalnya, bahwa Anda memiliki sejumlah situs web yang menggunakan akun PayPal yang sama untuk menangani pembayaran Anda, atau katakan bahwa Anda memiliki sejumlah bagian dalam satu situs web yang melakukan tugas pembelian yang berbeda, dan memerlukan alamat pengirim yang berbeda saat pembayaran selesai. Jika saya meletakkan tombol di halaman saya seperti yang dijelaskan di atas di bagian 'Formulir contoh menggunakan PHP untuk pembayaran langsung', Anda dapat melihat bahwa ada baris di sana:

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

tempat Anda menetapkan nilai pengembalian individual. Mengapa harus diatur secara umum, di bagian profil juga?!?!

Juga, karena Anda hanya dapat menetapkan satu nilai di Bagian Profil, itu berarti (AFAIK) bahwa Anda tidak dapat menggunakan Pengembalian Otomatis di situs dengan beberapa tindakan.

Komentar tolong ??

Tim Makins
sumber
3
parameter pengembalian dapat diteruskan untuk setiap bentuk yang menimpa pengaturan url pengembalian otomatis di konfigurasi paypal
DropHit
1
ya apa yang dikatakan DropHit, itu hanya nilai pengembalian otomatis default, jika Anda lupa memberikannya sebagai parameter. jika Anda meneruskannya sebagai parameter, ia akan menggunakan url pengembalian Anda untuk setiap situs web Anda.
hamish
Apakah ini membantu? codeseekah.com/2012/02/11/...
hamish
@ DropHit Apakah PDT masih bekerja dengan returnnilai overrriden per-tombol ? Jadi saya dapat memiliki halaman kembali yang berbeda yang semuanya masih akan menerima data PDT?
Dai
Maaf atas jawaban yang terlambat - saya tidak yakin apakah itu akan berfungsi TETAPI integrasi saya saat ini masih beroperasi seperti yang diharapkan meskipun itu tidak menjamin bahwa use case Anda akan berfungsi seperti milik saya
DropHit
1

pada halaman checkout, cari elemen formulir tersembunyi 'cancel_return':

setel nilai elemen formulir cancel_return ke URL yang ingin Anda kembalikan:

Rahul Shinde
sumber
Sebenarnya, 'membatalkan pengembalian' hanya digunakan ketika transaksi gagal. Anda HARUS memberikan URL 'pengembalian' untuk menangani transaksi yang berhasil diselesaikan, jika tidak, URL default akan digunakan untuk mereka.
Patanjali
Bukan ketika transaksi gagal tetapi, lebih tepatnya, ketika pembeli mengklik tautan "Batalkan dan kembali ke [nama pedagang]" selama checkout untuk meninggalkan penyelesaian pesanan mereka.
SubGothius