php - PayPal 生产的工作方式与沙箱不同

标签 php paypal paypal-ipn paypal-sandbox

我构建了一个应用程序,它向 PayPal 发送一个带有登录用户 GUID 的通知 url,购买完成后调用该 url,验证后,用户数据库条目更新列 从 0 到 1 购买

然后用户单击返回应用程序按钮,高级功能将根据已购买 列显示。

过去几个月我一直在沙盒中对此进行测试。 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" alt="Click for Product Plus">
<img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1">

这里是上面调用的处理路径:

$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
    } 

});

真的希望这对我来说只是一些非常愚蠢的事情。感谢您提供任何帮助/指导。

最佳答案

基本上这里的解决方案是两个选项之一 -

  1. 构建辅助完成方法 - 换句话说,IPN 不是购买的软件升级的第一道防线。我这边的一切都在工作,但是 IPN (notify_url) 调用的时间太慢,无法使即时升级不完全即时。将它们返回到执行升级然后重定向的页面。

  2. 将升级后的功能存储在不同的路径后面 - 这是 PayPal 的建议。本质上,有 app.com/basic 和 app.com/upgraded。这不是很理想,我也不建议将其作为永久解决方案。

总结 - 这是 PayPal 的一个已知问题。沙盒和生产工作流程基本上是不同的——不是功能或 API 不同,而是在使用上——生产级别的帐户受到更多的攻击,处理通知所需的时间要慢得多。

希望这对某人有帮助。

关于php - PayPal 生产的工作方式与沙箱不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20602818/

相关文章:

ios - Braintree v.zero iOS SDK 是否支持自适应支付?

php - 使用 paypal 沙箱 ipn 模拟器时调试 ipn.php

javascript - cakePHP 和 Google AdSense

android - 如何从一个应用程序快速集成多个商家

php - 如何在静态方法中调用类的成员变量?

xamarin - 我需要有企业 Paypal 账户才能开发应用程序吗?

java - 我们应该如何在 Java 网络服务器环境中集成 PayPal 自适应(和 IPN)API?

Paypal IPN : differentiating successful payment response from unsuccessful

php - 为什么对 php 序列化对象使用 blob 字段

php - 将嵌套数组中的 "dot notation"键展开为子数组