Paypal IPN не работает в песочнице, всегда показывая состояние не удалось - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь осуществлять регулярные платежи Paypal на своем веб-сайте, используя стандартные формы платежей Paypal. Я вижу в своем профиле Paypal, что платеж прошел успешно, но мой обработчик IPN не работает. Каждое уведомление в моей истории IPN показывает состояние сбоя с http-кодом ответа 401. Это мой ipn-код.

 public function ipn (Request $request) 
 {

    $raw_post_data = file_get_contents('php://input');
    $raw_post_array = explode('&', $raw_post_data);
    $myPost = array();

    foreach ($raw_post_array as $keyval) {
        $keyval = explode('=', $keyval);
        if (count($keyval) == 2) {
            if ($keyval[0] === 'payment_date') {
                if (substr_count($keyval[1], '+') === 1) {
                    $keyval[1] = str_replace('+', '%2B', $keyval[1]);
                }
            }
            $myPost[$keyval[0]] = urldecode($keyval[1]);
        }
    }

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

    $paypalURL = "https://ipnpb.sandbox.paypal.com/cgi-bin/webscr";
    $ch = curl_init($paypalURL);
    if ($ch == false) {
        return false;
    }
    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);
    curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'User-Agent: PHP-IPN-Verification-Script',
        'Connection: Close',
    ));
    $res = curl_exec($ch);        

    if (!($res)) {
        $errno = curl_errno($ch);
        $errstr = curl_error($ch);
        curl_close($ch);

    }

    $info = curl_getinfo($ch);
    $http_code = $info['http_code'];
    if ($http_code != 200) {
        Status::create([
            'status' => "PayPal responded with http code" . $http_code,
        ]);
    }

    curl_close($ch);

    if ($res == 'VERIFIED') {

        Status::create([
            'status' => 'Verified',
        ]);

        $paypalInfo = $_POST;
        $subscr_id = $paypalInfo['subscr_id'];
        $payer_email = $paypalInfo['payer_email'];
        $item_name = $paypalInfo['item_name'];
        $item_number = $paypalInfo['item_number'];
        $txn_id = $paypalInfo['txn_id'];

        if (!empty($txn_id)) {
            Status::create([
                'status' => $txn_id,
            ]);
        }
    } else {
        Status::create([
            'status' => $res,
        ]);
    }
}

, когда я пытался использовать почтальон, код работал и вернул INVALID.

...