Ir para conteúdo
Fórum Script Brasil
  • 0

PHPMYADMIN - EVENT ou TRIGGER


laio

Pergunta

Galera, sou novo aqui no fórum, acho que estou a área certa.

Vamos la:

Tenho um servidor de jogos online e estou tentando automatizar a compra e entrega de "cash" pela pagina de compra do site. ( cash o usuário compra para gastar ingame ).

Eu já tenho um sistema de cadastro e sistema de login no meu site. A pouco tempo consegui implementar o sistema de pagamentos e notificações do pagseguro no site e achei que poderia deixar a coisa automática. Vou explicar oque eu consegui fazer.

 

Minha pagina de cadastro controla a tabela USERS onde eu guardo os seguintes dados: (vou preencher como se fosse um registro do meu banco)

user_id (A.I) = 1
user_name     = usuarioteste
user_senha    = 123456
user_email    = usuarioteste@live.com
user_cash      = 0

Para registrar as comprar feitas no pagseguro eu uso uma tabela chamada PEDIDOS.

Para fazer a compra pelo site, a pessoa tem q estar logada no site, então quando ela clica no botão de compra eu salvo o 'user_name' da tabela USERS junto na tabela PEDIDOS, que fica assim:

pedido_id (A.I) = 1
descricao       = pacote de 30 cash
status          = 1 ( status 1 para o pagseguro significa "AGUARDANDO PAGAMENTO" )
user_name       = usuarioteste

Agora que vem o X da questão. Quando o usuário efetuar o pagamento o pagseguro via API de notificações vai atualizar o status desse pedido para '3' que significa "PAGO". Eu gostaria de fazer um event ou uma trigger para dar um update no 'user_cash' do usuário 'usuarioteste' da tabela USERS e acrescentar 30 assim que o 'status' mudar para '3'. Se alguém puder ajudar, ou tiver uma solução para o meu problema. Só falta isso para eu concluir o projeto. Obrigado!

Link para o comentário
Compartilhar em outros sites

12 respostass a esta questão

Posts Recomendados

  • 0

Fazer a trigger não é a única solução...

O PagSeguro não acessa diretamente o seu Banco de Dados não é?

Qual script seu faz essa atualização do status do pedido?

Outro problema como você vai saber que o pacote que o cliente comprou é o de 30?

Link para o comentário
Compartilhar em outros sites

  • 0

Quando a pessoa clica em comprar eu salvo o pedido no banco pela função:

function salvarPedido(){	
 $teste_login = $_SESSION['user_name'];
 $stmt = $this->pdo->prepare("INSERT INTO pedidos (descricao, status, user_name) VALUES ('Pacote 30 créditos', 1, '".$teste_login."')");
 $stmt->bindValue(":codigo",$codigo);
 $run = $stmt->execute();
 }

 Eu não sei muito bem como funciona a API de notificações do pagseguro. Mas sei que quando a pessoa efetua o pagamento automaticamente o status no banco de dados passa a ser 3.

function atualizaPedido($reference, $status){
 $stmt = $this->pdo->prepare("UPDATE pedidos SET status = :status where id = :reference");
 $stmt->bindValue(":reference",$reference);
 $stmt->bindValue(":status",$status);
 $run = $stmt->execute();
 }

quando clica no botão de compra esses são os dados que o pagseguro recebe.

<?php

$data['token'] ='MEU TOKEN';
$data['email'] = 'MEU EMAIL';
$data['currency'] = 'BRL';
$data['itemId1'] = '1';
$data['itemQuantity1'] = '1';
$data['itemDescription1'] = 'Pacote 30 creditos';
$data['itemAmount1'] = '30.00';

$url = 'https://ws.pagseguro.uol.com.br/v2/checkout';

$data = http_build_query($data);

$curl = curl_init($url);

curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
$xml= curl_exec($curl);

curl_close($curl);

$xml= simplexml_load_string($xml);
echo $xml -> code;

?>

e me retorna

<?php

$notificationCode = preg_replace('/[^[:alnum:]-]/','',$_POST["notificationCode"]);

$data['token'] ='MEU TOKEN';
$data['email'] = 'MEU EMAIL';

$data = http_build_query($data);

$url = 'https://ws.pagseguro.uol.com.br/v3/transactions/notifications/'.$notificationCode.'?'.$data;

$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, $url);
$xml = curl_exec($curl);
curl_close($curl);

$xml = simplexml_load_string($xml);

$reference = $xml->reference;
$status = $xml->status;

if($reference && $status){
 include_once 'conecta.php';
 $conn = new conecta();

 $rs_pedido = $conn->consultarPedido($reference);

 if($rs_pedido){
 $conn->atualizaPedido($reference,$status);
 }
}

?>

 

OBS: AS FUNÇÕES FICAM NO ARQUIVO CONECTA.PHP

Editado por laio
Link para o comentário
Compartilhar em outros sites

  • 0

Essa é a maravilha de usar APIs, você não precisa saber como elas funcionam rsrsrs.

Bom já que a  função atualizaPedido é quem atualiza o status é nela que você deve mexer.

Algo nesse sentido:

