paypal验证首次付款或初始金额是否在定期付款中记账

paypal验证首次付款或初始金额是否在定期付款中记账,paypal,subscription,recurring-billing,Paypal,Subscription,Recurring Billing,我希望我的用户能够订阅定期付款(使用express checkout api) 第一笔付款需要在用户订阅后立即计费,我需要在授予他们访问权限之前知道他们已成功计费 有没有直截了当的方法 我已经尝试过,用INITAMT集创建一个定期支付配置文件,但是,不清楚用户是否正在计费(使用沙箱时),并且没有返回txn_id(或等效的)来表示计费已经完成。我确实得到了IPN的确认,但这是在创建概要文件之后的“一段时间”,这使得很难提供良好的用户体验 我尝试添加一次性付款,使用DoExpressCheckout

我希望我的用户能够订阅定期付款(使用express checkout api) 第一笔付款需要在用户订阅后立即计费,我需要在授予他们访问权限之前知道他们已成功计费

有没有直截了当的方法

我已经尝试过,用INITAMT集创建一个定期支付配置文件,但是,不清楚用户是否正在计费(使用沙箱时),并且没有返回txn_id(或等效的)来表示计费已经完成。我确实得到了IPN的确认,但这是在创建概要文件之后的“一段时间”,这使得很难提供良好的用户体验

我尝试添加一次性付款,使用DoExpressCheckoutPayment进行验证,然后在一次性付款有效的情况下设置定期配置文件,但是验证也失败,在这一点上我放弃了(尽管这种方法可能还有一些不足之处)


不管怎样,我想我应该问问这里的专家。是否有一种简单的方法可以设置定期付款、每月一次付款、第一次付款立即计费()并通过API确认第一次付款,而无需等待未知的IPN确认消息时间

我将坚持使用INITAMT处理第一笔付款的第一个选项,但将FailedItamAction设置为CancelOnFailure

这样,如果初始付款不成功,配置文件将立即设置为暂停状态,而不是活动状态


然后,在您的登录系统内或您用来保护订户内容的任何东西中,您可以使用来获取订阅配置文件的当前状态。如果不是“活动”,您可以相应地向用户发送一条消息,并拒绝他们访问内容。

我发现的唯一解决方案(这很糟糕)是接受最多24小时的延迟通知,即第一个月的订阅已计费。我们现在正在调查谷歌结帐和braintree支付作为paypal的替代方案,以便我们可以从中迁移出去

首次创建配置文件时,PayPal会发送一个名为“定期付款配置文件创建”的IPN。此IPN包含一个字段“初始付款txn\U id”。您可以使用GetTransactionDetails查找此ID并确定该事务是否已完成。确保将该事务ID标记为已处理,以便在发送该事务的IPN时(如果与您相关),代码不会双重发送。这个例子类似于我们在IPN侦听器(用Ruby编写)中的做法:

case参数[:txn_类型]
“定期付款\创建个人资料”时
#配置文件已创建。如有必要,执行任何操作。。。
initial_txn=参数[:initial_payment_txn_id]
如果ProcessedTransaction.存在,则返回?(初始\u txn)
请求=api.build\u get\u事务\u详细信息({
:TransactionID=>initial\u txn
})
resp=api.get\u事务详细信息(请求)
如果成功?和resp.PaymentTransactionDetails.PaymentInfo.PaymentStatus==“已完成”
#初始付款完成后,执行操作。。。
#将此ID添加到ProcessedTransaction表中,以避免重复处理。。。
结束
#其他交易类型的其他“何时”语句,请点击此处
结束

这可以根据您的需要完成,我已经测试过了,它可以正常工作。关键在于,您需要使用相同的快速结账流程处理标准数字商品付款和定期付款,即要求用户一次性付款,以及批准订阅。您可能想设置s

  • 按照设置付款的说明进行操作:

  • 添加为定期付款指定的字段:

  • 处理“DoExpressCheckoutPayment”,如果成功,则处理“CreateRecurringPaymentsProfile”,开始日期为您的第一个“续订”日期


  • 您现在应该拥有一次性付款的交易id和定期付款的配置文件id。

    您好,安德鲁,谢谢,我使用INITAMT时遇到的问题是,配置文件状态经常(实际上几乎总是)设置为挂起,并且(我假设)Paypal正在等待支付金额。这让我不得不说,感谢你订阅了“将来某个时候”的服务,我正试图避免这种情况。但我不敢相信“立即向用户支付第一个月的账单并确认”的用例不受支持?正如我所说,如果付款失败,使用FailedItamAction和CancelOnFailure将其设置为Suspended而不是Pending。如果它工作,它将立即被激活。多年来,我一直在我的USBSwiper网站上使用定期付款,我一直采用这种方法,没有任何问题。奇怪的是,它不适合我。无论CancelOnFailure如何,它都返回为挂起。我认为pending意味着Paypal还没有尝试支付初始金额,因此它不可能失败(如果你明白我的意思的话)。@Andrew OK这很奇怪,这是我看到你第二次说同样的话,但这与其他人的帖子相矛盾。您是否调试了CreateRecurringPaymentsProfile立即返回活动状态的工作流?个人资料对我来说总是需要1分钟以上才能更改,我甚至在paypal定期付款页面上查看,我必须查看您的请求并尝试重现您的问题。我已经使用定期付款多年了,我立即得到了活动的配置文件。要详细说明,只需添加
    L\u BILLINGTYPE0=RecurringPayments
    L\u BILLINGAGREEMENTDESCRIPTION0=[插入您的描述]
    与准备
    DoExpressCheckoutPayment
    API调用时包含的
    SetExpressCheckout
    参数相同。然后您可以首先调用
    DoExpressCheckoutPayment