페이팔 IPN에 대해 혼란스럽고 혼란스럽습니다
-
13-12-2019 - |
문제
페이팔 결제에 이 보석을 사용하고 있습니다 https://github.com/tc/paypal_adaptive
나는 이 보석에 대해 매우 혼란스럽고 혼란스럽습니다.문서화가 잘 안 되어 있어서 ipn 응답 시 페이팔에서 데이터를 얻는 방법을 이해하기 어렵습니다.
이 질문이 같은 문제를 겪고 있는 더 많은 사람들에게 도움이 되기를 바랍니다.
내 단계는 다음과 같습니다
1º 내 페이팔로 요청을 보냅니다. orders_controller.rb
preapproval_지불 방법을 사용합니다.
def preapproval_payment
preapproval_request = PaypalAdaptive::Request.new
data = {
"returnUrl" => response_paypal_user_orders_url(current_user),
"cancelUrl"=> cancel_payment_gift_url(@gift),
"requestEnvelope" => {"errorLanguage" => "en_US"},
"senderEmail" => "gift_1342711309_per@gmail.com",
"startingDate" => Time.now,
"endingDate" => Time.now + (60*60*24) * 30,
"currencyCode"=>"USD",
"maxAmountPerPayment" => "@gift.price",
"ipnNotificationUrl" => ipn_notification_url,
"ip" => request.remote_ip
}
preapproval_response = preapproval_request.preapproval(data)
puts data
if preapproval_response.success?
redirect_to preapproval_response.preapproval_paypal_payment_url
else
redirect_to gift_url(@gift), alert: t(".something_was_wrong")
end
end
2º 다음은 명령에서 내 로그 콘솔에 있는 내 요청 데이터입니다. puts data
:
{"returnUrl"=>"http://localhost:3000/en/u/maserranocaceres/orders/response_paypal", "cancelUrl"=>"http://localhost:3000/en/gifts/gift-1/cancel_payment", "requestEnvelope"=>{"errorLanguage"=>"en_US"}, "senderEmail"=>"gift_1342711309_per@gmail.com", "startingDate"=>2012-07-29 13:05:49 +0200, "endingDate"=>2012-08-28 13:05:49 +0200, "currencyCode"=>"USD", "maxAmountPerPayment"=>9, "ipnNotificationUrl"=>"http://localhost:3000/ipn_notification?locale=en", "ip"=>"127.0.0.1"}
3º 페이팔 페이지로 리디렉션되어 페이팔 결제가 성공적으로 이루어졌습니다 :D.
4º 결제가 성공적으로 완료되면 다음 페이지로 이동됩니다.
http://localhost:3000/en/u/maserranocaceres/orders/response_paypal
나는 가지고있다 response_paypal
행동 orders_controller.rb
.GET 액션이고 이 액션에 대한 코드는 다음과 같습니다.
def response_paypal
respond_to do |format|
format.html { redirect_to user_orders_url(current_user), :alert => "works fine return url"}
end
end
지금까지는 모든 것이 잘 작동합니다.
이제 필요한 것은 페이팔로부터 받은 데이터를 가져오고 결제가 성공적으로 처리되면 내 데이터베이스에 새 주문을 저장하는 것입니다.
5º 이 목적을 위해 나는 다음과 같은 파일을 만듭니다. lib/paypal_ipn.rb
그리고 이 파일에 다음의 내용을 추가합니다. https://github.com/tc/paypal_adaptive/blob/master/templates/paypal_ipn.rb
# Allow the metal piece to run in isolation
require(File.dirname(__FILE__) + "/../../config/environment") unless defined?(Rails)
class PaypalIpn
def self.call(env)
if env["PATH_INFO"] =~ /^\/paypal_ipn/
request = Rack::Request.new(env)
params = request.params
ipn = PaypalAdaptive::IpnNotification.new
ipn.send_back(env['rack.request.form_vars'])
if ipn.verified?
#mark transaction as completed in your DB
output = "Verified."
else
output = "Not Verified."
end
[200, {"Content-Type" => "text/html"}, [output]]
else
[404, {"Content-Type" => "text/html"}, ["Not Found"]]
end
end
end
내 경로.rb 나는 다음을 추가한다:
match "/ipn_notification" => PaypalIpn
내 두 가지 문제는 다음과 같습니다
ㅏ) 결제한 후에 이 파일이 실행되는 것을 볼 수 없으며 페이팔에서 얻은 데이터를 내 콘솔에서도 볼 수 없습니다.
비) 내 요청에 포함된 개체 ID를 페이팔로 보내고 싶습니다. @gift
나중에 회복할 수 있도록 paypal_ipn.rb
내 데이터베이스를 저장합니다.
내가 뭘 잘못하고 있으며 어떻게 이러한 문제를 해결할 수 있습니까?
감사합니다
해결책
해당 gem을 사용해본 적은 없지만 이전에 PayPal IPN을 사용한 적이 있습니다.확인해야 할 사항은 다음과 같습니다.
IPN을 사용하도록 PayPal 계정을 설정했습니까?이 기능이 작동하려면 계정에서 이 설정을 활성화해야 합니다.
결제 과정에서 ipn_notification_url을 전달할 때 "/ipn_notification" 경로와 일치하는지 확인하셨나요?
이 기능이 작동하려면 PayPal이 이 앱을 실행하는 서버와 직접 통신할 수 있어야 합니다.이는 일반적으로 동적 DNS 등을 사용하여 로컬 컴퓨터에 사용자 정의 설정이 없는 한 PayPal이 앱과 통신할 수 있도록 실제로 이 코드를 서버에 배포해야 함을 의미합니다.즉, 이것이 실행 중이라면
http://localhost:3000
, 이것은 작동하지 않습니다.
두 번째 질문인 @gift를 복구하여 데이터베이스에 지불된 사실을 기록하는 방법에 답하기 위해 이 gem으로 어떻게 해야 할지 잘 모르겠지만 ActiveMerchant를 사용하여 어떻게 하는지 알려드리겠습니다. - 아마 꽤 비슷할 거예요.
PayPal에 대한 결제 요청 시 송장 번호를 전달할 수 있습니다.나는 그 필드가 "송장"이라고 불린다고 생각합니다.여기서는 선물의 ID를 전달합니다.
PayPal이 IPN을 통해 앱에 주문 결제가 완료되었음을 알리면 인보이스 번호를 다시 전달합니다.이 인보이스 번호를 사용하여 @gift를 검색하면 필요한 작업을 수행할 수 있습니다.
ActiveMerchant gem을 사용하여 작업 중인 PayPal 코드의 관련 부분은 다음과 같습니다. https://gist.github.com/3198178
행운을 빌어요!