2011-01-28 16 views
13

Tôi muốn triển khai Facebook Credits trong ứng dụng Facebook của mình. Có ai biết về một phiên bản của ứng dụng mẫu Facebook Credits có sẵn trong Ruby on Rails không? Có ai đã làm một viên ngọc cho điều này chưa? Nếu tôi tìm thấy một tôi sẽ liên kết dưới đây ...Có một Facebook Credits Ruby On Rails gem chưa? Hoặc phiên bản ruby ​​của ứng dụng mẫu Facebook Credits của họ?

+2

Được rồi vì vậy tôi có phiên bản Ruby On Rails hoạt động, vì vậy tôi sẽ đăng một bản sao của nó ở đây ngay nếu có ai quan tâm. Sau đó, có lẽ tôi sẽ xem xét để đá quý nó, nếu điều đó có vẻ hợp lý. –

+1

Hey Richard, bạn đã bao giờ đăng một bản sao ứng dụng Rails Facebook của bạn đang hoạt động chưa? Tôi thích xem nó hơn. Cảm ơn! – Tim

+0

Không Tim, xin lỗi, hoàn toàn quên. Tôi sẽ đến tuần này. Nếu bạn không nhìn thấy nó ở đây ngay lập tức chỉ cần nhắn tin cho tôi trực tiếp. –

Trả lời

14

Dưới đây là mã của tôi lấy ví dụ FB và RORing nó:

require 'facebook_signed_request.rb' 

class FacebookCreditsController < ApplicationController 

skip_before_filter :verify_authenticity_token 
layout nil 

    def index 
    facebook_request = FacebookSignedRequest.new(request.params['signed_request']) 
    data = { "content" => {} } 
    # handle invalid request 
    if !facebook_request.valid? 
     return 
    end 

    signed_request = facebook_request.signed_request 

    # handle invalid signed request 
    if signed_request.nil? 
     return 
    end 

    method = request.params['method'] 

    order_id = request.params['order_id'] 

    # second state response from facebook 
    if method == 'payments_status_update' 
     status = request.params['status'] 

     if status == 'placed' 
     next_state = 'settled' 
     data['content']['status'] = next_state 
     elsif status == 'settled' 
     redirect_to '/lots' 
     return 
     end 

     # compose returning data array_change_key_case 
     data['content']['order_id'] = order_id 

    # first stage response from facebook 
    elsif method == 'payments_get_items' 

     order_info = request.params['order_info'] 

     item = JSON.parse(order_info) 
     item['price'] = item['price'].to_i 

     # for url fields, if not prefixed by http://, prefix them 
     url_key = [ 'product_url', 'image_url' ] 
     url_key.each do |key| 
     if item[key][0..6] != 'http://' 
      item[key] = "http://#{item[key]}" 
     end 
     end 

     # if payload['test_mode'] 
     if request.params['test_mode'] 
     update_keys = ['title', 'description'] 
     update_keys.each do |key| 
      item[key] = '[Test Mode] ' + item[key] 
     end 
     end 

     data['content'] = [item] 
    end 

    data['method'] = method 

    render :json => data 
    end 

end 

Sau đó, thêm vào này có:

require 'base64' 
require 'json' 
require 'openssl' 

class FacebookSignedRequest 

    attr_reader :signed_request 

    def initialize(signed_request) 
    @signed_request = signed_request 
    end 

    def base64_url_decode str 
    encoded_str = str.gsub('-','+').gsub('_','/') 
    encoded_str += '=' while !(encoded_str.size % 4).zero? 
    Base64.decode64(encoded_str) 
    end 

    def valid? 
    # TODO: move it to some configuration 
    secret = " << my secret is here >>" 

    # decode data 
    encoded_sig, payload = signed_request.split('.') 
    sig = base64_url_decode(encoded_sig).unpack("H*")[0] 
    data = JSON.parse base64_url_decode(payload) 

    if data['algorithm'].to_s.upcase != 'HMAC-SHA256' 
    # Rails.logger.error 'Unknown algorithm. Expected HMAC-SHA256' 
     return false 
    end 

    #check sig 
    expected_sig = OpenSSL::HMAC.hexdigest('sha256', secret, payload) 
    if expected_sig != sig 
    # Rails.logger.error 'Bad Signed JSON signature!' 
     return false 
    end 

    data 
    end 

Tôi không biết nếu điều này giúp bất cứ ai khác, nhưng tất cả đều làm việc cho tôi. Xin lỗi vì dùng quá lâu để nhớ để trở lại và gửi mã làm việc của tôi ...

Xem related code theo yêu cầu:

#view 
<%= javascript_include_tag "premium_signup" %> 
<script type="text/javascript"> 
    $(document).ready(function() { 
     $('#premium_signup_button').click(function() { 
      signupAsPremiumMember('Premium Membership', 'Create unlimited auctions with no extra charge at all for 1 year.', "1", '', ''); 
     }); 
    }); 
</script> 
... 
<button id="premium_signup_button">Signup as a premium member</button> 

#premium_signup.js 
function signupAsPremiumMember(title, desc, price, imageURL, productURL) { 
var order_info = { 
    "title": title, 
    "description": desc, 
    "price": price, 
    "image_url": imageURL, 
    "product_url": productURL 
}; 

var payload = { 
    "method": 'pay', 
    "order_info": order_info, 
    "purchase_type": 'item' 
}; 

console.log(FB.ui(payload, facebookPurchaseCompletionCallback)); 
} 

function facebookPurchaseCompletionCallback(data) { 
    if (data['order_id']) { 
     console.log(data['order_id']); 
    } 
    else if (data['error_code']) { 
     console.log(data['error_code']); 
    } 
    else { 
     console.log("failed"); 
    } 
} 

#in the layout 
#in head 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 
<script src="http://connect.facebook.net/en_US/all.js"></script> 
<%= javascript_include_tag 'application' %> 
#in body 
    <div id="fb-root"></div> 
    <script> 
     FB.init({ 
     appId : '############', 
     status : true, // check login status 
     cookie : true, // enable cookies to allow the server to access the session 
     xfbml : true // parse XFBML 
     }); 

Bây giờ tất cả những điều này xuất phát từ một anh chàng ngồi xuống và học cách chương trình trong Ruby On Rails với ít kiến ​​thức Javascript hỗ trợ như tôi có thể nhận được, trong khoảng 12 tuần năm ngoái với một vài tuần nữa ném trong năm nay cho biện pháp tốt. Tôi nói rằng bằng cách thận trọng - mã tôi đã đăng có thể là rác ... nhưng nó hoạt động :-)

Và nếu bất kỳ ai thực sự tìm thấy bất kỳ câu trả lời hữu ích nào trên câu trả lời này sẽ được đánh giá cao - chỉ sayin ':-)

+0

hai .. Tôi thích sử dụng các khoản tín dụng facebook api cho ứng dụng đường ray 3 của tôi. Cũng có thể chia sẻ mã của lượt xem. Để tôi có thể hiểu được dòng chảy bắt đầu như thế nào. –

+0

Xin chào - Tôi rất sẵn lòng chia sẻ bất kỳ điều gì :-) ... Tôi sẽ phải tìm hiểu những gì tôi đã làm trong các lượt xem (không hoạt động trên ứng dụng này vào lúc này) vì vậy hãy kiên nhẫn và tôi sẽ bài ... thay thế cảm thấy tự do để nhắn tin cho tôi trực tiếp trên đây và đuổi theo tôi cho mã :-) ... R –

+0

chắc chắn ... đang chờ mã của bạn. Cảm ơn trước cho sự giúp đỡ của bạn –

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