الخلط والارتباك مع باي بال IPN
-
13-12-2019 - |
سؤال
أنا أستخدم هذه الجوهرة للمدفوعات في باي بال https://github.com/tc/paypal_adaptive
أنا في حيرة من أمري ومشوشة مع هذه الجوهرة.إنه موثق بشكل سيئ ومن الصعب بالنسبة لي أن أفهم كيفية الحصول على البيانات من paypal عند استجابة ipn.
آمل أن يساعد هذا السؤال المزيد من الأشخاص الذين يعانون من نفس المشكلة.
خطواتي هي:
1º أرسل طلبًا إلى paypal من حسابي orders_controller.rb
مع طريقة الدفع المسبق.
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º قمت بإعادة التوجيه إلى صفحة paypal، وقمت بالدفع على paypal بنجاح: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
حتى هذه اللحظة كل شيء يعمل بشكل جيد.
الآن ما أحتاجه هو الحصول على البيانات التي تلقيتها من paypal وحفظ قاعدة البيانات الخاصة بي في طلب جديد إذا تمت معالجة الدفع بنجاح.
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
مشكلتي 2 هي:
أ) لا أرى أنه بعد إجراء الدفع سيتم فصل هذا الملف ولا أستطيع رؤية البيانات التي أحصل عليها من paypal في وحدة التحكم الخاصة بي.
ب) أريد أن أرسل إلى باي بال في طلبي، معرف الكائن @gift
لتكون قادرة على التعافي في وقت لاحق paypal_ipn.rb
ولحفظ قاعدة البيانات الخاصة بي.
ما الخطأ الذي أفعله وكيف يمكنني حل هذه المشاكل؟
شكرًا لك
المحلول
لم أستخدم هذه الجوهرة، لكني استخدمت PayPal IPN من قبل.إليك بعض الأشياء التي يجب عليك التحقق منها:
هل قمت بإعداد حساب PayPal الخاص بك لاستخدام IPN؟يجب عليك تمكين هذا الإعداد على الحساب حتى يعمل هذا.
هل تأكدت من أنه عند تمرير ipn_notification_url أثناء عملية الدفع، فإنه يطابق مسار "/ipn_notification" الخاص بك؟
لكي ينجح هذا، يجب أن يكون PayPal قادرًا على الاتصال مباشرة بالخادم الذي يقوم بتشغيل هذا التطبيق.هذا يعني أنه عادةً، ما لم يكن لديك إعداد مخصص على جهازك المحلي باستخدام DNS ديناميكي أو شيء من هذا القبيل، فسوف تحتاج إلى نشر هذا الرمز فعليًا على خادم حتى يتمكن PayPal من التواصل مع تطبيقك.وبعبارة أخرى، إذا كان هذا قيد التشغيل
http://localhost:3000
, ، هذا لن يعمل.
للإجابة على سؤالك الثاني، كيفية استرداد @gift لتسجيل حقيقة أنه تم دفعه في قاعدة البيانات الخاصة بك، لست متأكدًا تمامًا من كيفية القيام بذلك باستخدام هذه الجوهرة، لكنني سأخبرك كيف أفعل ذلك باستخدام ActiveMerchant - ربما يكون مشابهًا تمامًا.
في طلب الدفع الخاص بك إلى PayPal، يمكنك تمرير رقم الفاتورة.أعتقد أن الحقل يسمى "الفاتورة" فقط.هنا سوف تقوم بتمرير معرف الهدية.
عندما يقوم PayPal بإعلام تطبيقك عبر IPN بأن الطلب قد تم دفع ثمنه، فإنه سيعيد رقم الفاتورة إليك.استرجع @gift باستخدام رقم الفاتورة هذا ومن ثم يمكنك القيام بما تحتاجه به.
فيما يلي الأجزاء ذات الصلة من رمز PayPal العامل الخاص بي، باستخدام جوهرة ActiveMerchant: https://Gist.github.com/3198178
حظ سعيد!