2012-03-09 35 views
19

Tôi biết có một câu hỏi khác tồn tại tương tự như câu hỏi này nhưng tôi không nghĩ rằng nó đã được hỏi/trả lời rất tốt.Sọc Webhook trên Rails

Về cơ bản tôi có ứng dụng đường ray hoạt động nơi người dùng có thể đăng ký đăng ký của tôi, nhập thông tin thẻ tín dụng, v.v. Nhưng tôi cần xử lý tình huống thẻ của người dùng bị từ chối tại một số thời điểm trong thời gian đăng ký định kỳ này.

Các loại sự kiện họ gửi có tại đây: https://stripe.com/docs/api?lang=ruby#event_types.

Tôi đang gặp sự cố khi truy cập đối tượng charge.failed trong ứng dụng của mình.

Tài liệu trên webhook cũng có ở đây: https://stripe.com/docs/webhooks và mọi trợ giúp sẽ được đánh giá cao.

+0

bản sao có thể có của [Sử dụng webhook sọc với Rails] (http://stackoverflow.com/questions/9371566/using-stripe-webhooks-with-rails) – Hauleth

Trả lời

39

Bạn cần tạo bộ điều khiển để về cơ bản chấp nhận và xử lý các yêu cầu. Đó là khá thẳng về phía trước, mặc dù không phải là thẳng về phía trước để quấn tâm trí của bạn xung quanh ban đầu. Dưới đây là ví dụ về hook_controller.rb của tôi:

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 

Trình nhận def là chế độ xem bạn phải trỏ webhook vào giao diện sọc. Khung nhìn nhận được json và tôi đang sử dụng nó để cập nhật hồ sơ của người dùng trong trường hợp thanh toán thất bại hoặc thành công.

+0

Tốt đẹp !! Tôi nghĩ bạn nói đúng, ban đầu nó hơi đáng sợ nhưng một khi tôi nhận ra nó không phải là vấn đề lớn. Bộ điều khiển của tôi thực sự trông hơi giống thế này (mặc dù không đẹp lắm). Cảm ơn! – Zach

+2

Rất hữu ích! FYI kết quả của phân tích cú pháp JSON không phải là một băm không quan tâm, vì vậy bạn có thể muốn làm event_json = JSON :: parse (request.body.read) .with_indifferent_access thay thế. – runako

+10

Để thực hành [bảo mật] tốt nhất, hãy sử dụng id sự kiện ('data_json ['id']') để truy xuất đối tượng Stripe :: Event, và sau đó lấy dữ liệu từ đó vì nó chắc chắn là legit. - Như đã nêu trên [trang tham khảo về webhooks của Stripe] (https://stripe.com/docs/webhooks). – anxiety

0

Đây là một ít hơn lý tưởng tình hình thử nghiệm ...

sọc cần một cách để "ép" webhooks cho mục đích thử nghiệm. Hiện tại, đăng ký ngắn nhất bạn có thể thực hiện là trong 1 tuần (ở chế độ thử nghiệm); nó sẽ hữu ích hơn nhiều nếu bạn có thể đặt nó trong 1 phút, 1 giờ hoặc thậm chí đơn giản là gây ra gọi lại trong thời gian thực, vì vậy bạn có thể kiểm tra hệ thống phản hồi API của mình.

Kiểm tra cục bộ rất tuyệt, nhưng không có gì thay thế thế giới thực, trực tiếp, qua internet, webhook/callbacks. Phải đợi một tuần (!) Làm chậm nghiêm trọng các dự án.

+0

Ngày nay, tối thiểu là 1 ngày nhưng vẫn đồng ý với bạn. – Francisco

Các vấn đề liên quan