折扣
PaymentKit 提供了一套使用 Coupons 和 Promotion Codes 的灵活折扣系统。这使您能够为客户提供各种类型的折扣,例如百分比折扣、固定金额折扣和限时优惠。
- Coupons:定义核心折扣规则,例如折扣百分比或金额、持续时间(例如,一次性、永久、重复)以及最大总兑换次数。
- Promotion Codes:这些是面向客户的代码,与 Coupon 相关联。它们可以有自己的一套规则,例如单个兑换限制、到期日期和限制条件(例如,仅限首次使用的客户)。
您可以将 Coupon 视为折扣的模板,而 Promotion Codes 则是客户可以使用的该折扣的具体实例。
有关所有可用 API 操作的详细说明,请参阅 Coupons API 参考 和 Promotion Codes API 参考。
折扣如何运作#
下图说明了 Coupons、Promotion Codes 及其在交易过程中的应用关系。

创建 Coupons#
Coupon 对象包含有关折扣的信息,例如是百分比折扣还是固定金额折扣。您可以创建 Coupons,然后将 Promotion Codes 附加到它们上面。
创建带有 Promotion Codes 的 Coupon#
您可以在一次 API 调用中创建一个 Coupon 和一个或多个关联的 Promotion Codes。这对于快速建立新的营销活动非常有用。
创建带有促销代码的 Coupon
import payment from '@blocklet/payment-js';
async function createDiscountCampaign() {
try {
const result = await payment.coupons.create({
name: '新用户折扣',
percent_off: 20,
duration: 'once',
max_redemptions: 1000, // Coupon 本身的最大兑换次数
promotion_codes: [
{
code: 'WELCOME20',
description: '新用户欢迎折扣',
max_redemptions: 100, // 此特定代码的最大兑换次数
expires_at: Math.floor(Date.now() / 1000) + (30 * 24 * 60 * 60) // 从现在起 30 天
}
]
});
console.log('Coupon 已创建:', result.coupon);
console.log('Promotion codes 已创建:', result.promotion_codes);
} catch (error) {
console.error('创建 Coupon 时出错:', error.message);
}
}See all 2 lines
参数
如果设置了 amount_off,则此项为必需。固定金额折扣的货币 ID。
描述折扣应用的持续时间。可以是 once(一次性)、forever(永久)或 repeating(重复)。
如果 duration 是 repeating,则为 Coupon 生效的月数。
创建 Promotion Codes#
虽然您可以在创建 Coupon 的同时创建 Promotion Codes,但也可以单独创建它们并附加到现有的 Coupon 上。这对于为单个营销活动生成多个唯一代码非常有用。
创建独立的 Promotion Code#
创建 Promotion Code
import payment from '@blocklet/payment-js';
async function createPromoCode(couponId) {
try {
const promotionCode = await payment.promotionCodes.create({
coupon_id: couponId, // 现有 Coupon 的 ID
code: 'SAVE15NOW',
description: '下次购买可享八五折优惠',
max_redemptions: 500,
restrictions: {
first_time_transaction: true, // 仅限新客户
}
});
console.log('Promotion code 已创建:', promotionCode);
} catch (error) {
console.error('创建 Promotion Code 时出错:', error.message);
}
}
createPromoCode('coupon_xxx'); // 替换为您的实际 Coupon ID参数
在结账时应用折扣#
要允许客户在结账页面输入 Promotion Code,您必须在创建 Checkout Session 或 Payment Link 时明确启用此选项。
在 Checkout Session 上启用#
在创建 Checkout Session 时,将 allow_promotion_codes 参数设置为 true。这将在支付页面上添加一个字段,供客户输入他们的代码。
启用 Promotion Codes
import payment from '@blocklet/payment-js';
async function createCheckoutWithDiscounts() {
try {
const session = await payment.checkout.sessions.create({
success_url: 'https://example.com/success',
cancel_url: 'https://example.com/cancel',
mode: 'payment',
line_items: [
{ price_id: 'price_xxx', quantity: 1 }
],
allow_promotion_codes: true // 这将启用优惠码字段
});
console.log('已创建启用 Promotion Codes 的结账会话:', session.url);
} catch (error) {
console.error('创建结账会话时出错:', error.message);
}
}
createCheckoutWithDiscounts();在 Payment Link 上启用#
同样的逻辑也适用于可重复使用的 Payment Links。将 allow_promotion_codes 设置为 true 可确保任何使用该链接的人都可以应用有效的 Promotion Code。
在支付链接上启用
import payment from '@blocklet/payment-js';
async function createPaymentLinkWithDiscounts() {
try {
const paymentLink = await payment.paymentLinks.create({
line_items: [{
price_id: 'price_xxx',
quantity: 1,
}],
allow_promotion_codes: true,
});
console.log('已创建启用 Promotion Codes 的支付链接:', paymentLink.url);
} catch (error) {
console.error('创建支付链接时出错:', error.message);
}
}
createPaymentLinkWithDiscounts();管理折扣#
SDK 提供了多种方法来管理和跟踪您的折扣。
通过代码检索 Promotion Code#
您可以直接使用面向客户的代码字符串来获取 Promotion Code 的详细信息。
通过代码获取 Promotion Code
import payment from '@blocklet/payment-js';
async function getPromoDetails(code) {
try {
const promoByCode = await payment.promotionCodes.byCode(code);
console.log('找到 Promotion Code:', promoByCode);
// 您现在可以访问关联的 Coupon 详细信息
console.log('折扣:', promoByCode.coupon);
} catch (error) {
console.error(`未找到 Promotion Code '${code}' 或发生错误:`, error.message);
}
}
getPromoDetails('WELCOME20');检查 Coupon 使用情况#
确定一个 Coupon 是否至少被兑换过一次。这对于决定是否仍可编辑 Coupon 的规则很有用。
检查 Coupon 使用情况
import payment from '@blocklet/payment-js';
async function checkCouponUsage(couponId) {
try {
const { used } = await payment.coupons.used(couponId);
if (used) {
console.log(`Coupon ${couponId} 已被使用,其规则现已锁定。`);
} else {
console.log(`Coupon ${couponId} 尚未被使用。`);
}
} catch (error) {
console.error('检查 Coupon 使用情况时出错:', error.message);
}
}
checkCouponUsage('coupon_xxx'); // 替换为有效的 Coupon ID列出兑换记录#
您可以检索已兑换特定 Coupon 或 Promotion Code 的客户或订阅的分页列表。
列出 Coupon 兑换记录
import payment from '@blocklet/payment-js';
async function getCouponRedemptions(couponId) {
try {
const redemptions = await payment.coupons.redemptions(couponId, {
type: 'customer', // 或 'subscription'
page: 1,
pageSize: 10
});
console.log(`找到 ${redemptions.count} 个 Coupon ${couponId} 的客户兑换记录:`);
redemptions.customers.forEach(customer => {
console.log(`- 客户 ID: ${customer.id}`);
});
} catch (error) {
console.error('获取兑换记录时出错:', error.message);
}
}
getCouponRedemptions('coupon_xxx'); // 替换为有效的 Coupon ID