Portal SAMP
[Projeto Pronto] Integração com serviço de pagamentos - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: Comunidade (https://portalsamp.com/forumdisplay.php?fid=15)
+--- Fórum: Portfólio (https://portalsamp.com/forumdisplay.php?fid=48)
+---- Fórum: Projetos Completos (https://portalsamp.com/forumdisplay.php?fid=49)
+---- Tópico: [Projeto Pronto] Integração com serviço de pagamentos (/showthread.php?tid=2850)



Integração com serviço de pagamentos - Dr Editor - 29/09/2022

Integração com serviço de pagamentos

Recentemente fui contratado pra fazer um sistema que integre pagamentos ao SA:MP e resolvi compartilhar a conclusão do trabalho.
Trata-se de uma include que faz esse gerenciamento e usa apenas recursos nativos, portanto uma implementação facilitada.
O sistema em si para mim não é novo, mas a proposta foi criar uma include que gerencie o serviço de forma que seja necessário pouco conhecimento para trabalhar com um sistema deste porte.
Como é um trabalho novo pretendo adicionar novas ideias e montar a documentação.

Callback's:
Código:
forward OnCreateOrder(order_id[]); // Chamada ao criar ordem através do servidor
forward OnPlayerCreateOrder(playerid, order_id[]); // Chamada ao criar ordem pelo jogador através do servidor
forward OnPlayerRequestOrderStatus(playerid, order_id[], bool:status); // Chamada a cada ordem aberta no banco de dados
forward OnPlayerRequestOrderCoins(playerid, order_id[], coins); // Chamada quando o jogador solicita moedas de determinada ordem

Funções:
Código:
stock PayAPI_CreateTable(MySQL:handle)
stock PayAPI_CheckOrders(MySQL:handle, playerid, max_days = 5)
stock OrderData:PayAPI_CreateOrderData()
stock PayAPI_DestroyOrderData(OrderData:orderdata_id)
stock IsValidOrderData(OrderData:orderdata_id)
stock PayAPI_AppendOrderData(OrderData:orderdata_id, const name[], const value[])
stock PayAPI_CreateOrder(MySQL:handle, const plataform[], OrderData:orderdata_id, playerid = INVALID_PLAYER_ID)
stock PayAPI_ChangeOrderStatus(MySQL:handle, const order_id[], bool:status)
stock PayAPI_RequestPlayerCoins(MySQL:handle, playerid, const order_id[])

Vídeo demonstrativo:

OBS.:
O vídeo mostra o sistema operando localmente (com exceção da plataforma, claro), porém totalmente pronto para o ambiente real.
Na parte do formulário foi totalmente para fins demonstrativos.



Código de exemplo:
Código:
#include <a_samp>
#include <a_mysql>
#include <zcmd>
#include <pay_api>

static MySQL:handle;

main()
{
    handle = mysql_connect("localhost", "root", "", "pgto_api");
}

CMD:moedas(playerid, params[])
{
    PayAPI_CheckOrders(handle, playerid);
    SendClientMessage(playerid, -1, "[!] Verificando pagamentos...");
    return 1;
}

stock CriarNovoBoleto()
{
    new OrderData:orderData = PayAPI_CreateOrderData();
    if(orderData != INVALID_ORDER_DATA)
    {
        PayAPI_AppendOrderData(orderData, "type", "boleto"); // ou pix, cartão... (vide plataforma)
        PayAPI_AppendOrderData(orderData, "player_name", "Eduardo_AC");
        PayAPI_AppendOrderData(orderData, "player_email", "email@email.com");
        PayAPI_AppendOrderData(orderData, "player_real_name", "Eduardo AC");
        PayAPI_AppendOrderData(orderData, "player_cpf", "99999999999");
        PayAPI_AppendOrderData(orderData, "player_fone", "54999999999");
        PayAPI_AppendOrderData(orderData, "coins", "50");
        return PayAPI_CreateOrder(handle, "paghiper", orderData);
    }
    return false;
}

public OnCreateOrder(order_id[])
{
    if(strlen(order_id) == 1)
        return false;
    
    static string[100];
    format(string, sizeof string, "[!] Nova ordem criada (server): %s", order_id);
    printf(string);
    return 1;
}

public OnPlayerCreateOrder(playerid, order_id[])
{
    if(strlen(order_id) == 1) // Ordem inválida
        return false;
    
    static string[100];
    format(string, sizeof string, "[!] Nova ordem criada (player): %s", order_id);
    SendClientMessage(playerid, -1, string);
    return 1;
}

public OnPlayerRequestOrderStatus(playerid, order_id[], bool:status, status_info[])
{
    if(strlen(order_id) == 1) // Ordem inválida
        return SendClientMessage(playerid, -1, "[!] Você não possui ordens pendentes!");
    
    static string[100];
    format(string, sizeof string, "[!] Status da ordem %s: %s.", order_id, status_info);
    SendClientMessage(playerid, -1, string);
    
    if(status) // True = ordem paga | False = aguardando pgto / cancelada / ...
        PayAPI_RequestPlayerCoins(handle, playerid, order_id);
    return 1;
}

public OnPlayerRequestOrderCoins(playerid, order_id[], coins)
{
    static string[100];
    format(string, sizeof string, "[!] Você recebeu %i moedas referente a ordem %s.", coins, order_id);
    SendClientMessage(playerid, -1, string);
    
    // Como recebeu as moedas, alternamos o status do pagamento para PAGO para não ser mais listado nas transações incompletas
    PayAPI_ChangeOrderStatus(handle, order_id, true);
    return 1;
}

Objetivos:
✔️ Include para manipular os dados
✔️ Fácil implementação
✔️ Zero intervenção administrativa
✔️ Deixe seu servidor lucrar para você
✔️ Fácil integração com outras plataformas


RE: Integração com serviço de pagamentos - xbruno1000x - 30/09/2022

Maneiro demais esse trabalho. Quando criei a área de portfólio a intenção era essa. Pessoas mostrando seus serviços, para que pessoas interessadas neles encontrassem com maior facilidade. Te desejo sucesso!


RE: Integração com serviço de pagamentos - CoelhaO_LokaO - 30/09/2022

top gostei fiz um parecido


RE: Integração com serviço de pagamentos - João Pedro Alves - 30/09/2022

Realmente trabalho sensacional!!!


RE: Integração com serviço de pagamentos - White_Blue - 30/09/2022

Muito bom o trabalho!


RE: Integração com serviço de pagamentos - Sants - 01/10/2022

Belo projeto, parabéns!