2013-10-27 3 views
3

Я пытался настроить свой первый веб-сайт с полосой. Я нашел article, который выглядит как правильный способ сделать это, но 2 года. Я думаю, что он устарел.полоса webhooks для рельсов 4

Вот мой контроллер до сих пор.

class StripewebhooksController < ApplicationController 
    # Set your secret key: remember to change this to your live secret key in production 
    # See your keys here https://manage.stripe.com/account 
    Stripe.api_key = "mytestapikey" 

    require 'json' 

    post '/stripewebhooks' do 
     data = JSON.parse request.body.read, :symbolize_names => true 
     p data 

     puts "Received event with ID: #{data[:id]} Type: #{data[:type]}" 

     # Retrieving the event from the Stripe API guarantees its authenticity 
     event = Stripe::Event.retrieve(data[:id]) 

     # This will send receipts on succesful invoices 
     # You could also send emails on all charge.succeeded events 
     if event.type == 'invoice.payment_succeeded' 
     email_invoice_receipt(event.data.object) 
     end 
    end 
end 

Будет ли это работать правильно и это правильный способ сделать это? Вот полоса documentation.

+0

Лучший способ проверить, чтобы запустить код и посмотреть сами :) – rb512

ответ

4

Я использую Stripe Webhooks в производстве, и это выглядит не совсем правильно. Вы должны сначала определить свой webhook URL в маршрутах, как это:

# config/routes.rb 
MyApp::Application.routes.draw do 
    post 'webhook/receive' 
end 

В этом примере ваш webhook URL будет http://yourapp.com/webhook/receive (это то, что вы даете Stripe). Затем вам понадобится соответствующий контроллер и действие:

class WebhookController < ApplicationController 
    # You need this line or you'll get CSRF/token errors from Rails (because this is a post) 
    skip_before_filter :verify_authenticity_token 

    def receive 
    # I like to save all my webhook events (just in case) 
    # and parse them in the background 
    # If you want to do that, do this 
    event = Event.new({raw_body: request.body.read}) 
    event.save 
    # OR If you'd rather just parse and act 
    # Do something like this 
    raw_body = request.body.read 
    json = JSON.parse raw_body 
    event_type = json['type'] # You most likely need the event type 
    customer_id = json['data']['object']['customer'] # Customer ID is the other main bit of info you need 

    # Do the rest of your business here 

    # Stripe just needs a 200/ok in return 
    render nothing: true 
    end 

end 

Еще одно замечание: каждый веб-сайт, который вы получили, имеет удостоверение личности. Это хорошая практика, чтобы сохранить и проверить на это, чтобы убедиться, что вы не действуете на одном и том же мероприятии более одного раза.

+0

hmmm. Я продолжаю получать ошибку 422 при тестировании веб-узлов. Не могли бы вы помочь привести пример, например, событие, такое как customer.subscription.canceled – Josh

+1

Я продолжаю получать эту ошибку в журналах heroku. JSON :: ParserError (текст JSON должен содержать по крайней мере два октета!): Что это значит? – Josh

Смежные вопросы