Verbinden von automatischen Zahlungen über TeleWalletAbot mit Ihrem Telegramm-Bot

Schönen Tag.



Heute möchte ich darüber sprechen, wie Sie mit der Zahlungs-API der TeleWallet- Brieftasche arbeiten, die kürzlich in den offenen Bereichen von Telegram veröffentlicht wurde. Dieser Artikel ist vor allem für Eigentümer und Entwickler von Telegramm-Bots von Interesse, da Sie mit diesem Zahlungssystem Zahlungen in Telegramm akzeptieren können, ohne Telegramm zu verlassen



Ich möchte sofort darauf hinweisen, dass ich kein "für" oder "gegen" ein Zahlungssystem bin, sondern nur beschreiben möchte, wie mit der API gearbeitet wird.



Vorteile und Nachteile



Die Hauptvorteile (meiner Meinung nach) bei der Annahme von Zahlungen über TeleWallet:



  • Niedrige Provision (insgesamt 0,8% für automatische Aufladung und automatische Auszahlung)
  • Kein Mindestbetrag (genauer gesagt, der Mindestbetrag beträgt 0,01)
  • Mehrere Währungen verfügbar (Fiat und Krypto)
  • Die Möglichkeit, eine unbegrenzte Anzahl von Projekten mit einem Profil zu verbinden


Hauptnachteile:



  • Geringe Prävalenz der Ressource (obwohl dies höchstwahrscheinlich behoben werden kann)
  • Fehlen einer englischsprachigen Benutzeroberfläche (die Brieftasche ist für ein russischsprachiges Publikum und dementsprechend für in der GUS übliche Zahlungssysteme konzipiert)
  • Unzureichende automatische Überweisung von Geldern auf die Brieftasche selbst (derzeit ist die automatische Auffüllung der Brieftasche nur über Yandex.Money und Visa / MasterCard möglich. Bei anderen Zahlungssystemen ist eine halbautomatische Auffüllung möglich, weshalb eine Wartezeit besteht.)


Automatische Zahlungen verbinden



Also lasst uns anfangen. Lassen Sie uns zunächst einen kleinen PHP-Testbot mit 3 Schaltflächen skizzieren:



  • Balance - um die Balance anzuzeigen und festzustellen, ob sie sich geändert hat
  • Nachfüllen
  • Abheben


Ich werde nicht über die Registrierung eines Bots bei BotFather sprechen: Zu diesem Thema wurde mir zu viel gesagt. Um mit Telegram-bot-api zu arbeiten, verwenden wir irazasyed / telegram-bot-sdk . Wie man mit diesem SDK arbeitet und wie man einen Bot in BotFather registriert und einen Webhook darauf installiert, wird hier ausführlich beschrieben .



Und natürlich werden wir für die Arbeit mit der TeleWallet-API das offizielle SDK verwenden . Dort haben sie auch detaillierte Anweisungen zum Umgang mit Zahlungen und Codebeispiele. Im Folgenden werde ich Ihnen nur zeigen, wie Sie die dort angegebenen Codebeispiele mit einem echten Bot kombinieren können.



Erstellen Sie ein Zahlungskonto



  1. Gehen Sie zum Bot t.me/TeleWalletAbot
  2. Starte es
  3. Klicken Sie im Hauptmenü auf die Schaltfläche Zahlungen akzeptieren
  4. Klicken Sie unter der angezeigten Meldung auf die Schaltfläche Zahlungskonto eröffnen
  5. Kontowährung auswählen
  6. Die Meldung "Konto erfolgreich erstellt" wird angezeigt


Bild



Schritte ab dem 3. sind im Bild dargestellt. Sie sehen das neu hinzugefügte Konto als letztes in der Liste Ihrer Rechnungskonten (7 im Bild). Klicken Sie auf den Befehlslink gegenüber, um zu den Einstellungen zu gelangen (8 im Bild). Die Nachricht, die wir als Antwort erhalten, sieht folgendermaßen aus:

Kontoeinrichtung ap110741100 Kontostand

: 0 RUB



Geschäftsname:

API-Schlüssel nicht angegeben : eHW2IQZQYjlJjgQ

URL für Benachrichtigungen:

URL des Übergangs nach erfolgreicher Zahlung nicht angegeben: URL des Übergangs nach erfolgreicher Zahlung nicht angegeben

: Nicht angegeben

