Conectando pagamentos automáticos via TeleWalletAbot ao seu bot do Telegram

Dia bom.



Hoje quero falar sobre como trabalhar com a API de pagamento da carteira TeleWallet que apareceu recentemente nos espaços abertos do Telegram. Este artigo será de interesse principalmente para proprietários e desenvolvedores de bots do Telegram, uma vez que este sistema de pagamento permite aceitar pagamentos no Telegram sem sair do Telegram



Gostaria de salientar imediatamente que não sou “a favor” ou “contra” nenhum sistema de pagamento, mas apenas gostaria de descrever como trabalhar com a API.



Vantagens e desvantagens



As principais vantagens (na minha opinião) de aceitar pagamentos através do TeleWallet:



  • Comissão baixa (0,8% no total para recarga automática e pagamento automático)
  • Sem valor mínimo (mais precisamente, o valor mínimo é 0,01)
  • Várias moedas disponíveis (fiat e cripto)
  • A capacidade de conectar um número ilimitado de projetos por perfil


Principais desvantagens:



  • Baixa prevalência do recurso (embora isso provavelmente possa ser corrigido)
  • Falta de uma interface em inglês (a carteira é projetada para um público que fala russo e, portanto, sistemas de pagamento comuns no CIS)
  • Transferências automatizadas de fundos insuficientes para a própria carteira (no momento, a reposição automática da carteira está disponível apenas através de Yandex.Money e Visa / MasterCard. Para outros sistemas de pagamento, a reposição semiautomática está disponível, devido ao qual há um tempo de espera)


Conectando pagamentos automáticos



Então vamos começar. Primeiro, vamos esboçar um pequeno bot de teste PHP com 3 botões:



  • Balanço - para ver o balanço e ver se ele mudou
  • Completar
  • Retirar


Não vou falar sobre registrar um bot no BotFather: muito já foi dito antes de mim sobre esse assunto. Para trabalhar com o Telegram-bot-api, usaremos irazasyed / telegram-bot-sdk . Como trabalhar com este SDK e, a propósito, como registrar um bot no BotFather e instalar um webhook nele está bem descrito aqui .



E, claro, para trabalhar com a API TeleWallet usaremos seu SDK oficial . Lá, eles também têm instruções detalhadas sobre como trabalhar com pagamentos e exemplos de código. A seguir, mostrarei apenas como combinar os exemplos de código fornecidos ali com um bot real.



Crie uma conta de pagamento



  1. Vá para o bot t.me/TeleWalletAbot
  2. Executá-lo
  3. Clique no botão Aceitar Pagamentos no menu principal
  4. Abaixo da mensagem que aparece, clique no botão Abrir uma conta de pagamento
  5. Selecione a moeda da conta
  6. A mensagem "Conta criada com sucesso" aparecerá


imagem



As etapas a partir do terceiro são mostradas na imagem. Você verá a conta recém-adicionada como a última na lista de suas contas de faturamento (7 na imagem). Clique no link de comando ao lado dele para ir para suas configurações (8 na imagem). A mensagem que recebemos em resposta é assim:

Configuração da conta ap110741100

Saldo: 0 RUB



Nome da loja:

Chave API não especificada : eHW2IQZQYjlJjgQ

URL para notificações:

URL não especificado após o pagamento bem-sucedido:

URL não especificado após falha (recusa): Não especificado

Pagador da comissão no pagamento:

Excluir conta da loja (/ delapsch_100Re6)



Use os botões abaixo desta mensagem para editar os parâmetros necessários




Crie um arquivo de configurações



Crie um arquivo config.php e cole o seguinte código lá



<?php
  $dblocation = "localhost";
  $dbname = "   mysql";  
  $dbuser = "   mysql";
  $dbpasswd = "   mysql";
  /*    MySQL */ 
  $link = mysqli_connect($dblocation,$dbuser,$dbpasswd,$dbname);       
  if(!$link)  exit("<P>     .</P>" ); 
  mysqli_query($link,"SET NAMES 'utf8'");
  //-   TeleWalletAbot
  $tlwkey = "eHW2IQZQYjlJjgQ";
  $tlwacc = "ap110741100";
?>


Aqui, conectaremos o banco de dados mysql (precisaremos dele para armazenar saldos de usuários e informações sobre pagamentos) e criaremos 2 variáveis ​​$ tlwkey e $ tlwacc para armazenar a chave API e o número da conta da mensagem recebida do bot.



Vamos criar 2 tabelas em nosso banco de dados:



  1. usuários (id, nome, saldo, número maior) - vamos armazenar os dados do usuário
  2. doar (id, user_id, sum, finalizado) - informações sobre doações


A seguir, vamos criar um arquivo index.php (direcionaremos nosso webhook do Telegram para ele) e inserir o seguinte código lá:



