簡體   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