Paypal Adaptiveがこれを進める方法のようです。ここに私が見つけたいくつかのドキュメントがあります。
Rails 3 による PayPal 対応
いつものように、PayPal のドキュメントはかなりごちゃごちゃしていて整理されていないので、どうやって PayPal Adaptive をマーケットプレイス スタイルの Web サイトで動作させることができたかをドキュメントにしようと思いました。
警告!
Paypal API が Rails アプリに接続する方法については、この投稿をガイドとして使用してください。以下のコメントで Jamesw が指摘しているように、私は各トランザクションのすべての詳細を記録する適切な方法を作成していません。間違いなく法律で義務付けられているもの。ですから、これを読んだ後、彼のコメントを見てください。うまくいけば、これを行う方法を考え出すことができます
設定
いくつか検索した結果、現在使用するのに最適な gem はpaypal_adaptiveであることがわかりました。ActiveMerchant は現在 PayPal Adaptive をサポートしていません (それを追加する gem がありますが、維持されていないようです)。
# Gemfile
gem 'paypal_adaptive'
使い方
PayPal Adaptive は比較的単純ですが、ドキュメントが煩雑なため、難しそうに見える場合があります。簡単に言えば、これは私がそれをした方法です:
- config フォルダーに paypal_adaptive.yml を作成し、詳細を追加します。
- 支払いを処理するリソースを作成する – 「購入」リソースを作成しました (モデル: 購入)
- ユーザーが購入ボタンをクリックすると、 PurchasesController で「buy」と呼ばれるアクションが呼び出されます
- 「購入」アクションでは、最初に新しい購入アイテム (Purchase.new) を作成し、次に user_id、product_id、金額などの詳細を追加します。
- 次に、新しく作成した Purchase オブジェクト (purchase.pay) で「pay」というモデル メソッドを呼び出します。
- Purchase モデルで「pay」メソッドを定義し、その中で最後に Request クラス (PaypalAdaptive::Request.new) を作成して、paypal_adaptive gem を利用します。
- PayPal に発送するために必要なすべてのデータをハッシュに追加し、Request.pay メソッドを呼び出して、そのデータのハッシュを渡します。これにより PayPal への API 呼び出しが行われ、PayPal はこのリクエストが成功したことを確認する応答を返します。
- API 呼び出しが成功した場合、ユーザーを PayPal にリダイレクトしてサインインし、支払いを確認します。
- ユーザーが支払いを行うと、PayPal は指定された IPN アドレスに IPN (即時支払い通知) を送信します。これは PurchasesController のメソッドにルーティングされます。
- このメソッドでは、 Purchase オブジェクトを見つけて支払い済みとしてマークし (purchase.paid = true)、それで完了です!
paypal_adaptive.yml
ここに移動して、サンドボックス アカウントを作成します (必要になります)。ログインしたら、「事前設定されたアカウントを作成する」に進みます。2 つのアカウントを作成します。1 つは購入者で、もう 1 つは販売者です。連鎖または並行支払い (複数の人に分割される支払い) を使用している場合は、さらにいくつかのアカウントを作成します。
左側のパネルで [Api Credentials] をクリックします。
これらの資格情報を使用して、paypal_adaptive.yml に入力します (以下で提供する application_id も使用します。これは、www.x.com が提供するテスト用の application_id です)。
development:
environment: "sandbox"
username: "platts_xxxxxxxx_biz_api1.gmail.com"
password: "xxxxxxxxxxxx"
signature: "xxxxxxx"
application_id: "APP-80W284485P519543T"
test:
environment: "sandbox"
username: "platts_xxxxxxxx_biz_api1.gmail.com"
password: "xxxxxxxx"
signature: "xxxxxxxx"
application_id: "APP-80W284485P519543T"
production:
environment: "production"
username: "my_production_username"
password: "my_production_password"
signature: "my_production_signature"
application_id: "my_production_app_id"
購入リクエストを処理するコントローラー アクションを作成する
ここで本当に必要なのは、支払う金額と、そのお金を送りたいメールのリストだけです。ロジックを書いてそれを解決し、PayPal に電話して購入をセットアップします。
pay_request = PaypalAdaptive::Request.new
data = {
"returnUrl" => return_url,
"requestEnvelope" => {"errorLanguage" => "en_US"},
"currencyCode" => "USD",
"receiverList" =>
{ "receiver" => [
{"email" => "platts_xxxxxxxx_biz@gmail.com", "amount"=> amount}
]},
"cancelUrl" => cancel_url,
"actionType" => "PAY",
"ipnNotificationUrl" => ipn_url
}
#To do chained payments, just add a primary boolean flag:{“receiver”=> [{"email"=>"PRIMARY", "amount"=>"100.00", "primary" => true}, {"email"=>"OTHER", "amount"=>"75.00", "primary" => false}]}
pay_response = pay_request.pay(data)
if pay_response.success?
# Send user to paypal
redirect_to pay_response.approve_paypal_payment_url
else
puts pay_response.errors.first['message']
redirect_to "/", notice: "Something went wrong. Please contact support."
end
IPN 通話の処理
IPN コールを PayPal から次のメソッドにルーティングします。
def ipn_notification
ipn = PaypalAdaptive::IpnNotification.new
ipn.send_back(request.raw_post)
if ipn.verified?
logger.info "IT WORKED"
else
logger.info "IT DIDNT WORK"
end
render nothing: true
end
残念ながら、localhost を使用している場合、PayPal は IPN を送信できないため、このプロセス全体をテストするには問題があります。Ryan Bates の解決策は、curl を使用して IPN 要求を模倣することです。ただし、上記のコードでわかるように、IPN が本物であることを確認する別のリクエストを PayPal に送信します。そのため、curl が偽の IPN を送信しても、問題が発生します。今から解決策を探しに行きますが、何かアイデアがあればコメントしてください。