29/09/2022 22:41
(Esta mensagem foi modificada pela última vez a: 29/08/2023 13:45 por xbruno1000x.)
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
SA:MP Dev Tools
Faça mais, ganhe mais e poupe tempo!
Viper Anti-Cheat
Torne seu servidor mais seguro!
________________________________________
Soluções personalizadas para SA:MP
Discord: .eduardoac | Eduardo AC#3140
Faça mais, ganhe mais e poupe tempo!
Viper Anti-Cheat
Torne seu servidor mais seguro!
________________________________________
Soluções personalizadas para SA:MP
Discord: .eduardoac | Eduardo AC#3140