أود اليوم أن أتحدث عن كيفية العمل مع واجهة برمجة تطبيقات الدفع الخاصة بمحفظة TeleWallet التي ظهرت مؤخرًا في المساحات المفتوحة في Telegram ، وستكون هذه المقالة موضع اهتمام مالكي ومطوري برامج Telegram بوت بشكل أساسي ، لأن نظام الدفع هذا يسمح لك بقبول المدفوعات في Telegram دون مغادرة Telegram
أريد أن أشير على الفور إلى أنني لست مع أي نظام دفع أو ضده ، لكنني أريد فقط وصف كيفية العمل مع API.
المميزات والعيوب
المزايا الرئيسية (في رأيي) لقبول المدفوعات من خلال TeleWallet:
- عمولة منخفضة (إجمالي 0.8٪ للتعبئة التلقائية والدفع التلقائي)
- لا يوجد حد أدنى للمبلغ (بتعبير أدق ، الحد الأدنى للمبلغ هو 0.01)
- العملات المتعددة المتاحة (العملات الورقية والعملات المشفرة)
- القدرة على ربط عدد غير محدود من المشاريع بملف تعريف واحد
العيوب الرئيسية:
- انتشار منخفض للمورد (على الرغم من أنه من المرجح أن يكون ذلك قابلاً للإصلاح)
- عدم وجود واجهة باللغة الإنجليزية (تم تصميم المحفظة للجمهور الناطق باللغة الروسية ، وبالتالي ، أنظمة الدفع الشائعة في رابطة الدول المستقلة)
- التحويلات الآلية غير الكافية للأموال إلى المحفظة نفسها (في الوقت الحالي ، التجديد التلقائي للمحفظة متاح فقط من خلال Yandex.Money و Visa / MasterCard. بالنسبة لأنظمة الدفع الأخرى ، يتوفر التجديد شبه التلقائي ، وهذا هو سبب وجود وقت انتظار)
ربط المدفوعات التلقائية
اذا هيا بنا نبدأ. أولاً ، لنرسم روبوت اختبار PHP صغير بثلاثة أزرار:
- التوازن - لعرض الرصيد ومعرفة أنه قد تغير
- فوق حتى
- انسحب
لن أتحدث عن تسجيل روبوت في BotFather: لقد قيل الكثير قبلي حول هذا الموضوع. للعمل مع Telegram-bot-api ، سنستخدم irazasyed / telegram-bot-sdk . كيفية العمل مع SDK هذا ، وبالمناسبة ، فإن كيفية تسجيل روبوت في BotFather وتثبيت خطاف ويب عليه موصوف جيدًا هنا .
وبالطبع ، للعمل مع TeleWallet API ، سنستخدم SDK الرسمي الخاص بهم . هناك أيضًا لديهم إرشادات مفصلة حول كيفية التعامل مع المدفوعات وأمثلة التعليمات البرمجية. سأوضح لك أدناه كيفية الجمع بين أمثلة التعليمات البرمجية الواردة هناك مع روبوت حقيقي.
نقوم بإنشاء حساب دفع
- انتقل إلى bot t.me/TeleWalletAbot
- شغلها
- انقر فوق الزر قبول المدفوعات في القائمة الرئيسية
- تحت الرسالة التي تظهر ، انقر فوق الزر فتح حساب دفع
- اختر عملة الحساب
- ستظهر رسالة "تم إنشاء الحساب بنجاح"
تظهر الخطوات التي تبدأ من الثالث في الصورة. سترى الحساب المضاف حديثًا باعتباره آخر حساب في قائمة حسابات الفوترة (7 في الصورة). انقر فوق ارتباط الأوامر المقابل له للانتقال إلى إعداداته (8 في الصورة). تبدو الرسالة التي نتلقاها ردًا على النحو التالي:
إعداد الحساب ap110741100
الرصيد: 0 RUB
اسم المتجر:
مفتاح واجهة برمجة التطبيقات غير محدد :
عنوان URL eHW2IQZQYjlJjgQ للإخطارات:
عنوان 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 (سنحتاجها لتخزين أرصدة المستخدم ومعلومات حول المدفوعات) ونقوم بتعيين متغيرين $ tlwkey و $ tlwacc لتخزين مفتاح API ورقم الحساب من الرسالة المستلمة من الروبوت.
لنقم بإنشاء جدولين في قاعدة البيانات الخاصة بنا:
- المستخدمين (المعرف ، الاسم ، الرصيد ، العدد الزائد) - سنقوم بتخزين بيانات المستخدم
- تبرع (معرف ، معرف المستخدم ، مجموع ، انتهى) - معلومات حول التبرعات
بعد ذلك ، قم بإنشاء ملف index.php (سنوجه خطاف الويب الخاص بنا من 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);
}
}
?>
هنا نحدد الرسالة التي يتم تلقيها من المستخدم. نرسله ، بالإضافة إلى معرف المستخدم لوظيفة 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);
ستعيد وظيفة getSheque مصفوفة ارتباطية بها خطأ في المعلمات وعنوان url. يجب أن يكون الخطأ "0" ، ومن المستحسن التحقق من ذلك أيضًا ، لكنني حذفت هذا التحقق من الإيجاز. نحن نستخدم معلمة url لتكوين رسالة بها زر مضمن ، عند النقر فوق أي مستخدم من الروبوت الخاص بنا سيذهب إلىTeleWalletAbot ويقوم بالدفع (أو لا). التحقق من حقيقة الدفع موصوف أدناه.
عندما يطلب المستخدم سحبًا ، يجب أن يكون لديه رقم حساب للسحب. إذا لم يكن الأمر كذلك ، فنبلغه بذلك. إذا تم تحديد الحساب ، نحاول إجراء عملية سحب باستخدام وظيفة sendOutpay ، وإذا كان رمز الخطأ الذي أرجعه هو "0" ، فإن السحب كان ناجحًا ، ونقوم بشطب الأموال من رصيد المستخدم في الروبوت الخاص بنا.
التحقق من حقيقة الدفع
للتحقق من حقيقة الدفع وإيداع الأموال في رصيد المستخدم ، فلنقم بإنشاء نص برمجي آخر: note.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";
?>
سيتلقى هذا الملف خطافًا على الويب من المحفظة عندما يُكمل المستخدم الدفع بنجاح.
للحصول على وصف لمعلمات طلب POST ، راجع وثائق SDK .
دعنا نعود الآن إلى حساب الدفع الخاص بنا في المحفظة. انقر فوق زر URL للإشعارات وأرسل إلى الروبوت رابطًا إلى ملف note.php الخاص بنا ،
كما أشر إلى اسم المتجر (بشكل أكثر دقة ، مشروعك). نظرًا لنجاح عنوان URL وفشل عنوان URL ، ما عليك سوى تحديد ارتباط إلى مشروعك (الروبوت)
حسنًا ، ربما هذا كل شيء. لقد أنشأنا معك روبوتًا اختباريًا يتيح لك فهم كيفية العمل مع TeleWallet Payment API.
يمكنك أن ترى كيف تعمل حالة الاختبار هذه (لا يزال هناك بالفعل إدخال يدوي مضاف للمبلغ والحساب عند السحب) من خلال الرابط: http://t.me/TlwSdkBot...
للحصول على فهم أفضل للكود في المقالة ، وكذلك للحصول على وصف لرموز الخطأ ومعلمات الاستعلام ، راجع الوثائق .