设置 PayPal 退货 URL 并使其自动退货?

Posted

技术标签:

【中文标题】设置 PayPal 退货 URL 并使其自动退货?【英文标题】:Setting PayPal return URL and making it auto return? 【发布时间】:2015-06-07 14:24:54 【问题描述】:

这是一个后续问题:php: Easy way to start PayPal checkout?

所以,我的问题是我指定了返回 url。但是,在使用 PayPal 付款后,我最终会看到一个屏幕,上面写着:

您刚刚完成付款。 XXXX,您刚刚完成付款。 您的这笔付款的交易 ID 是:XXXXXXXXXXXXX。

我们将向 XX@XXXX.com 发送一封确认电子邮件。此交易将在您的对帐单上显示为 PAYPAL。

Go to PayPal account overview

我需要它不显示此屏幕并直接转到返回 URL。我有:

设置“return”变量 设置“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?

【问题讨论】:

请注意,您的自定义返回参数中输入的主机必须与您的paypal帐户中配置的相同。 【参考方案1】:

您必须在您的 PayPal 帐户中启用自动退货,否则它将忽略 return 字段。

来自文档(更新以反映 2019 年 1 月的新布局):

默认情况下自动返回是关闭的。 要打开自动返回:

    通过https://www.paypal.com 或https://www.sandbox.paypal.com 登录您的PayPal 帐户 出现“我的帐户概览”页面。 单击右上角的齿轮图标。 将显示配置文件摘要页面。 点击左侧栏中的“我的销售偏好”链接。 在“在线销售”部分下,单击“网站偏好”行中的“更新”链接。 出现“网站付款首选项”页面 在网站付款的自动返回下,单击打开单选按钮以启用自动 返回。 在返回 URL 字段中,输入您希望付款人在之后重定向到的 URL 他们完成付款。 注意:PayPal 会检查您输入的退货 URL。如果 URL 格式不正确 或无法验证,PayPal 将不会激活自动退货。 滚动到页面底部,然后点击保存按钮。

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 处理程序页面将是更新数据库以将订单标记为已付款的正确位置。

【讨论】:

看看这里paypal.com/cgi-bin/webscr?cmd=p/mer/… 使用 Paypal 的新网站布局,这不再完全准确。 Step 3) 点击My Selling Tools Step 4) 点击Selling Online下的Website Preferences IPN 应该用于验证 PayPal 是否正确处理了订单,但是,您仍然需要返回 url 向用户显示您知道成功。很多时候用户没有收到您发送的电子邮件,所以如果他们可以立即访问产品(下载等),那就太好了。 @Kevin Stricker 我们如何设置 2 个不同站点的返回 url?就像我为 2 个网站使用一个贝宝帐户一样,但我只能使用您的步骤添加一个 URL 作为返回 URL。我如何将它用于 2 个站点? “您必须在您的 PayPal 帐户中启用自动退货,否则它将忽略return 字段。” 您的任何return URL 参数不太准确。 pass to checkout 将被兑现并覆盖在卖家的 PayPal 帐户配置文件中配置的任何自动退货 URL(或缺少),但如果他们没有在此处启用自动退货,则买家需要在结帐结束后手动点击为了被重定向到那个 URL,而不是被自动重定向。【参考方案2】:

使用 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" >
</form>

请仔细检查字段 notify_url、return、cancel_return

支付完成后paypal请求的处理ipn(my_ipn.php)的示例代码。

有关创建 IPN 的更多信息,请参阅this 链接。

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

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

更多阅读请参考以下链接;

https://www.paypal.com/cgi-bin/webscr?cmd=p/pdn/howto_checkout-outside https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_html_Appx_websitestandard_htmlvariables

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

【讨论】:

