测试Paypal订阅IPN

38

我想测试PayPal订阅IPN,包括在创建订阅时接收到的IPN和随后发送的下一笔付款的IPN(例如,如果每月订阅费用是$x,则为每月)。

然而,我不想等一个月或一天才能收到第二个IPN。是否有一种方法可以更快地发送IPN,例如每小时,使用PayPal或他们的沙箱?

文档中说,您只能将年、月、日和周指定为订阅期限。

5个回答

58
PayPal的开发者支持和文档令人尴尬。但是这个特定限制并不像一开始看起来那么具有破坏性。为了进行测试,请定义您的循环付款不包含免费试用。当您创建一个新的订阅时,您的服务器将会快速接收到两条IPN消息,第一条消息是创建订阅,第二条消息是应用支付。这基本上就是您需要测试的全部内容。如果您有免费试用,您将得到基本相同的一对消息,只是它们之间有一个试用期:)第一条消息("创建订阅")将看起来像这样。请注意'txn_type' - 这是消除两条消息歧义的关键信息:
{
  "txn_type"=>"subscr_signup",
  "subscr_id"=>"unique_id",
  "verify_sign"=>"random_gibberish",

  "item_number"=>"your_subscription_name"
  "subscr_date"=>"14:32:23 Feb 15, 2010 PST",
  "btn_id"=>"1111111",
  "item_name"=>"Your Subscription Description",
  "recurring"=>"1",
  "period1"=>"1 M",

  # This example is from a "free trial" IPN notification-- if you don't have a 
  # free trial defined, there will only be 'period1' fields, and they'll
  # have the data that appears here in the 'period3' fields.
  "amount1"=>"0.00",
  "mc_amount1"=>"0.00",
  "period3"=>"1 M",
  "amount3"=>"34.95",
  "mc_amount3"=>"34.95",
  "mc_currency"=>"USD",

  "payer_status"=>"verified",
  "payer_id"=>"payer_unique_id",
  "first_name"=>"Test",
  "last_name"=>"User",
  "payer_email"=>"test_xxxx@example.com",
  "residence_country"=>"US",

  "business"=>"seller_xxxxxxx@example.com",
  "receiver_email"=>"seller_xxxxxxx@example.com",

  "reattempt"=>"1",

  "charset"=>"windows-1252","notify_version"=>"2.9","test_ipn"=>"1",
}

第二个消息在这种情况下更有趣。当应用定期付款时,您将获得与此完全相同的消息。它看起来像这样:
{
  "txn_type"=>"subscr_payment",
  "subscr_id"=>"unique_id",
  "verify_sign"=>"random_gibberish",

  "txn_id"=>"payment_unique_id",
  "payment_status"=>"Completed",
  "payment_date"=>"12:45:33 Feb 16, 2010 PST",

  "item_number"=>"your_subscription_name"
  "subscr_date"=>"14:32:23 Feb 15, 2010 PST",
  "custom"=>"data-you-sent-in-a-custom-field",

  "id"=>"1",
  "payment_gross"=>"34.95",
  "mc_currency"=>"USD",
  "payment_type"=>"instant",
  "payment_fee"=>"1.31",
  "payer_status"=>"verified",
  "mc_fee"=>"1.31",
  "mc_gross"=>"34.95",
  "btn_id"=>"1111111",

  "payer_id"=>"payer_unique_id",
  "first_name"=>"Test",
  "last_name"=>"User",
  "payer_email"=>"test_xxxx@example.com",
  "residence_country"=>"US",

  "receiver_id"=>"your_merchant_id",
  "business"=>"seller_xxxxxxx@example.com",
  "receiver_email"=>"seller_xxxxxxx@example.com",

  "protection_eligibility"=>"Ineligible",
  "transaction_subject"=>"",
  "charset"=>"windows-1252","notify_version"=>"2.9","test_ipn"=>"1",
}

所以你几乎可以在不用等待一天的情况下完成大部分测试。当你认为你已经掌握了它的时候,你将在第二天收到大量的订阅IPN消息。

此外,这里是PayPal的文档链接,供进一步参考。


17
请注意,这两个即时支付通知(IPN)并不保证以任何特定顺序到达 - 您可能会在"subscr_signup" IPN之前收到"subscr_payment" IPN! - Jess Telford
2
我只是想说,“不保证以任何特定顺序到达”这一点再次说明了PayPal开发者的故事有多糟糕。 - Judah Gabriel Himango
当订阅续订时,“custom”字段是否会被重置? - Greeso

