有没有一个Facebook Credits的Ruby On Rails gem呢?或者他们的Facebook Credits样本应用程序的Ruby版本?[英] Is there a Facebook Credits Ruby On Rails gem out there yet? Or ruby version of their Facebook Credits sample app?

本文是小编为大家收集整理的关于有没有一个Facebook Credits的Ruby On Rails gem呢?或者他们的Facebook Credits样本应用程序的Ruby版本?的处理方法,想解了有没有一个Facebook Credits的Ruby On Rails gem呢?或者他们的Facebook Credits样本应用程序的Ruby版本?的问题怎么解决?有没有一个Facebook Credits的Ruby On Rails gem呢?或者他们的Facebook Credits样本应用程序的Ruby版本?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我想在我的Facebook应用程序中实现Facebook信用.有人知道Ruby上的Ruby上可用的Facebook Credits示例应用程序吗?有人为此做了宝石吗?如果我找到一个,我会在下面链接...

推荐答案

这是我的代码以FB示例并ret脚:

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上编程的人,我可以远离支持JavaScript知识,在去年大约12周内,再花几周的时间才扔掉一年很好.我说,通过谨慎 - 我发布的代码可能是垃圾...但是它有效: - )

,如果有人真正找到任何有用的答案,那么对答案的投票将不胜感激 - 只是说: - )

本文地址:https://www.itbaoku.cn/post/786417.html