繁体   English   中英

PayPal 订阅 IPN 下一个账单日期

[英]PayPal Subscription IPN Next Billing Date

我的网络应用程序使用 PayPal 每月订阅。 我在付款、用户注册/取消等时收到 IPN 通知,这一切似乎都运行良好。

IPN 消息中似乎缺少的一件事是有关下一个计费日期的任何指示。 https://developer.paypal.com/docs/classic/ipn/integration-guide/IPNandPDTVariables/#id091EB0901HT

起初我以为因为它是按月订阅,所以我可以简单地在前一个日期上加一个月,但 PayPal 似乎有一种确定下一个付款日期的时髦方法——它并不总是 30 或 31 天或一个月。

下一个计费日期可从 PayPal 内部获得,但似乎没有在任何 IPN 消息中发送。

有谁知道从 IPN 消息中可用的信息中解决这个问题的简单方法?

我最近也遇到了这个问题。 我不确定人们能否就订阅“一个月”的含义获得一致的方案。 例如,如果您在 3 月 31 日注册服务,下一次付款是在 4 月 30 日还是 5 月 1 日到期? 您只需要选择一个并将其清楚地传达给您的用户。 不幸的是,PayPal 无法为我们提供这种礼遇。

最后,我决定让用户访问该服务 32 天或 367 天,分别按月和按年订阅。 我知道你可能会在这里和那里“输掉”一两天,但我认为最好允许一些宽限访问,而不是冒险给用户的时间少于支付的时间。

如果一切顺利,如果您还收听subscr_eotsubscr_payment IPN,激活帐户的时间实际上并不重要(请参阅https://stackoverflow.com/a/1195246/1852838 )。 我从下一次付款之日起续订上述期限,以便订阅始终与 PayPal 付款周期同步。 PayPal 将在最后一个付费期结束时向您发送eot IPN,以便您可以在服务器端终止订阅。 这意味着你决定给予他们多少“恩典”并不重要。

就提供“支付至”而言,我将简单地提供“宽限期”日期,因为您是真正决定这一期限的人。 但是,我建议您也让他们知道他们应该在下一次付款时按照最保守的估计付款。 这将是最后一次付款后的 30 天或月末(如果在此之后)。

这可能会帮助你。 要准确指定天数,请不要使用 paypal 的MONTHLY类型。 而是像这样指定DAY

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

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

每月定期付款大约每 30 天收取一次。

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

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

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

为了安全起见,我允许一个月,然后 +1 天,但后来发生了这种情况。

31日开始订阅

客户在 1 月 31 日订阅并付款。因为那是当月的最后一天,PayPal 于 2 月 28 日再次向他们收费。然后我的代码计算出下一个付款日期(+1 天宽限期)= 3 月 29 日。 但是,当然不是。 现在是 3 月 31 日。

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

解决方案 1

一种选择是允许更长的宽限期,或者如果付款日期是任何给定月份的最后一天,则可以例外。 这可以正常工作,但有时会向用户显示稍微错误的信息。

解决方案 2

跟踪订阅原始日期的月份值。 这样你就可以随时参考它。 因此,在我的示例中,该日期为 31。我保留该值,然后每当我需要更新“下一个付款日期”时,我就可以在下个月使用该月的那一天。 对于较短的月份,如果该月的最后一天 < 存储的月份,则只需使用该月份的最后一天。

 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 会将结算周期调整为次年 2 月的第一天。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM