Je finis par publier ce plugin cybermut que j'ai sous le coude depuis un moment, et que j'ai enfin utilisé en production

script/plugin install http://svn.immateriel.fr/cybermut/trunk

Le README:

Basé sur le gem paypal et sur le code de Yann KLIS

Dans environment.rb:

Cybermut::Confirmation.action_url = "https://ssl.paiement.cic-banques.fr/test/paiement.cgi"
Cybermut::Confirmation.hmac_sha1_key = "SHA1_KEY"
Cybermut::Confirmation.hmac_sha1_pass = "SHA1_PASS"

Dans la vue:

cybermut_setup(no_commande, montant, tpe, options)

Exemple:

<%=  cybermut_form_tag %>
<%= cybermut_setup("order10", 100, "123456",'societe'=>"nomsociete", 'url_retour_ok'=>"http://site/paiement_ok", 'url_retour_err'=>"http://site/paiement_erreur") %>
<%= submit_tag "Payer maintenant"%>
</form>

La validation:

def validate_cybermut_order
  if request.raw_post
    confirmation=Cybermut::Confirmation.new(request.raw_post)
    # verification que la commande existe dans la base
    if Order.exists?(confirmation.reference)
      @order=Order.find(confirmation.reference)
      # verification de la validité du message du serveur cybermut
      if confirmation.acknowledge
        # verification du total
        if @order.total == confirmation.montant_euros
          @order.validation
          logger.info "CYBERMUT: order #{@order.id} is OK"
        else
          logger.info "CYBERMUT: order #{@order.id} FAILS with data problem"
        end
      else
        logger.info "CYBERMUT: order #{@order.id} FAILS with validation
      end
    else
      logger.info "CYBERMUT: order #{confirmation.reference} FAILS not found"
    end
  end
  render :text=>confirmation.response
end

Limitations : Pas de support d'une autre monnaie que l'euro