Возврат PayPal ?PayerID=

PayPal возвращает index.php?ID плательщика=N3QKU3H2STQZN после оплаты, а моя функция addCash игнорируется.

Он работал на предыдущем веб-сервере (удален), и я не знаю, есть ли у меня недостающие расширения на php.ini.

Системная информация Centos 7 + версия PHP 7.4.28

Заголовок.php

$paypal_email = getJsonSettings("paypal");

Функция AddCash, которая выполняется после оплаты.

function addCash($account_id, $coins)
    {
        global $database;

        $stmt = $database->runQueryAccount("UPDATE user SET credit = credit + ? WHERE id = ?");
        $stmt->bindParam(1, $coins, PDO::PARAM_INT);
        $stmt->bindParam(2, $account_id, PDO::PARAM_INT);
        $stmt->execute();
    }

Функция пожертвования.php

<?php
    $jsondataDonate = file_get_contents('include/db/donate.json');
    $jsondataDonate = json_decode($jsondataDonate, true);
    
    $jsondataCurrency = file_get_contents('include/db/currency.json');
    $jsondataCurrency = json_decode($jsondataCurrency,true);
    
    if (isset($_POST["method"]) && strtolower($_POST["method"])=='paypal' && isset($_POST['id']) && isset($_POST['type']))
    {
        $return_url = $site_url."index.php";
        $cancel_url = $site_url."index.php";
        $notify_url = $site_url."paypal.php";
        
        $querystring = '';
        $querystring .= "?business = ".urlencode($paypal_email)."&";
        
        $price = $jsondataDonate[$_POST['id']]['list'][$_POST['type']];
        
        $querystring .= "item_name = ".urlencode($jsondataDonate[$_POST['id']]['name'].' ['.$price['price'].' - '.$price['cash'].' Cash]')."&";
        $querystring .= "amount = ".urlencode($price['price'])."&";
        $querystring .= "noshipping=1"."&";
        $querystring .= "cmd = ".urlencode(stripslashes("_xclick"))."&";
        $querystring .= "no_note = ".urlencode(stripslashes("1"))."&";
        $querystring .= "currency_code = ".urlencode(stripslashes($price['currency']))."&";
        $querystring .= "bn = ".urlencode(stripslashes("PP-BuyNowBF:btn_buynow_LG.gif:NonHostedGuest"))."&";
        $querystring .= "first_name = ".urlencode(stripslashes(getAccountName($_SESSION['id'])))."&";
        
        $querystring .= "return = ".urlencode(stripslashes($return_url))."&";
        $querystring .= "cancel_return = ".urlencode(stripslashes($cancel_url))."&";
        $querystring .= "notify_url = ".urlencode($notify_url)."&";
        $querystring .= "item_number = ".urlencode($jsondataDonate[$_POST['id']]['name'].' ['.$price['price'].' - '.$price['cash'].' Cash]')."&";
        $querystring .= "custom = ".urlencode($_SESSION['id']);
        
        $url = 'https://www.sandbox.paypal.com/cgi-bin/webscr'.$querystring;
        if (!headers_sent()) {
            header('Location: '.$url);
            exit;
        } else {
            echo '<script type = "text/javascript">';
            echo 'window.location.href = "'.$url.'";';
            echo '</script>';
            echo '<noscript>';
            echo '<meta http-equiv = "refresh" content = "0;url='.$url.'" />';
            echo '</noscript>';
            exit;
        }
        
        exit();
    }
?>