<?php
function atualizaPedido($reference, $status) {
  $stmt = $this->pdo->prepare("UPDATE pedidos SET status = :status WHERE id = :reference");
  $stmt->bindValue(":reference",$reference);
  $stmt->bindValue(":status",$status);
  $stmt->execute();
  if ($status == 3) {
    $stmt = $this->pdo->prepare("SELECT * FROM pedidos WHERE id = :reference");
    $stmt->bindValue(":reference",$reference);
    $stmt->execute();
    $pedido = $stmt->fetch();
    $cash = 30; // Agora só falta você trocar esse hard coded por algo dinamico, que realmente receba a quantidade de cash do pacote que foi comprado
    atualizaCash($pedido->user_name, $cash);
  } 
}

function atualizaCash ($user_name, $cash) {
  $stmt = $this->pdo->prepare("UPDATE users SET cash = cash + :cash WHERE user_name = :user_name");
  $stmt->bindValue(":user_name",$user_name);
  $stmt->bindValue(":cash",$cash);
  $stmt->execute();
}
  

 

Link para o comentário
Compartilhar em outros sites

  • 0

Markus,

Rodei o código aqui. E usei o ambiente de testes do pagseguro. Simulei um pagamento, atualizou o status para 3, porém não acrescentou 30 na tabela users em user_cash.

Depois de ter rodado uma vez, dei uma conferida e vi que essa linha estava com o nome da coluna errado.

$stmt = $this->pdo->prepare("UPDATE users SET cash = cash + :cash WHERE user_name = :user_name");

alterei para:

$stmt = $this->pdo->prepare("UPDATE users SET user_cash = user_cash + :cash WHERE user_name = :user_name");

Mas mesmo assim não deu certo...

Link para o comentário
Compartilhar em outros sites

  • 0

Ficou assim

<?php

include_once 'config.php';
session_start();

class conecta extends config{
 var $pdo;
 
 function __construct(){
 $this->pdo = new PDO('mysql:host='.$this->host.';dbname='.$this->db, $this->usuario, $this->senha); 
 }

 function salvarPedido(){
 $teste_login = $_SESSION['user_name'];
 $stmt = $this->pdo->prepare("INSERT INTO pedidos (descricao, status, user_name) VALUES ('Pedido de Teste', 1, '".$teste_login."')");
 $stmt->bindValue(":codigo",$codigo); 
 $run = $stmt->execute();
 }

 function atualizaPedido($reference, $status){
 $stmt = $this->pdo->prepare("UPDATE pedidos SET status = :status where id = :reference");
 $stmt->bindValue(":reference",$reference);
 $stmt->bindValue(":status",$status);
 $run = $stmt->execute();
 if ($status == 3) {
    $stmt = $this->pdo->prepare("SELECT * FROM pedidos WHERE id = :reference");
    $stmt->bindValue(":reference",$reference);
    $stmt->execute();
    $pedido = $stmt->fetch();
    $cash = 30;
    $this->atualizaCash($pedido->user_name, $cash);
  }
 
 }

function atualizaCash ($user_name, $cash) {
  $stmt = $this->pdo->prepare("UPDATE users SET user_cash = user_cash + :cash WHERE user_name = :user_name");
  $stmt->bindValue(":user_name",$user_name);
  $stmt->bindValue(":cash",$cash);
  $stmt->execute();
}

}

?>

Mas não fez o update do user_cash, mesmo assim.

Link para o comentário
Compartilhar em outros sites

  • 0

p****... Bom ta na hora de uns debug ai...

<?php

function atualizaPedido($reference, $status){
  $this->log('atualizaPedido('.$reference.','.$status.')');
 $stmt = $this->pdo->prepare("UPDATE pedidos SET status = :status where id = :reference");
 $stmt->bindValue(":reference",$reference);
 $stmt->bindValue(":status",$status);
 $run = $stmt->execute();
 if ($status == 3) {
  	$this->log('if ($status == 3)');
    $stmt = $this->pdo->prepare("SELECT * FROM pedidos WHERE id = :reference");
    $stmt->bindValue(":reference",$reference);
    $stmt->execute();
    $pedido = $stmt->fetch();
  	$this->log(var_export($pedido,true));
    $cash = 30;
    $this->atualizaCash($pedido->user_name, $cash);
  }
 
 }

function atualizaCash ($user_name, $cash) {
  	$this->log('atualizaCash('.$user_name.','.$cash.')');
  $stmt = $this->pdo->prepare("UPDATE users SET user_cash = user_cash + :cash WHERE user_name = :user_name");
  $stmt->bindValue(":user_name",$user_name);
  $stmt->bindValue(":cash",$cash);
  $stmt->execute();
}

function log ($log) {
  file_put_contents('log.log',$log."\n",FILE_APPEND); // Escolhe uma pasta para salvar esse log
}

Testa e posta o log

Link para o comentário
Compartilhar em outros sites

  • 0

Segue o log...

atualizaPedido(26,2)
atualizaPedido(26,3)
if ($status == 3)
array (
  'id' => '26',
  0 => '26',
  'descricao' => 'Pedido de Teste',
  1 => 'Pedido de Teste',
  'status' => '3',
  2 => '3',
  'user_name' => 'laioteste',
  3 => 'laioteste',
)
atualizaCash(,30)

 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...