Menghubungkan pembayaran otomatis melalui TeleWalletAbot ke bot Telegram Anda

Selamat siang.



Hari ini saya ingin berbicara tentang cara bekerja dengan API pembayaran dompet TeleWallet yang baru-baru ini muncul di ruang terbuka Telegram.



Saya ingin segera menunjukkan bahwa saya tidak "mendukung" atau "menentang" sistem pembayaran apa pun, tetapi saya hanya ingin menjelaskan cara bekerja dengan API.



Keuntungan dan kerugian



Keuntungan utama (menurut saya) menerima pembayaran melalui TeleWallet:



  • Komisi rendah (total 0,8% untuk isi ulang otomatis dan pembayaran otomatis)
  • Tidak ada jumlah minimum (lebih tepatnya, jumlah minimum adalah 0,01)
  • Berbagai mata uang tersedia (fiat dan crypto)
  • Kemampuan untuk menghubungkan proyek dalam jumlah tak terbatas ke satu profil


Kerugian utama:



  • Prevalensi sumber daya yang rendah (meskipun kemungkinan besar dapat diperbaiki)
  • Kurangnya antarmuka berbahasa Inggris (dompet dirancang untuk audiens berbahasa Rusia dan, karenanya, sistem pembayaran yang umum di CIS)
  • Transfer dana otomatis yang tidak mencukupi ke dompet itu sendiri (saat ini, pengisian otomatis dompet hanya tersedia melalui Yandex.Money dan Visa / MasterCard. Untuk sistem pembayaran lain, pengisian semi-otomatis tersedia, itulah sebabnya ada waktu tunggu)


Menghubungkan pembayaran otomatis



Jadi mari kita mulai. Pertama, mari buat sketsa bot uji PHP kecil dengan 3 tombol:



  • Saldo - untuk melihat saldo dan melihat bahwa itu telah berubah
  • Isi ulang
  • Menarik


Saya tidak akan berbicara tentang mendaftarkan bot dengan BotFather: terlalu banyak yang telah dikatakan sebelum saya tentang topik ini. Untuk bekerja dengan Telegram-bot-api, kami akan menggunakan irazasyed / telegram-bot-sdk . Cara bekerja dengan SDK ini, dan cara mendaftarkan bot di BotFather dan menginstal webhook di atasnya dijelaskan dengan baik di sini .



Dan tentu saja, untuk bekerja dengan API TeleWallet kami akan menggunakan SDK resmi mereka . Di sana, mereka juga memiliki petunjuk terperinci tentang cara bekerja dengan pembayaran dan contoh kode. Jadi di bawah ini saya hanya akan menunjukkan kepada Anda bagaimana menggabungkan contoh kode yang diberikan di sana dengan bot nyata.



Buat akun pembayaran



  1. Buka bot t.me/TeleWalletAbot
  2. Menjalankannya
  3. Klik tombol Terima Pembayaran di menu utama
  4. Di bawah pesan yang muncul, klik tombol Buka akun pembayaran
  5. Pilih mata uang akun
  6. Pesan "Akun berhasil dibuat" akan muncul


gambar



Langkah-langkah mulai dari yang ke-3 ditunjukkan pada gambar. Anda akan melihat akun yang baru ditambahkan sebagai yang terakhir dalam daftar akun penagihan Anda (7 dalam gambar). Klik pada tautan perintah di seberangnya untuk pergi ke pengaturannya (8 dalam gambar). Pesan yang kami terima sebagai tanggapan terlihat seperti ini:

Setup akun ap110741100

Saldo: 0 RUB



Nama toko:

API key tidak ditentukan : eHW2IQZQYjlJjgQ

URL untuk pemberitahuan:

URL transisi setelah pembayaran berhasil tidak ditentukan: URL transisi setelah pembayaran berhasil tidak ditentukan

: Tidak ditentukan

Pembayar komisi pembayaran:

Akun Penghapusan Toko (/ delapsch_100Re6)



Gunakan tombol di bawah pesan ini untuk mengedit parameter yang diperlukan




Buat file pengaturan



Buat file config.php dan tempel kode berikut di sana



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


Di sini kita akan menghubungkan database mysql (kita akan membutuhkannya untuk menyimpan saldo pengguna dan informasi tentang pembayaran) dan mengatur 2 variabel $ tlwkey dan $ tlwacc untuk menyimpan kunci API dan nomor akun dari pesan yang diterima dari bot.



Mari buat 2 tabel di database kita:



  1. users (id, name, balance, outnumber) - kami akan menyimpan data pengguna
  2. donate (id, user_id, sum, finish) - informasi tentang donasi


Selanjutnya, mari buat file index.php (kita akan mengarahkan webhook kita dari Telegram ke sana) dan masukkan kode berikut di sana:



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


Di sini kami mendefinisikan pesan mana yang diterima dari pengguna. Kami mengirimkannya, serta ID pengguna ke fungsi getAnsw (). Ini mengembalikan array pesan yang kami teruskan ke pengguna.



Sekarang mari buat file commands.php dan memasukkan implementasi fungsi getAnsw () ke dalamnya



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


Ketika pengguna mengklik Setor dan memilih jumlah menggunakan tombol sebaris di bawah pesan, tautan pembayaran dibuat di baris:



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


Fungsi getheque akan mengembalikan array asosiatif dengan kesalahan parameter dan url. kesalahan harus "0", dan diinginkan untuk memeriksa ini juga, tetapi saya menghilangkan pemeriksaan ini untuk singkatnya. Kami menggunakan parameter url untuk membentuk pesan dengan tombol inline, saat mengklik di mana pengguna bot kami akan dibawa ke @TeleWalletAbot dan akan membayar (atau tidak). Memeriksa fakta pembayaran dijelaskan di bawah ini.



Ketika seorang pengguna memesan penarikan, mereka harus memiliki nomor akun untuk penarikan. Jika tidak demikian, kami memberi tahu dia tentang hal itu. Jika akun ditentukan, kami mencoba melakukan penarikan menggunakan fungsi sendOutpay, dan jika kode kesalahan yang dikembalikan adalah "0", maka penarikan berhasil, dan kami menghapus dana dari saldo pengguna di bot kami.



Memeriksa fakta pembayaran



Untuk memeriksa fakta pembayaran dan pengkreditan dana ke saldo pengguna, kami akan membuat skrip lain: notice.php . Ini kodenya:



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


File ini akan menerima webhook dari dompet saat pengguna berhasil menyelesaikan pembayaran.



Untuk penjelasan tentang parameter permintaan POST, lihat dokumentasi SDK .



Mari kita kembali sekarang ke akun pembayaran kita di dompet. Klik tombol URL untuk notifikasi dan kirim bot tautan ke file notice.php kami. Tunjukkan



juga nama toko (lebih tepatnya, proyek Anda). Karena URL berhasil dan URL gagal, cukup tentukan tautan ke proyek (bot) Anda



. Mungkin itu saja. Kami telah membuat bot uji coba dengan Anda yang memungkinkan Anda memahami cara bekerja dengan API pembayaran TeleWallet.



Anda dapat melihat bagaimana test case ini bekerja (masih ada input manual dari jumlah dan akun saat penarikan) melalui link: http://t.me/TlwSdkBot...



Untuk pemahaman yang lebih baik tentang kode dalam artikel, serta untuk deskripsi kode kesalahan dan parameter kueri, lihat dokumentasi .



All Articles