设置 PayPal 返回 URL 并使其自动返回?

这是一个后续问题: PHP: 简单的方式开始贝宝结帐?

所以,我的问题是我指定了返回的 url。然而,在使用贝宝(PayPal)支付后,我看到的屏幕上显示:

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

我们将发送一封确认电子邮件给 XX@XXXX.com。这笔交易将作为 PAYPAL 出现在您的声明中。

Go to PayPal account overview

我需要它不显示这个屏幕,直接去返回的网址。我有:

  • 设置“ return”变量
  • 将“ rm”变量设置为: 2(根据 guide = “ 使用 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 是什么?

246878 次浏览

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

根据文件(更新以反映2019年1月的新布局) :

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

  1. 登录到你的贝宝帐户在 https://www.paypal.com或 < a href = “ https://www.sandbox.PayPal.com”rel = “ norefrer”> https://www.sandbox.PayPal.com 出现“我的帐户概述”页。
  2. 点击右上角的齿轮图标。 将出现“配置文件摘要”页。
  3. 单击左栏中的 MySellingPreferences 链接。
  4. 在“在线销售”部分下,单击“网站首选项”行中的“更新”链接。 出现“网站支付首选项”页
  5. 在“网站支付自动返回”下,单击“在”单选按钮以启用“自动” 返回。
  6. 在“返回 URL”字段中,输入您希望付款人重定向到的 URL 他们完成了付款。 注意: PayPal 检查您输入的返回 URL。如果 URL 格式不正确 或无法验证,贝宝将不会激活自动返回。
  7. 滚动到页面底部,单击 Save 按钮。

IPN 是即时付款通知。它会给你更可靠/有用的信息,比你将获得从自动退货。

IPN 的文档如下: https://www.x.com/sites/default/files/ipnguide.pdf

IPN 的在线文档: https://developer.paypal.com/docs/classic/ipn/gs_IPN/

一般的过程是,你传递一个 notify_url参数与请求,并建立一个页面,处理和验证 IPN 通知,贝宝将发送请求到该页面,通知你当付款/退款/等通过。然后,IPN 处理程序页面将是更新数据库以将订单标记为已付款的正确位置。

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

请查看通知、返回、取消返回字段

处理付款后 paypal 请求的 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 process flow

如欲进一步阅读,请参阅以下连结:

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

我发现了一个办法:

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

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

Rm 表示 返回方法;

2 表示 (邮寄)

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

如果使用 php,尝试在返回的 url (script)中插入 var_dump($_POST);,然后进行测试购买,当您返回到您的站点时,您将看到在您的 url 上获得了哪些变量。

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

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

我认为设置自动返回值的想法,如上所述的凯文是有点奇怪!

例如,你有很多网站使用相同的贝宝账户来处理你的付款,或者你在一个网站上有很多部分执行不同的购买任务,并且在付款完成后要求不同的回执地址。如果我在我的页面上放一个按钮,如上面“使用 PHP 直接支付的示例表单”部分所述,您可以看到那里有一行:

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

其中设置单个返回值。为什么它必须设置一般,在配置文件部分呢? ! ? !

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

请评论一下?

与大家分享我最近遇到的问题 类似于这条线

在很长一段时间内,我的脚本工作得很好(基本的支付表单) ,并将 POST 变量返回到我的 success.php 页面,IPN 数据也作为 POST 变量返回。然而,最近,我注意到 return 页面(Success. php)不再接收任何 POST 变量。我在沙盒测试和生活,我很肯定贝宝已经改变了一些东西!

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

尽管在 PayPal 网站支付首选项和 IPN 中尝试了很多组合来开关选项,我还是不得不对我的脚本进行一些修改,以确保我仍然可以处理一条消息。我已经完成了这一点,打开 PDT 和自动返回,在遵循了这本优秀的指南之后

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

你也可以找到 这很有帮助