设置PayPal返回网址并使其自动返回?


127

这是一个后续问题:PHP:开始PayPal结帐的简便方法?

所以,我的问题是我要指定返回网址。但是,在使用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?


请注意,您的自定义返回参数中的enters主机必须与您的贝宝帐户中配置的相同。
Andreas

Answers:


199

您必须在您的PayPal帐户中启用自动返回功能,否则它将忽略该return字段。

从文档中(已更新以反映新的版式2019年1月):

默认情况下,“自动返回”处于关闭状态。要打开自动返回:

  1. 通过https://www.paypal.comhttps://www.sandbox.paypal.com登录到您的PayPal帐户 。出现“我的帐户概述”页面。
  2. 点击右上方的齿轮图标。出现“概要摘要”页面。
  3. 点击左侧栏中的我的销售偏好设置链接。
  4. 在“在线销售”部分下,单击“网站偏好设置”行中的“更新”链接。出现“网站付款首选项”页面
  5. 在“网站付款的自动退还”下,单击“启用”单选按钮以启用“自动退还”。
  6. 在“返回URL”字段中,输入付款人希望您在付款后将其重定向到的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 PreferencesSelling Online
Webnet

2
应该使用IPN来验证该订单是否正确地由PayPal处理,但是,您仍然需要返回URL来向用户显示您对成功的了解。如此多的用户没有收到您发送的电子邮件,因此,如果他们可以立即访问产品(下载等),那就太好了。
pcunite

1
@Kevin Stricker我们如何设置两个不同站点的返回URL?例如,如果我将一个Paypal帐户用于2个网站,但是使用您的步骤,我只能添加一个URL作为返回URL。如何在2个网站上使用?
Gaurav

4
“您必须在您的PayPal帐户中启用自动退回,否则将忽略该return字段。” 这种说法不太准确return您传递给结帐的所有URL参数都会被接受,并且会覆盖卖家的PayPal帐户资料中配置的任何自动返回URL(或缺少自动返回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");
?>

下图将帮助您了解Paypal流程。 贝宝流程

要进一步阅读,请参考以下链接;

希望这对您有帮助.. :)


1
有人知道今天的Paypal API是否仍然有效?我看到这个问题已经2岁了。
Matt Welander 2014年

1
“ return”和“ cancel_return” URL用于向买方提供即时交易反馈,并且可以为此使用PDT变量。但是,PP只对它们尝试一次,因此不能依靠它们来完成关键订单(例如,买家付款后关闭浏览器,但仍在PP处)。为此,您可能还希望通过“ notify_url”通过可靠的IPN流程对其进行备份,从而至少处理“已完成”状态(假设其他任何操作均失败,可能需要手动协商)。您的PDT和IPN服务器处理将需要确保仅执行一次订单。
Patanjali

我相信事情已经改变了,贝宝success.php现在仅适用于GET变量。看到这里:stackoverflow.com/questions/45671366/…–
Sol

23

我发现的一种方式:

尝试将此字段插入生成的表单代码中:

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

rm表示返回方法 ;

2表示(发布)

在用户购买并返回到您的网站网址之后,该网址也将获得POST参数

ps:如果使用php,请尝试var_dump($_POST);在您的返回网址(script)中插入,然后进行测试购买,当您返回网站时,您会看到网址中包含哪些变量。


您实际使用过吗?
西蒙·吉布斯

太好了 只要在Paypal中关闭了付款数据传输,您就可以将所有过帐设置发送到返回网址。
朱利安·J

4

分享,因为我最近遇到了与此线程类似的问题

长期以来,我的脚本运行良好(基本付款形式),并将POST变量返回到我的success.php页面,并将IPN数据也返回为POST变量。但是,最近,我注意到返回页面(success.php)不再接收任何POST变量。我已经在Sandbox上进行了测试并投入使用,而且我很确定PayPal有所改变!

notify_url仍然接收正确的IPN数据,允许我更新数据库,但是我无法在返回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
可以为每种形式传递return参数,以覆盖paypal配置中的自动返回URL设置
DropHit

1
是的,DropHit所说的只是默认的自动返回值,以防万一您忘记将其作为参数传递。如果您将其作为参数传递,它将使用您的每个网站的返回网址。
hamish 2015年


@DropHit那么,PDT是否仍可以使用按按钮的替代return值?因此,我可以拥有其他返回页,这些返回页仍将全部接收PDT数据吗?

对不起,您的答复很晚-我不确定它是否会起作用,但我目前的集成仍按预期运行,尽管这不能保证您的用例将像我的一样工作
DropHit

1

在结帐页面上,查找“ cancel_return”隐藏的表单元素:

将cancel_return表单元素的值设置为您希望返回的URL:


实际上,“取消退货”仅在交易失败时使用。您还必须提供“返回” URL来处理成功完成的交易,否则将使用默认URL。
Patanjali

不是不是交易失败,而是买家在结帐期间单击“取消并返回[商户名称]”链接以放弃完成订单时。
SubGothius '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.