如何通过Stripe API获取产品与优惠券的关联关系?
问题:如何通过Stripe API获取优惠券与产品的关联关系?
Stripe控制台支持将优惠券/促销活动与产品(及对应的价格)进行关联,例如可将5折优惠券关联至特定的年度订阅产品。
我的使用场景是:用户在结账UI中输入优惠券代码(如50OFFANNUAL),我需要验证该优惠券是否存在、其所有限制条件(是否单次使用、是否限时、是否限使用次数等),并确认客户购买的产品/订阅是否与该优惠券关联。
我已通过以下PHP代码获取优惠券代码:
$stripeCouponList = $stripe->promotionCodes->all([ 'limit' => 1, 'code' => $upperCode, 'active' => true, ]);
但返回结果中并无products或prices对象,尝试使用expand扩展属性时会报错(不存在该可扩展属性)。同样,从产品或价格接口也无法找到promotion_code或promotion_codes属性。
请问如何通过API获取优惠券与产品的关联关系?
解决方案
你混淆了Stripe里**促销码(Promotion Code)和优惠券(Coupon)**的核心区别:
- 促销码是用户输入的可兑换代码(比如
50OFFANNUAL),仅作为优惠券的分发入口,本身不存储产品关联规则。 - 产品/价格的关联限制,是定义在**优惠券(Coupon)**对象的
applies_to字段中的。
正确的操作步骤如下:
- 通过促销码代码找到对应的促销码对象,从中取出关联的
couponID。 - 调用优惠券接口获取该优惠券的详情,即可拿到
applies_to字段,里面包含关联的products或prices列表。
对应的PHP代码示例:
// 1. 获取目标促销码 $promotionCodes = $stripe->promotionCodes->all([ 'limit' => 1, 'code' => $upperCode, 'active' => true, ]); if (empty($promotionCodes->data)) { // 促销码不存在或已失效 exit('Invalid promotion code'); } $promotionCode = $promotionCodes->data[0]; $couponId = $promotionCode->coupon; // 提取关联优惠券的ID // 2. 获取优惠券详情,包含产品关联信息 $coupon = $stripe->coupons->retrieve($couponId); // 读取关联的产品/价格列表 $appliesTo = $coupon->applies_to; if (isset($appliesTo->products)) { $allowedProductIds = $appliesTo->products; // 此处可验证客户购买的产品ID是否在允许列表内 } if (isset($appliesTo->prices)) { $allowedPriceIds = $appliesTo->prices; // 此处可验证客户购买的价格ID是否在允许列表内 } // 同时从促销码对象读取使用限制 $isSingleUse = $promotionCode->restrictions->first_time_transaction; $redeemDeadline = $promotionCode->expires_at; $maxRedemptions = $promotionCode->max_redemptions;
如果想减少API请求次数,可以在查询促销码时直接通过expand参数展开关联的优惠券对象:
$promotionCodes = $stripe->promotionCodes->all([ 'limit' => 1, 'code' => $upperCode, 'active' => true, 'expand' => ['data.coupon'], // 直接获取完整的优惠券详情 ]); $promotionCode = $promotionCodes->data[0]; $coupon = $promotionCode->coupon; // 已展开的优惠券对象 $appliesTo = $coupon->applies_to;
注意:产品与优惠券的关联是单向的——优惠券关联产品,但产品不会反向存储关联的优惠券列表,因此无法通过产品接口直接查询关联的优惠券。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