<?php  
    include('vendor/autoload.php');  // ,   composer
    //    Telegram bot api
    use Telegram\Bot\Api; 
    use Telegram\Bot\Commands\Command;
    use Telegram\Bot\Keyboard\Keyboard;
    // -----------------------------------------
    require_once "commands.php"; //,     
    require_once "config.php"; // 
    require_once "TeleWallet.php"; /*SDK Telewallet  https://github.com/tlwadmin/TeleWalletSDK/blob/main/TeleWallet.php  */
    $telegram = new Api(",   Telegram");
    $result = $telegram -> getWebhookUpdates(); // 
    $chat_id = $result["message"]["chat"]["id"];
    $text = $result["message"]["text"];
    $callback_query = $result['callback_query'];    
    $data = $callback_query['data'];	 
    $chat_id_in = $callback_query['message']['chat']['id']; 
    $uname = $result["message"]["from"]["username"]; 
	
	if($chat_id>0 && $text){ //   
		$sm=['chat_id' => $chat_id, 'text' => $text];		
		$ans_arr=getAnsw($text,$chat_id,$uname);
	    for($i=0;$i<count($ans_arr);$i++){
			$ans=$ans_arr[$i];
			$reply = $ans['text'];		
			$sm=[ 'chat_id' => $chat_id, 'text' => $reply, 'caption'=>$reply];					
			if(array_key_exists('inline_keyboard',$ans)) {					
				$keyboard=$ans['inline_keyboard'];
				$replyMarkup = json_encode($keyboard); 	   
				$sm['reply_markup'] =$replyMarkup;
			}       
			else if(array_key_exists('keyboard',$ans)){
				$keyboard=$ans['keyboard'];
				$reply_markup = $telegram->replyKeyboardMarkup([ 'keyboard' => $keyboard, 'resize_keyboard' => true, 'one_time_keyboard' => false ]);
				$sm['reply_markup']=$reply_markup;
			}		
			$telegram->sendMessage($sm);
		}        
    }
    if($data){  //  -
		$ans_arr=getAnsw($data,$chat_id_in);
		for($i=0;$i<count($ans_arr);$i++){
			$ans=$ans_arr[$i];
			$reply = $ans['text'];		
			$sm=[ 'chat_id' => $chat_id_in, 'text' => $reply, 'caption'=>$reply];								
			if(array_key_exists('inline_keyboard',$ans)) {
				$keyboard=$ans['inline_keyboard'];
				$replyMarkup = json_encode($keyboard); 	   
				$sm['reply_markup'] =$replyMarkup;
			}       
			else if(array_key_exists('keyboard',$ans)){
				$keyboard=$ans['keyboard'];
				$reply_markup = $telegram->replyKeyboardMarkup([ 'keyboard' => $keyboard, 'resize_keyboard' => true, 'one_time_keyboard' => false ]);
				$sm['reply_markup']=$reply_markup;
			}
			$telegram->sendMessage($sm);
		}
	}    
?>


Aqui definimos qual mensagem é recebida do usuário. Nós o enviamos, assim como o ID do usuário, para a função getAnsw (). Ele retorna uma série de mensagens que encaminhamos ao usuário.



Agora vamos criar o arquivo commands.php e inserir a implementação da função getAnsw () nele



