TeleWalletAbotを介して自動支払いをTelegramボットに接続する

良い一日。



今日は、Telegramのオープンスペースに最近登場したTeleWalletウォレットの支払いAPIの操作方法についてお話したいと思います



私はどの支払いシステムにも「賛成」または「反対」ではないことをすぐに指摘したいと思いますが、APIの操作方法について説明したいと思います。



長所と短所



TeleWalletを介して支払いを受け入れることの(私の意見では)主な利点:



  • 低手数料(自動補充と自動支払いの合計で0.8%)
  • 最小量なし(より正確には、最小量は0.01です)
  • 利用可能な複数の通貨(フィアットとクリプト)
  • 無制限の数のプロジェクトを1つのプロファイルに接続する機能


主な欠点:



  • リソースの普及率が低い(これはおそらく修正可能ですが)
  • 英語のインターフェースの欠如(ウォレットはロシア語を話す聴衆のために設計されているため、CISで一般的な支払いシステム)
  • ウォレット自体への資金の自動転送が不十分です(現時点では、ウォレットの自動補充はYandex.MoneyおよびVisa / MasterCardを介してのみ利用できます。他の支払いシステムでは、半自動補充が利用可能であるため、待ち時間があります)


自動支払いの接続



それでは始めましょう。まず、3つのボタンを備えた小さなPHPテストボットをスケッチしてみましょう。



  • バランス-バランスを表示し、それが変更されたことを確認します
  • 補充
  • 撤回


ボットをBotFatherに登録することについては説明しません。このトピックについては、私の前であまりにも多くのことが言われています。Telegram-bot-apiを操作するには、irazasyed / telegram-bot-sdkを使用します。このSDKの操作方法、およびBotFatherにボットを登録してWebhookをインストールする方法については、ここで詳しく説明しています



そしてもちろん、TeleWallet APIを使用するには、公式のSDKを使用しますそこには、支払いの操作方法とコード例に関する詳細な説明もあります。以下では、そこに示されているコード例を実際のボットと組み合わせる方法を示します。



支払いアカウントを作成します



  1. ボットに移動しますt.me/TeleWalletAbot
  2. それを実行します
  3. メインメニューの[支払い受け入れる]ボタンをクリックします
  4. 表示されるメッセージの下で、[支払いアカウントを開く]ボタンをクリックします
  5. アカウント通貨を選択
  6. 「アカウントが正常に作成されました」というメッセージが表示されます


画像



写真は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データベースに接続し(ユーザーの残高と支払いに関する情報を保存するために必要になります)、ボットから受信したメッセージからAPIキーとアカウント番号を保存するための2つの変数$ tlwkeyと$ tlwaccを作成します。



データベースに2つのテーブルを作成しましょう。



  1. ユーザー(ID、名前、残高、アウトナンバー)-ユーザーデータを保存します
  2. 寄付(id、user_id、sum、finished)-寄付に関する情報


次に、index.phpファイルを作成し(WebhookをTelegramからそのファイルに転送します)、そこに次のコードを挿入します。



<?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関数は、エラーパラメータとurlパラメータを含む連想配列を返します。エラーは「0」である必要があり、これもチェックすることが望ましいですが、簡潔にするためにこのチェックを省略しました。urlパラメータを使用して、インラインボタンでメッセージを生成します。クリックすると、ボットのユーザーが@TeleWalletAbotにアクセスして支払いを行います(または行いません)。お支払い内容の確認は以下のとおりです。



ユーザーが引き出しを注文するときは、引き出し用のアカウント番号が必要です。そうでない場合は、彼に通知します。アカウントが指定されている場合、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ボタンクリックし、notice.phpファイルへのリンクをボットに送信し



ます。ストアの名前(より正確には、プロジェクト)も指定します。 URLは成功し、URLは失敗するので、プロジェクト(ボット)へのリンクを指定するだけ



です。おそらくそれだけです。 TeleWallet PaymentAPIの操作方法を理解できるテストボットを作成しました。



このテストケースがどのように機能するかを確認するには、次のリンクを参照してください(実際には、引き出し時に金額とアカウントの手動入力が追加されています):http//t.me/TlwSdkBot..。



記事のコードをよりよく理解するため、およびエラーコードとクエリパラメータの説明については、ドキュメントを参照してください



All Articles