PayPal IPN脚本的问题

时间:2017-07-07 21:00:06

标签: php mysqli paypal paypal-ipn

好的,所以我最近使用IPN for PayPal开发了自己的自动付款系统。我挣扎了几个小时,想出了下面的内容。虽然我的付款会转到我的备用PayPal电子邮件,但付款会被标记为失败。它应该做的是当它返回验证时将事务详细信息插入数据库以供以后使用。无论是订单参考还是只是向买家表明他们的付款是成功的等我如何使用它是通过访问domain.com/pay.php?id=然后是我试图购买的ID。

这是我称之为#34; pay.php"

的主要课程
require_once('class_ipn.php');
$p = new paypal_class;
if(!isset($_SESSION['id']))
{
    Site::Stop('/login');
} 

$p->paypal_url = 'https://www.paypal.com/cgi-bin/webscr';           
$this_script = 'https://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];

if(empty($_GET['action'])) { $_GET['action'] = 'process'; }

switch ($_GET['action']) 
{    
    case 'process':
    {
        switch($_GET['id'])
        {
            case 1:
            {           
                $cost = '0.01';
                $name = 'Name #1';
                break;
            }
            case 2:
            {           
                $cost = '6.00';
                $name = 'Name #2';
                break;
            }
            case 3:
            {           
                $cost = '5.00';
                $name = 'Name #3';
                break;
            }
            case 4:
            {           
                $cost = '60.00';
                $name = 'Name #4';
                break;
            }
        }

        $p->add_field('business', '');
        $p->add_field('return', 'https://'.$_SERVER['HTTP_HOST']);
        $p->add_field('custom', $_SESSION['id']);
        $p->add_field('cancel_return', 'https://'.$_SERVER['HTTP_HOST']);
        $p->add_field('notify_url', $this_script.'?action=ipn');
        $p->add_field('item_number', $_GET['id']);
        $p->add_field('item_name', $name);
        $p->add_field('amount', $cost);

        $p->submit_paypal_post();           
        break;
    }

    case 'ipn':
    {

        if ($p->validate_ipn()) 
        {   
            CMS::$MySql->Insert('purchases', array(
                'transaction_id' => $p->ipn_data['txn_id'],
                'user_id' => $p->ipn_data['custom'],
                'package_id' => $p->ipn_data['item_number'],
                'time' => time(),
                'status' => 'Pending',
                'payment_method' => 'PayPal'
            ));
        }
      break;
    }
} 

这是在pay.php上调用的另一个文件,如果需要它供参考。但是,我仍然不确定为什么它标记为甚至没有开始。

class paypal_class
{
    var $last_error;
    var $ipn_log;
    var $ipn_log_file;
    var $ipn_response;
    var $ipn_data = array();
    var $fields = array();


    function paypal_class()
    {
        $this->paypal_url   = 'https://www.paypal.com/cgi-bin/webscr';
        $this->last_error   = '';
        $this->ipn_log_file = 'ipn_results.log';
        $this->ipn_log      = true;
        $this->ipn_response = '';
        $this->add_field('rm', '2');
        $this->add_field('cmd', '_xclick');
    }

    function add_field($field, $value)
    {
        $this->fields["$field"] = $value;
    }

    function submit_paypal_post()
    {
        echo "<html>\n";
        echo "<head><title>Processing Payment...</title>";
        echo "<body onLoad=\"document.forms['paypal_form'].submit();\">\n";
        echo "<center><h2>Please wait, your order is being processed and you";
        echo " will be redirected to the paypal website.</h2></center>\n";
        echo "<form method=\"post\" name=\"paypal_form\" ";
        echo "action=\"" . $this->paypal_url . "\">\n";
        foreach ($this->fields as $name => $value) {
            echo "<input type=\"hidden\" name=\"$name\" value=\"$value\"/>\n";
        }
        echo "<center><br/><br/>If you are not automatically redirected to ";
        echo "paypal within 5 seconds...<br/><br/>\n";
        echo "<input type=\"submit\" value=\"Click Here\"></center>\n";
        echo "</body></html>\n";
    }

    function validate_ipn()
    {
        $url_parsed  = parse_url($this->paypal_url);
        $post_string = '';

        foreach ($_POST as $field => $value) {
            $this->ipn_data["$field"] = $value;
            $post_string .= $field . '=' . urlencode(stripslashes($value)) . '&';
        }
        $post_string .= "cmd=_notify-validate";


        $fp = fsockopen('ssl://www.paypal.com', 443, $errno, $errstr, 30);
        if (!$fp) {

            $this->last_error = "fsockopen error no. $errnum: $errstr";
            $this->log_ipn_results(false);
            return false;

        } else {
            fputs($fp, "POST $url_parsed[path] HTTP/1.1\r\n");
            fputs($fp, "Host: $url_parsed[host]\r\n");
            fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
            fputs($fp, "Content-length: " . strlen($post_string) . "\r\n");
            fputs($fp, "Connection: close\r\n\r\n");
            fputs($fp, $post_string . "\r\n\r\n");

            while (!feof($fp)) {
                $this->ipn_response .= fgets($fp, 1024);
            }

            fclose($fp);
        }

        if (eregi("VERIFIED", $this->ipn_response)) {
            $this->log_ipn_results(true);
            return true;
        } else {
            $this->last_error = 'IPN Validation Failed.';
            $this->log_ipn_results(false);
            return false;
        }

    }

