9

我希望我的用户能够订阅定期付款(使用快速结帐 api) 第一次付款需要在用户订阅后立即计费,并且我需要在授予他们访问权限之前知道他们已经成功计费。

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

我已经尝试过创建一个带有 INITAMT 集的定期付款配置文件,但是,不清楚是否正在向用户收费(使用沙箱时),并且没有返回 txn_id(或等效项)以表明计费已已完成。我确实收到了 IPN 确认,但是在创建配置文件后“一段时间”会出现,这使得很难提供出色的用户体验。

我尝试添加一次性付款,使用 DoExpressCheckoutPayment 对其进行身份验证,然后在一次性付款有效时设置定期配置文件,但是身份验证也失败了,此时我已经放弃了(尽管可能还有一些这种方法中的腿)。

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

4

4 回答 4

12

这可以根据您的需要完成,我已经对其进行了测试并且可以正常工作。关键是您需要使用相同的 Express Checkout 流程同时处理标准数字商品付款和经常性付款,即要求用户一次性付款并批准订阅。你会想要设置 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”,开始日期为您的第一个“续订”日期。

您现在应该拥有一次性付款的交易 ID,以及定期付款的配置文件 ID。

于 2014-05-07T09:04:18.750 回答
3

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

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

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

于 2012-11-27T07:30:30.663 回答
2

首次创建配置文件时,PayPal 会发送一个名为“recurring_payment_profile_created”的 IPN。此 IPN 包含一个字段“initial_payment_txn_id”。您可以使用 GetTransactionDetails 来查找此 ID 并确定该事务是否已完成。确保您将该交易 ID 标记为已处理,以便您的代码在发送该交易的 IPN 时不会重复发送(如果这与您相关)。这个例子类似于我们在 IPN 监听器中的处理方式(用 Ruby 编写,针对PayPal 的官方 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
于 2013-05-03T09:40:49.687 回答
1

我发现的唯一解决方案(很差)是接受最多 24 小时延迟通知第一个月的订阅已计费。我们现在正在研究 Google checkout 和 Braintree Payments 作为 paypal 的替代品,以便我们可以摆脱它。

于 2012-11-29T18:55:06.123 回答