paypal verifying first payment or initamt was billed in recurring payment

微笑、不失礼 提交于 2019-12-03 00:02:59

This can be done as you require, I've tested it and it works. The key is that you need to process both a standard digital goods payment as well as a recurring payment using the same Express Checkout flow, i.e. The user will be asked to pay a once-off, as well as approve a subscription. You would want to set the s

  1. Follow the instructions for setting up the payment: https://developer.paypal.com/webapps/developer/docs/classic/express-checkout/ht_ec-basicDigGoodsPayment-curl-etc/

  2. Add the fields specified for recurring payment: https://developer.paypal.com/webapps/developer/docs/classic/express-checkout/ht_ec-recurringPaymentProfile-curl-etc/

  3. Process 'DoExpressCheckoutPayment' and if successful, 'CreateRecurringPaymentsProfile' with a start date of your first 'renewal' date.

You should now have both transaction id for the one-off payment, as well as a profile id for the recurring payment.

I would stick to your first option of using INITAMT to process the first payment, but set FAILEDINITAMTACTION to CancelOnFailure.

This way, if the initial payment is not successful, the profile will immediatly be set to Suspended status instead of Active.

Then, within your login system or whatever you're using to protect your subscriber content, you can use GetRecurringPaymentsProfileDetails to obtain the current status of the subscription profile. If it's anything other than "Active" you can give the user a message accordingly and deny them access to the content.

When the profile is first created, PayPal sends an IPN named "recurring_payment_profile_created". This IPN contains a field "initial_payment_txn_id". You can use GetTransactionDetails to look up this ID and determine whether that transaction is Completed. Ensure that you mark that transaction ID as processed so that your code doesn't double-ship if/when the IPN for that transaction is sent (if that is relevant to you). This example is similar to how we approach this in our IPN listener (written in Ruby against 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

The only solution I've found (which is poor) is to accept up to a 24 hour delay in being notified that the first month's subscription has been billed. We're now investigating Google checkout and braintree payments as alternatives to paypal so we can migrate away from it.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!