关于Stripe Success_URL查询字符串可嵌入变量的技术咨询
Stripe结账success_url可用变量及用户关联方案
首先明确:Stripe的success_url里仅支持{CHECKOUT_SESSION_ID}这一个内置占位符,你尝试的{email}、{customer}.{email}等写法都不生效。
原因是success_url在创建结账会话时就已生成,而客户邮箱、客户信息是用户后续在结账流程中填写的,这些数据在会话创建阶段还未产生,无法直接嵌入到URL中。
要实现支付响应与数据库用户的关联,推荐两种可行方案:
方案一:通过Session ID查询会话完整信息
在你的success.php页面,利用获取到的session_id调用Stripe API查询会话详情,从中提取客户邮箱、客户ID等信息,再关联数据库内的用户。
示例PHP代码:
require_once('vendor/autoload.php'); \Stripe\Stripe::setApiKey('你的Stripe秘钥'); $session_id = $_GET['session_id']; $session = \Stripe\Checkout\Session::retrieve($session_id); // 直接获取会话中的客户邮箱 $customer_email = $session->customer_details->email; // 也可通过客户ID查询更详细信息 // $customer = \Stripe\Customer::retrieve($session->customer); // $customer_email = $customer->email; // 这里编写用$customer_email关联数据库用户的逻辑
方案二:创建会话时存入自定义元数据
创建结账会话时,将数据库中的用户唯一标识(如用户ID)存入会话的metadata字段,后续在success.php中通过Session ID读取该元数据,直接关联用户,无需依赖邮箱。
创建会话时的示例代码:
$session = \Stripe\Checkout\Session::create([ 'payment_method_types' => ['card'], 'line_items' => [[ 'price' => '你的价格ID', 'quantity' => 1, ]], 'mode' => 'payment', 'success_url' => 'https://www.psychology.com/personality/lizard/success.php?session_id={CHECKOUT_SESSION_ID}', 'cancel_url' => 'https://www.psychology.com/personality/lizard/cancel.php', // 存入自定义元数据,关联数据库用户ID 'metadata' => [ 'user_id' => '数据库内的用户唯一ID' ] ]);
在success.php中读取元数据:
$session = \Stripe\Checkout\Session::retrieve($session_id); $user_id = $session->metadata->user_id; // 用$user_id直接关联数据库中的用户
内容的提问来源于stack exchange,提问作者user22371906
相关产品推荐
相关产品推荐

