1

外部Webサイトにリクエストを送信し、サイトへのコールバックを含むjson urlレスポンスを返す単純なRailsアプリを作成して、Railsアプリにレスポンスを通知します。json url のサンプルはhttps://voguepay.com/?v_transaction_id=demo-1345109950&type=json次のとおりで、応答本文は次のとおりです。

{"merchant_id":"demo","transaction_id":"demo-1345109950","email":"testuser@buyerdomain.com","total":"10","total_paid_by_buyer":"10.00","total_credited_to_merchant":"9.90","extra_charges_by_merchant":"0.00","merchant_ref":"","memo":"Donation of N10 to Test User","status":"Approved","date":"2012-01-01 11:39:11","referrer":"http:\/\/sellerdomain.com\/buy_now.html","method":"VoguePay","fund_maturity":"2012-01-03"}

この応答を Rails メソッドに変換して、クエリを作成するために必要な属性を簡単に取得できるようにしたいと考えています。たとえば、応答本文から次のようなアクションを作成する必要があります。

def notify
  response = Json.parse('https://voguepay.com/?v_transaction_id=demo-1345109950&type=json').body
  response.status
  response.date
  response.merchant_id
  response.total
end

上記のコードは、私が達成したいことを説明するための単なるサンプルです。どんな助けでも素晴らしいでしょう。

typhoeusyajl-ruby の両方の gem を試しましたが、リクエストが来ると、すべての認証方法が削除され、csrf メタ トークンを認証できないというエラー メッセージが表示され続けます。スキップしても、現在のユーザーは自動的にサインアウトされます(デバイス認証を使用)。使用したコード サンプルは次のとおりです。

class NotificationsController < ApplicationController
  skip_before_filter :verify_authenticity_token

  def notify
      @transaction_id = params[:transaction_id]
      do_notify
  end

  private
  def do_notify
    hydra = Typhoeus::Hydra.new
    request = Typhoeus::Request.new("https://voguepay.com/?v_transaction_id=#{@transaction_id}&type=json")
    request.on_complete do |response|
        logger.info("#{response.request.url} in #{response.time} seconds")  #remove in production to avoid huge logs
              transaction = Yajl::Parser.parse(response.body)  #or Yajl::Parser.parse(response.body)

              #Now we have the following keys in our transaction hash  you can do whatever
              transaction[:merchant_id]
              transaction[:transaction_id]
              transaction[:email]
              transaction[:total]
              transaction[:merchant_ref]
              transaction[:memo]
              transaction[:status]
              transaction[:date]
              transaction[:referrer]
              transaction[:method]
              @plan = Plan.find_by_id(transaction[:merchant_ref])
              if(transaction[:total] == 0)
                logger.error "Invalid total for transaction:#{@transaction_id}"
                 #do not subscribe the user or generate invoice, notify user of error n cancel order
              elsif(transaction[:status] != 'Approved')
                logger.error "Failed transaction for transaction:#{@transaction_id}"
                 #do not subscribe the user or generate invoice, notify user of error n cancel order
              elsif(transaction[:total] >= @plan.naira_price.to_s)
                current_user.award_user_credits(@plan.hjc.to_i)
              end            
    end
    hydra.queue(request)
    hydra.run
  end
end

もう、私は宝石を使いたくないので、csrf メタ トークンが影響を受けないかどうかを手動で確認したいと考えています。したがって、これをどのように達成できるかについてのアイデアは素晴らしいでしょう。Rails 3.2.9 を使用しています。

ありがとうございました!

4

1 に答える 1

6

できるよ:

def notify
  response = JSON('https://voguepay.com/?v_transaction_id=demo-1345109950&type=json').body
 response["status"]
 response["date"]
 response["merchant_id"]
 response["total"]
end    
于 2012-12-05T13:39:13.723 に答える