paypal.php

 <?php
    include 'include/functions/header.php';

    if (isset($_POST["txn_id"]) && isset($_POST["txn_type"]) && isset($_POST["item_name"]) && isset($_POST["item_number"]) && isset($_POST["payment_status"]) && isset($_POST["mc_gross"])&& isset($_POST["mc_currency"])&& isset($_POST["receiver_email"])&& isset($_POST["custom"]))
    {
        $req = 'cmd=_notify-validate';
        foreach ($_POST as $key => $value) {
            $value = urlencode(stripslashes($value));
            $value = preg_replace('/(.*[^%^0^D])(%0A)(.*)/i','${1}%0D%0A${3}',$value);// IPN fix
            $req .= "&$key=$value";
        }

        $data['item_name']          = $_POST['item_name'];
        $data['item_number']        = $_POST['item_number'];
        $data['payment_status']     = $_POST['payment_status'];
        $data['payment_amount']     = $_POST['mc_gross'];
        $data['payment_currency']   = $_POST['mc_currency'];
        $data['txn_id']             = $_POST['txn_id'];
        $data['receiver_email']     = $_POST['receiver_email'];
        $data['payer_email']        = $_POST['payer_email'];
        $data['custom']             = $_POST['custom'];

        $curl_result=$curl_err='';
        $ch = curl_init();
        //curl_setopt($ch, CURLOPT_URL,'https://www.sandbox.paypal.com/cgi-bin/webscr');
        curl_setopt($ch, CURLOPT_URL,'https://www.sandbox.paypal.com/cgi-bin/webscr');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
        curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
        curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/x-www-form-urlencoded", "Content-Length: " . strlen($req)));
        curl_setopt($ch, CURLOPT_HEADER , 1);
        curl_setopt($ch, CURLOPT_VERBOSE, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);

        $curl_result = curl_exec($ch);
        $curl_err = curl_error($ch);
        curl_close($ch);
        
        if (strpos($curl_result, "VERIFIED")!==false && strtolower($data['receiver_email']) == strtolower($paypal_email)) {
            
            $jsondataDonate = file_get_contents('include/db/donate.json');
            $jsondataDonate = json_decode($jsondataDonate, true);
            
            foreach($jsondataDonate as $key => $donate)
                if (strtolower($donate['name'])= = "paypal")
                    foreach($donate['list'] as $list)
                    {
                        $type = $donate['name'].' ['.$list['price'].' - '.$list['cash'].' Cash]';
                        if ($type==$data['item_name'] && $list['price']==$data['payment_amount'] && $data['payment_currency']==$list['currency'])
                            addCash($data['custom'], $list['cash']);
                    }
        }
    }
?>

Может показаться, что проверка IPN не удалась, и это то, что вам нужно отладить.

Preston PHX 19.03.2022 19:27

@PrestonPHX, как это сделать? не может получить доступ к paypal.php напрямую

Joanna 19.03.2022 20:09
string(430) "?business=sb-q7t47o8707421%40business.example.com&item_name‌​=PayPal+%5B2+-+9999+‌​Cash%5D&amount=2&cmd‌​=_xclick&no_note=1&c‌​urrency_code=EUR&bn=‌​PP-BuyNowBF%3Abtn_bu‌​ynow_LG.gif%3ANonHos‌​tedGuest&first_name=‌​admin&return=http%3A‌​%2F%2F127.0.0.1%2FWE‌​B%2Findex.php&cancel‌​_return=http%3A%2F%2‌​F127.0.0.1%2FWEB%2Fi‌​ndex.php&notify_url=‌​http%3A%2F%2F127.0.0‌​.1%2FWEB%2Fpaypal.ph‌​p&item_number=PayPal‌​+%5B2+-+9999+Cash%5D‌​&custom=1741"
Joanna 19.03.2022 20:39

Измените файл. Добавьте ведение журнала. Определите, что идет не так. Например, посмотрите, может ли он подключиться к конечной точке PayPal для проверки IPN. Если он не сможет подключиться, конечно, он не сможет проверить IPN.

Preston PHX 19.03.2022 21:07

@PrestonPHX я не знаю, в каком файле искать, paypal.php или donate.php

Joanna 19.03.2022 22:23

В коде, который вы разместили, paypal.php выполняет проверку IPN.

Preston PHX 19.03.2022 23:26

Рукопожатие @PrestonPHX из PayPal прошло успешно, проблема исходит от $notify_url = $site_url."paypal.php";

Joanna 20.03.2022 21:49

Какая именно проблема? Что это за неправильный URL-адрес для уведомлений, и если да, то вы уже исправили это?

Preston PHX 20.03.2022 21:54

Еще нет, я думал оттуда, но нет, ни у кого нет ответа, что здесь не так

Joanna 20.03.2022 22:33

Хорошо. Если проверка прошла успешно, вам нужно больше отладить то, что происходит после этого проверенного ответа.

Preston PHX 20.03.2022 22:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
10
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

$type = $donate['name']; if ($type==$data['item_name'] && $list['price']==$data['payment_amount'] && $data['payment_currency']==$list['currency']){ addCash($data['custom'], $list['cash']); }

Другие вопросы по теме