Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Paypal IPN-检查付款状态是否已完成?_Php_Paypal - Fatal编程技术网

Php Paypal IPN-检查付款状态是否已完成?

Php Paypal IPN-检查付款状态是否已完成?,php,paypal,Php,Paypal,我有一个电子书销售网站,用户可以在购买后下载一本书。我从Paypal收到IPN,据我所知,如果用户选择信用卡作为支付方式,有时支付状态为“正在进行”或“正在处理”。既然Paypal会在付款完成后重新发送IPN,那么检查付款状态是否已完成的最佳方法是什么,以避免数据库中出现重复 这些是Paypal返回到IPN侦听器的可能状态 Canceled_Reversal Completed Denied Failed Refunded Reversed Voided In-Progress Pending

我有一个电子书销售网站,用户可以在购买后下载一本书。我从Paypal收到IPN,据我所知,如果用户选择信用卡作为支付方式,有时支付状态为“正在进行”或“正在处理”。既然Paypal会在付款完成后重新发送IPN,那么检查付款状态是否已完成的最佳方法是什么,以避免数据库中出现重复

这些是Paypal返回到IPN侦听器的可能状态

Canceled_Reversal
Completed
Denied
Failed
Refunded
Reversed
Voided
In-Progress
Pending
Processed
您应该检查
Completed
状态,以确保付款已完成。下面是检查不同状态的
IPN侦听器的示例

<?php
    //Build the data to post back to Paypal
    $postback = 'cmd=_notify-validate'; 

    // go through each of the posted vars and add them to the postback variable
    foreach ($_POST as $key => $value) {
    $value = urlencode(stripslashes($value));
    $postback .= "&$key=$value";
    }


    // build the header string to post back to PayPal system to validate
    $header = "POST /cgi-bin/webscr HTTP/1.0\r\n";
    $header .= "Content-Type: application/x-www-form-urlencoded\r\n";
    $header .= "Content-Length: " . strlen($postback) . "\r\n\r\n";

    // Send to paypal or the sandbox depending on whether you're live or developing
    // comment out one of the following lines
    //$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);//open the connection
    $fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);
    // or use port 443 for an SSL connection
    //$fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);

    if (!$fp) 
    {
        // HTTP ERROR Failed to connect
        //error handling or email here
    }
    else // if we've connected OK
    {
        fputs ($fp, $header . $postback);//post the data back
        while (!feof($fp)) 
        {
            $response = fgets ($fp, 1024);

            if (strcmp ($response, "VERIFIED") == 0) //It's verified
            {
                // assign posted variables to local variables, apply urldecode to them all at this point as well, makes things simpler later
                $payment_status = $_POST['payment_status'];//read the payment details and the account holder

                if($payment_status == 'Completed')
                {
                    //Do something
                }
                else if($payment_status == 'Denied' || $payment_status == 'Failed' || $payment_status == 'Refunded' || $payment_status == 'Reversed' || $payment_status == 'Voided')
                {
                    //Do something
                }
                else if($payment_status == 'In-Progress' || $payment_status == 'Pending' || $payment_status == 'Processed')
                {
                    //Do something
                }
                else if($payment_status == 'Canceled_Reversal')
                {
                    //Do something
                }
            }
            else if (strcmp ($response, "INVALID") == 0) 
            { 
                //the Paypal response is INVALID, not VERIFIED
            }
        } //end of while
        fclose ($fp);
    }
?>

我通过保存事务id并检查它来完成。是的,我知道如何创建侦听器。我想问的是如何处理这种情况:“如果($payment|u status==‘In Progress’|$$payment|u status==‘Pending’| |$payment|u status==‘Processed’”)?问题是——我将把它存储在数据库中,稍后当支付完成时——paypal将重新发送IPN,然后触发“if($payment_status=='completed')”。那么,如何检查欺诈者是否没有使用相同的事务id重新提供此请求?因为交易id将保持不变。谢谢@KhawerZeshan!此信息也可以在官方PayPal文档中找到,以了解详细信息:(付款信息变量)