今天,我想谈谈如何使用最近出现在Telegram的开放空间中的TeleWallet钱包的支付API。本文将主要吸引Telegram机器人的所有者和开发人员关注,因为此付款系统允许在Telegram中接受付款而无需离开Telegram
我想马上指出,我不是“赞成”或“反对”任何支付系统,而只是想描述如何使用API。
的优点和缺点
我认为通过TeleWallet接受付款的主要优点是:
- 低佣金(自动充值和自动付款总计0.8%)
- 无最低金额(更确切地说,最低金额为0.01)
- 多种货币可用(法定货币和加密货币)
- 将无限数量的项目连接到一个配置文件的能力
主要缺点:
- 资源普及率低(尽管这很可能是可修复的)
- 缺少英语界面(该钱包是为俄语用户设计的,因此是独联体国家通用的支付系统)
- 资金到钱包本身的自动转移不足(目前,只能通过Yandex.Money和Visa / MasterCard进行钱包的自动补充。对于其他付款系统,由于需要等待时间,因此可以进行半自动补充)
连接自动付款
因此,让我们开始吧。首先,让我们画出一个带有3个按钮的小型PHP测试机器人:
- 余额-查看余额并查看余额是否已更改
- 充值
- 收回
我不会谈论在BotFather中注册机器人的问题:关于这个话题,我之前已经说了太多。要使用Telegram-bot-api,我们将使用irazasyed / telegram-bot-sdk。此处详细介绍了如何使用此SDK以及如何在BotFather中注册机器人并在其上安装Webhook 。
当然,要使用TeleWallet API,我们将使用其官方SDK。在那里,他们还提供了有关如何使用付款的详细说明以及代码示例。因此,下面我将向您展示如何将此处给出的代码示例与一个真正的机器人结合起来。
创建一个支付账户
- 前往bot t.me/TeleWalletAbot
- 运行
- 点击主菜单中的接受付款按钮
- 在显示的消息下,点击打开付款帐户按钮
- 选择账户币种
- 将会出现“成功创建帐户”消息
从第3步开始的步骤如图所示。您将在帐单帐户列表中看到新添加的帐户作为最后一个帐户(图中的7)。单击它对面的命令链接以转到其设置(在图片中为8)。我们收到的响应消息如下所示:
帐户设置ap110741100
余额:0 RUB
商店名称:未指定
API密钥:eHW2IQZQYjlJjgQ
通知的
URL:成功付款
后未指定的URL :失败(拒绝)后未指定的URL:未指定
付款的付款人:商店
删除帐户(/ delapsch_100Re6)
使用此消息下方的按钮来编辑所需的参数
创建一个设置文件
创建一个config.php文件,并将以下代码粘贴在那里
<?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";
?>
在这里,我们将连接mysql数据库(我们将需要它来存储用户余额和有关付款的信息),并创建2个变量$ tlwkey和$ tlwacc来存储从机器人收到的消息中的API密钥和帐号。
让我们在数据库中创建2个表:
- 用户(ID,名称,余额,人数)-我们将存储有关用户的数据
- 捐赠(id,user_id,总和,完成)-有关捐赠的信息
接下来,让我们创建一个index.php文件(我们将从Telegram将webhook定向到该文件)并在其中插入以下代码:
<?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);
}
}
?>
在这里,我们定义了从用户那里收到的消息。我们将它以及用户ID发送到getAnsw()函数。它返回我们转发给用户的消息数组。
现在让我们创建commands.php文件,并将getAnsw()函数实现插入其中
<?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];
}
}
?>
当用户单击“存款”并使用消息下方的嵌入式按钮选择金额时,将在以下行中创建付款链接:
$resp = $tlw->getheque($arr[1],$payId);
getheque函数将返回带有error和url参数的关联数组。错误应该为“ 0”,并且也希望对此进行检查,但为简洁起见,我省略了此检查。当单击该机器人的用户将被带到@TeleWalletAbot并且将付款(或不会付款)时,我们使用url参数形成带有内联按钮的消息。检查付款情况如下。
用户订购提款时,他们必须具有用于提款的帐号。如果不是这种情况,我们会通知他。如果指定了帐户,我们将尝试使用sendOutpay函数进行提款,并且如果该帐户返回的错误代码为“ 0”,则提款成功,并且我们会从漫游器的用户余额中扣除资金。
检查付款事实
要检查付款事实并将资金记入用户余额,让我们创建另一个脚本:notice.php。这是它的代码:
<?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";
?>
用户成功完成付款后,此文件将从钱包中收到一个Webhook。
有关POST请求参数的说明,请参见SDK文档。
现在让我们回到钱包中的付款帐户。按下URL按钮进行通知,并向bot发送指向我们notice.php文件的链接,
同时指明商店的名称(更准确地说,是您的项目)。由于URL成功而URL失败,只需指定指向您的项目(机器人)的链接,
好吧,仅此而已。我们与您一起创建了一个测试机器人,使您可以了解如何使用TeleWallet付款API。
您可以在以下链接中看到该测试用例的工作原理(提取时实际上仍然添加了金额和帐户的手动输入):http : //t.me/TlwSdkBot...
为了更好地理解本文中的代码,以及对错误代码和查询参数的描述,请参阅文档。