Aujourd'hui, je veux parler de la façon de travailler avec l'API de paiement du portefeuille TeleWallet qui est récemment apparu dans les espaces ouverts de Telegram.Cet article intéressera principalement les propriétaires et les développeurs de robots Telegram, car ce système de paiement permet d'accepter des paiements dans Telegram sans quitter Telegram
Je tiens à noter tout de suite que je ne suis ni pour ni contre aucun système de paiement, mais je veux juste décrire comment travailler avec l'API.
Avantages et inconvénients
Les principaux avantages (à mon avis) d'accepter des paiements via TeleWallet:
- Commission faible (0,8% au total pour le rechargement automatique et le paiement automatique)
- Pas de montant minimum (plus précisément, le montant minimum est de 0,01)
- Plusieurs devises disponibles (fiat et crypto)
- La possibilité de connecter un nombre illimité de projets à un profil
Principaux inconvénients:
- Faible prévalence de la ressource (bien que cela soit probablement réparable)
- Absence d'interface en anglais (le portefeuille est conçu pour un public russophone et, par conséquent, pour les systèmes de paiement courants dans la CEI)
- Transferts automatisés insuffisants de fonds vers le portefeuille lui-même (pour le moment, le réapprovisionnement automatique du portefeuille n'est disponible que via Yandex.Money et Visa / MasterCard. Pour les autres systèmes de paiement, un réapprovisionnement semi-automatique est disponible, c'est pourquoi il y a un temps d'attente)
Connexion des paiements automatiques
Alors, commençons. Tout d'abord, esquissons un petit robot de test PHP avec 3 boutons:
- Balance - pour afficher le solde et voir qu'il a changé
- Recharger
- Se désister
Je ne parlerai pas de l'enregistrement d'un bot avec BotFather: trop de choses ont été dites avant moi sur ce sujet. Pour travailler avec Telegram-bot-api, nous utiliserons irazasyed / telegram-bot-sdk . Comment travailler avec ce SDK, et en passant, comment enregistrer un bot dans BotFather et installer un webhook dessus est bien décrit ici .
Et bien sûr, pour travailler avec l'API TeleWallet, nous utiliserons leur SDK officiel . Là, ils ont également des instructions détaillées sur la façon de travailler avec des paiements et des exemples de code. Donc ci-dessous, je vais juste vous montrer comment combiner les exemples de code qui y sont donnés avec un vrai bot.
Créer un compte de paiement
- Accédez au bot t.me/TeleWalletAbot
- Exécuter
- Cliquez sur le bouton Accepter les paiements dans le menu principal
- Sous le message qui apparaît, cliquez sur le bouton Ouvrir un compte de paiement
- Sélectionnez la devise du compte
- Le message "Compte créé avec succès" apparaîtra
Les étapes à partir du 3ème sont indiquées sur l'image. Vous verrez le compte nouvellement ajouté comme le dernier dans la liste de vos comptes de facturation (7 sur l'image). Cliquez sur le lien de commande en face pour accéder à ses paramètres (8 dans l'image). Le message que nous recevons en réponse ressemble à ceci:
Configuration du compte ap110741100
Solde: 0 RUB
Nom du magasin:
Clé API non spécifiée : eHW2IQZQYjlJjgQ
URL pour les notifications:
URL de transition après paiement réussi non spécifiée: URL de transition après paiement réussi n'est pas spécifiée
: Non spécifié
Payeur de commission sur le paiement: Store
Delete account (/ delapsch_100Re6)
Utilisez les boutons sous ce message pour modifier les paramètres requis
Créer un fichier de paramètres
Créez un fichier config.php et collez-y le code suivant
<?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";
?>
Ici, nous allons connecter la base de données mysql (nous en aurons besoin pour stocker les soldes des utilisateurs et les informations sur les paiements) et définir 2 variables $ tlwkey et $ tlwacc pour stocker la clé API et le numéro de compte du message reçu du bot.
Créons 2 tables dans notre base de données:
- utilisateurs (identifiant, nom, solde, sur-nombre) - nous stockerons des données sur les utilisateurs
- donate (id, user_id, sum, done) - informations sur les dons
Ensuite, créons un fichier index.php (nous allons diriger notre webhook de Telegram vers celui-ci) et y insérer le code suivant:
<?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);
}
}
?>
Ici, nous définissons quel message est reçu de l'utilisateur. Nous l'envoyons, ainsi que l'ID utilisateur à la fonction getAnsw (). Il renvoie un tableau de messages que nous transmettons à l'utilisateur.
Créons maintenant le fichier commands.php et insérons l'implémentation de la fonction getAnsw () dedans
<?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];
}
}
?>
Lorsque l'utilisateur clique sur Dépôt et sélectionne le montant à l'aide des boutons en ligne sous le message, un lien de paiement est créé dans la ligne:
$resp = $tlw->getheque($arr[1],$payId);
La fonction getheque renverra un tableau associatif avec des paramètres error et url. L'erreur doit être "0", et il est souhaitable de vérifier cela aussi, mais j'ai omis cette vérification par souci de concision. Nous utilisons le paramètre url pour générer un message avec un bouton en ligne, en cliquant sur lequel l'utilisateur de notre bot se rendra sur @TeleWalletAbot et effectuera un paiement (ou non). La vérification du fait du paiement est décrite ci-dessous.
Lorsqu'un utilisateur commande un retrait, il doit disposer d'un numéro de compte pour le retrait. Si ce n'est pas le cas, nous l'en informons. Si le compte est spécifié, nous essayons d'effectuer un retrait en utilisant la fonction sendOutpay, et si le code d'erreur renvoyé par celui-ci est "0", le retrait a réussi et nous déduisons les fonds du solde de l'utilisateur dans notre bot.
Vérification du fait du paiement
Pour vérifier le fait du paiement et du crédit des fonds sur le solde de l'utilisateur, créons un autre script: notice.php . Voici son 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";
?>
Ce fichier recevra un webhook du portefeuille lorsque l'utilisateur aura terminé le paiement avec succès.
Pour obtenir une description des paramètres de la requête POST, consultez la documentation du SDK .
Revenons maintenant à notre compte de paiement dans le portefeuille. Cliquez sur le bouton URL pour les notifications et envoyez au bot un lien vers notre fichier notice.php Indiquez
également le nom du magasin (plus précisément, votre projet). Lorsque l'URL réussit et que l'URL échoue, spécifiez simplement un lien vers votre projet (bot)
Eh bien, c'est probablement tout. Nous avons créé avec vous un robot de test qui vous permet de comprendre comment travailler avec l'API de paiement TeleWallet.
Vous pouvez voir comment ce cas de test fonctionne (il y a vraiment encore ajouté une saisie manuelle du montant et du compte lors du retrait) par le lien: http://t.me/TlwSdkBot...
Pour une meilleure compréhension du code de l'article, ainsi que pour une description des codes d'erreur et des paramètres de requête, consultez la documentation .