有人知道这对于今天的贝宝 API 是否仍然有效?我看到这个问题是 2 岁。 'return' 和 'cancel_return' URL 用于向买家提供即时交易反馈,并且可以为此使用 PDT 变量。但是,PP 只与他们一起尝试一次,因此不能依赖它们来完成关键订单(例如,买家在付款后关闭浏览器,但仍然在 PP)。为此,您可能还希望通过“notify_url”使用可靠的 IPN 流程对其进行备份,至少处理“已完成”状态(假设其他任何事情都是失败的,可能需要手动协商)。您的 PDT 和 IPN 服务器处理将需要确保订单只执行一次。 我相信事情已经发生了变化,Paypal success.php 现在只适用于 GET 变量。见这里:***.com/questions/45671366/…【参考方案3】:

我找到的一种方法:

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

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

rm 表示返回方法

2 表示(帖子)

在用户购买并返回您的站点 url 之后,该 url 也会获取 POST 参数

附言如果使用 php,请尝试在您的返回 url(脚本)中插入 var_dump($_POST);,然后进行测试购买,当您返回您的网站时,您将看到您的 url 上有哪些变量。

【讨论】:

你真的用过这个吗? 这很棒。只要在 paypal 中关闭付款数据传输,您就会将所有帖子设置发送到返回 url。【参考方案4】:

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

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

【讨论】:

其实,'cancel return'只在交易失败时使用。您还必须提供一个“返回”网址来处理成功完成的交易,否则将使用默认网址。 不是交易失败,而是买家在结账时点击“取消并返回[商家名称]”链接放弃完成订单。【参考方案5】:

我觉得 Kevin 上面描述的设置自动返回值的想法有点奇怪!

例如,假设您有多个网站使用同一个 PayPal 帐户来处理您的付款,或者假设您在一个网站中有多个部分执行不同的购买任务,并且需要不同的退货地址付款完成时。如果我在“使用 PHP 进行直接付款的示例表单”部分中如上所述在我的页面上放置了一个按钮,您可以看到那里有一行:

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

您在其中设置单独的返回值。为什么必须在配置文件部分进行一般设置?!?!

此外,因为您只能在配置文件部分设置一个值,这意味着 (AFAIK) 您不能在具有多个操作的站点上使用自动返回。

请评论??

【讨论】:

可以为每个表单传递返回参数,覆盖 paypal 配置中的自动返回 url 设置 是的,DropHit 说的是,这只是默认的自动返回值,以防您忘记将其作为参数传递。如果您将其作为参数传递,它将使用您的每个网站的返回 url。 这有帮助吗? codeseekah.com/2012/02/11/… @DropHit 那么 PDT 是否仍然适用于每个按钮覆盖的 return 值?所以我可以有不同的返回页面,它们仍然会接收 PDT 数据? 抱歉,回复晚了 - 我不确定它是否会起作用,但我当前的集成仍然按预期运行,尽管这并不能保证您的用例会像我的那样工作【参考方案6】:

分享这个,因为我最近遇到了问题similar to this thread

长期以来,我的脚本运行良好(基本支付表单)并将 POST 变量返回到我的 success.php 页面,并将 IPN 数据也作为 POST 变量返回。但是,最近,我注意到返回页面(success.php)不再接收任何 POST 变量。我在 Sandbox 中进行了测试,并且我很确定 PayPal 已经改变了一些东西!

notify_url 仍然接收到允许我更新数据库的正确 IPN 数据,但我无法在返回 URL (success.php) 页面上显示成功消息。

尽管尝试了许多组合来打开和关闭 PayPal 网站支付首选项和 IPN 中的选项,但我不得不对我的脚本进行一些更改,以确保我仍然可以处理消息。我通过打开 PDT 和自动返回来完成此操作,after following this excellent guide。

现在一切正常,但唯一的问题是返回 URL 包含所有丑陋的 PDT 变量!

您还可以找到this helpful

【讨论】:

以上是关于设置 PayPal 退货 URL 并使其自动退货?的主要内容,如果未能解决你的问题,请参考以下文章

PayPal IPN - 自动退货

PayPal退货页面问题

Paypal:返回“退货”网址时,我可以退回收据编号或订单编号吗?

Paypal:标准结帐退货

PayPal:将电子邮件地址传递到退货/“谢谢”页面

paypal动态退货地址