在使用Braintree实施定期付款的过程中,我遇到了一个问题。
在文档中,我可以读到:"如果未启用按比例分配,在周期中期对客户的订阅所做的任何更改都将在下一个周期开始时生效。(https://articles.braintreepayments.com/guides/recurring-billing/recurring-advanced-settings#proration)
但是,如果我在计费周期中间将订阅编辑为较低的美元金额(未启用降级按比例分配),例如从 100 美元到 80 美元,然后将订阅编辑为更高的美元金额(启用升级按比例分配),例如 90 美元,网关将立即向我收取一些费用。
在这种情况下,我预计网关不会生成任何交易,因为降级应该在下一个周期开始时生效,并且新的订阅价格(90 美元)低于初始订阅价格(100 美元)。
那么,如何达到仅当新订阅价格高于当前计费周期的最高订阅价格时才会生成按比例升级的交易的情况?
我是Braintree的开发人员。
如果您为价格降低和增加保持按比例分配,在您给出的示例中,您将看到一个信用额度应用于订阅余额以减少,然后针对余额收取增加的费用。如果费用超过订阅余额信用额度,则将向您的客户收费。
除非选择按比例收费,否则不会在计费周期中间对订阅收费。您可以使用类似于下面的逻辑创建所需的方案。代码片段在 Ruby 中,因为您没有指定正在使用的客户端库。
首先查找要更新的订阅,并找到当前计费周期的开始日期:
subscription = Braintree::Subscription.find("subscription_id")
billing_period_start_date = Date.parse(subscription.billing_period_start_date) # convert String to Date
然后循环访问订阅的status_history
事件,如果历史记录事件发生在此计费周期开始之后并且billing_period_max_price
大于前一个事件,则更新billing_period_max_price
:
billing_period_max_price = 0.0
subscription.status_history.each do |history_event|
event_date = Date.parse(history_event.timestamp.strftime('%Y/%m/%d')) # convert Time to Date
event_price = history_event.price.to_f
if event_date >= billing_period_start_date && billing_period_max_price < event_price
billing_period_max_price = event_price
end
end
最后,如果billing_period_max_price
低于要将订阅价格更改为的价格,请按比例分配费用:
Subscription.update(
"subscription_id",
:price => "yourHigherPrice",
:options => { :prorate_charges => true }
)
如果您有其他问题,请随时联系 Braintree 支持。