PayPal订阅IPN下一个账单日期

5
我的网站应用使用PayPal的月度订阅功能。每当付款、用户注册、取消等活动发生时,我都会收到IPN通知,这一切似乎都很顺利。

但是IPN消息中似乎缺少一件事情,即有关下次结算日期的任何指示。 https://developer.paypal.com/docs/classic/ipn/integration-guide/IPNandPDTVariables/#id091EB0901HT

起初,我认为由于是每月一次的订阅,我可以简单地加上一个月到上一个日期,但PayPal似乎有一种奇特的方式来计算下一个付款日期——它并不总是30或31天或一个月。

下一个账单日期可以在PayPal内部获得,但似乎没有发送到任何IPN消息中去。

是否有人知道从IPN消息提供的信息中简单解决这个问题的方法?


1
你为什么需要知道呢?我已经实现了一个Paypal订阅系统,唯一需要注意的是subscr_signup,用于创建用户,然后是实际的付款,以启用他对相应产品的访问权限。没有支付就没有访问权限。我保存了其他信息以便进行会计处理,但我从未需要知道下一个账单日期。 - user207421
1
嗨,我想要为用户提供一个“截至付款”日期...虽然我知道他们可以登录PayPal并查找此信息,但知道他们的订阅何时到期以及下一笔付款将何时进行会更好。 - JohnB
你知道上次付款日期和订阅周期。下一次付款将在到期之前不久到期,但是Paypal决定何时扫描并不一定可预知。 - user207421
1
嗨,是的,我认为那确实是唯一的方法...不过有点复杂,因为错过的付款可以在到期日后3、5、7等天重新尝试,下一个付款日期也不是完整的账单周期。 - JohnB
5个回答

3
我最近也遇到了这个问题。我不确定“一个月”订阅的定义是否能保持一致。比如,如果您在3月31日注册服务,下一笔付款是在4月30日还是5月1日?你只需要选一个并清楚地告诉用户。很遗憾,PayPal没有给我们提供这个便利。
最终,我决定为月度和年度订阅分别提供32天或367天的服务。我知道你可能会失去一两天的收益,但我认为允许一些宽限时间比风险让用户付款而得到的时间少要好。
如果一切顺利,实际上无论你为帐户激活了多长时间,只要你还监听subscr_eotsubscr_payment IPN(参见https://dev59.com/ynNA5IYBdhLWcg3wL6oc#1195246),就没有关系。我从下次付款的日期开始更新以上期限,以便订阅始终与PayPal的付款周期同步。当最后一个付费期结束时,PayPal会向您发送eot IPN,因此您可以在服务器端终止订阅。这意味着你决定给他们多少“宽限”时间并不那么重要。
在提供“到期日”方面,我会简单地提供“宽限”日期,因为你是实际决定这个日期的人。不过,我建议您也告诉他们在最保守的估计下,他们应该在下一个付款日支付,这将是上次付款后30天或月底(如果月底在此之后)。

2

这可能会对您有所帮助。如果要精确指定天数,请不要使用PayPal的MONTHLY类型,而是像这样指定DAY

以下代码将每30天向客户收费:

    ->setfrequency_interval('30')
    ->setfrequency('DAY')

0
 let m  = moment.utc('2021-05-31T06:52:19Z')
 for (let i = 0; i < 20; i++) {
   const date = m.get('date')
   m.add(3, 'month') // any number of months
   if ((date === 29 || date === 30) && m.get('month') === 1) {
     m.add(1, 'day')
   }
   console.log(m.format())
}

如果有错误,请告知我。

我在真实的订阅中测试了1、2、3和4个月。

至少第一个下次账单日期是相同的。

它也与文档中的示例相匹配,除了这个:

示例:每月定期付款应于31日收取 如果订阅条款为每月25.99美元,订阅者于7月31日星期四注册。订户按以下方式计费:

星期四,7月31日= $25.99美元 8月31日(星期六)= $25.99美元 10月1日(星期三)= $25.99美元 11月1日(星期六)= $25.99美元 等等

但匹配这个:

定期付款将在每月的同一天收取。如果初始定期付款落在31日,PayPal最终会调整结算周期到该月的最后一天。如果初始定期付款落在29日或30日,PayPal会在接下来的二月份调整结算周期到当月的第一天。


0

每月循环付款大约每30天收取一次。

如果订阅条款为每月25.99美元,订阅者在7月31日星期四注册。订阅者的账单如下:

  • 7月31日星期四 = 25.99美元
  • 8月31日星期六 = 25.99美元
  • 10月1日星期三 = 25.99美元
  • 11月1日星期六 = 25.99美元

0

最坏的情况是原始订阅日期在月份的31日

我考虑了一个月,然后再加上1天以确保安全,但结果还是出现了问题。

订阅开始于31日

客户在1月31日订阅并付款。由于这是该月的最后一天,PayPal在2月28日再次收取了他们的费用。我的代码随后计算下一个付款日期(+1天宽限期)= 3月29日。但实际上不是这样的,应该是3月31日。

即使“下一个付款日期”不是100%准确,我仍会跟踪它,并在用户的个人资料页面上显示它。我觉得很奇怪,PayPal没有在IPN数据中包含这个重要信息。

解决方案1

一种选择是允许更长的宽限期,或者如果支付日期是任何给定月份的最后一天,则进行例外处理。这个方法还可以,但有时会向用户显示略微错误的信息。

解决方案2

追踪订阅原始日期的每月日期值。这样你就可以随时参考它。所以,在我的例子中,那个日期是31日。我保留那个值,然后每当我需要更新“下一个付款日期”时,我只需在即将到来的月份上使用该月份的那一天。对于较短的月份,如果小于存储的日期,则使用该月份的最后一天。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接