paypal验证第一笔付款或initamt是经常性付款

时间:2012-11-26 15:32:59

标签: paypal subscription recurring-billing

我希望我的用户能够订阅定期付款(使用快速结帐api) 第一笔付款需要立即向用户订阅,我需要知道他们已经成功收费,然后才能授予他们访问权限。

有没有直接的方法来做到这一点?

我已经尝试过,使用INITAMT设置创建定期付款资料,但是,目前尚不清楚用户是否需要付费(使用沙箱时),并且没有返回建议的txn_id(或等效内容)结算已完成。我确实获得了IPN确认,但是在创建配置文件后“一段时间”,这使得很难提供出色的用户体验。

我尝试添加一次性付款,使用DoExpressCheckoutPayment验证,然后设置定期付款,如果一次性付款有效,但身份验证也失败了,此时我放弃了(尽管可能在这种方法中仍然是一些腿)。

无论如何,我想我会问这里的专家。是否有一种简单的方法来设置定期付款,每月一次付款,现在首次付款()并通过API确认第一笔付款,而无需等待一段未知的时间来收到IPN确认消息?

4 个答案:

答案 0 :(得分:12)

这可以按照您的要求来完成,我已经测试了它并且它可以正常工作。关键是您需要使用相同的快速结账流程处理标准数字商品付款以及定期付款,即用户将被要求支付一次性费用以及批准订阅。你想要设置s

  1. 按照说明设置付款:https://developer.paypal.com/webapps/developer/docs/classic/express-checkout/ht_ec-basicDigGoodsPayment-curl-etc/

  2. 添加为定期付款指定的字段: https://developer.paypal.com/webapps/developer/docs/classic/express-checkout/ht_ec-recurringPaymentProfile-curl-etc/

  3. 处理'DoExpressCheckoutPayment',如果成功,'CreateRecurringPaymentsProfile'的开始日期为您的第一个'续订'日期。

  4. 您现在应该同时拥有一次性付款的交易ID,以及定期付款的个人资料ID。

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:2)

首次创建个人资料时,PayPal会发送名为“recurring_payment_profile_created”的IPN。该IPN包含字段“initial_payment_txn_id”。您可以使用GetTransactionDetails查找此ID并确定该事务是否已完成。确保将该事务ID标记为已处理,以便在发送该事务的IPN时(如果与您相关),您的代码不会重复发送。这个例子类似于我们在IPN监听器中处理这个问题的方法(用Ruby编写PayPal's official Merchant SDK gem):

case params[:txn_type]
  when 'recurring_payment_profile_created'
    # The profile has been created.  Perform any action, if necessary...

    initial_txn = params[:initial_payment_txn_id]
    return if ProcessedTransaction.exists?(initial_txn)

    request = api.build_get_transaction_details({
        :TransactionID => initial_txn
    })

    resp = api.get_transaction_details(request)
    if resp.success? and resp.PaymentTransactionDetails.PaymentInfo.PaymentStatus == 'Completed'
        # The initial payment is completed, perform the action...
        # Add this ID to your ProcessedTransaction table so you don't double-process...
    end
  # other 'when' statements for other transaction types, etc go here
end

答案 3 :(得分:1)

我找到的唯一解决方案(这是差的)是接受最多24小时的延迟,通知第一个月的订阅已被收费。我们现在正在调查Google Checkout和braintree付款作为paypal的替代品,以便我们可以远离它。