Sinatra e pagamento com código QR (exemplo completo)

O exemplo abaixo demonstra o uso de códigos QR para pagamentos no Sinatra. Ele usa duas soluções possíveis ao mesmo tempo (descritas nos comentários). O primeiro (usando a imagem do código QR) é provavelmente mais universal, o segundo (usando o código QR em forma de mesa) é provavelmente mais leve (apenas uma sensação). No segundo caso, é necessário passar a variável do código QR para a visualização do modelo (mais difícil quando se usa o design modular). Isso às vezes pode criar problemas e precisa de mais invenção.

Aplicativo:

#!/usr/bin/env ruby

require
'sinatra'
require
'sinatra/reloader' if development? # sinatra-contrib gem for reloading
require
'rspayd' # for generating the SPAYD string
require
'rqrcode' # for generating the QR code from string
require
'rqrcode_png' # for saving the code as img file

# setting the public folder location
set
:public_folder, 'public'

get
'/' do
# generating the string of SPAYD (Short Payment Descriptor) with rspayd gem
@payment = Rspayd::CzechPayment.generate_string(
:accountPrefix => '6607', # typical for Czech banks
:accountNumber => '112336511',
:bankCode => '0800',
:amount => 130.00,
:vs => "323232",
:message => "Global domain payment"
)
# QR code generated with rqrcode gem, using the SPAYD code generated above
# for longer string it is needed to use bigger QR code sizes! default is 4
@qr = RQRCode::QRCode.new(@payment, size: 10)
# using the code for generating png with rqrcode_png gem
png
= @qr.to_img
# resizing and saving the image file
png
.resize(200, 200).save("./public/qr-test.png")
img
= @qr.to_img
erb
:index
end

__END__

Modelo (aqui o inline):

@@index
<!doctype html>
<html>
<head>
<title>QR code test</title>
</head>
<body>
<p>QR code test (image form via rqrcode_png)</p>

<img src="qr-test.png">

<!-- When needing to recolorize that, it is possible via rewriting
values
in the rqrcode_png/lib/rqrcode_png/image.rb and qrcode_extensions.rb,
(not sure the exact relationship between the bg_color included in both of them;
however
, replacing the values works perfectly) -->

<!-- Here we can do another thing, it is possible to
generate the code like a table
. Nice solution ready for
recoloring the code
! Custom resizing possible via td width/height values -->

<style type="text/css">

table
{
border
-width: 0;
border
-style: none;
border
-color: #0000ff;
border
-collapse: collapse;
}

td
{
border
-width: 0;
border
-style: none;
border
-color: #0000ff;
border
-collapse: collapse;
padding
: 0;
margin
: 0;
width
: 3px;
height
: 3px;
}

td
.black { background-color: #73033D; }
td
.white { background-color: #ffffff; }

</style>

<p>QR code test (simple table)

<table>
<% @qr.modules.each_index do |x| %>
<tr>
<% @qr.modules.each_index do |y| %>
<% if @qr.dark?(x,y) %>
<td class="black" />
<% else %>
<td class="white" />
<% end %>
<% end %>
</tr>
<% end %>
</table>
</body>
</html>