9

ユーザーが定期的な支払いをサブスクライブできるようにしたい(エクスプレスチェックアウトAPIを使用)ユーザーがサブスクライブした直後に最初の支払いを請求する必要があり、アクセスを許可する前に、正常に請求されたことを確認する必要があります。

これを行う簡単な方法はありますか?

INITAMTセットを使用して定期支払いプロファイルを作成しようとしましたが、ユーザーに請求が行われていること(サンドボックスを使用している場合)が明確ではなく、請求が行われていることを示唆するtxn_id(または同等のもの)が返されていません行われて。IPNの確認は得られますが、プロファイルの作成後「しばらく」かかるため、優れたユーザーエクスペリエンスを提供することは困難です。

1回限りの支払いを追加し、DoExpressCheckoutPaymentで認証してから、1回限りの支払いが機能する場合は定期的なプロファイルを設定しようとしましたが、認証も失敗し、この時点で諦めました(まだいくつかあるかもしれませんが)このアプローチの脚)。

とにかく、ここの専門家に聞いてみようと思いました。定期的な支払いを設定する簡単な方法はありますか?月に1回の支払い、最初の支払いはnow()で請求され、IPN確認メッセージを不明な時間待つことなくAPIを介して最初の支払いを確認しますか?

4

4 に答える 4

12

これは必要に応じて行うことができます。私はそれをテストしましたが、機能します。重要なのは、同じエクスプレスチェックアウトフローを使用して、標準のデジタル商品支払いと定期支払いの両方を処理する必要があることです。つまり、ユーザーは1回限りの支払いと、サブスクリプションの承認を求められます。あなたは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」を処理します。

これで、1回限りの支払い用のトランザクションIDと、定期的な支払い用のプロファイルIDの両方が必要になります。

于 2014-05-07T09:04:18.750 に答える
3

INITAMTを使用して最初の支払いを処理するという最初のオプションに固執しますが、FAILEDINITAMTACTIONをCancelOnFailureに設定します。

このように、最初の支払いが成功しなかった場合、プロファイルはすぐにアクティブではなく一時停止ステータスに設定されます。

次に、ログインシステム内、またはサブスクライバーコンテンツを保護するために使用しているものを使用して、GetRecurringPaymentsProfileDetailsを使用してサブスクリプションプロファイルの現在のステータスを取得できます。「アクティブ」以外の場合は、それに応じてユーザーにメッセージを送信し、コンテンツへのアクセスを拒否できます。

于 2012-11-27T07:30:30.663 に答える
2

プロファイルが最初に作成されると、PayPalは「recurring_payment_profile_created」という名前のIPNを送信します。このIPNには、フィールド「initial_payment_txn_id」が含まれています。GetTransactionDetailsを使用して、このIDを検索し、そのトランザクションが完了したかどうかを判断できます。そのトランザクションのIPNが送信された場合(関連する場合)にコードが二重に出荷されないように、そのトランザクションIDを処理済みとしてマークするようにしてください。この例は、IPNリスナー(PayPalの公式Merchant SDK gemに対してRubyで記述されたもの)でこれにアプローチする方法に似ています。

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時間の遅延を受け入れることです。現在、Paypalの代替手段として、Google CheckoutとBraintreeの支払いを調査しているため、Paypalから移行できます。

于 2012-11-29T18:55:06.123 に答える