2012-03-09 17 views
19

मुझे पता है कि एक और सवाल है जो इस तरह के समान है लेकिन मुझे नहीं लगता कि यह बहुत अच्छी तरह से पूछा गया/उत्तर दिया गया।रेल पर स्ट्रिप वेबहूक

असल में मेरे पास एक कामकाजी रेल ऐप है जहां उपयोगकर्ता मेरी सदस्यता के लिए साइन अप कर सकते हैं, क्रेडिट कार्ड की जानकारी दर्ज कर सकते हैं आदि। यह सब काम कर रहा है। लेकिन मुझे इस आवर्ती सदस्यता के दौरान किसी बिंदु पर किसी उपयोगकर्ता का कार्ड अस्वीकार करने की स्थिति को संभालने की आवश्यकता है।

वे जो घटनाएं भेजते हैं वे यहां हैं: https://stripe.com/docs/api?lang=ruby#event_types

मुझे अपने ऐप में चार्ज.फेल ऑब्जेक्ट तक पहुंचने में परेशानी हो रही है।

वेबहुक पर दस्तावेज़ यहां भी हैं: https://stripe.com/docs/webhooks, और किसी भी मदद की बहुत सराहना की जाएगी।

+0

संभावित डुप्लिकेट [रेल के साथ स्ट्रिप वेबहुक का उपयोग करके] (http://stackoverflow.com/questions/9371566/using-stripe-webhooks-with-rails) – Hauleth

उत्तर

39

आपको अनुरोधों को मूल रूप से स्वीकार करने और संभालने के लिए नियंत्रक बनाने की आवश्यकता है। यह बहुत सीधे आगे है, हालांकि शुरुआत में अपने दिमाग को लपेटने के लिए सीधे आगे नहीं है। यहाँ मेरी hooks_controller.rb का एक उदाहरण है:

class HooksController < ApplicationController 
    require 'json' 

    Stripe.api_key = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 

    def receiver 

    data_json = JSON.parse request.body.read 

    p data_json['data']['object']['customer'] 

    if data_json[:type] == "invoice.payment_succeeded" 
     make_active(data_event) 
    end 

    if data_json[:type] == "invoice.payment_failed" 
     make_inactive(data_event) 
    end 
    end 

    def make_active(data_event) 
    @profile = Profile.find(User.find_by_stripe_customer_token(data['data']['object']['customer']).profile) 
    if @profile.payment_received == false 
     @profile.payment_received = true 
     @profile.save! 
    end 
    end 

    def make_inactive(data_event) 
    @profile = Profile.find(User.find_by_stripe_customer_token(data['data']['object']['customer']).profile) 
    if @profile.payment_received == true 
     @profile.payment_received = false 
     @profile.save! 
    end 
    end 
end 

डीईएफ़ रिसीवर दृश्य आपको धारी इंटरफेस पर करने के लिए webhooks बात करने के लिए होता है। दृश्य जेसन प्राप्त करता है, और जब मैं भुगतान विफल रहता है या सफल होता है तो मैं उपयोगकर्ता की प्रोफ़ाइल को अपडेट करने के लिए इसका उपयोग कर रहा हूं।

+0

अच्छा !! मुझे लगता है कि आप सही हैं, शुरुआत में थोड़ा डरावना था लेकिन एक बार जब मैंने इसे समझ लिया तो यह कोई बड़ा सौदा नहीं था। मेरे नियंत्रक वास्तव में इस तरह कुछ देखा (हालांकि सुंदर के रूप में नहीं)। धन्यवाद! – Zach

+2

बहुत उपयोगी! एफवाईआई जेएसओएन पार्स का परिणाम उदासीन हैश नहीं है, इसलिए आप event_json = JSON :: parse (request.body.read) .with_indifferent_access को इसके बजाय करना चाहते हैं। – runako

+10

सर्वोत्तम [सुरक्षा] अभ्यास के लिए, स्ट्रिप :: ईवेंट ऑब्जेक्ट को पुनर्प्राप्त करने के लिए इवेंट आईडी ('data_json ['id']') का उपयोग करें, और फिर उस से डेटा को पकड़ लें क्योंकि यह निश्चित रूप से वैध है। - जैसा कि [स्ट्रिप के वेबहुक संदर्भ पृष्ठ] पर बताया गया है (https://stripe.com/docs/webhooks)। – anxiety

0

यह एक आदर्श से कम परीक्षण स्थिति है ...

धारी परीक्षण प्रयोजनों के लिए एक तरह से करने के लिए "शक्ति" webhooks की जरूरत है। वर्तमान में, सबसे छोटी सदस्यता जो आप कर सकते हैं वह 1 सप्ताह (परीक्षण मोड में) है; यदि आप इसे 1 मिनट, 1 घंटा के लिए सेट कर सकते हैं, या यहां तक ​​कि बस रीयलटाइम में कॉलबैक होने का कारण बनते हैं, तो यह अधिक उपयोगी होगा, ताकि आप अपने एपीआई प्रतिक्रिया प्रणाली का परीक्षण कर सकें।

स्थानीय परीक्षण बहुत अच्छे हैं, लेकिन कुछ भी वास्तविक दुनिया, लाइव, इंटरनेट पर, वेबहुक/कॉलबैक को प्रतिस्थापित नहीं करता है। एक सप्ताह (!) का इंतजार करना गंभीर रूप से परियोजनाओं को धीमा कर देता है।

+0

आजकल, न्यूनतम 1 दिन है लेकिन फिर भी आपसे सहमत हैं। – Francisco

संबंधित मुद्दे