    function log_ipn_results($success)
    {
        if (!$this->ipn_log)
            return;
        $text = '[' . date('m/d/Y g:i A') . '] - ';
        if ($success)
            $text .= "SUCCESS!\n";
        else
            $text .= 'FAIL: ' . $this->last_error . "\n";

        $text .= "IPN POST Vars from Paypal:\n";
        foreach ($this->ipn_data as $key => $value) {
            $text .= "$key=$value, ";
        }

        $text .= "\nIPN Response from Paypal Server:\n " . $this->ipn_response;
        $fp = fopen($this->ipn_log_file, 'a');
        fwrite($fp, $text . "\n\n");
        fclose($fp);
    }

    function dump_fields()
    {
        echo "<h3>paypal_class->dump_fields() Output:</h3>";
        echo "<table width=\"95%\" border=\"1\" cellpadding=\"2\" cellspacing=\"0\">
            <tr>
               <td bgcolor=\"black\"><b><font color=\"white\">Field Name</font></b></td>
               <td bgcolor=\"black\"><b><font color=\"white\">Value</font></b></td>
            </tr>";

        ksort($this->fields);
        foreach ($this->fields as $key => $value) {
            echo "<tr><td>$key</td><td>" . urldecode($value) . "&nbsp;</td></tr>";
        }

        echo "</table><br>";
    }
}

最后但并非最不重要的是它从这个脚本创建的日志。

[07/07/2017 4:21 PM] - FAIL: IPN Validation Failed.
IPN POST Vars from Paypal:

IPN Response from Paypal Server:
 HTTP/1.1 200 OK

Server: Apache

X-Frame-Options: SAMEORIGIN

HTTP_X_PP_AZ_LOCATOR: dcg12.slc

Paypal-Debug-Id: 4dceeade1904c

Cache-Control: max-age=0, no-cache, no-store, must-revalidate

Pragma: no-cache

Content-Type: text/html; charset=UTF-8

DC: ccg11-origin-www-2.paypal.com

Date: Fri, 07 Jul 2017 20:21:06 GMT

Content-Length: 7

Connection: close

Set-Cookie: cwrClyrK4LoCV1fydGbAxiNL6iG=t4-TIdtjrBz8vS57KUToznKW3kNvFvf7eD_Gu_IQla03osxOCn0iGStIefoynQ-a5QdBb47FJMxq2ldNeHFrZ2sF7Z8-0qHCMRLKiPTD_hEOSmwHA3p7p_hmuO6W162Ulf71gGUUETkLoRLjOjTaAm4AWwDYTs6Dq_T9_u9dmbjLwzqn7Tk3AWDoFkp44CUsCwNAmXmDNEwr15NHSGGsG2QJlVRGw-6KNfLLTHfg8XG0vX6DANepNeRsOrTvB-qjNlwIkjFsYu0m46qJ3GtCk1ydMho_N2zE4C-ZBr-eEeshULK7IAFnHwmRxHXRywwzpDCvRVqV1SuEhtGXEiDDjlTAuhmPRIPK3u6h0NapytpGcF1a2479y189PoHui1_0nxWtJlpYMyc1seppCF_Syenmn6SiAj1jfFlTkucUO2AqpDEz5xJb3DB_SdO; domain=.paypal.com; path=/; Secure; HttpOnly

Set-Cookie: cookie_check=yes; expires=Mon, 05-Jul-2027 20:21:06 GMT; domain=.paypal.com; path=/; Secure; HttpOnly

Set-Cookie: navcmd=_notify-validate; domain=.paypal.com; path=/; Secure; HttpOnly

Set-Cookie: navlns=0.0; expires=Sun, 07-Jul-2019 20:21:06 GMT; domain=.paypal.com; path=/; Secure; HttpOnly

Set-Cookie: X-PP-SILOVER=name%3DLIVE5.WEB.1%26silo_version%3D880%26app%3Dappdispatcher%26TIME%3D854417241%26HTTP_X_PP_AZ_LOCATOR%3Ddcg12.slc; Expires=Fri, 07 Jul 2017 20:51:06 GMT; domain=.paypal.com; path=/; Secure; HttpOnly

Set-Cookie: X-PP-SILOVER=; Expires=Thu, 01 Jan 1970 00:00:01 GMT

Set-Cookie: AKDC=ccg11-origin-www-2.paypal.com; expires=Fri, 07-Jul-2017 20:51:06 GMT; path=/; secure

Set-Cookie: akavpau_ppsd=1499459466~id=63e1479e71581fc5ddb36390f64a0b67; Path=/

Strict-Transport-Security: max-age=63072000



INVALID

欢迎任何帮助,非常感谢。如果您对点点滴滴有任何疑问,请随时询问,也许我们可以一起来到这里!

此致 杰克

0 个答案:

没有答案