<?php
function getAnsw($command,$chat_id, $name=""){
	global $link;	
	global $telegram;
	global  $tlwkey;
    global	$tlwacc;
	$r=mysqli_query($link,"select * from users where id='$chat_id'");
	$ud=mysqli_fetch_assoc($r); //  
	if($command=="/start") {
		//    		
		if(!$ud) mysqli_query($link,"INSERT INTO `users`(`id`,`name`) values('$chat_id','$name')");
		$res['text']=".  ,       TeleWallet";
		$res['keyboard']=[["","",""]];
		return [$res];
	}
	if($command=="") {
		$res['text']=" : {$ud['balance']} ";
		return [$res];
	}
	if($command=="") {
		$res['text']=" ,     ";
		$res['inline_keyboard']['inline_keyboard']=[[['text'=>'1 ','callback_data'=>'popoln_1'],['text'=>'5 ','callback_data'=>'popoln_5'],['text'=>'10 ','callback_data'=>'popoln_10']]];
		return [$res];
	}
	if($command=="") {
		$res['text']="   ?";
		$res['inline_keyboard']['inline_keyboard']=[[['text'=>'1 ','callback_data'=>'vivod_1'],['text'=>'5 ','callback_data'=>'vivod_5'],['text'=>'10 ','callback_data'=>'vivod_10']]];
		addCmd("vivod_",$chat_id);
		return [$res];
	}
	$tlw = new TeleWallet($tlwkey,$tlwacc);
	if(strpos($command,'popoln_')!==false) {
		$arr = explode("_",$command);		
		mysqli_query($link,"INSERT INTO `donate`( `user_id`, `sum`) values('$chat_id','{$arr[1]}')");
		$payId = mysqli_insert_id($link);
		$resp = $tlw->getheque($arr[1],$payId);
		$res['text']="    {$arr[1]} .    TeleWallet.       ";
		$res['inline_keyboard']['inline_keyboard']=[[["text"=>"","url"=>$resp['url']]]];
		return [$res];
	}
       if(strpos($command,'setnumber_')!==false) { //   
		$arr = explode("_",$command);
		mysqli_query($link,"UPDATE `users` SET `outnumber`='{$arr[1]}' where `id`='$chat_id'");
		$res['text']="  .";
		return [$res];
	}
	if(strpos($command,'vivod_')!==false) {
		$arr = explode("_",$command);
		if($ud['balance']<$arr[1]) $res['text']="   ";
		else {
			if(empty($ud['outnumber']))	$res['text']="      TeleWallet  .   setnumber_(  ) ( ),    ";
			else {
				$resp = $tlw->sendOutpay($arr[1],$ud['outnumber']);
				if($resp['error']==0) { // 
					$res['text']="      {$arr[1]} ";
					mysqli_query($link,"UPDATE `users` SET `balance`=`balance`-{$arr[1]} where `id`='$chat_id'");					
				}
				else if($resp['error']==4 || $resp['error']==5) { // 
					$res['text']="    ";					
				}
				else $res['text']="  .  : {$resp['error']}.    ";				
			}
		}
		return [$res];
	}	
}
?>


Quando o usuário clica em Depósito e seleciona o valor usando os botões embutidos abaixo da mensagem, um link de pagamento é criado na linha:



$resp = $tlw->getheque($arr[1],$payId);


A função getheque retornará um array associativo com os parâmetros error e url. o erro deve ser "0" e é desejável verificar isso também, mas omiti esta verificação por questões de brevidade. Utilizamos o parâmetro url para formar uma mensagem com um botão inline, ao clicar no qual o usuário do nosso bot será levado para @TeleWalletAbot e pagará (ou não). A verificação do fato do pagamento está descrita a seguir.



Quando um usuário solicita um saque, ele deve ter um número de conta para o saque. Se não for esse o caso, nós o informamos. Se a conta for especificada, tentamos fazer um saque usando a função sendOutpay, e se o código de erro retornado por ela for "0", então o saque foi bem-sucedido, e deduzimos os fundos do saldo do usuário em nosso bot.



Verificando o fato de pagamento



Para verificar o fato de pagamento e crédito dos fundos no saldo do usuário, criaremos outro script: notice.php . Aqui está seu código:



<?php
include('vendor/autoload.php'); 
use Telegram\Bot\Api; 
use Telegram\Bot\Commands\Command;
use Telegram\Bot\Keyboard\Keyboard;    
require_once "config.php";
require_once "TeleWallet.php";
$telegram = new Api("   ,   ");
$tlw = new TeleWallet($tlwkey,$tlwacc);
$ri = mysqli_query($link,"SELECT * FROM `donate` WHERE `id`={$_POST['payId']}");
$pay_info = mysqli_fetch_assoc($ri);
if($tlw->testPayIn($_POST) && $pay_info['sum']==$_POST['sum']) {
	echo "YES";
	mysqli_query($link,"UPDATE `users` SET `balance`=`balance`+{$pay_info['sum']} where `id`={$pay_info['user_id']}");
       	mysqli_query($link,"UPDATE `users` SET `balance`=`balance`+{$pay_info['sum']} where `id`={$_POST['payId']}");
	try {	
		$telegram->sendMessage(["text"=>"    {$pay_info['sum']} ","chat_id"=>$pay_info['user_id']]);
	}
	catch(Exception $e) {}
}
else echo "NO";
?>


Este arquivo receberá um webhook da carteira quando o usuário concluir o pagamento com sucesso.



Para obter uma descrição dos parâmetros de solicitação POST, consulte a documentação do SDK .



Vamos voltar agora para nossa conta de pagamento na carteira. Clique no botão URL para notificações e envie ao bot um link para nosso arquivo notice.php Indique



também o nome da loja (mais precisamente, seu projeto). Como URL com sucesso e falha de URL, apenas especifique um link para seu projeto (bot)



Bem, provavelmente isso é tudo. Criamos um bot de teste com você que permite que você entenda como trabalhar com a API de pagamento TeleWallet.



Você pode ver como funciona esse caso de teste (realmente ainda é adicionada a entrada manual do valor e da conta no momento da retirada) no link: http://t.me/TlwSdkBot...



Para uma melhor compreensão do código do artigo, bem como para uma descrição dos códigos de erro e parâmetros de consulta, consulte a documentação .



All Articles