【问题标题】:Paypal IPN 1.1 php script seems to loop through several timesPaypal IPN 1.1 php 脚本似乎循环了几次
【发布时间】:2013-11-06 02:08:27
【问题描述】:

我最近为新的 1.1 版本更新了我的 IPN 脚本。它可以工作并且付款通过,但它正在多次运行我的成功代码(插入数据库,发送电子邮件)。例如我进行了一次测试购买,我的订单经历了 22 次,我收到了 22 封电子邮件?!?

这是我的确切代码(实际的数据库和邮件代码是直截了当的 - 根本没有循环):

//read the post from PayPal system and add 'cmd'
$req = 'cmd=_notify-validate';

foreach ($_POST as $key => $value) {
    $value = urlencode(stripslashes($value));
    $req .= "&$key=$value";
}

//post back to PayPal system to validate (replaces old headers)
$header = "POST /cgi-bin/webscr HTTP/1.1\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Host: www.paypal.com\r\n";
$header .= "Connection: close\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
$fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);
//

//error connecting to paypal
if (!$fp) {
   //
}

//successful connection    
if ($fp) {
    fputs ($fp, $header . $req);

    while (!feof($fp)) {
        $res = fgets ($fp, 1024);
        $res = trim($res); //NEW & IMPORTANT

        if (strcmp($res, "VERIFIED") !== false) {

            //insert into db and send an email goes here

        }

        if (strcmp ($res, "INVALID" ) == 0) {   }
    }

    fclose($fp);
}

【问题讨论】:

  • 多一点最佳实践格式化,您可能会自己发现问题。
  • 好的...现在我觉得它的格式没问题(我缩进了那个})。我仍然看不到问题
  • 它必须是 while() 循环循环运行,但我不明白为什么它会多次运行?这是大多数人使用的相同代码
  • 试试脚本顶部的 error_reporting(-1) 看看你会发现什么。

标签: loops paypal paypal-ipn


【解决方案1】:

这就是我的做法:

$arrRequestVars=$_POST;

$cx=stream_context_create(
    array(
        "http"=>array(
            "method"=>"POST",
            "header"=>"Content-type: application/x-www-form-urlencoded",
            "content"=>"cmd=_notify-validate&".http_build_query($arrRequestVars),
        ),
        "tls"=>array(
            "allow_self_signed"=>false,
        ),
        "ssl"=>array(
            "allow_self_signed"=>false,
        ),
    )
);
$strPayPalVerifyResponse=file_get_contents("https://".PAYPAL_API_HOSTNAME."/cgi-bin/webscr", false, $cx);
if(is_string($strPayPalVerifyResponse))
{
    $_arrParts=explode(" ", $http_response_header[0]);
    $nHTTPResponseCode=(int)$_arrParts[1];
    if($nHTTPResponseCode!==200)
        throw new Exception("Failed to verify wether request originated from PayPal. HTTP response code: ".$nHTTPResponseCode);

    if(trim($strPayPalVerifyResponse)=="INVALID")
        throw new Exception("PayPal did not recognize/validate the incoming IPN request. If the request was valid then mark as paid manually.");
    else if(trim($strPayPalVerifyResponse)!="VERIFIED")
        throw new Exception("Failed to verify wether request originated from PayPal. PayPal response: ".$strPayPalVerifyResponse);
}
else
    throw new Exception("Failed to verify wether request originated from PayPal.");

这是一个尽可能少的依赖示例。我推荐 cURL 而非 file_get_contents。

【讨论】:

    猜你喜欢
    • 2013-02-04
    • 2021-01-26
    • 2013-06-07
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    相关资源
    最近更新 更多