por Cesar Cassiano Schimanco

Tratamento de retorno MoIP (NASP) em ASP.NET / C# (Atualizado)

O NASP (Notificação de Alteração de Status de Pagamento) é uma forma automatizada de notificação de pagamentos, onde a MoIP envia dados de um pagamento realizado para uma das páginas de sua aplicação.

Nota: Após criar esta página, cadastre a URL no site do MoIP/Sandbox.
Meus Dados > Preferências > Notificação das Transações. Marque a opção Receber notificação instantânea de venda e digite a URL da pagina no campo URL de notificação.

Após processar qualquer transação. O MoIP envia um POST para sua URL com os parâmetros abaixo.
 

Parâmetro enviado Descrição Tipo Tamanho Maxímo Exemplo
 id_transacao Identificador da transação informado por você para
controle em seu site (IdProprio)
 Alfanumérico  32  abcd1234
 valor  Valor total do pagamento, sem vírgulas, com casas decimais
(veja exemplo para R$21,90)
 Numérico inteiro  9  2490
 status_pagamento  Codigo informando o status atual da transação Numérico inteiro  2  3
 cod_moip  Código da transação no ambiente MoIP. Valor único
gerado pelo MoIP para cada pagamento.
Alfanumérico  32  Daw4es-1wq2.341234
 forma_pagamento  Codigo informando a forma de pagamento escolhida pelo pagador  Numérico inteiro  2  1
 tipo_pagamento  Tipo de pagamento utilizado, descritivo, em formato de texto  Alfanumérico  32  CartaoDeCredito
 email_consumidor  E-mail informado pelo pagador, no MoIP  Alfanumérico  45  [email protected]

 
Abaixo segue mais duas listas detalhadas com status das transações e tipos de pagamento.

Status das transações MoIP  (Atenção, o MoIP constuma criar Status novos sem notificar os desenvolvedores)

Status Código Descrição
autorizado 1 Pagamento já foi realizado porém ainda não foi creditado na Carteira MoIP recebedora (devido ao floating da forma de pagamento)
iniciado 2 Pagamento está sendo realizado ou janela do navegador foi fechada (pagamento abandonado)
boleto impresso 3 Boleto foi impresso e ainda não foi pago
concluido 4 Pagamento já foi realizado e dinheiro já foi creditado na Carteira MoIP recebedora
cancelado 5 Pagamento foi cancelado pelo pagador, instituição de pagamento, MoIP ou recebedor antes de ser concluído
em análise 6 Pagamento foi realizado com cartão de crédito e autorizado, porém está em análise pela Equipe MoIP. Não existe garantia de que será concluído
estornado 7 Pagamento foi estornado pelo pagador, recebedor, instituição de pagamento ou MoIP
em revisão 8 Pagamento está em revisão pela equipe de Disputa ou por Chargeback
reeembolsado 9 Pagamento foi reembolsado diretamente para a carteira MoIP do pagador pelo recebedor do pagamento ou pelo MoIP
Este artigo foi editado para adiconar os Status 7, 8 e 9, criados recentemente pelo MoIP.


Tipo de Pagamento

Status Descrição
DebitoBancario Débito em conta no domicílio bancário do pagador
FinanciamentoBancario Financiamento obtido junto ao domicílio bancário do pagador e o montante total debitado diretamente da conta e creditado na Conta MoIP do recebedor
BoletoBancario Boleto bancário impresso
CartaoDeCredito Cartão de crédito
CartaoDeDebito Cartão de débito Visa Electron (apenas para correntistas do Bradesco)
CarteiraMoIP Diretamente da Conta MoIP do pagador

Bom, agora vamos criar a página para receber e processar as notificações enviadas pelo MoIP.
Uma dica para aumentar a segurança é adicionar uma chave na URL da página, ex:
http://www.site.com.br/moip/retorno/default.aspx?key=35B58690-F9FA-4C30-B9DF-1C32494E5D1B
Então mesmo que alguém descubra onde fica sua página que trata o retorno do MoIP, ainda vai ter que descobrir a chave que o MoIP manda com a URL. Diminuindo assim a possibilidade de alguém conseguir mandar dados, tentando se passar pelo MoIP.

Default.aspx.cs

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Data.SqlClient;
using System.Net.Mail;
using System.Globalization;
using System.Data;

public partial class retorno : System.Web.UI.Page
{
    const string KEY = "35B58690-F9FA-4C30-B9DF-1C32494E5D1B";
    string sConnectionString = "sua conectionstring";

    #region Page_Load
    protected void Page_Load(object sender, EventArgs e)
    {
        //Caso o processamento e atualização tenham ocorrido perfeitamente, 
        //envie o código HTTP 200 como resposta.
        Response.StatusCode = 200;
        //Caso ocorra algum erro, sera chamada a função setError500(), 
        //que sobrescrevera o código HTTP 200 adicionado acima.

        //Verifica se os dados vem por POST
        if (Request.HttpMethod == "POST")
        {
            try
            {
                //Verifica se possui chave de segurança.
                if (Request.QueryString["key"] == KEY)
                {
                    #region Salva os dados do post no Log
                    string sFormData = string.Empty;
                    //Pega todos os dados do post
                    foreach (string name in Request.Form)
                        sFormData += name + "=" + Request.Form[name] + "&";
                    sFormData = sFormData.Trim('&');

                    //Aqui salvo os dados como uma forma de historico
                    SaveLog(sFormData);
                    #endregion

                        const int APROVADO = 3;
                        const int CANCELADO = 5;

                        //Pegar ID de status baseado no ID de retorno do MoIP.
                        int idPedidoStatus = Convert.ToInt32(Request.Form["status_pagamento"]);

                        if (idPedidoStatus != 0)
                        {
                            //Salve o mudanca de status do seu pedido
                        }

                        if (idPedidoStatus == APROVADO)
                        {
                            //Liberar os produtos
                        }
                        else if (idPedidoStatus == CANCELADO)
                        {
                            //pedido cancelado
                        }     
                }
                else
                    SaveLog("Falso");
            }
            catch (Exception ex)
            {
                //No caso de erro define o StatusCode = 500
                SetError500();
                SaveLog("Ocorreu o seguinte erro:" + ex.Message);
            }
        }
    } 
    #endregion

    #region SetError500
    public void SetError500()
    {
        Response.StatusCode = 500;
    }
    #endregion

    #region SaveLog
    public void SaveLog(string sValue)
    {
        using (SqlConnection conn = new SqlConnection(sConnectionString))
        {
            string sql = "INSERT INTO logMoIP (logText, dataLog) VALUES (@valor, GETDATE())";
            SqlCommand cmd = new SqlCommand(sql, conn);
            cmd.Parameters.AddWithValue("@valor", sValue);
            conn.Open();
            cmd.ExecuteNonQuery();
            conn.Close();
        }
    }
    #endregion

}

 

Mais detalhes:
NASP - Notificação de Alteração de Status de Pagamento.pdf

Conteúdo direto do site MoIP:
Integração via API – Exemplo de integração em Java
Integração via API – Exemplo de integração em ASP
Integração via API – Exemplo de integração em PHP
http://labs.moip.com.br/2010/08/15/exemplos/

Comentários

Carregando comentários

Postar um novo comentário



Processando...