stripe 订阅
1. 创建 stripe setup_intent
POST /bp/asset/stripe_setup_intent
接口功能: 新建 stripe setup_intent 对象,客户端使用该接口返回的 setup_intent 信息,收集用户的支付信息。
该接口用于创建有免费试用期 (free trial) 的 stripe 订阅订单场景,没有免费试用期的 stripe 订单(即付费试用期和无试用期订阅订单)创建无需调用该接口,该接口使用场景描述如下:
- 客户端调用本接口(/bp/asset/stripe_setup_intent),创建 setup_intent
- 客户端通过返回的 setup_intent 信息,收集用户的支付信息,并 confirm 该 setup_intent
- 客户端将 confirm 过的 setup_intent id 通过创建订单接口(/bp/asset/stripe_sub)上传给服务器,完成订单创建
stripe test clock 测试支持
stripe 支持使用 test clock 对订阅订单进行测试,如果需要在 test clock 下创建相关资源进行测试,请上传参数 test_clock_id
test clock 具体的使用方式,请参考文档:stripe test clock 测试方法说明
请求头部参数 (Headers)
- X-BytePower-Session-Token:登录后获取用户的 session。
- X-BytePower-Sign:请求体签名
请求体
- content-type: "application/json"
Parameters | Type | Required | Desc |
---|---|---|---|
string | false | 用户邮箱,可选参数,用于创建 stripe customer。根据 stripe 后台的配置,stripe 可能会使用该邮箱给用户发送 invoice 信息,提醒用户续费等。 | |
test_clock_id | string | false | test_clock id,用于测试,正式上线不需要这个参数 |
product_id | string | false | 创建 setup_intent 后需要购买的 bytepower product_id,服务端根据该 product_id 获取 stripe 平台配置,并进行 setup_intent 的创建。该参数是新版本添加,不传该参数默认会使用 Default stripe 配置创建 setup_intent |
- 请求体示例:
{
"email": "abc@qq.com",
"product_id": "BUYCQD6NV7PLG665"
}
响应
- HTTP 状态码:200
参数 | Type | Desc |
---|---|---|
stripe_setup_intent | object | stripe setup_intent 信息 |
stripe_setup_intent 数据结构见 stripe_setup_intent 对象说明
响应示例:
{
"stripe_setup_intent": {
"client_secret": "seti_1LLeMFJeDjdpBmRtt3DLRafc_secret_M3luBC3YKrbUagrYv179TAPA4I6lE5C",
"customer_id": "cus_M3lueBoXO9uQTF",
"id": "seti_1LLeMFJeDjdpBmRtt3DLRafc",
"payment_method_id": "",
"status": "requires_payment_method"
}
}
HTTP 状态码:4xx 描述:错误 响应示例:
{
"error": {
"error_type": "invalid_parameter",
"message": "xxxxx"
}
}
error_type:
- invalid_parameter (请求参数错误)
- config_invalid (console 配置问题)
- backend unavailable (stripe 第三方错误)
2. 创建 stripe subscription
POST /bp/asset/stripe_sub
接口功能: 创建 stripe 订阅订单。服务端返回创建的订阅订单信息和用户当前的资产情况。
目前有两种方式创建订单:
- 客户端上传 email 和 product_id,该接口会创建 stripe customer 和 stripe subscription,该方式用于没有免费试用期的订单(即该订单需要立即付费,包括付费试用期和无试用期订阅订单)
- 客户端上传 setup_intent_id 和 product_id,该接口会根据 setup_intent_id 对应的 setup_intent 更新 customer 的支付方式,并创建订阅订单,该方式用于有免费试用期的订单(即该订单不需要立即付费)
stripe test clock 测试支持
stripe 支持使用 test clock 对订阅订单进行测试,如果需要在 test clock 下创建相关资源进行测试,请上传参数 test_clock_id
test clock 具体的使用方式,请参考文档:stripe test clock 测试方法说明
请求头部参数 (Headers)
- X-BytePower-Session-Token:登录后获取用户的 session。
- X-BytePower-Sign:请求体签名
请求体
- content-type: "application/json"
Parameters | Type | Required | Desc |
---|---|---|---|
string | false | 用户邮箱,可选参数,用于创建 stripe customer。根据 stripe 后台的配置,stripe 可能会使用该邮箱给用户发送 invoice 信息,提醒用户续费等。 | |
test_clock_id | string | false | test_clock id,用于测试,正式上线不需要这个参数 |
setup_intent_id | string | false | stripe setup_intent id,可选参数,由 /bp/asset/stripe_setup_intent 接口返回并在客户端被 stripe confirm。 |
product_id | string | true | 待创建的订阅对应的 bytepower product_id |
country_code | string | false | 用户的国家码,可选参数。国家码为 2 位大写字母,根据 ISO_3166-1 Alpha-2 code 编码。参考链接:https://en.wikipedia.org/wiki/ISO_3166-1 |
- 请求体示例:
{
"email": "abc@qq.com",
"product_id": "BUYCQD6NV7PLG665"
}
{
"setup_intent_id": "si_xxxxxxxx",
"product_id": "BUYCQD6NV7PLG665"
}
响应
- HTTP 状态码:200
参数 | Type | Desc |
---|---|---|
stripe_sub | object | stripe subscription 信息 |
assets | array | 用户的 asset 信息 |
stripe_sub 数据结构见 stripe_sub 对象说明
响应示例:
{
"assets": [
{
"custom_expire_time": "0001-01-01T00:00:00Z",
"expire_time": "2024-02-28T06:33:24Z",
"is_auto_renewable": true,
"is_consumable": true,
"is_trial_period": true,
"name": "vip",
"origin": "purchase",
"platform": "stripe",
"product_id": "prod_Nf6dZGfCIERbqP",
"quantity": 300,
"receipt_id": "sub_1OnxkeJeDjdpBmRtQTvwiUeA",
"sub_canceled": false,
"sub_canceled_time": "0001-01-01T00:00:00Z",
"sub_canceled_ts": 0,
"total_quantity": 300,
"type": "subscription",
"valid_seconds": 101407
}
],
"stripe_sub": {
"bp_product_id": "BUY7LJLQ4NON6VMF",
"cancel_at_period_end": false,
"canceled_time": "0001-01-01T00:00:00Z",
"canceled_ts": 0,
"current_cycle_end_ts": 1709015604,
"current_cycle_start_ts": 1708929204,
"customer_id": "cus_PdEDP7z32Z27wn",
"id": "sub_1OnxkeJeDjdpBmRtQTvwiUeA",
"invoice_id": "in_1OnxkeJeDjdpBmRtSd8HJBvo",
"invoice_status": "paid",
"payment_intent_client_secret": "pi_3OnxkfJeDjdpBmRt0hiHOz1q_secret_TxB2v8HVoveWadDsZtNkyc5wn",
"payment_intent_id": "pi_3OnxkfJeDjdpBmRt0hiHOz1q",
"status": "trialing",
"stripe_price_id": "price_1MtmPmJeDjdpBmRtJm9nMYZE",
"stripe_product_id": "prod_Nf6dZGfCIERbqP"
}
}
HTTP 状态码:4xx 描述:错误 响应示例:
{
"error": {
"error_type": "invalid_parameter",
"message": "xxxxx"
}
}
error_type:
- invalid_parameter (请求参数错误)
- config_invalid (console 配置问题)
- backend unavailable (stripe 第三方错误)
3. 获取刚支付成功的 stripe subscription 信息并同步用户资产
GET /bp/asset/stripe_sub/{sub_id}/sync
该接口与 GET /bp/asset/stripe_sub/{sub_id}
接口的功能相同,请优先使用 sync 接口, GET /bp/asset/stripe_sub/{sub_id}
接口已被废弃。
接口功能: 获取 stripe subscription 的信息, 并同步用户资产。stripe subscription id 由 URL 路径中的 sub_id 给出。
使用场景:该接口只用于支付成功后,立刻同步用户资产的场景。当用户支付成功后,stripe 会向 bytepower 发送 webhook 通知支付成功,bytepower 接收到 webhook 后为用户加资产。由于 webhook 的发送是异步的,会有延迟,如果客户端想在支付成功后较快地刷新用户资产,可以使用 sync 接口。
请求头部参数 (Headers)
- X-BytePower-Session-Token:登录后获取用户的 session。
- X-BytePower-Sign:请求体签名
请求体
无
响应
- HTTP 状态码:200
参数 | Type | Desc |
---|---|---|
stripe_sub | object | stripe subscription 信息 |
assets | array | 用户的 asset 信息 |
stripe_sub 数据结构见 stripe_sub 对象说明。
响应示例:
{
"assets": [
{
"custom_expire_time": "0001-01-01T00:00:00Z",
"expire_time": "2024-02-28T06:33:24Z",
"is_auto_renewable": true,
"is_consumable": true,
"is_trial_period": true,
"name": "vip",
"origin": "purchase",
"platform": "stripe",
"product_id": "prod_Nf6dZGfCIERbqP",
"quantity": 300,
"receipt_id": "sub_1OnxkeJeDjdpBmRtQTvwiUeA",
"sub_canceled": false,
"sub_canceled_time": "0001-01-01T00:00:00Z",
"sub_canceled_ts": 0,
"total_quantity": 300,
"type": "subscription",
"valid_seconds": 101407
}
],
"stripe_sub": {
"bp_product_id": "BUY7LJLQ4NON6VMF",
"cancel_at_period_end": false,
"canceled_time": "0001-01-01T00:00:00Z",
"canceled_ts": 0,
"current_cycle_end_ts": 1709015604,
"current_cycle_start_ts": 1708929204,
"customer_id": "cus_PdEDP7z32Z27wn",
"id": "sub_1OnxkeJeDjdpBmRtQTvwiUeA",
"invoice_id": "in_1OnxkeJeDjdpBmRtSd8HJBvo",
"invoice_status": "paid",
"payment_intent_client_secret": "pi_3OnxkfJeDjdpBmRt0hiHOz1q_secret_TxB2v8HVoveWadDsZtNkyc5wn",
"payment_intent_id": "pi_3OnxkfJeDjdpBmRt0hiHOz1q",
"status": "trialing",
"stripe_price_id": "price_1MtmPmJeDjdpBmRtJm9nMYZE",
"stripe_product_id": "prod_Nf6dZGfCIERbqP"
}
}
HTTP 状态码:4xx 描述:错误 响应示例:
{
"error": {
"error_type": "invalid_parameter",
"message": "xxxxx"
}
}
error_type:
- invalid_parameter (请求参数错误)
- config_invalid (console 配置问题)
- backend unavailable (stripe 第三方错误)
4. 获取 stripe subscription 信息
GET /bp/asset/stripe_sub/{sub_id}/fetch
接口功能: 获取 stripe subscription 的信息, stripe subscription id 由 URL 路径中的 sub_id 给出。
请求头部参数 (Headers)
- X-BytePower-Session-Token:登录后获取用户的 session。
- X-BytePower-Sign:请求体签名
请求体
无
响应
- HTTP 状态码:200
参数 | Type | Desc |
---|---|---|
stripe_sub | object | stripe subscription 信息 |
assets | array | 用户的 asset 信息 |
stripe_sub 数据结构见 stripe_sub 对象说明。
响应示例:
{
"assets": [
{
"custom_expire_time": "0001-01-01T00:00:00Z",
"expire_time": "2024-02-28T06:33:24Z",
"is_auto_renewable": true,
"is_consumable": true,
"is_trial_period": true,
"name": "vip",
"origin": "purchase",
"platform": "stripe",
"product_id": "prod_Nf6dZGfCIERbqP",
"quantity": 300,
"receipt_id": "sub_1OnxkeJeDjdpBmRtQTvwiUeA",
"sub_canceled": false,
"sub_canceled_time": "0001-01-01T00:00:00Z",
"sub_canceled_ts": 0,
"total_quantity": 300,
"type": "subscription",
"valid_seconds": 101407
}
],
"stripe_sub": {
"bp_product_id": "BUY7LJLQ4NON6VMF",
"cancel_at_period_end": false,
"canceled_time": "0001-01-01T00:00:00Z",
"canceled_ts": 0,
"current_cycle_end_ts": 1709015604,
"current_cycle_start_ts": 1708929204,
"customer_id": "cus_PdEDP7z32Z27wn",
"id": "sub_1OnxkeJeDjdpBmRtQTvwiUeA",
"invoice_id": "in_1OnxkeJeDjdpBmRtSd8HJBvo",
"invoice_status": "paid",
"payment_intent_client_secret": "pi_3OnxkfJeDjdpBmRt0hiHOz1q_secret_TxB2v8HVoveWadDsZtNkyc5wn",
"payment_intent_id": "pi_3OnxkfJeDjdpBmRt0hiHOz1q",
"status": "trialing",
"stripe_price_id": "price_1MtmPmJeDjdpBmRtJm9nMYZE",
"stripe_product_id": "prod_Nf6dZGfCIERbqP",
"next_payment_attempt": 1708939204,
"next_payment_amount": 1000,
"next_payment_currency": "usd"
}
}
HTTP 状态码:4xx 描述:错误 响应示例:
{
"error": {
"error_type": "invalid_parameter",
"message": "xxxxx"
}
}
error_type:
- invalid_parameter (请求参数错误)
- config_invalid (console 配置问题)
- backend unavailable (stripe 第三方错误)
5. 升级 stripe subscription
POST /bp/asset/stripe_sub/{sub_id}/upgrade
接口功能: 升级 stripe subscription 至较高级的套餐, stripe subscription id 由 URL 路径中的 sub_id 给出。
套餐的等级规则不由 bytepower 规定,而是产品来确定当前订阅能升级到哪个套餐,推荐在 bytepower console 上配置 product 的 tag 来自定义升级规则。
注意:如果订阅已通过之前的 revise 接口进行了订阅的变更,但 revise 的目标订阅套餐仍未生效,则不能使用该 upgrade 接口进行升级。如果 revise 的目标订阅套餐已经生效,则可使用该 upgrade 接口进行升级。
升级后的行为:
- 新套餐立即生效,根据当前时刻重新计算订阅周期
- 首次付费时补差价,无需支付全款,后续周期支付全款。如果需要补的差价为负,则会向用户退款。
升级订阅时,原订阅需要是 stripe 平台的订阅, 且目前的订阅状态是 active 或 trialing。 升级的目标套餐不能有试用期【包括免费试用期和付费试用期】。
请求头部参数 (Headers)
- X-BytePower-Session-Token:登录后获取用户的 session。
- X-BytePower-Sign:请求体签名
请求体
- content-type: "application/json"
Parameters | Type | Required | Desc |
---|---|---|---|
new_bp_product_id | string | true | 待升级的 bytepower product_id |
- 请求体示例:
{
"new_bp_product_id": "BUYCQD6NV7PLG665"
}
响应
- HTTP 状态码:200
参数 | Type | Desc |
---|---|---|
stripe_sub | object | stripe subscription 信息 |
assets | array | 用户的 asset 信息 |
stripe_sub 数据结构见 stripe_sub 对象说明
注: 当 status 字段为 active 或 tralling, 且 invoice_status 字段为 paid 时,才说明升级成功;如果 invoice_status 为 open 时,则说明新套餐支付没有成功。
响应示例:
{
"assets": [
{
"custom_expire_time": "0001-01-01T00:00:00Z",
"expire_time": "2024-02-28T06:33:24Z",
"is_auto_renewable": true,
"is_consumable": true,
"is_trial_period": true,
"name": "vip",
"origin": "purchase",
"platform": "stripe",
"product_id": "prod_Nf6dZGfCIERbqP",
"quantity": 300,
"receipt_id": "sub_1OnxkeJeDjdpBmRtQTvwiUeA",
"sub_canceled": false,
"sub_canceled_time": "0001-01-01T00:00:00Z",
"sub_canceled_ts": 0,
"total_quantity": 300,
"type": "subscription",
"valid_seconds": 101407
}
],
"stripe_sub": {
"bp_product_id": "BUY7LJLQ4NON6VMF",
"cancel_at_period_end": false,
"canceled_time": "0001-01-01T00:00:00Z",
"canceled_ts": 0,
"current_cycle_end_ts": 1709015604,
"current_cycle_start_ts": 1708929204,
"customer_id": "cus_PdEDP7z32Z27wn",
"id": "sub_1OnxkeJeDjdpBmRtQTvwiUeA",
"invoice_id": "in_1OnxkeJeDjdpBmRtSd8HJBvo",
"invoice_status": "paid",
"payment_intent_client_secret": "pi_3OnxkfJeDjdpBmRt0hiHOz1q_secret_TxB2v8HVoveWadDsZtNkyc5wn",
"payment_intent_id": "pi_3OnxkfJeDjdpBmRt0hiHOz1q",
"status": "trialing",
"stripe_price_id": "price_1MtmPmJeDjdpBmRtJm9nMYZE",
"stripe_product_id": "prod_Nf6dZGfCIERbqP"
}
}
HTTP 状态码:4xx 描述:错误 响应示例:
{
"error": {
"error_type": "invalid_parameter",
"message": "xxxxx"
}
}
error_type:
- invalid_parameter (请求参数错误)
- config_invalid (console 配置问题)
- subscription_unsupported_upgrade (不支持的升级操作,如原订阅不是 stripe 订阅)
- backend unavailable (stripe 第三方错误)
- invalid_operation (非法的升级操作,如当前订阅不处于活跃状态)
6. 获取刚升级成功的 stripe subscription 信息并同步用户资产
GET /bp/asset/stripe_sub/{sub_id}/sync_upgrade
接口功能: 获取 stripe subscription 的信息, 并同步用户资产。stripe subscription id 由 URL 路径中的 sub_id 给出。
使用场景:该接口只用于升级成功后,立刻同步用户资产的场景。当用户支付成功后,stripe 会向 bytepower 发送 webhook 通知支付成功,bytepower 接收到 webhook 后为用户加资产。由于 webhook 的发送是异步的,会有延迟,如果客户端想在支付成功后较快地刷新用户资产,可以使用 sync_upgrade 接口。
请求头部参数 (Headers)
- X-BytePower-Session-Token:登录后获取用户的 session。
- X-BytePower-Sign:请求体签名
请求体
无
响应
- HTTP 状态码:200
参数 | Type | Desc |
---|---|---|
stripe_sub | object | stripe subscription 信息 |
assets | array | 用户的 asset 信息 |
stripe_sub 数据结构见 stripe_sub 对象说明。
响应示例:
{
"assets": [
{
"custom_expire_time": "0001-01-01T00:00:00Z",
"expire_time": "2024-02-28T06:33:24Z",
"is_auto_renewable": true,
"is_consumable": true,
"is_trial_period": true,
"name": "vip",
"origin": "purchase",
"platform": "stripe",
"product_id": "prod_Nf6dZGfCIERbqP",
"quantity": 300,
"receipt_id": "sub_1OnxkeJeDjdpBmRtQTvwiUeA",
"sub_canceled": false,
"sub_canceled_time": "0001-01-01T00:00:00Z",
"sub_canceled_ts": 0,
"total_quantity": 300,
"type": "subscription",
"valid_seconds": 101407
}
],
"stripe_sub": {
"bp_product_id": "BUY7LJLQ4NON6VMF",
"cancel_at_period_end": false,
"canceled_time": "0001-01-01T00:00:00Z",
"canceled_ts": 0,
"current_cycle_end_ts": 1709015604,
"current_cycle_start_ts": 1708929204,
"customer_id": "cus_PdEDP7z32Z27wn",
"id": "sub_1OnxkeJeDjdpBmRtQTvwiUeA",
"invoice_id": "in_1OnxkeJeDjdpBmRtSd8HJBvo",
"invoice_status": "paid",
"payment_intent_client_secret": "pi_3OnxkfJeDjdpBmRt0hiHOz1q_secret_TxB2v8HVoveWadDsZtNkyc5wn",
"payment_intent_id": "pi_3OnxkfJeDjdpBmRt0hiHOz1q",
"status": "trialing",
"stripe_price_id": "price_1MtmPmJeDjdpBmRtJm9nMYZE",
"stripe_product_id": "prod_Nf6dZGfCIERbqP"
}
}
HTTP 状态码:4xx 描述:错误 响应示例:
{
"error": {
"error_type": "invalid_parameter",
"message": "xxxxx"
}
}
error_type:
- invalid_parameter (请求参数错误)
- config_invalid (console 配置问题)
- backend unavailable (stripe 第三方错误)
7. 恢复和更新现有订阅
POST /bp/asset/stripe_sub/{sub_id}/recover_and_update
接口功能:当订阅处于【本期期末结束时取消】的状态时,调用该接口取消该状态。根据传入的 new_bp_product_id 参数,该订阅会恢复原订阅套餐、升级套餐或降级套餐。
恢复和更新订阅时,原订阅需要满足如下条件:
- 是 stripe 平台的订阅, 且订阅状态是 active 或 trialing
- 订阅的 cancel_at_period_end 字段为 true
在使用该接口前,可以先用 fetch 接口查询该订阅是否满足如上条件。
请求头部参数 (Headers)
- X-BytePower-Session-Token:登录后获取用户的 session。
- X-BytePower-Sign:请求体签名
请求体
- content-type: "application/json"
Parameters | Type | Required | Desc |
---|---|---|---|
new_bp_product_id | string | true | 待升级的 bytepower product_id |
- 请求体示例:
{
"new_bp_product_id": "BUYCQD6NV7PLG665"
}
响应
- HTTP 状态码:200
参数 | Type | Desc |
---|---|---|
stripe_sub | object | stripe subscription 信息 |
assets | array | 用户的 asset 信息 |
stripe_sub 数据结构见 stripe_sub 对象说明
响应示例:
{
"assets": [
{
"custom_expire_time": "0001-01-01T00:00:00Z",
"expire_time": "2024-02-28T06:33:24Z",
"is_auto_renewable": true,
"is_consumable": true,
"is_trial_period": true,
"name": "vip",
"origin": "purchase",
"platform": "stripe",
"product_id": "prod_Nf6dZGfCIERbqP",
"quantity": 300,
"receipt_id": "sub_1OnxkeJeDjdpBmRtQTvwiUeA",
"sub_canceled": false,
"sub_canceled_time": "0001-01-01T00:00:00Z",
"sub_canceled_ts": 0,
"total_quantity": 300,
"type": "subscription",
"valid_seconds": 101407
}
],
"stripe_sub": {
"bp_product_id": "BUY7LJLQ4NON6VMF",
"cancel_at_period_end": false,
"canceled_time": "0001-01-01T00:00:00Z",
"canceled_ts": 0,
"current_cycle_end_ts": 1709015604,
"current_cycle_start_ts": 1708929204,
"customer_id": "cus_PdEDP7z32Z27wn",
"id": "sub_1OnxkeJeDjdpBmRtQTvwiUeA",
"invoice_id": "in_1OnxkeJeDjdpBmRtSd8HJBvo",
"invoice_status": "paid",
"payment_intent_client_secret": "pi_3OnxkfJeDjdpBmRt0hiHOz1q_secret_TxB2v8HVoveWadDsZtNkyc5wn",
"payment_intent_id": "pi_3OnxkfJeDjdpBmRt0hiHOz1q",
"status": "trialing",
"stripe_price_id": "price_1MtmPmJeDjdpBmRtJm9nMYZE",
"stripe_product_id": "prod_Nf6dZGfCIERbqP"
}
}
HTTP 状态码:4xx 描述:错误 响应示例:
{
"error": {
"error_type": "invalid_parameter",
"message": "xxxxx"
}
}
error_type:
- invalid_parameter (请求参数错误)
- config_invalid (console 配置问题)
- subscription_unsupported_upgrade (不支持的升级操作,如原订阅不是 stripe 订阅)
- backend unavailable (stripe 第三方错误)
- invalid_operation (非法的升级操作,如当前订阅不处于活跃状态)
数据结构
stripe_setup_intent
参数 | 类型 | 说明 |
---|---|---|
id | string | setup_intent id |
client_secret | string | setup_intent 的 client_secret, 用于 confirm setup_intent |
status | string | setup_intent 的状态,状态说明详见:stripe payments intents 文档 |
payment_method_id | string | setup_intent 关联的 payment_method_id,该接口返回的该字段均为空字符串 |
customer_id | string | setup_intent 关联的 stripe customer id |
格式举例如下:
{
"stripe_setup_intent": {
"client_secret": "seti_1LLeMFJeDjdpBmRtt3DLRafc_secret_M3luBC3YKrbUagrYv179TAPA4I6lE5C",
"customer_id": "cus_M3lueBoXO9uQTF",
"id": "seti_1LLeMFJeDjdpBmRtt3DLRafc",
"payment_method_id": "",
"status": "requires_payment_method"
}
}
stripe_sub
参数 | 类型 | 说明明 |
---|---|---|
id | string | stripe 订阅订单 id |
customer_id | string | stripe customer id |
status | string | stripe 订单状态,详见 stripe 文档中的 订阅状态说明 |
invoice_id | string | stripe 订单 latest_invoice 的 id |
invoice_status | string | stripe 订单 latest_invoice 的状态,详见 stripe 文档中的 invoice 状态说明 |
bp_product_id | string | 当前订阅的 bytepower product_id |
stripe_product_id | string | 当前订阅的 stripe product id |
stripe_price_id | string | 当前订阅的 stripe price id |
payment_intent_id | string | stripe 订单的 payment_intent id |
payment_intent_client_secret | string | stripe 订单支付时需要的 payment_intent 的 client_secret |
canceled_ts | int | 订阅取消时间的秒级时间戳。如果订阅没有取消,则为 0;如果订阅在本期期末取消,则为本期期末时间戳(将来时间的时间戳);如果订阅已经取消,则为已取消时间的时间戳(过去时间的时间戳) |
canceled_time | string | 订阅取消时间。如果订阅没有取消,则为 0001-01-01T00:00:00Z;如果订阅在本期期末取消,则为本期期末时间(将来的时间);如果订阅已经取消,则为已取消时间(过去的时间)。该字段已废弃,请使用 canceled_ts 字段 |
cancel_at_period_end | bool | 订阅是否在本期期末取消 |
current_cycle_start_ts | int | 当期订阅开始的秒级时间戳 |
current_cycle_end_ts | int | 当期订阅结束的秒级时间戳 |
next_payment_attempt | int | 下个周期尝试扣款的秒级时间戳,当订阅状态为 active 或 trialing 时有效。该字段只在 fetch 接口返回 |
next_payment_amount | int | 下个周期扣款金额,美元以分计, 当订阅状态为 active 或 trialing 时有效。该字段只在 fetch 接口返回 |
next_payment_currency | string | 下个周期扣款币种,币种缩写小写,如 usd, 当订阅状态为 active 或 trialing 时有效。该字段只在 fetch 接口返回 |
注: 订阅取消时间分别给出了【字符串】和【秒级时间戳】两种格式的字段(canceled_time 和 canceled_ts),这两种格式表示的时间是一致的。 由于当订阅没有取消时,canceled_time 会返回 0001-01-01T00:00:00Z,不方便客户端解析,故废弃该字段,以后解析订阅取消时间时请使用 canceled_ts
秒级时间戳字段。
格式举例如下:
{
"bp_product_id": "BUY7LJLQ4NON6VMF",
"cancel_at_period_end": false,
"canceled_time": "0001-01-01T00:00:00Z",
"canceled_ts": 0,
"current_cycle_end_ts": 1709015604,
"current_cycle_start_ts": 1708929204,
"customer_id": "cus_PdEDP7z32Z27wn",
"id": "sub_1OnxkeJeDjdpBmRtQTvwiUeA",
"invoice_id": "in_1OnxkeJeDjdpBmRtSd8HJBvo",
"invoice_status": "paid",
"payment_intent_client_secret": "pi_3OnxkfJeDjdpBmRt0hiHOz1q_secret_TxB2v8HVoveWadDsZtNkyc5wn",
"payment_intent_id": "pi_3OnxkfJeDjdpBmRt0hiHOz1q",
"status": "trialing",
"stripe_price_id": "price_1MtmPmJeDjdpBmRtJm9nMYZE",
"stripe_product_id": "prod_Nf6dZGfCIERbqP",
"next_payment_attempt": 1708939204,
"next_payment_amount": 1000,
"next_payment_currency": "usd"
}