Integração: Entendendo a comunicação

Este guia o conduzirá através do processo de integração do WALK Server com um sistema de autorização hospedado na internet

Este guia o conduziu através do processo de integração do WALK Server com um sistema de autorização feito em Sinatra, hospedado na internet.

O próximo passo é entender como o WALK Server e o autorizador trocam informações.

Autorizador exemplo

1. WALK Server submete um post ao autorizador

O WALK Server recebe a transação do terminal POS, formata o pacote de dados e submete uma requisição post ao autorizador.

Note que o WALK Server delimita as informações do pacote de dados com vírgula

Entenda o formato do pacote de dados

2. Autorizador retorna a resposta para o WALK Server

O trecho de código abaixo (feito em Sinatra) é responsável por duas ações:

  1. Processar o recebimento de dados do WALK Server

  2. Retornar para o WALK Server o resultado da operação

post '*' do
    inf = params[:buffer].split(',')

    if inf[2] == "1"
        return "<pagina_retorno>\"msg=Venda: R$ #{(inf[3].to_f)/100}\""
    end

    if inf[2] == "2"
        return "<pagina_retorno>\"msg=Saldo: R$ 10.44\""
    end

    return "<pagina_retorno>\"msg=Opcao Invalida\""
end

Observe que na segunda linha, a variável inf recebe o conteúdo do parâmetro buffer, enviado pelo WALK Server.

O comando split é utilizado para que a variável inf se transforme em um Array, e dessa forma, os dados enviados pelo WALK Server (separados por vírgula) podem ser lidos separadamente.

3. WALK Server retorna a página para o terminal POS

Assim que o WALK Server recebe a resposta do autorizador, este envia a página formatada para o terminal POS.

Observe que no trecho de código POSXML abaixo, é definido uma página chamada pagina_retorno, e que esta utiliza uma variável chamada msg, que é exatamente o que o autorizador está retornando.

    <pagina nome="pagina_retorno">
        <display coluna="0" linha="0" mensagem="** PLATAFORMA WALK **" />
        <display coluna="0" linha="2" mensagem="[msg]" />
        
        <esperatecla />
    </pagina>
</aplicativoposxml>

Autorizador em outras linguagens

O mesmo código do autorizador exemplo (feito em Sinatra) pode ser feito na linguagem de programação do seu interesse. Segue abaixo alguns exemplos em outras linguagens:

ASP (classic)

<%
    If ISNull(Request.QueryString("buffer")) Then
        Response.Write("Buffer não informado")
        Response.End()
    End If

    inf = split(Request.QueryString("buffer"), ",")

    If inf(2) = "1" Then
        valor = FormatCurrency(inf(3) / 100)
        Response.Write("<pagina_retorno>""msg=Venda: " & valor & """")
        Response.End()
    End If

    If inf(2) = "2" Then
        valor = FormatCurrency(10.44)
        Response.Write("<pagina_retorno>""msg=Saldo: " & valor & """")
        Response.End()
    End If

    Response.Write("<pagina_retorno>""msg=Opcao Invalida""")
%>

ASP.NET (C#)

<%@ Page Language="C#" ValidateRequest="false" %>
 
<script runat="server">
 
protected void Page_Load(object sender, EventArgs e){
    if (Request.Params["buffer"] == null){
        Response.Write("Buffer não informado");
        Response.End();
    }

    string[] inf = Request.Params["buffer"].Split(',');

    if (inf[2] == "1"){
        double valor = Convert.ToDouble(inf[3]) / (double)100;
        Response.Write(string.Format("<pagina_retorno> \"msg=Venda: {0:c}\"", valor));
        Response.End();
    }

    if (inf[2] == "2"){
        Response.Write(string.Format("<pagina_retorno> \"msg=Saldo: {0:c}\"", 10.44));
        Response.End();
    }

    Response.Write("<pagina_retorno> \"msg=Opcao Invalida\"");
}
 
</script>

ASP.NET (VB)

<%@ Page Language="VB" ValidateRequest="false" %>
 
<script runat="server">

Protected  Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
    If Request.Params("buffer") Is Nothing Then
        Response.Write("Buffer não informado")
        Response.End()
    End If

    Dim inf() As String = Request.Params("buffer").Split(",")

    If inf(2) = "1" Then
        Dim valor As Double =  Convert.ToDouble(inf(3)) / 100 
        Response.Write(String.Format("<pagina_retorno>""msg=Venda: {0:c}""", valor))
        Response.End()
    End If

    If inf(2) = "2" Then
        Response.Write(String.Format("<pagina_retorno>""msg=Saldo: {0:c}""", 123.44))
        Response.End()
    End If

    Response.Write("<pagina_retorno>""msg=Opcao Invalida""")
End Sub
 
</script>

Ruby on Rails

class AuthController < ApplicationController
    def index
        if params[:buffer].nil?
            return render :text => "Buffer não informado"
        end

        inf = params[:buffer].split(',')

        if inf[2] == "1"
            return render :text => "<pagina_retorno>\"msg=Venda: R$ #{(inf[3].to_f)/100}\""
        end

        if inf[2] == "2"
            return render :text => "<pagina_retorno>\"msg=Saldo: R$ 10.44\""
        end

        render :text => "<pagina_retorno>\"msg=Opcao Invalida\""

    end
end

PHP

<?php
    if ($_GET["buffer"] == null){
        print("Buffer não informado");
        return;
    }

    $inf = explode(',',$_GET["buffer"]);

    if ($inf[2] == "1"){
        $valor = floatval($inf[3]) / 100;
        print("<pagina_retorno>\"msg=Venda: R$ " . $valor . "\"");
        return;
    }
 
    if ($inf[2] == "2"){
        print("<pagina_retorno>\"msg=Saldo: R$ 10.44\"");
        return;
    }

    print("<pagina_retorno>\"msg=Opcao Invalida\"");
?>

JSP

<%
    if(request.getParameter("buffer") == null){
        out.print("Buffer não informado");
        return;
    }

    String[] inf = request.getParameter("buffer").split(",");

    if(inf[2].equals("1")) {
        String valor = String.valueOf(Double.parseDouble(inf[3]) / 100);
        out.print("<pagina_retorno>\"msg=Venda: R$ " + valor + "\"");
        return;
    }

    if(inf[2].equals("2")) {
        out.print("<pagina_retorno>\"msg=Saldo: R$ 10.44\"");
        return;
    }

    out.print("<pagina_retorno> \"msg=Opcao Invalida\"");
%>