سؤال

أنا أستخدم هذه الجوهرة للمدفوعات في باي بال https://github.com/tc/paypal_adaptive

أنا في حيرة من أمري ومشوشة مع هذه الجوهرة.إنه موثق بشكل سيئ ومن الصعب بالنسبة لي أن أفهم كيفية الحصول على البيانات من paypal عند استجابة ipn.

آمل أن يساعد هذا السؤال المزيد من الأشخاص الذين يعانون من نفس المشكلة.

خطواتي هي:

أرسل طلبًا إلى 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

هذه هي بيانات طلبي في وحدة تحكم السجل الخاصة بي من الأمر 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"}

قمت بإعادة التوجيه إلى صفحة paypal، وقمت بالدفع على paypal بنجاح:D.

عند إتمام عملية الدفع بنجاح، يتم توجيهي إلى:

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 وحفظ قاعدة البيانات الخاصة بي في طلب جديد إذا تمت معالجة الدفع بنجاح.

ولهذا الغرض، أقوم بإنشاء ملف بتنسيق 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 من قبل.إليك بعض الأشياء التي يجب عليك التحقق منها:

  1. هل قمت بإعداد حساب PayPal الخاص بك لاستخدام IPN؟يجب عليك تمكين هذا الإعداد على الحساب حتى يعمل هذا.

  2. هل تأكدت من أنه عند تمرير ipn_notification_url أثناء عملية الدفع، فإنه يطابق مسار "/ipn_notification" الخاص بك؟

  3. لكي ينجح هذا، يجب أن يكون PayPal قادرًا على الاتصال مباشرة بالخادم الذي يقوم بتشغيل هذا التطبيق.هذا يعني أنه عادةً، ما لم يكن لديك إعداد مخصص على جهازك المحلي باستخدام DNS ديناميكي أو شيء من هذا القبيل، فسوف تحتاج إلى نشر هذا الرمز فعليًا على خادم حتى يتمكن PayPal من التواصل مع تطبيقك.وبعبارة أخرى، إذا كان هذا قيد التشغيل http://localhost:3000, ، هذا لن يعمل.

للإجابة على سؤالك الثاني، كيفية استرداد @gift لتسجيل حقيقة أنه تم دفعه في قاعدة البيانات الخاصة بك، لست متأكدًا تمامًا من كيفية القيام بذلك باستخدام هذه الجوهرة، لكنني سأخبرك كيف أفعل ذلك باستخدام ActiveMerchant - ربما يكون مشابهًا تمامًا.

  1. في طلب الدفع الخاص بك إلى PayPal، يمكنك تمرير رقم الفاتورة.أعتقد أن الحقل يسمى "الفاتورة" فقط.هنا سوف تقوم بتمرير معرف الهدية.

  2. عندما يقوم PayPal بإعلام تطبيقك عبر IPN بأن الطلب قد تم دفع ثمنه، فإنه سيعيد رقم الفاتورة إليك.استرجع @gift باستخدام رقم الفاتورة هذا ومن ثم يمكنك القيام بما تحتاجه به.

فيما يلي الأجزاء ذات الصلة من رمز PayPal العامل الخاص بي، باستخدام جوهرة ActiveMerchant: https://Gist.github.com/3198178

حظ سعيد!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top