如何使用 PHP API 更新 Chargify 的 next_billing_at?
数据小陈
结论
可以通过 Chargify API 修改订阅的下一次计费时间。多数情况下,问题不在日期格式,而在请求体结构。next_billing_at 必须放在 subscription 对象中,不能直接作为 JSON 的顶层字段发送。
正确的请求结构
更新 Chargify 订阅时,请使用类似下面的 JSON:
{
"subscription": {
"next_billing_at": "2013-04-20T02:52:17-04:00"
}
}
对应的 PHP 代码如下:
$requestArr = array(
'subscription' => array(
'next_billing_at' => '2013-04-20T02:52:17-04:00'
)
);
try {
$connector->requestUpdateSubscription(
$thisSubscriptionID,
json_encode($requestArr),
'JSON'
);
} catch (ChargifyValidationException $cve) {
echo $cve->getMessage();
}
更新已有订阅时,通常不必再次传入 customer_id,因为订阅 ID 已经确定了要修改的订阅。
为什么原来的代码没有生效
原请求生成的 JSON 是:
{
"customer_id": "12345",
"next_billing_at": "2013-04-20T02:52:17-04:00"
}
这里的 next_billing_at 没有放在 subscription 节点内,Chargify 可能会忽略这个嵌套位置不正确的字段。部分 API 或客户端版本不会因此抛出验证异常,所以请求没有报错,并不表示字段已经更新。
检查更新结果
更新完成后,重新获取订阅,并检查返回对象中的 next_assessment_at:
$subscriptionUpdated = $connector->getSubscriptionsByID(
$thisSubscriptionID
);
$newBillingDate = $subscriptionUpdated->next_assessment_at;
echo "new next billing date is {$newBillingDate}\n";
更新请求使用的参数名是 next_billing_at,订阅响应中表示下一次评估或计费时间的字段则可能是 next_assessment_at。两者用在不同位置。不要把查询字段也改成 next_billing_at,除非当前 API 版本的响应明确包含该字段。
日期格式
建议使用包含时区的 ISO 8601 时间:
2013-04-20T02:52:17-04:00
也可以按照当前 Chargify API 版本支持的格式使用 UTC:
2013-04-20T06:52:17Z
如果只传入:
2013-04-20
由于缺少具体时间和时区,可能产生歧义。即使某些版本接受纯日期,显式提供完整时间也更稳妥。
注意事项
next_billing_at必须位于subscription对象内。- 新时间通常需要晚于当前时间,并处于订阅当前状态允许调整的计费范围内。
- 修改计费日期可能影响立即计费、试用期、余额结转或组件计费。实际行为取决于 Chargify/Maxio 当前的 API 规则和站点配置。
- 如果字段正确嵌套后仍未更新,请记录并检查客户端返回的 HTTP 状态码和原始响应体。这个 PHP 客户端可能只在遇到特定错误时抛出
ChargifyValidationException。 Chargify-PHP-Client是较早的第三方客户端。如果它的请求封装与当前 API 不兼容,可以直接发送PUT /subscriptions/{id}.json请求,并沿用相同的subscription嵌套结构。
备注:内容仅供参考。
