如何判断 Chargify Statement 是否为 Paid
支付小周
结论
判断 Chargify Statement 是否为 Paid,应查看 settled_at 字段:
settled_at有时间值:Statement 已结清,状态为 Paidsettled_at为null:Statement 尚未结清,状态为 Unpaid
不要只用 ending_balance_in_cents === 0 判断付款状态。这个字段表示周期结束时的账户余额,不能直接代表 Statement 是否已付款。
为什么 Ending Balance 不为 0 仍可能是 Paid
ending_balance_in_cents 有三种可能:
- 大于
0:客户仍有欠款 - 等于
0:余额正好结清 - 小于
0:客户账户中有 credit,也就是商家欠客户款项,或客户有可用于抵扣的余额
所以,当 Ending Balance 为负数时,虽然它不等于 0,但客户并没有应付余额,Statement 仍可能显示为 Paid。
Statement 的余额也可能受付款、退款、credits、调整和后续账户活动影响。只根据余额数值推断状态,结果可能与 Chargify 记录的结清状态不一致。
判断示例
假设 Statement API 返回:
{
"statement": {
"id": 123456,
"starting_balance_in_cents": 0,
"ending_balance_in_cents": -500,
"settled_at": "2024-01-15T10:30:00-05:00"
}
}
这里的 ending_balance_in_cents 虽然是 -500,但 settled_at 已有值,因此该 Statement 应判断为 Paid。
JavaScript 示例:
function getStatementStatus(statement) {
return statement.settled_at ? "paid" : "unpaid";
}
const status = getStatementStatus(response.statement);
PHP 示例:
function getStatementStatus(array $statement): string
{
return !empty($statement['settled_at']) ? 'paid' : 'unpaid';
}
如果业务中还要显示当前余额,可以分别处理状态和余额:
function normalizeStatement(statement) {
return {
status: statement.settled_at ? "paid" : "unpaid",
balanceInCents: statement.ending_balance_in_cents,
hasCredit: statement.ending_balance_in_cents < 0
};
}
注意事项
settled_at 是 Chargify 认定 Statement 已结清的时间。与自行比较 ending_balance_in_cents 相比,它更适合用于判断状态。
如果实际 API 响应中没有 settled_at,请先确认:
- 查询的是 Statement 详情接口,而不是仅返回部分字段的列表或报表接口;
- 当前使用的 Chargify/Maxio API 版本是否仍会返回旧版 Statement 字段;
- 响应是否被本地模型、SDK 或中间服务裁剪过。
如果无法取得 settled_at,可以用 ending_balance_in_cents <= 0 近似判断“当前没有应付余额”,但这个结果不一定与 Chargify 界面中的 Paid 状态完全一致。需要与后台展示严格一致时,应以 API 返回的结清字段或当前版本提供的正式状态字段为准。
备注:内容仅供参考。
