2011-01-28 3 views
13

Я хочу реализовать Facebook Credits в своем приложении для Facebook. Кто-нибудь знает о версии приложения для образцов Facebook Credits, доступного в Ruby on Rails? Кто-нибудь сделал камень для этого еще? Если я найду один я ссылку ниже ...Есть ли еще Facebook Credits Ruby On Rails? Или рубиновая версия своего приложения для Facebook Credits?

+2

Хорошо, поэтому у меня есть версия Ruby On Rails, поэтому я скоро отправлю ее копию, если кому-то это интересно. Тогда, может быть, я посмотрю, чтобы это сделать, если это кажется разумным. –

+1

Эй, Ричард, вы когда-нибудь публиковали копию своего рабочего приложения Rails Facebook? Мне интересно разобраться. Благодаря! – Tim

+0

Нет Тим, извините, полностью забыл. Я доберусь до него на этой неделе. Если вы не видите его здесь, просто сообщите мне прямо. –

ответ

14

Вот мой код, на примере FB и RORing его:

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 

Тогда в дополнение к этому есть:

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 

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

Посмотреть код, связанный с просьбой:

#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 
     }); 

Теперь все это исходит от человека, который сел и научился программы в Ruby On Rails с минимальным количеством поддерживающих Javascript-знаний, поскольку я могу уйти, примерно за 12 недель в прошлом году, а еще несколько недель были выброшены в этом году для хорошей оценки. Я говорю, что с осторожностью - код, который я опубликовал, может быть мусором ... но он работает :-)

И если кто-нибудь действительно найдет что-либо из этого полезного, ГОЛОСОВАНИЕ на ответ будет оценено - просто sayin ':-)

+0

hai .. Мне нравится использовать facebook credits api для моих рельсов 3 приложения. Можно также поделиться кодами просмотров. Чтобы я понял, как начинается поток. –

+0

Привет - Я с удовольствием поделюсь с кем-нибудь из этого :-) ... Мне нужно будет выкопать то, что я сделал во взглядах (не работая над этим приложением в данный момент), поэтому, пожалуйста, будьте терпеливы, и я буду пост ... альтернативно, не стесняйтесь сообщать мне прямо здесь и преследовать меня за код :-) ... R –

+0

обязательно ... ждет вашего кода. Заранее спасибо за вашу помощь –