无法在 Stripe webhook 中检索会话的变量值
Unable to retrieve a session's variable values in a Stripe webhook
我正在我的网站上设置 Stripe 订阅网络钩子。我按照文档进行操作,webhook 现在已在我的网站中设置。
现在,我希望更新我网站数据库中的一条记录,在我的一位用户订阅我的会员计划后,该记录中的一列被设置为另一个值。我试图在包含电子邮件地址的会话 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 连接到我网站的数据库。
- webhook 也可以正常工作。
唯一的问题是我无法在付款处理后 运行 Webhook 上的 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);
?>
关于如何传递变量的值有什么建议吗?或者我在这里做错了整个 webhook 的事情?
解决了!
我发现在 webhook JSON 日志中,用户完成付款后会有一个客户 ID。所以,我可以使用 ID 来获取电子邮件地址。
代码如下:
$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
我正在我的网站上设置 Stripe 订阅网络钩子。我按照文档进行操作,webhook 现在已在我的网站中设置。
现在,我希望更新我网站数据库中的一条记录,在我的一位用户订阅我的会员计划后,该记录中的一列被设置为另一个值。我试图在包含电子邮件地址的会话 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 连接到我网站的数据库。
- webhook 也可以正常工作。
唯一的问题是我无法在付款处理后 运行 Webhook 上的 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);
?>
关于如何传递变量的值有什么建议吗?或者我在这里做错了整个 webhook 的事情?
解决了!
我发现在 webhook JSON 日志中,用户完成付款后会有一个客户 ID。所以,我可以使用 ID 来获取电子邮件地址。
代码如下:
$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