Невозможно получить значения переменных сеанса в веб-крючке Stripe - PullRequest
0 голосов
/ 03 июля 2019

Я настраиваю подписку на наш веб-сайт Stripe. Я просмотрел документацию, и теперь на моем веб-сайте установлен веб-крючок.

Теперь я хочу обновить запись в базе данных моего веб-сайта, где столбцу записи будет присвоено другое значение после того, как один из моих пользователей подпишется на мой план членства. Я попытался получить значение сеанса в сеансе PHPSESSID, где он содержит адрес электронной почты.

Используя предложение SQL "WHERE", я попробовал следующее:

$sql = "UPDATE xxxxxx SET Plan = 'Professional' WHERE EmailAddress = '$email'";

 if ($conn->query($sql) === TRUE) 
 {
     echo "You have subscribed to the professional plan";
 } 
 else 
 {
     echo "Error: " . $sql . "<br>" . $conn->error;
 }

            $conn->close();

Обратите внимание, что:

  • Синтаксис SQL отлично работает на моем сайте phpmyadmin.
  • mysqli подключен к базе данных моего сайта.
  • Веб-крючок также работает без проблем.

Единственная проблема заключается в том, что я не могу запустить SQL-запрос на веб-крюке после обработки платежа. После небольшой отладки я обнаружил, что переменная электронной почты в сеансе PHPSESSID не передается в строку "UPDATE xxxxxx SET Plan = 'Professional" ".

<?php    
session_name("PHPSESSID");   
session_start();    
$email = $_SESSION["email_address"];

require_once('stripe-php/init.php');

\Stripe\Stripe::setApiKey('xxxxxx');

$endpoint_secret = 'xxxxxx';

$payload = @file_get_contents('php://input');
$sig_header = $_SERVER['HTTP_STRIPE_SIGNATURE'];
$event = null; 

 try {
  $event = \Stripe\Webhook::constructEvent(
    $payload, $sig_header, $endpoint_secret
  );
 } catch(\UnexpectedValueException $e) {
  http_response_code(400);
  exit();
} catch(\Stripe\Error\SignatureVerification $e) {
  http_response_code(400);
  exit();
} 

// Handle the checkout.session.completed event
if ($event->type == 'checkout.session.completed') 
{
    $servername = "localhost";
    $username = "xxxxxx";
    $password = "xxxxxxx";
    $dbname = "xxxxxxx";

    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);

    // Check connection
    if ($conn->connect_error) 
    {
        die("Connection failed: " . $conn->connect_error);
    } 

    $amount = $event['data']['object']['display_items'][0]['amount'];


    switch ($amount)
    {
        case 499:
        {       
            $sql = "UPDATE xxxxxx SET Plan = 'Professional' WHERE EmailAddress = '$email'";

            if ($conn->query($sql) === TRUE) 
            {
                echo "You have subscribed to the professional plan";
            } 
            else 
            {
                echo "Error: " . $sql . "<br>" . $conn->error;
            }

            $conn->close();
        }
        break;

        case 899:
        {

            $sql = "UPDATE xxxxxx SET Plan = 'Premium' WHERE EmailAddress = 'xxxxxx'";

            if ($conn->query($sql) === TRUE) 
            {
                echo "You have subscribed to the Premium plan";
            } 
            else 
            {
                echo "Error: " . $sql . "<br>" . $conn->error;
            }

            $conn->close();
        }
        break;   

        default:
        {

            $sql = "UPDATE xxxxxx SET Plan = 'Premium' WHERE EmailAddress = '$email'";

            if ($conn->query($sql) === TRUE) 
            {
                echo "You have subscribed to the Premium plan on free trial.";
            } 
            else 
            {
                echo "Error: " . $sql . "<br>" . $conn->error;
            }

            $conn->close();
        }
    }
}

http_response_code(200);
?>

Есть предложения о том, как передать значение в переменную? Или я тут все делаю неправильно?

1 Ответ

0 голосов
/ 04 июля 2019

Решил!

Я понял, что в журнале JSON webhook есть идентификатор клиента после того, как пользователь завершил платеж. Итак, я могу использовать идентификатор для получения адреса электронной почты.

Вот код:

$amount = $event['data']['object']['display_items'][0]['amount'];
// Retrieve the customer ID
$customerToken = $event['data']['object']['customer'];
switch ($amount)
{
    case 499:
    {
        // Fetch the email address      
        $customerInfo = \Stripe\Customer::retrieve($customerToken);
        $email = $customerInfo->email;

        // Use the email variable on the SQL query           
        $sql = "UPDATE JobDesktop.UserDatabase SET Plan = 'Professional' WHERE EmailAddress = '$email'";

        if ($conn->query($sql) === TRUE) 
        {
            echo "You have subscribed to the professional plan";
        } 
        else 
        {
            echo "Error: " . $sql . "<br>" . $conn->error;
        }

        $conn->close();
    }
// The rest of the code down below
...