Provisionszahler bei Zahlung: Geschäft

Konto löschen (/ delapsch_100Re6)



Verwenden Sie die Schaltflächen unter dieser Nachricht, um die erforderlichen Parameter zu bearbeiten




Erstellen Sie eine Einstellungsdatei



Erstellen Sie eine config.php-Datei und fügen Sie dort den folgenden Code ein



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


Hier verbinden wir die MySQL-Datenbank (wir benötigen sie, um Benutzersalden und Informationen über Zahlungen zu speichern) und setzen 2 Variablen $ tlwkey und $ tlwacc, um den API-Schlüssel und die Kontonummer aus der vom Bot empfangenen Nachricht zu speichern.



Lassen Sie uns 2 Tabellen in unserer Datenbank erstellen:



  1. Benutzer (ID, Name, Kontostand, Anzahl) - Wir speichern Daten über Benutzer
  2. spenden (id, user_id, summe, fertig) - Informationen zu Spenden


Als nächstes erstellen wir eine index.php-Datei (wir leiten unseren Webhook von Telegram dorthin) und fügen dort den folgenden Code ein:



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


Hier definieren wir, welche Nachricht vom Benutzer empfangen wird. Wir senden es sowie die Benutzer-ID an die Funktion getAnsw (). Es gibt eine Reihe von Nachrichten zurück, die wir an den Benutzer weiterleiten.



Jetzt erstellen wir die Datei command.php und fügen die Implementierung der Funktion getAnsw () ein



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


Wenn der Benutzer auf Einzahlung klickt und den Betrag über die Inline-Schaltflächen unter der Nachricht auswählt, wird in der Zeile ein Zahlungslink erstellt:



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


Die Funktion getheque gibt ein assoziatives Array mit den Parametern error und url zurück. Fehler sollte "0" sein, und es ist wünschenswert, dies auch zu überprüfen, aber ich habe diese Überprüfung der Kürze halber weggelassen. Wir verwenden den URL- Parameter , um eine Nachricht mit einer Inline-Schaltfläche zu erstellen, wenn wir darauf klicken, dass der Benutzer unseres Bots zu @TeleWalletAbot geht und eine Zahlung vornimmt (oder nicht). Die Überprüfung der Zahlungsweise wird unten beschrieben.



Wenn ein Benutzer eine Auszahlung bestellt, muss er eine Kontonummer für die Auszahlung haben. Ist dies nicht der Fall, informieren wir ihn darüber. Wenn das Konto angegeben ist, versuchen wir, mit der Funktion sendOutpay eine Auszahlung vorzunehmen. Wenn der von ihm zurückgegebene Fehlercode "0" lautet, war die Auszahlung erfolgreich, und wir ziehen Geld vom Guthaben des Benutzers in unserem Bot ab.



Überprüfung der Zahlungsweise



Um die Tatsache der Zahlung und Gutschrift des Guthabens auf das Guthaben des Benutzers zu überprüfen, erstellen wir ein weiteres Skript: Notice.php . Hier ist der Code:



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


Diese Datei erhält einen Webhook aus der Brieftasche, wenn der Benutzer die Zahlung erfolgreich abgeschlossen hat.



Eine Beschreibung der POST-Anforderungsparameter finden Sie in der SDK-Dokumentation .



Kehren wir jetzt zu unserem Zahlungskonto in der Brieftasche zurück. Klicken Sie auf die URL- Schaltfläche für Benachrichtigungen und senden Sie dem Bot einen Link zu unserer Datei Notice.php. Geben Sie



auch den Namen des Geschäfts an (genauer gesagt Ihr Projekt). Wenn die URL erfolgreich ist und die URL fehlschlägt, geben Sie einfach einen Link zu Ihrem Projekt (Bot) an.



Nun, das ist wahrscheinlich alles. Wir haben mit Ihnen einen Testbot erstellt, mit dem Sie verstehen, wie Sie mit der TeleWallet-Zahlungs-API arbeiten.



Unter dem folgenden Link können Sie sehen, wie dieser Testfall funktioniert (beim Abheben wird tatsächlich noch eine manuelle Eingabe des Betrags und des Kontos hinzugefügt): http://t.me/TlwSdkBot...



Ein besseres Verständnis des Codes im Artikel sowie eine Beschreibung der Fehlercodes und Abfrageparameter finden Sie in der Dokumentation .



All Articles