【问题标题】:Hash message Rails哈希消息 Rails
【发布时间】:2018-07-17 22:08:02
【问题描述】:

我在将我的 Rails 应用程序链接到 Paybox(通过一家法国银行)时遇到问题。

技术支持表示问题可能来自我发送给他们的哈希消息(通过表单)。但是他们对Ruby一无所知,所以他们不能保证任何事情。

也许你们中的一些人会发现不对劲?

方法如下:

def paiement
    @commande = Commande.find_by(code: params[:id])

    @confirmation_url = ENV['PBX_EFFECTUE'].gsub('CODE_COMMANDE', @commande.code)
    @annulation_url = ENV['PBX_ANNULE'].gsub('CODE_COMMANDE', @commande.code)
    @refus_url = ENV['PBX_REFUSE'].gsub('CODE_COMMANDE', @commande.code)

    @current_time = Time.now.strftime('%FT%T%:z')

    msg = {
      PBX_SITE: "#{ENV['PBX_SITE']}",
      PBX_RANG: "#{ENV['PBX_RANG']}",
      PBX_IDENTIFIANT: "#{ENV['PBX_IDENTIFIANT']}",
      PBX_TOTAL: "#{@commande.total_price_centimes}",
      PBX_DEVISE: "978",
      PBX_CMD: "#{@commande.code}",
      PBX_PORTEUR: "#{current_user.email}",
      PBX_REPONDRE_A: "#{ENV['PBX_REPONDRE_A']}",
      PBX_RETOUR: "#{ENV['PBX_RETOUR']}",
      PBX_EFFECTUE: "#{@confirmation_url}",
      PBX_ANNULE: "#{@annulation_url}",
      PBX_REFUSE: "#{@refus_url}",
      PBX_HASH: "SHA512",
      PBX_TIME: "#{@current_time}"
    }

    key = ENV['CLE_HMAC']
    binKey = [key].pack('H*')

    digest = OpenSSL::Digest.new('sha512')
    @signature = OpenSSL::HMAC.hexdigest(digest, binKey, msg.keys.map{|k,v| "#{k}=#{v}"}.join('&')).upcase
    #binding.pry
  end

形式:

<form method="POST" action="<%= ENV['CREDIT_AGRICOLE_URL'] %>" id="paiement-form">
  <input type="hidden" name="PBX_SITE" value="<%= ENV['PBX_SITE'] %>">
  <input type="hidden" name="PBX_RANG" value="<%= ENV['PBX_RANG'] %>">
  <input type="hidden" name="PBX_IDENTIFIANT" value="<%= ENV['PBX_IDENTIFIANT'] %>">
  <input type="hidden" name="PBX_TOTAL" value="<%= @commande.total_price_centimes %>">
  <input type="hidden" name="PBX_DEVISE" value="978">
  <input type="hidden" name="PBX_CMD" value="<%= @commande.code %>">
  <input type="hidden" name="PBX_PORTEUR" value="<%= ENV['PBX_PORTEUR'] %>">
  <input type="hidden" name="PBX_REPONDRE_A" value="<%= ENV['PBX_REPONDRE_A'] %>">
  <input type="hidden" name="PBX_RETOUR" value="<%= ENV['PBX_RETOUR'] %>">
  <input type="hidden" name="PBX_EFFECTUE" value="<%= @confirmation_url %>">
  <input type="hidden" name="PBX_ANNULE" value="<%= @annulation_url %>">
  <input type="hidden" name="PBX_REFUSE" value="<%= @refus_url %>">
  <input type="hidden" name="PBX_HASH" value="SHA512">
  <input type="hidden" name="PBX_TIME" value="<%= @current_time %>">
  <input type="hidden" name="PBX_HMAC" value="<%= @signature %>">
  <input type="submit" value="Envoyer">
</form>

paiement 动作被触发的地方:

