这是一个跟进问题:PHP: Easy way to start PayPal checkout?
所以,我的问题是我指定了返回网址。但是,在使用PayPal付款后,我最终会在一个屏幕上显示:
您刚刚完成了付款。 XXXX,您刚刚完成了付款。 此付款的交易ID为:XXXXXXXXXXXXX。
我们会发送一封确认电子邮件至XX@XXXX.com。此交易将在您的对帐单上显示为PAYPAL。
Go to PayPal account overview
我需要它不显示此屏幕并直接转到返回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:<Br />Goldfish Flock BLG<br />" 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?
答案 0 :(得分:187)
您必须在PayPal帐户中启用自动退货,否则会忽略return
字段。
从文档(更新以反映2019年1月的新布局):
默认情况下,自动返回功能已关闭。 要启用自动返回:
- 在https://www.paypal.com或https://www.sandbox.paypal.com登录您的PayPal帐户 将显示“我的帐户概述”页面。
- 点击右上方的齿轮图标。 将显示“配置文件摘要”页
- 点击左栏中的“我的销售偏好设置”链接。
- 在“在线销售”部分下,点击“网站偏好设置”行中的“更新”链接。 将显示“网站付款首选项”页面
- 在“自动返回网站付款”下,单击“打开”单选按钮以启用“自动” 返回。
- 在“返回网址”字段中,输入您希望付款人重定向到的网址 他们完成付款。 注意: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处理程序页面将是更新数据库以将订单标记为已付款的正确位置。
答案 1 :(得分:40)
使用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)的示例代码,该代码在付款后由paypal请求。
有关创建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");
?>
下图将帮助您了解paypal过程。
有关进一步阅读,请参阅以下链接;
希望这会对你有所帮助.. :)
答案 2 :(得分:22)
我找到的一种方式:
尝试将此字段插入生成的表单代码中:
<input type='hidden' name='rm' value='2'>
rm 表示 返回方法 ;
2 表示 (帖子)
在用户购买并返回您的网站网址后,该网址也会获取POST参数
P.S。如果使用php,请尝试在您的返回网址(脚本)中插入var_dump($_POST);
,然后进行测试购买,当您返回到您的网站时,您会看到您的网址上有哪些变量。
答案 3 :(得分:4)
在我最近遇到问题similar to this thread
时分享此内容很长一段时间,我的脚本运行良好(基本付款方式)并将POST变量返回到我的success.php页面,IPN数据也作为POST变量返回。但是,最近,我注意到返回页面(success.php)不再接收任何POST变量。我在沙盒中测试并且直播,我很确定PayPal已经改变了一些东西!
notify_url仍然会收到正确的IPN数据,允许我更新数据库,但是我无法在返回URL(success.php)页面上显示成功消息。
尽管尝试了许多组合来在PayPal网站支付首选项和IPN中打开和关闭选项,但我必须对我的脚本进行一些更改,以确保我仍然可以处理消息。我通过打开PDT和自动返回after following this excellent guide来完成此任务。
现在一切正常,但唯一的问题是返回URL包含所有难看的PDT变量!
您可能还会找到this helpful
答案 4 :(得分:3)
我认为如上所述设置自动返回值的想法有点奇怪!
例如,假设您有许多网站使用相同的PayPal帐户来处理您的付款,或者说您在一个网站中有多个部门执行不同的购买任务,并且需要不同的退货地址付款完成时。如果我按照上面“使用PHP直接付款的示例表单”部分所述在我的页面上放置一个按钮,您可以看到那里有一行:
input type="hidden" name="return" value="https://www.yoursite.com/checkout_complete.php"
您可以在其中设置单个返回值。为什么必须在配置文件部分中进行一般设置?!?!
此外,因为您只能在“个人资料”部分中设置一个值,这意味着(AFAIK)您无法在具有多个操作的网站上使用“自动返回”。
请注意?
答案 5 :(得分:1)
,查找“cancel_return”隐藏表单元素:
将cancel_return表单元素的值设置为您希望返回的URL: