Как обновить базу данных после получения PayPal IPN - PullRequest
0 голосов
/ 19 января 2020

Я пытаюсь простым слушателем обновить мою базу данных информации о пользователях (например, установить тип их учетной записи с FREE на PREMIUM) после получения IPN PayPal. После проверки истории IPN, IPN успешно отправлен моему слушателю, но не может обновить мою базу данных. Я хотел обновить тип учетной записи пользователя после ПРОВЕРЕННОЙ части, используя идентификатор СЕССИИ, который использует мой пользователь. Слушатель. php, который я использую, взят из учебного видео, за которым я следовал.

Вот код:

session_start();

require 'scr/db.inc.php';

header('HTTP:/1.1 200 OK');

$resp = "cmd=_notify-validate";
foreach ($_POST as $parm => $var) {
    $var = urlencode (stripslashes($var));
    $resp .= "&$parm=$var";
}

$item_name          = $_POST['item_name'];
$item_number        = $_POST['$item_number'];
$payment_status     = $_POST['$payment_status'];
$payment_amount     = $_POST['$payment_amount'];
$payment_currency   = $_POST['$payment_currency'];
$txn_id             = $_POST['$txn_id'];
$receiver_email     = $_POST['$receiver_email'];
$payer_email        = $_POST['$payer_email'];
$record_id          = $_POST['$record_id'];

$httphead = "POST /cgi-bin/webscr HTTP/1.0\r\n";
$httphead .= "Content-Type: application/x-www-form-urlencoded\r\n";
$httphead .= "Content-Length: " .strlen($resp) . "\r\n\r\n";

$errno = '';
$errstr = '';

$fh = fsockopen ('ssl:www.paypal.com',443,$errno,$errstr,30);

if (!$fh) {

} else {
    fputs ($fh, $httphead . $resp);
    while (!feof($fh)) {
        $readresp = fgets ($fh, 1024);
        if(strcmp ($readresp, "VERIFIED") == 0 ) {

           $handler = new Dbh();

           $sql = 'UPDATE `users` SET `type` = "PREMIUM" WHERE `id`  = :id ';
           $query = $handler->connect()->prepare($sql);
           $query->execute(array(':id'=>$_SESSION['log_id']));

        } else if (strcmp ($readresp, "INVALID") == 0) {

        }
    }
fclose($fh);        
}


?>

Я только что добавил в него пару строк, чтобы, надеюсь, обновить базу данных. Вот эти строки:

session start();
require 'scr/db.inc.php';
.
.
.
.
$handler = new Dbh(); // used to connect to database

$sql = 'UPDATE `users` SET `type` = "PREMIUM" WHERE `id`  = :id ';
$query = $handler->connect()->prepare($sql);
$query->execute(array(':id'=>$_SESSION['log_id']));
.
.
.
.

1 Ответ

0 голосов
/ 19 января 2020

Когда сервер PayPal вызывает вашего слушателя IPN, он начинает свой собственный мини-сеанс между собой и вашим веб-сервером. Веб-браузер вашего пользователя не является участником этого прямого HTTP-соединения между PayPal и вашим сервером, поэтому никакие сведения о веб-сеансе браузера вашего пользователя с вашим сервером не будут доступны.

Если вам требуется идентификатор доступны во время обработки IPN, вам необходимо передать его в PayPal как часть транзакции, используя переменную, такую ​​как INVNUM или CUSTOM.

Когда вы пишете в базу данных, вам нужно будет захватить соответствующие переменные из тела сообщения IPN в $_POST ( не из $_SESSION, которые не будут иметь абсолютно никакого значения)


Примечание: всякий раз, когда я вижу использование IPN Подобно этому асинхронно на сервере, я не могу не отметить, что гораздо более приятная и надежная интеграция заключается в интеграции шаблона на стороне сервера, который синхронно захватывает со стороны сервера и, таким образом, получает немедленный ответ API об успешном / неудачном завершении транзакции с пользователь $ _SESSION активен. Вот демонстрационная модель пользовательского интерфейса и серверная часть v2 / orders вызовов на стороне сервера

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...