PayPal 生产与沙盒的工作方式不同
Posted
技术标签:
【中文标题】PayPal 生产与沙盒的工作方式不同【英文标题】:PayPal production working differently than sandbox 【发布时间】:2014-01-03 08:46:20 【问题描述】:我已经构建了一个应用程序,它将带有登录用户的 GUID 的通知 url 发送到 PayPal,并在购买完成后调用该 url,并在验证后,用户数据库条目更新列 purchased
从 0 到 1。
然后用户点击返回应用按钮,高级功能基于purchased
列显示。
过去几个月我一直在沙盒中对此进行测试。 100% 的测试次数(包括在此问题之后),在购买完成后显示高级选项卡。
客户很高兴,并同意继续进行生产。我已经使用 完全相同的 URL 设置了 IPN,除了从 www.sandbox.paypal.com 切换到 www.paypal.com 并将列出的帐户从沙盒业务更改为个人事务。
问题是,按钮现在不显示,直到,您刷新屏幕。单击以前按预期工作的“返回应用程序”按钮现在不显示高级选项卡。一旦我点击刷新 - 它就会出现。如果我将所有内容都切换回沙盒设置,那就太好了——它又可以正常工作了。
这是带有生产帐户的 BuyNow 按钮代码:
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" id="buynowForm" target="_top">
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="business" value="ACCOUNT EMAIL">
<input type="hidden" name="lc" value="US">
<input type="hidden" name="item_name" value="Product">
<input type="hidden" name="amount" value="10.00">
<input type="hidden" name="currency_code" value="USD">
<input type="hidden" name="button_subtype" value="services">
<input type="hidden" name="no_note" value="1">
<input type="hidden" name="no_shipping" value="1">
<input type='hidden' name='notify_url' value='http://app.com/purchase/<?php echo $data[0]['uid'] ?>'>
<input type='hidden' name='return' value='http://app.com/'>
<input type="hidden" name="rm" value="1">
<input type="hidden" name="cbt" value="Return to Product Plus">
<input type="hidden" name="bn" value="PP-BuyNowBF:btn_buynowCC_LG.gif:NonHosted">
<input type="submit" class="hidden-print visible-print" border="0" name="buysubmit" value="Click For Product Plus" >
<img border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" >
这是上面调用的处理路线:
$app->post('/purchase/:uid', function ($uid) use ($app)
$request = Slim::getInstance()->request();
$inputs = json_decode($request->getBody());
$db_conn = conn();
$req = 'cmd=_notify-validate';
foreach ($_POST as $key => $value)
if (get_magic_quotes_gpc())
$_POST[$key] = stripslashes($value);
$value = stripslashes($value);
$value = urlencode($value);
$req .= "&$key=$value";
$url = "https://www.paypal.com/cgi-bin/webscr";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
$result = curl_exec($ch);
curl_close($ch);
if (strcmp ($result, "VERIFIED") == 0)
$sql_st = 'UPDATE `user_data` SET `purchased` = 1 WHERE uid=:uid';
$sql = $db_conn->prepare($sql_st);
if ($sql->execute(array('uid'=>$uid)))
$data = array('status' => "Ok");
else
$data = array('status' => print_r(mysql_error()));
else
// Did Not Process IPN Properly
);
真的希望这对我来说是非常愚蠢的事情。任何帮助/指导表示赞赏。
【问题讨论】:
技术支持,顺便说一句,在这里根本没有帮助。仍然不确定如何解决。在延迟或队列中没有发现任何可能导致速度变慢的内容。此刻感觉很迷茫。 这非常令人沮丧。测试也有问题,因为唯一的测试方法是使用沙箱(我认为)。如果唯一的测试方法是沙箱,并且它运行良好,那么它应该可以在生产环境中运行......呃! 即时付款通知似乎不是即时的。似乎需要大约 10-15 秒,很可能是在排队。正在修复,希望尽快报告。 【参考方案1】:基本上这里的解决方案是两个选项之一 -
构建辅助完成方法 - 换句话说,IPN 不是购买软件升级的第一道防线。我这边的一切都在工作,但是 IPN (notify_url) 调用的时间太慢,无法即时升级。将它们返回到执行升级然后重定向的页面。
将升级后的功能存储在不同的路径后面 - 这是 PayPal 的建议。本质上,有 app.com/basic 和 app.com/upgraded。这并不理想,我也不建议将其作为永久解决方案。
总结 - 这是 PayPal 的一个已知问题。沙盒和生产工作流程基本上不同 - 不是功能或 API,而是在使用方面 - 生产级帐户受到的冲击更大,处理通知所需的时间要慢得多。
希望这对某人有所帮助。
【讨论】:
这里是指向同一问题的链接 - warriorforum.com/main-internet-marketing-discussion-forum/…以上是关于PayPal 生产与沙盒的工作方式不同的主要内容,如果未能解决你的问题,请参考以下文章