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 生产与沙盒的工作方式不同的主要内容,如果未能解决你的问题,请参考以下文章

PDT 的 PayPal 方向与沙盒设置不匹配

使用 Paypal Cordova 插件,无法使用生产或沙盒模式使其工作

沙盒的 PayPal API 凭据

不使用沙盒的 PayPal 测试

未收到来自 Paypal IPN 沙盒的响应

贝宝沙箱不工作[重复]