<div class="cmd-actions">
    <%= form_for @commande, {url: commande_path(@commande.code)} do |f| %>
      <div class="recap-commande-container">
        <div class="etape">
          <div>3</div>
          <h1>Récapitulatif et paiement de votre commande</h1>
        </div>
        <%= render partial: 'line_items_table', locals: {recap_commande: @commande} %>
      </div>
      <div id="secured-paiement">
        <div>
          <h3>Choisissez votre mode de paiement :</h3>
        </div>
        <div class="secured-paiement-logo">
          <div class="paiement-row">
            <div class="input-radio">
              <%= radio_button_tag("commande[methode_paiement]", 'carte_bancaire', {onchange: 'methode(1)', data: {a: "carte_bancaire"}, id: 'carte_bancaire'}) %>
            </div>
            <div class="input-img">
              <%= image_tag('logo/ca-e-transactions', style: 'width: 170px;height: 40px') %>
              <%= image_tag('logo/mastercard', style: 'width: 50px;height: 40px') %>
              <%= image_tag('logo/visa', style: 'width: 50px;height: 40px') %>
              <%= image_tag('logo/cb', style: 'width: 50px;height: 40px') %>
            </div>
          </div>
          <div class="paiement-row" style="margin-top: 20px;">
            <div class="input-radio">
              <%= radio_button_tag("commande[methode_paiement]", 'le_pot_commun', {onchange: 'methode(2)', data: {a: "le_pot_commun"}, id: 'le_pot_commun'}) %>
            </div>
            <div class="input-img">
              <%= image_tag('logo/pot-commun') %>
            </div>
          </div>
        </div>
      </div>
      <div id="proceed-actions">
        <div id="cgv">
          <%= check_box_tag "cgv" %>
          <label>J'accepte les <%= link_to "conditions générales de vente", conditions_generales_de_vente_path, style: 'color:black', target: 'blank' %></label>
        </div>
      </div>
      <div class="commander-link" id="paiement-cmd-btn">
        <%= f.submit "Payer ma commande" %>
      </div>
    <% end %>
  </div>

表单应该重定向到https://preprod-tpeweb.paybox.com/cgi/MYchoix_pagepaiement.cgi,这就是它的作用。但在同一页面上,我收到以下错误消息:“Problème d'identification du commerce。Accès refusé !” ('身份验证问题。访问被拒绝!')。

这个问题和这个有关:Ruby HMAC signing issue

有什么想法吗?

【问题讨论】:

  • 本地语言的代码库真的很奇怪。 paiement 操作何时触发?
  • @apneadiving 你可以看看我编辑的帖子:)

标签: ruby-on-rails ruby hmac ruby-hash


【解决方案1】:

对于我使用的日期

 @date_time = Time.now.iso8601

创建 Hmac:

bin_key = Array(keyTest).pack 'H*'
@hmac = OpenSSL::HMAC.hexdigest("SHA512", bin_key, data).upcase

您的密钥也需要在生成后激活。

【讨论】:

  • 我已经尝试过使用您的代码,但它仍然无法正常工作.. :(
【解决方案2】:

通常使用 HMAC 签名,密钥在签名之前先按字母顺序排序。如果您正在迭代 Hash 键/值对,那么迭代顺序在很大程度上是不确定的(或者至少应该这样对待)。

尝试首先对您的键进行排序:

msg.keys.sort.map{|k| "#{k}=#{msg[k]}"}

【讨论】:

    【解决方案3】:

    您似乎在从哈希中收集数据时打错了。您目前使用:

    msg.keys.map { |k,v| "#{k}=#{v}" }.join('&')
    

    但是通过在散列上调用 #keys,你会得到一个只有键的数组。

    我猜你是想打字

    msg.map { |k,v| "#{k}=#{v}" }.join('&')
    

    否则你会丢失值并且v总是nil

    【讨论】:

    • 感谢 Johan,但不幸的是它也没有解决问题... :(
    猜你喜欢
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 2012-03-26
    • 2016-04-20
    相关资源
    最近更新 更多