ساخت منوی شیشهای و دکمههای اینلاین در ربات بله (آموزش PHP)
۱۵ خرداد ۱۴۰۵ - ۵ ژوئن ۲۰۲۶
تا حالا توی ربات فروشگاهی بله، کاربر برای خرید باید تایپ میکرد؟ این بزرگترین قاتل نرخ تبدیل است! هر بار که کاربر مجبور شود چیزی تایپ کند، احتمال انصرافش بالا میرود. راه حل چیست؟ Inline Keyboard (منوی شیشهای). در این مقاله از مجموعه راهنمای جامع ربات فروشگاهی در بله، میخواهم به شما نشان دهم چطور با PHP یک فروشگاه کاملاً بصری بسازید که کاربر فقط با کلیک روی دکمهها محصولات را ببیند، انتخاب کند و حتی پرداخت را شروع کند. این دقیقاً همان ساختاری است که در ربات کلینیک دکتر رضوانی استفاده کردیم و نتیجهاش افزایش ۳۵٪ نرخ تکمیل خرید بود.
۱. Inline Keyboard چیست و چرا باید از آن استفاده کنید؟
Inline Keyboard (کیبورد درونخطی) دکمههایی هستند که زیر پیام ربات ظاهر میشوند. برخلاف Keyboard معمولی که فضای تایپ را اشغال میکند، دکمههای اینلاین کاملاً در متن پیام ادغام میشوند و با کلیک روی آنها، یک Callback Data به سرور ارسال میشود. یعنی کاربر بدون تایپ کردن، فقط با کلیک، در فروشگاه حرکت میکند.
سه مزیت اصلی Inline Keyboard برای فروشگاه شما:
- کاهش اصطکاک: کاربر تایپ نمیکند، فقط کلیک میکند. نرخ تعامل تا ۶۰٪ افزایش مییابد.
- مدیریت پیشرفته: هر دکمه یک Callback Data اختصاصی دارد که میتوانید با switch-case پردازش کنید.
- ظاهر حرفهای: فروشگاه شما دقیقاً شبیه یک اپلیکیشن به نظر میرسد، نه یک ربات معمولی.
۲. ساختار JSON دکمههای اینلاین در API بله
API بله (مشابه تلگرام) از یک ساختار JSON برای تعریف دکمهها استفاده میکند. یک Inline Keyboard شامل آرایهای از ردیفها (`inline_keyboard`) است که هر ردیف شامل یک یا چند دکمه است. هر دکمه یک متن (`text`) و یک `callback_data` دارد.
| پارامتر | توضیح | مثال |
|---|---|---|
| text | متنی که روی دکمه نمایش داده میشود | "خرید 🛒" |
| callback_data | دادهای که با کلیک به سرور ارسال میشود (حداکثر ۶۴ بایت) | "buy_product_15" |
| url | (اختیاری) یک لینک خارجی باز کند | "https://zarinpal.com/..." |
۳. پیادهسازی در PHP: نمایش دستهبندی محصولات
بیایید یک مثال واقعی بزنیم. میخواهیم وقتی کاربر استارت میزند، دستهبندیهای اصلی فروشگاه را ببیند:
<?php
function sendMainMenu($chat_id) {
$keyboard = [
'inline_keyboard' => [
[['text' => '🐶 غذای سگ', 'callback_data' => 'category_dog_food']],
[['text' => '🐱 غذای گربه', 'callback_data' => 'category_cat_food']],
[['text' => '🧴 شامپو و بهداشتی', 'callback_data' => 'category_shampoo']],
[['text' => '🛒 سبد خرید', 'callback_data' => 'view_cart'], ['text' => '📞 پشتیبانی', 'callback_data' => 'support']]
]
];
$reply_markup = json_encode($keyboard);
sendMessage($chat_id, "به فروشگاه ما خوش آمدید!\nدستهبندی مورد نظر را انتخاب کنید:", $reply_markup);
}
?>
با این کد، یک منوی ۴ ردیفه ساخته میشود. ردیف آخر دو دکمه در کنار هم دارد. کاربر فقط با کلیک روی هر گزینه، یک `callback_data` مثل `category_dog_food` به سرور ارسال میکند.
۴. پردازش Callback Data و نمایش زیرمنو
حالا باید در Webhook ربات، callback_data را دریافت و پردازش کنید:
<?php
$update = json_decode(file_get_contents('php://input'), true);
if (isset($update['callback_query'])) {
$callback = $update['callback_query'];
$chat_id = $callback['message']['chat']['id'];
$data = $callback['data'];
switch ($data) {
case 'category_dog_food':
showProducts($chat_id, 'dog_food');
break;
case 'category_cat_food':
showProducts($chat_id, 'cat_food');
break;
case 'view_cart':
showCart($chat_id);
break;
// ... سایر case ها
}
// حتماً به bale پاسخ دهید که callback دریافت شده
answerCallbackQuery($callback['id']);
}
function showProducts($chat_id, $category) {
$products = getProductsFromDB($category); // از دیتابیس بخوانید
$keyboard = ['inline_keyboard' => []];
foreach ($products as $p) {
$keyboard['inline_keyboard'][] = [
['text' => $p['name'] . ' - ' . number_format($p['price']) . ' تومان', 'callback_data' => 'add_to_cart_' . $p['id']]
];
}
$keyboard['inline_keyboard'][] = [['text' => '🔙 بازگشت', 'callback_data' => 'main_menu']];
sendMessage($chat_id, "محصولات $category:", json_encode($keyboard));
}
?>
با این ساختار، کاربر میتواند تا عمق دلخواه در منوها حرکت کند، همه چیز فقط با کلیک. تابع `answerCallbackQuery` هم ضروری است، وگرنه کاربر یک ساعتشنی آزاردهنده میبیند.
۵. دکمههای ترکیبی: پرداخت و لینک خارجی
گاهی نیاز دارید دکمهای کاربر را به یک URL خارجی (مثلاً درگاه پرداخت) هدایت کند. برای این کار از پارامتر `url` استفاده کنید:
$keyboard = [
'inline_keyboard' => [
[['text' => '💳 پرداخت آنلاین', 'url' => $payment_url]],
[['text' => '📋 مشاهده فاکتور', 'callback_data' => 'view_invoice_' . $order_id]]
]
];
این دقیقاً همان روشی است که در اتصال ربات بله به زرینپال توضیح دادیم. دکمه اول کاربر را به درگاه میبرد و دکمه دوم داخل ربات پردازش میشود.
۶. نکات طلایی برای طراحی منوی حرفهای
- از ایموجیهای مرتبط استفاده کنید. 🛒🐶📦. این کار نرخ کلیک را ۲۰٪ افزایش میدهد.
- هر ردیف حداکثر ۲ دکمه بگذارید. ردیفهای شلوغ روی موبایل بههمریخته میشوند.
- دکمه بازگشت را فراموش نکنید. کاربر نباید احساس گم شدن کند.
- callback_data را کوتاه نگه دارید. از `cat_1` به جای `show_products_of_category_number_one` استفاده کنید.
- منوهای طولانی را صفحهبندی کنید. اگر بیش از ۱۰ محصول دارید، دکمههای «صفحه بعد» بگذارید.
۷. نمونه واقعی: منوی ربات کلینیک دکتر رضوانی
در ربات @DrRezvaniBot که توسط خانه ربات و وب ساخته شده، کاربر بدون حتی یک خط تایپ کردن، مراحل زیر را طی میکند:
برای دیدن جزئیات فنی بیشتر، معرفی کامل شهبازیون را بخوانید.
۸. سوالات متداول
حداکثر تعداد دکمههای اینلاین چقدر است؟
در API بله، حداکثر ۱۰۰ دکمه در یک پیام میتوانید داشته باشید. اما توصیه میکنیم بیش از ۲۰ دکمه نگذارید تا تجربه کاربری افت نکند. برای محصولات زیاد، صفحهبندی کنید.
آیا میتوانم دکمههای اینلاین را بعد از ارسال ویرایش کنم؟
بله، با متد `editMessageReplyMarkup` میتوانید دکمههای یک پیام را عوض کنید. مثلاً بعد از اتمام موجودی، دکمه «اتمام موجودی» را جایگزین «خرید» کنید.
تفاوت callback_data و url در دکمه چیست؟
`callback_data` به سرور شما ارسال میشود و میتوانید پردازش کنید. `url` کاربر را مستقیماً به یک لینک خارجی میبرد. برای پرداخت، از `url` استفاده کنید.
چطور از کلیکهای تکراری کاربر جلوگیری کنم؟
بعد از دریافت callback_query، یک پاسخ سریع (`answerCallbackQuery`) بدهید. برای عملیات حساس مثل پرداخت، میتوانید callback_data را در سشن ذخیره و یکبار مصرف کنید.
آیا این کد برای تلگرام و روبیکا هم کار میکند؟
ساختار Inline Keyboard در بله، تلگرام و روبیکا مشابه است. فقط ممکن است برخی پارامترهای اختیاری متفاوت باشد. برای مقایسه کامل، مقایسه API پیامرسانها را ببینید.
💬 نظرات کاربران
هنوز نظری ثبت نشده است. اولین نفری باشید که نظر میدهید!