IPN Paypal的“官方"示例代码不起作用 [英] IPN Paypal "official" sample code doesn't work

查看:55
本文介绍了IPN Paypal的“官方"示例代码不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个问题,我想他们也发现了许多其他问题.我正在尝试将PayPal支付系统集成到我的站点中,但是IPN出现了一些问题.我尝试了这段代码,可在github Paypal上找到:

I have a problem that I imagine they also found many others. I am trying to integrate the PayPal payment system into my site, but I have some problem with the IPN. I tried this code, found on github Paypal:

    <?php require('PaypalIPN.php');
use PaypalIPN;
$ipn = new PayPalIPN();
// Use the sandbox endpoint during testing.
$ipn->useSandbox();
$verified = $ipn->verifyIPN();
if ($verified) {

}
// Reply with an empty 200 response to indicate to paypal the IPN was received correctly.
header("HTTP/1.1 200 OK");
?>

必修课:

<?php
class PaypalIPN
{
    private $use_sandbox = false;
    private $use_local_certs = true;
    /*
     * PayPal IPN postback endpoints
     */
    const VERIFY_URI = 'https://ipnpb.paypal.com/cgi-bin/webscr';
    const SANDBOX_VERIFY_URI = 'https://ipnpb.sandbox.paypal.com/cgi-bin/webscr';
    /*
     * Possible responses from PayPal after the request is issued.
     */
    const VALID = 'VERIFIED';
    const INVALID = 'INVALID';
    /**
     * Sets the IPN verification to sandbox mode (for use when testing,
     * should not be enabled in production).
     * @return void
     */
    public function useSandbox()
    {
        $this->use_sandbox = true;
    }
    /**
     * Determine endpoint to post the verification data to.
     * @return string
     */
    public function getPaypalUri()
    {
        if ($this->use_sandbox) {
            return self::SANDBOX_VERIFY_URI;
        } else {
            return self::VERIFY_URI;
        }
    }
    /**
     * Verification Function
     * Sends the incoming post data back to paypal using the cURL library.
     *
     * @return bool
     * @throws Exception
     */
    public function verifyIPN()
    {
        if ( ! count($_POST)) {
            throw new Exception("Missing POST Data");
        }
        $raw_post_data = file_get_contents('php://input');
        $raw_post_array = explode('&', $raw_post_data);
        $myPost = [];
        foreach ($raw_post_array as $keyval) {
            $keyval = explode('=', $keyval);
            if (count($keyval) == 2) {
                // Since we do not want the plus in the datetime string to be encoded to a space, we manually encode it.
                if ($keyval[0] === 'payment_date') {
                    if (substr_count($keyval[1], '+') === 1) {
                        $keyval[1] = str_replace('+', '%2B', $keyval[1]);
                    }
                }
                $myPost[$keyval[0]] = urldecode($keyval[1]);
            }
        }
        // Build the body of the verification post request, adding the _notify-validate command.
        $req = 'cmd=_notify-validate';
        $get_magic_quotes_exists = false;
        if (function_exists('get_magic_quotes_gpc')) {
            $get_magic_quotes_exists = true;
        }
        foreach ($myPost as $key => $value) {
            if ($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) {
                $value = urlencode(stripslashes($value));
            } else {
                $value = urlencode($value);
            }
            $req .= "&$key=$value";
        }
        // Post the data back to paypal, using curl. Throw exceptions if errors occur.
        $ch = curl_init($this->getPaypalUri());
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
        curl_setopt($ch, CURLOPT_SSLVERSION, 6);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
        // This is often required if the server is missing a global cert bundle, or is using an outdated one.
        if ($this->use_local_certs) {
            curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . "/cert/cacert.pem");
        }
        curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
        curl_setopt($ch, CURLOPT_HTTPHEADER, ['Connection: Close']);
        $res = curl_exec($ch);
        $info = curl_getinfo($ch);
        $http_code = $info['http_code'];
        if ($http_code != 200) {
            throw new Exception("PayPal responded with http code $http_code");
        }
        if ( ! ($res)) {
            $errno = curl_errno($ch);
            $errstr = curl_error($ch);
            curl_close($ch);
            throw new Exception("cURL error: [$errno] $errstr");
        }
        curl_close($ch);
        // Check if paypal verfifes the IPN data, and if so, return true.
        if ($res == self::VALID) {
            return true;
        } else {
            return false;
        }
    }
}

当我使用IPN Simulator进行测试时,收到以下响应:IPN未发送,并且握手未得到验证.请检查您的信息.有人可以帮我吗?

When I test with IPN Simulator, I get the following response: IPN was not sent, and the handshake was not verified. Please review your information. Can someone help me?

推荐答案

来自示例代码:

   <?php require('PaypalIPN.php');
^^^  /** This will cause your script to fail.**/

在Paypal IPN接受页面上,PHP周围应有 NO 空格.

You should have NO whitespace around your PHP on the paypal IPN acceptance page.

如果尚未安装其cacert.pem文件,则需要调整类设置,以使Paypal类cURL不会尝试使用该pem文件:

If you have not installed their cacert.pem file then you need to adjust the class settings so that the paypal class cURL doesn't try and use that pem file:

 private $use_local_certs = false; // set to true when you have the 
                                   // file in your server filesystem


在IPN模拟器上,您需要选择 Web-accept 作为要执行的模拟类型.


On the IPN simulator you need to choose Web-accept as the type of Simulation to perform.

require d文件是否存在?根据您的代码,该文件应与IPN侦听器文件位于同一文件夹中.是这样吗如果找不到该文件,脚本将失败.

does the required file exist? the file should -by your code- be in the same folder as your IPN listener file. Is this so? If that file can't be found the script will fail.

让我们知道这些详细信息是否可以解决此问题,或者您还有其他要添加的细节.

Let us know if these details fix it or if you have any more details to add.

这篇关于IPN Paypal的“官方"示例代码不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