8
可以重新发送测试IPN,因此您只需要购买一个订阅来进行测试。 一旦购买了一个订阅,以下是操作步骤:
1.登录PayPal沙盒卖家账户; 2.选择“配置文件”=>“我的销售偏好设置”; 3.从第三列选择“即时付款通知首选项”; 4.确认IPN已启用并且URL正确; 5.单击链接到“IPN历史记录”页面; 6.向下滚动,选中一个或多个IPN并单击“重新发送”。
确认后,所选的IPN将被重新发送到您指定的URL。您可以使用相同的IPN无限次重复。 其他详细信息请参考 @dondo 提供的优秀答案。

7

过去,在测试服务器中,指定为天数的时间段会被视为分钟,因此当指定为“d3”时,您将每3分钟被调用一次。我认为他们已经删除了这个功能,我不知道是否有任何替代功能来测试订阅。


确定他们移除了吗?有链接吗? - Ali
1
是的,你说得对,我已经测试过了,天数和分钟的计算不再起作用了。有趣的是,尽管他们在https://www.paypal.com/en_US/ebook/PP_Sandbox_UserGuide/testing_recurringpayments.html中仍然描述了这个功能。我会等几天看看是否有其他建议。 - Ali
是的,那就是链接。我测试了三天 :) - Remus Rusanu

6

嘿,我想向尼尔喊话,因为那正是我在寻找的内容,而且我没有足够的声望来回复或点赞...

信不信由你,PayPal仍然不方便使用IPN文件进行订阅测试 :/

所以,只是因为我没有在这里看到它,并且原始发布者似乎认为只有两个可能的响应来自Papal--

如果其他人也遇到问题,以下是一些在我的测试中触发了IPN的其他txn_type:

//when paypal subscription profile is created for the subscriber
subscr_signup 

//payment made for a given billing cycle
subscr_payment 

//when subscription fails
subscr_failed 

//user cancels subscription - not
subscr_cancel 

//end of term - paypal is "done" with that subscriber 
subscr_eot 

//why I was looking for this thread to begin with lol
recurring_payment_suspended_due_to_max_failed_payment

今天早上有位测试用户的IPN调用失败。查找相关信息后发现,还可能出现以下错误:

recurring_payment_profile_created

recurring_payment_profile_cancel

recurring_payment_profile_modify

recurring_payment

recurring_payment_skipped

recurring_payment_failed

我不知道我做了什么来获得这个错误,因为在PayPal的眼中,订阅和循环付款在技术上是不同的 (订阅可能永远不会终止,但循环付款对于任何“订阅”,一个人可以进行的总付款有一个上限),但他们的文档也并不总是直接明了的,所以我不知道。因为这是由沙盒商户账户生成的订阅按钮,所以我还在努力弄清楚。

欢乐的头痛 :)

更新: 我刚刚解决了我的问题 - 所以只是为了让它听起来像我知道我在做什么,我会解释一下...

我认为PayPal的订阅沙箱环境正在逐渐消失。 我注意到前几天当我在sandbox.paypal.com上胡闹时,我经常遇到“致命失败”。 刷新页面通常可以纠正这种情况,尽管有时我必须刷新几次才能恢复屏幕。

从他们击中我的IPN文件中我得到了同样的回应,这解释了为什么今天所有的订阅都被暂停了。感谢Neil,我能够重新发送IPN响应并将其捕获到文本文件中(lol),然后我打开IPN文件并读取响应,再将其传递回PayPal(这实际上比我说的要复杂得多)。

无论如何,通过刷新页面,我可以在更多或更少的情况下启动Paypal握手,当我这样做时,它是50/50 - 有时我会得到VERIFIED,有时我会得到致命失败 - 就像在他们的沙箱网站上尝试做任何事情一样(致命失败)。

以下是我从他们那里收到的部分错误响应示例... 我得到了一个200,所以我相信与连接性无关,但我开始看到“致命失败”的模式,并且这指向更多是他们端口的问题而不是我的问题。

HTTP/1.1 200 OK 
Date: Tue, 29 Sep 2015 02:41:00 GMT 
Server: Apache 

Fatal Failure 

感谢 @Rich,稍晚但仍向您致以赞扬 :) - Neil T

0

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