贝宝按钮中的退货功能不起作用
Posted
技术标签:
【中文标题】贝宝按钮中的退货功能不起作用【英文标题】:return facility in paypal button not working 【发布时间】:2017-06-30 19:37:32 【问题描述】:我正在尝试在 paypal paynow 按钮中发送直通数据,当用户在付款后单击“返回商家”按钮时,让 paypal 将该数据返回到我的 php 页面。
为此,我使用了 paypal 按钮中的“return”功能,并与 rm=2 一起将所有数据作为 post 发回。但是,我无法让它工作。这是我的贝宝按钮 html:
<form name="paypal2" action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="hosted_button_id" value="xxx">
<input type="hidden" name="invoice" value="testinvoice_fromcode2">
<input type="hidden" name="custom" value="testcustom_fromcode1">
<input type="hidden" name="on0" value="yes"><!--agreetc-->
<input type="hidden" name="os0" value="<?php echo $aid; ?>">
<input type="hidden" name="on1" value="<?php echo $id; ?>">
<input type="hidden" name="os1" value="<?php echo $agent; ?>">
<input type="hidden" name="return" value=http://www.example.com/Admin/conpanel/privat/phpvendorpaidad.php>
<input type="hidden" name="rm" value="2">
<input id="submit" type="image" src="https://www.paypalobjects.com/en_GB/i/btn/btn_paynowCC_LG.gif" border="0" name="submit" >
<img border="0" src="https://www.paypalobjects.com/en_GB/i/scr/pixel.gif" >
</form>
在 IPN 通知中,paypal 呈现: os0 作为 option_selection1, os1 作为 option_selection2, on0 作为 option_name1, on1 作为 option_name2,
我知道 on0 和 os0 应该用作名称值对,但早在 2009 年我第一次编写此脚本时,只允许 2 个集合,因此我使用所有 4 个来携带值,然后它就可以工作了。
但本质上,我不明白为什么
<input type="hidden" name="return" value=http://www.example.com/Admin/conpanel/privat/phpvendorpaidad.php>
<input type="hidden" name="rm" value="2">
不工作。
我无法在接收脚本 phpvendorpaidad.php 中获取这些值
$aid=$_REQUEST['option_selection1'];
或作为
$aid=$_REQUEST['os0'];
例如。
谁能看到我做错了什么?非常感谢。
我还有一个正常工作的 IPN 侦听器页面。另一种方法是使用 javascript 将其构建到 IPN 侦听器页面中,以便在页面加载时自动发送表单数据?
【问题讨论】:
【参考方案1】:paypal 是实际发布到您的返回脚本还是使用 GET?在后一种情况下,您可以在查询字符串中看到 txn_id 和其他一些信息,但您不会获得完整的付款明细数据。
如果您将 Auto Return 设置为 On(意味着用户会自动重定向回您的网站,而无需单击按钮),那么 paypal 会发送一个 GET 请求,并且只会包含几个项目。
var_dump($_REQUEST) 和 var_dump($_POST) 在你的脚本中看看你得到了什么。
【讨论】:
非常感谢您的帮助。我已经尝试了一切,无论有无自动返回和 PDT。正如您所说,我在 Auto Return/PDT 开启的情况下获得 GET 传输(带有查询字符串),在这些关闭的情况下获得 POST 传输。我在所有情况下都记录了 url 和 var_dump($_REQUEST),但 Paypal 没有向我的返回脚本发布任何内容(即返回给商家)。奇怪的是,当我在 2009 年第一次编写脚本时,这一切都起作用了。按钮仍然是那个时候的。 我在这方面浪费了很多时间,现在我想我会尝试使用 javascript 表单提交从我的 IPN 处理/侦听脚本中发布变量。 IPN 处理脚本运行正常,付款成功(验证和完成),所有付款数据都通过电子邮件发送给我。 JBart,你太棒了!我刚刚发现我无意中在我的脚本修改代码中留下了'rm = 0'(我在测试不同的方式时这样做了)。返回 'rm-2' 成功发布了所有付款细节,感谢您关于 var_dump($_REQUEST) 的建议,我能够看到这些细节。发布的数据在一个数组中,所以我必须将它们从数组中提取出来才能得到我想要的。非常感谢,再次感谢!!! 唯一奇怪的是,在 2009 年,我能够访问所需的数据,而无需从数组中提取它们,至少这是我的接收脚本所显示的。我想知道 Paypal 是否进行了更改 关于我上面的评论,我 2009 年的返回/接收脚本显示我正在获取 on0、os0、on1、os1 作为 GET 数据,所以一定是从 Paypal 作为查询字符串过来的,因此我不必将它们从数组中提取出来。我试图记住我是如何设置 Paypal 来执行此操作的,或者 Paypal 已更改,因此不再可能。在您编写时,使用 Auto Return 只会发送几个数据项。【参考方案2】:实际上,问题在于我的返回代码中存在缺陷的 if/else 逻辑,该代码是在 2009 年设置的,用于处理 Paypal 在当时发送到返回脚本的 GET 变量。这个逻辑必须区分从我服务器上的先前表单接收到的 POST 数据和从 Paypal 接收到的 GET 数据。自 2009 年以来,Paypal 似乎已经改变,不再将 GET 数据发送到返回脚本,而是通过 POST 数据发送
<input type="hidden" name="return" value=http://www.example.com/Admin/conpanel/privat/phpvendorpaidad.php>
<input type="hidden" name="rm" value="2">
一旦这个问题得到纠正,程序就可以工作了。
但是,由于 JBart 对 var_dump($_REQUEST)(或更容易阅读的 print_r($_REQUEST))的出色建议,我才能够发现问题。如果没有这个,我仍然会陷入困境。加油 JBart,如果您在附近(伦敦西北部),很想请您喝一杯!
不,我不需要从收到的 POSTed 数组中提取任何变量(参见我上面的最后一条评论),只需正常的 '$payment_status = $_POST['payment_status'];'。在此,我误解了“How can I get posted data passed along when the user is first redirected through Paypal?”中有关该主题的另一个线程
【讨论】:
以上是关于贝宝按钮中的退货功能不起作用的主要内容,如果未能解决你的问题,请参考以下文章