Conexión de pagos automáticos a través de TeleWalletAbot a su bot de Telegram

Buen día.



Hoy les quiero hablar sobre cómo trabajar con la API de pago de la billetera TeleWallet que ha aparecido recientemente en los espacios abiertos de Telegram, este artículo será de interés principalmente para los propietarios y desarrolladores de bots de Telegram, ya que este sistema de pago permite aceptar pagos en Telegram sin salir de Telegram.



Quiero señalar de inmediato que no estoy a favor ni en contra de ningún sistema de pago, pero solo quiero describir cómo trabajar con la API.



Ventajas y desventajas



Las principales ventajas (en mi opinión) de aceptar pagos a través de TeleWallet:



  • Comisión baja (0,8% en total para recargas y pagos automáticos)
  • Sin cantidad mínima (más precisamente, la cantidad mínima es 0.01)
  • Varias monedas disponibles (fiat y cripto)
  • La capacidad de conectar un número ilimitado de proyectos a un perfil.


Principales desventajas:



  • Baja prevalencia del recurso (aunque lo más probable es que se pueda solucionar)
  • Falta de una interfaz en inglés (la billetera está diseñada para una audiencia de habla rusa y, en consecuencia, los sistemas de pago comunes en el CIS)
  • Transferencias automáticas insuficientes de fondos a la billetera en sí (por el momento, la reposición automática de la billetera está disponible solo a través de Yandex.Money y Visa / MasterCard. Para otros sistemas de pago, la reposición semiautomática está disponible, por lo que hay un tiempo de espera)


Conexión de pagos automáticos



Entonces empecemos. Primero, esbocemos un pequeño bot de prueba PHP con 3 botones:



  • Saldo: para ver el saldo y ver que ha cambiado
  • Completar
  • Retirar


No hablaré de registrar un bot en BotFather: se me ha dicho demasiado sobre este tema. Para trabajar con Telegram-bot-api, usaremos irazasyed / telegram-bot-sdk . Aquí se describe bien cómo trabajar con este SDK y, por cierto, cómo registrar un bot en BotFather e instalar un webhook en él .



Y por supuesto, para trabajar con la API de TeleWallet usaremos su SDK oficial . Allí también tienen instrucciones detalladas sobre cómo trabajar con pagos y ejemplos de código. Entonces, a continuación, solo le mostraré cómo combinar los ejemplos de código que se dan allí con un bot real.



Crea una cuenta de pago



  1. Ve al bot t.me/TeleWalletAbot
  2. Ejecutarlo
  3. Haga clic en el botón Aceptar pagos en el menú principal
  4. Debajo del mensaje que aparece, haga clic en el botón Abrir una cuenta de pago
  5. Seleccione la moneda de la cuenta
  6. Aparecerá el mensaje "Cuenta creada correctamente".


imagen



Los pasos a partir del 3 se muestran en la imagen. Verá la cuenta recién agregada como la última en la lista de sus cuentas de facturación (7 en la imagen). Haga clic en el enlace de comando enfrente para ir a su configuración (8 en la imagen). El mensaje que recibimos en respuesta se ve así:

Configuración de la cuenta ap110741100

Saldo: 0 RUB



Nombre de la tienda: No especificado

Clave API: eHW2IQZQYjlJjgQ

URL para notificaciones:

URL no especificada después de un pago exitoso:

URL no especificada después de un error (rechazo): No especificado

Pagador de la comisión en el pago: Tienda

Eliminar cuenta (/ delapsch_100Re6)



Use los botones debajo de este mensaje para editar los parámetros requeridos




Crea un archivo de configuración



Cree un archivo config.php y pegue el siguiente código allí



<?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";
?>


Aquí conectaremos la base de datos mysql (la necesitaremos para almacenar saldos de usuarios e información sobre pagos) y crearemos 2 variables $ tlwkey y $ tlwacc para almacenar la clave API y el número de cuenta del mensaje recibido del bot.



Creemos 2 tablas en nuestra base de datos:



  1. usuarios (identificación, nombre, saldo, número superior): almacenaremos los datos del usuario
  2. donate (id, user_id, sum, terminado) - información sobre donaciones


A continuación, cree un archivo index.php (dirigiremos nuestro webhook desde Telegram a él) e inserte el siguiente código allí:



<?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);
		}
	}    
?>


Aquí definimos qué mensaje se recibe del usuario. Lo enviamos, así como el ID de usuario a la función getAnsw (). Devuelve una serie de mensajes que reenviamos al usuario.



Ahora creemos el archivo commands.php e insertemos la implementación de la función getAnsw () en él



<?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];
	}	
}
?>


Cuando el usuario hace clic en Depositar y selecciona la cantidad usando los botones en línea debajo del mensaje, se crea un enlace de pago en la línea:



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


La función getheque devolverá una matriz asociativa con error de parámetros y URL. el error debería ser "0", y es conveniente comprobarlo también, pero omití esta comprobación por brevedad. Usamos el parámetro url para formar un mensaje con un botón en línea, al hacer clic en el cual el usuario de nuestro bot irá a @TeleWalletAbot y realizará un pago (o no). La comprobación del hecho del pago se describe a continuación.



Cuando un usuario ordena un retiro, debe tener un número de cuenta para el retiro. Si este no es el caso, le informamos al respecto. Si se especifica la cuenta, intentamos hacer un retiro usando la función sendOutpay, y si el código de error devuelto por ella es "0", entonces el retiro fue exitoso y cancelamos los fondos del saldo del usuario en nuestro bot.



Comprobando el hecho del pago



Para comprobar el hecho del pago y abono de fondos al saldo del usuario, crearemos otro script: notice.php . Aquí está su 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 archivo recibirá un webhook de la billetera cuando el usuario haya completado con éxito el pago.



Para obtener una descripción de los parámetros de solicitud POST, consulte la documentación del SDK .



Regresemos ahora a nuestra cuenta de pago en la billetera. Haga clic en el botón URL para recibir notificaciones y envíe al bot un enlace a nuestro archivo notice.php.



También indique el nombre de la tienda (más precisamente, su proyecto). Como la URL tiene éxito y la URL falla, solo especifique un enlace a su proyecto (bot)



Bueno, eso es probablemente todo. Hemos creado un bot de prueba con usted que le permite comprender cómo trabajar con la API de pago de TeleWallet.



Puede ver cómo funciona este caso de prueba (realmente todavía se agrega la entrada manual de la cantidad y la cuenta al retirar) mediante el enlace: http://t.me/TlwSdkBot...



Para comprender mejor el código del artículo, así como para obtener una descripción de los códigos de error y los parámetros de consulta, consulte la documentación .



All Articles