いくつかの言語の公式コード サンプルがありますが、Rails のコード サンプルは見つかりませんでした。
7 に答える
ここに、Rails コントローラーの実際のコード サンプルを投稿します。検証を行います。役に立つことを願っています。
class PaymentNotificationsController < ApplicationController
protect_from_forgery :except => [:create] #Otherwise the request from PayPal wouldn't make it to the controller
def create
response = validate_IPN_notification(request.raw_post)
case response
when "VERIFIED"
# check that paymentStatus=Completed
# check that txnId has not been previously processed
# check that receiverEmail is your Primary PayPal email
# check that paymentAmount/paymentCurrency are correct
# process payment
when "INVALID"
# log for investigation
else
# error
end
render :nothing => true
end
protected
def validate_IPN_notification(raw)
live = 'https://ipnpb.paypal.com/cgi-bin'
sandbox = 'https://ipnpb.sandbox.paypal.com/cgi-bin'
uri = URI.parse(sandbox + '/webscr?cmd=_notify-validate')
http = Net::HTTP.new(uri.host, uri.port)
http.open_timeout = 60
http.read_timeout = 60
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
http.use_ssl = true
response = http.post(uri.request_uri, raw,
'Content-Length' => "#{raw.size}",
'User-Agent' => "My custom user agent"
).body
end
end
コードはRailscast 142と、 Tanel Suurhansによるこの投稿に触発されています。
PayPal の Ruby Merchant SDK は、ipn_valid?
これを非常に簡単にするブール メソッドを提供します。
def notify
@api = PayPal::SDK::Merchant.new
if @api.ipn_valid?(request.raw_post) # return true or false
# params contains the data
end
end
https://github.com/paypal/merchant-sdk-ruby/blob/master/samples/IPN-README.md
IPNジェム
DWilke の Paypal IPN gem は次の場所にあります。
https://github.com/dwilkie/paypal
IPN モジュールを確認してください。素敵なコードです:
https://github.com/dwilkie/paypal/blob/master/lib/paypal/ipn/ipn.rb
シミュレーターに対するテスト
ここで IPN シミュレーターに対してテストできます。
https://developer.paypal.com/webapps/developer/applications/ipn_simulator
ngrok を使用して、パブリック URL で localhost:3000 を公開し、シミュレーターをそこに向けます。
Paypal の IPNなど、複数のゲートウェイの実装を含むActiveMerchant gem をご覧ください。
HTH
プロジェクトの 1 つで IPN を実装しましたが、コードは問題なく見えます。それで、あなたが直面している問題は何ですか?
これを行うだけで、ipn の詳細を取得できます。結果には、確認済みかどうかが表示されます。body からすべての詳細を取得できます
post '/english/ipn' do
url = " https://sandbox.paypal.com/cgi-bin/webscr?cmd=_notify-validate {@query}"
本文 = request.body.string
結果 = RestClient.post URL、本文
終わり