获取Stripe Checkout Session时返回No such checkout.session错误求助
获取Stripe Checkout Session时返回No such checkout.session错误求助
遇到这种明明后台能看到Session ID,但调用API却提示找不到的情况确实挺闹心的,我来帮你梳理几个可能的排查方向:
1. 先排查API密钥的环境匹配问题
这是最常见的“低级错误”但也是最容易忽略的:
- 你在Stripe后台看到的Session ID是属于测试模式还是生产模式?
- 代码里用的API密钥是不是对应同一个环境?比如测试Session只能用测试密钥(开头是
sk_test_)查询,生产Session必须用生产密钥(开头是sk_live_),跨环境查询肯定会返回404。
2. 验证$_GET['session_id']的实际值是否正确
虽然你说能拿到Session ID,但有可能传递过程中出现了篡改或编码问题:
先在代码里加一行调试代码,打印出实际拿到的Session ID:
var_dump($_GET['session_id']);把这个值和Stripe后台的Session ID仔细对比,看看有没有多了空格、特殊字符,或者被URL编码了(比如
%20这类转义字符)。如果是编码问题,可以用urldecode($_GET['session_id'])处理后再传递给API。另外可以做个测试:把后台复制的正确Session ID硬编码到代码里,替换
$_GET['session_id'],看看能不能成功查询到Session:$session = $stripe->checkout->sessions->retrieve('你从后台复制的准确Session ID');如果硬编码能成功,说明问题出在
$_GET参数的传递上;如果还是失败,那大概率是密钥或环境的问题。
3. 排查插件冲突的可能性
你提到报错来自YITH的Stripe插件,而这个插件并没有在当前页面使用,那有可能是它的Stripe客户端实例干扰了你的代码:
- 插件可能已经初始化了一个Stripe客户端,并且用了不同的API密钥或者旧版本的Stripe PHP库,导致你的客户端实例被污染。可以试试在你的代码里明确指定API版本,并且初始化独立的客户端,避免全局冲突:
$stripe = new \Stripe\StripeClient([ 'api_key' => '你的API密钥', 'stripe_version' => '2024-06-20', // 用你当前Stripe账号的默认API版本 ]); - 临时禁用YITH的Stripe插件,测试你的自定义页面是否能正常工作。如果禁用后恢复正常,那就能确定是插件冲突,这时候可以考虑调整代码的加载顺序,或者用命名空间隔离你的Stripe客户端实例。
4. 检查API密钥的权限
虽然默认的Stripe密钥都有checkout_sessions:read权限,但也可以去Stripe后台的API密钥页面,确认你使用的密钥没有被限制权限范围,确保它能读取Checkout Session数据。
先从这几个方向排查,应该能找到问题所在。
备注:内容来源于stack exchange,提问作者udarts
相关产品推荐
相关产品推荐

