
فرض کنید هر بار که سفارشی در فروشگاه ووکامرسی ثبت میشود، باید اطلاعات آن را برای نرمافزار حسابداری، سیستم انبار یا CRM ارسال کنید. اگر این کار را دستی انجام دهید، هم زمان زیادی میگیرد و هم ممکن است بعضی سفارشها از قلم بیفتند. وب هوک در ووکامرس برای همین موقعیتها کاربرد دارد. با تعریف یک رویداد و یک آدرس مقصد، ووکامرس میتواند هنگام وقوع آن رویداد، اطلاعات مربوط را به سرویس دیگری بفرستد.
راهاندازی اولیه وب هوک از پیشخوان ووکامرس انجام میشود، اما دریافت امن اطلاعات به آمادگی سرویس مقصد هم بستگی دارد. در این آموزش توضیح میدهیم وب هوک چگونه کار میکند، چه تفاوتی با API و هوکهای وردپرس دارد، چطور آن را بسازید و با یک سفارش آزمایشی از درست کار کردنش مطمئن شوید.
وب هوک در ووکامرس چیست و چه کاربردی دارد
وب هوک یا Webhook روشی برای اطلاعرسانی خودکار بین دو نرمافزار است. وقتی اتفاق مشخصی در فروشگاه رخ میدهد، ووکامرس یک درخواست اینترنتی به آدرسی که از قبل تعیین کردهاید ارسال میکند. این درخواست معمولاً از نوع HTTP POST است و اطلاعات رویداد را در قالب JSON به برنامه دریافتکننده میرساند.
برای مثال میتوانید مشخص کنید هر زمان سفارش جدیدی در ووکامرس ایجاد شد، اطلاعات آن برای سامانه مدیریت سفارش ارسال شود. برنامه مقصد درخواست را دریافت میکند و پس از اعتبارسنجی و بررسی دادهها، سفارش را در سیستم خود ثبت میکند. در این حالت نیازی نیست نرمافزار مقصد هر چند دقیقه یکبار فروشگاه را بررسی کند.
وب هوک میتواند برای هماهنگی سفارشها با نرمافزار حسابداری، ثبت مشتری در CRM، اطلاعرسانی تغییر موجودی محصولات یا ارسال اطلاعات سفارش به ابزارهای اتوماسیون استفاده شود. البته همه این امکانات فقط با پر کردن فرم ووکامرس انجام نمیشوند. سامانه مقصد هم باید امکان دریافت و پردازش پیام وب هوک را داشته باشد.
نکته مهم این است که ثبت سفارش لزوماً به معنی پرداخت موفق نیست. اگر قرار است بعد از دریافت وجه کاری مانند صدور دسترسی یا ثبت فروش قطعی انجام شود، سرویس مقصد باید وضعیت معتبر سفارش و پرداخت را نیز بررسی کند. موضوع «سفارش ایجاد شد» برای چنین تصمیمی بهتنهایی کافی نیست.
تفاوت وب هوک با API و هوکهای وردپرس
وب هوک، API و هوک وردپرس هر سه در برقراری ارتباط یا اجرای یک فرایند نقش دارند، ولی کارشان یکسان نیست. تفاوت را با یک مثال ساده بررسی کنیم.
فرض کنید یک نرمافزار حسابداری میخواهد سفارشهای جدید فروشگاه را دریافت کند. اگر این نرمافزار از API ووکامرس استفاده کند، میتواند در زمان دلخواه از فروشگاه درخواست کند که اطلاعات سفارشها را برگرداند. اگر این درخواست هر چند دقیقه تکرار شود، به آن Polling میگویند.
با وب هوک مسیر برعکس میشود. این بار ووکامرس در زمان رخ دادن رویداد، خودش به آدرس نرمافزار حسابداری پیام میفرستد. بنابراین برای باخبر شدن از یک اتفاق مشخص، به بررسی مداوم فروشگاه نیاز نیست. البته API مفهومی گستردهتر از دریافت اطلاعات است و برای ثبت، ویرایش یا حذف دادهها نیز به کار میرود. در عمل وب هوک و API مکمل یکدیگرند؛ وب هوک خبر میدهد و سامانه مقصد میتواند در صورت نیاز جزئیات تکمیلی را از طریق API دریافت کند.
هوکهای وردپرس موضوع دیگری هستند. Action و Filter به افزونهها و کدهای داخل وردپرس اجازه میدهند هنگام اجرای بخشهای مختلف سایت کاری انجام دهند یا دادهای را تغییر دهند. برای مثال یک Action میتواند هنگام تغییر وضعیت سفارش اجرا شود. اما خود هوک وردپرس به معنی فرستادن اطلاعات به سرور خارجی نیست. ووکامرس میتواند بر پایه بعضی از همین رویدادها، وب هوک خارجی ارسال کند.
| معیار | وب هوک ووکامرس | REST API ووکامرس | هوک وردپرس |
|---|---|---|---|
| شروع ارتباط | با رخ دادن رویداد، از سمت ووکامرس | با درخواست برنامه مصرفکننده | با اجرای رویداد یا فیلتر داخل وردپرس |
| کاربرد اصلی | اطلاعرسانی خودکار به سرویس دیگر | دریافت یا تغییر اطلاعات فروشگاه | اجرای منطق افزونهها و تغییر رفتار وردپرس |
| نیاز به آدرس اینترنتی مقصد | بله | برنامه درخواستدهنده به API متصل میشود | خیر، ذاتاً داخل وردپرس اجرا میشود |
| نمونه استفاده | اطلاع از سفارش جدید | گرفتن فهرست سفارشهای هفته | اجرای تابع بعد از تغییر وضعیت سفارش |
اگر فقط میخواهید سرویس دیگری از ایجاد یا تغییر یک سفارش مطلع شود، وب هوک انتخاب مناسبی است. اگر به جستوجوی تاریخچه سفارشها یا دریافت اطلاعات در زمان دلخواه نیاز دارید، API مناسبتر است. برای تغییر رفتار داخلی وردپرس نیز باید سراغ Action و Filter بروید.
پیشنیازهای راهاندازی وب هوک در ووکامرس
برای ساخت وب هوک نیازی به نصب افزونه جداگانه ندارید؛ این امکان در خود ووکامرس وجود دارد. اگر فروشگاه را تازه راهاندازی میکنید، ابتدا مراحل نصب ووکامرس در وردپرس را کامل کنید. پیش از ساخت وب هوک هم چند مورد باید آماده باشد.
- دسترسی به تنظیمات ووکامرس: باید با حسابی وارد شوید که اجازه مدیریت وب هوکها را دارد.
- آدرس دریافتکننده: سرویس مقصد باید یک URL مشخص داشته باشد که درخواستهای POST را دریافت کند. برای استفاده واقعی بهتر است آدرس HTTPS باشد.
- امکان پردازش اطلاعات: قرار دادن نشانی سایت یا صفحه اصلی نرمافزار مقصد کافی نیست. باید آدرسی وارد شود که مخصوص دریافت وب هوک طراحی شده است.
- کلید محرمانه مشترک: برای آنکه مقصد بتواند معتبر بودن پیام را بررسی کند، Secret مشخصی در هر دو سمت تعریف کنید.
- امکان آزمایش: بهتر است ابتدا از یک فروشگاه آزمایشی و آدرس دریافت تستی استفاده کنید تا اطلاعات واقعی مشتریان به سرویس نامطمئن نرسد.
اگر ووکامرس روی لوکال هاست اجرا میشود و فقط با آدرسی مانند localhost قابل دسترسی است، یک سرویس بیرونی لزوماً نمیتواند به آن متصل شود. برای آزمایش دریافت وب هوک باید مسیر شبکه و دسترسی به سرویس مقصد را بررسی کنید. آدرس مقصد نیز نباید پشت صفحه ورود یا محدودیتی باشد که درخواست ووکامرس را بدون روش احراز هویت مورد توافق رد کند.
آموزش ساخت وب هوک در تنظیمات ووکامرس
برای شروع وارد پیشخوان وردپرس شوید و مسیر ووکامرس ← پیکربندی ← پیشرفته ← وب هوکها را باز کنید. در محیط انگلیسی این مسیر به صورت WooCommerce → Settings → Advanced → Webhooks نمایش داده میشود.
در این صفحه وب هوکهای قبلی فروشگاه را میبینید. اگر هنوز وب هوکی وجود ندارد، گزینه ساخت وب هوک جدید را انتخاب کنید. در غیر این صورت روی افزودن وب هوک (Add webhook) کلیک کنید. سپس فرم تنظیمات باز میشود.
برای مثال، فرض میکنیم میخواهید هر سفارش جدید را برای یک سامانه انبارداری آزمایشی بفرستید. فیلدها را به این شکل بررسی کنید:
- نام (Name): یک نام مشخص مانند «ارسال سفارش جدید به انبار» بگذارید تا بعداً هدف وب هوک را بشناسید.
- وضعیت (Status): برای ارسال پیام روی Active قرار دهید. اگر هنوز مقصد آماده نیست، موقتاً Paused را انتخاب کنید.
- موضوع (Topic): در این مثال «Order created» یا ایجاد سفارش را انتخاب کنید.
- پیوند تحویل (Delivery URL): نشانی دقیق بخش دریافت وب هوک در سرویس مقصد را وارد کنید.
- کلید محرمانه (Secret): کلیدی تعریف کنید که در تنظیمات سرویس مقصد نیز برای بررسی امضای پیام استفاده میشود.
در پایان روی ذخیره وب هوک (Save webhook) کلیک کنید. طبق مستندات ووکامرس، هنگام نخستین ذخیره وب هوک فعال، یک درخواست آزمایشی Ping به مقصد فرستاده میشود. این پیام را با ارسال داده یک سفارش واقعی اشتباه نگیرید.
عنوان فیلدها ممکن است در نسخههای مختلف ووکامرس یا ترجمه فارسی تفاوت جزئی داشته باشد، اما نامهای انگلیسی آنها به شناسایی گزینهها کمک میکنند.
انتخاب رویداد و تنظیم آدرس دریافت اطلاعات
انتخاب رویداد مهمترین تصمیم هنگام ساخت وب هوک است. اگر موضوع را اشتباه انتخاب کنید، ممکن است اطلاعات زودتر یا دیرتر از زمانی که نیاز دارید ارسال شوند. برای مثال order.created برای اطلاع از ایجاد سفارش مناسب است، اما پرداخت موفق را تضمین نمیکند.
در ووکامرس موضوعهای استانداردی مانند order.created، order.updated، order.deleted، product.updated و customer.created وجود دارند. برخی افزونهها نیز ممکن است رویدادهای دیگری اضافه کنند. اگر موضوع Action را انتخاب کنید، باید نام Action مربوط را نیز وارد کنید. این گزینه بیشتر برای زمانی است که توسعهدهنده دقیقاً میداند چه رویدادی در وردپرس اجرا میشود.
اگر هدف شما اطلاع از پرداخت قطعی است، معمولاً باید تغییر وضعیت سفارش را بررسی کنید و در سیستم مقصد پس از تأیید معتبر بودن پیام، وضعیت پرداخت را نیز کنترل کنید. بسته به روش پرداخت، ایجاد سفارش و تأیید وجه در دو زمان متفاوت رخ میدهند. برای آشنایی با مسیر پرداخت و وضعیت سفارش، راهنمای درگاه پرداخت ووکامرس در همیار وردپرس نیز به شناخت این فرایند کمک میکند.
در فیلد Delivery URL باید نشانی بخشی از سرویس مقصد را وارد کنید که برای دریافت پیام طراحی شده است. برای نمونه https://example.com/webhooks/woocommerce فقط یک آدرس فرضی است و تا زمانی که برنامهای پشت آن درخواستها را پردازش نکند، کاربردی نخواهد داشت. از وارد کردن URL سایت شخص دیگری یا ابزار عمومی ثبت درخواست با داده واقعی مشتریان خودداری کنید.
وب هوک ووکامرس دادهها را معمولاً به شکل JSON ارسال میکند. بنابراین سرویس مقصد باید بتواند بدنه درخواست را بخواند، رویداد را تشخیص دهد و پاسخ مناسب برگرداند. اگر سامانه حسابداری شما ساختار داده متفاوتی میخواهد، ممکن است برای تبدیل اطلاعات به یک رابط میانی یا ابزار اتوماسیون نیاز داشته باشید.
کلید Secret چیست و چگونه امنیت وب هوک را بررسی کنیم
وقتی آدرس دریافت وب هوک در اینترنت در دسترس است، فقط دریافت شدن یک درخواست کافی نیست تا به آن اعتماد کنیم. ممکن است هر شخص دیگری هم به همان آدرس درخواست ارسال کند. Secret یک کلید مشترک و محرمانه است که به سرویس مقصد کمک میکند تشخیص دهد محتوای پیام واقعاً با کلید تعریفشده برای وب هوک امضا شده است یا خیر.
ووکامرس با استفاده از Secret و بدنه اصلی درخواست، امضای HMAC-SHA256 میسازد و آن را در هدر X-WC-Webhook-Signature قرار میدهد. سرویس مقصد باید با کلید یکسان، امضا را دوباره روی همان بدنه خام محاسبه و نتیجه را مقایسه کند. اگر امضا معتبر نبود، نباید محتوای درخواست را بهعنوان سفارش معتبر پردازش کند.
برای روشنتر شدن موضوع، نمونه زیر فقط بخش اعتبارسنجی امضا در PHP را نشان میدهد. این کد بهتنهایی یک سرویس دریافت وب هوک کامل نیست و نباید بدون ساخت Endpoint مناسب، مدیریت خطا و ثبت امن رویدادها در فایل قالب وردپرس قرار بگیرد.
کد نمونه :
<?php
$secret = 'YOUR_PRIVATE_WEBHOOK_SECRET';
$raw_body = file_get_contents('php://input');
$received_signature = $_SERVER['HTTP_X_WC_WEBHOOK_SIGNATURE'] ?? '';
$expected_signature = base64_encode(
hash_hmac('sha256', $raw_body, $secret, true)
);
if (!hash_equals($expected_signature, $received_signature)) {
http_response_code(401);
exit;
}
// Only after signature verification: validate and process the payload.
?>
برای استفاده واقعی، مقدار نمونه Secret باید از تنظیمات امن برنامه خوانده شود و در کد عمومی یا مخزن قابل دسترس قرار نگیرد. از HTTPS استفاده کنید، کلید را در اسکرینشات منتشر نکنید و اطلاعات حساس مشتریان را در گزارشهای عمومی ذخیره نکنید. نکته دیگر این است که امضای معتبر، مشکل ارسال تکراری پیام را بهتنهایی حل نمیکند؛ جلوگیری از پردازش دوباره را در بخش جداگانه توضیح دادهایم.
آزمایش ارسال اطلاعات با یک سفارش تستی
بعد از ذخیره وب هوک، بهتر است ابتدا دریافتکننده و سپس جریان یک سفارش آزمایشی را بررسی کنید. برای این کار نیازی به ایجاد سفارش واقعی و پرداخت پول نیست؛ اگر فروشگاه محیط Staging یا درگاه Sandbox دارد، از همان استفاده کنید.
- در سرویس مقصد مطمئن شوید Endpoint موردنظر آماده دریافت درخواست است و برای درخواست معتبر پاسخ موفق مانند
200میفرستد. - در ووکامرس وب هوک را روی وضعیت Active قرار دهید و موضوع
order.createdرا انتخاب کنید. - یک محصول آزمایشی را به سبد خرید اضافه کنید و فرایند ثبت سفارش را تکمیل کنید. اگر لازم است، از روش پرداخت آزمایشی استفاده کنید.
- در سرویس مقصد بررسی کنید آیا درخواست HTTP دریافت شده، هدر امضا معتبر بوده و اطلاعات سفارش ثبت شدهاند یا خیر.
- در پیشخوان ووکامرس شماره سفارش و زمان ثبت را بررسی و با اطلاعات دریافتی مقصد مقایسه کنید.
اگر موضوع وب هوک شما order.updated است، فقط ساخت سفارش کافی نیست. باید تغییر مرتبطی روی سفارش آزمایشی انجام دهید تا رویداد بروزرسانی رخ دهد. همچنین اگر قصد دارید پیامها را پس از پرداخت موفق پردازش کنید، نتیجه را با وضعیت تراکنش درگاه آزمایشی و وضعیت نهایی سفارش تطبیق دهید.
وب هوکها ممکن است با کمی تأخیر در صف پردازش پسزمینه ارسال شوند. بنابراین نرسیدن پیام در همان ثانیه اول، بهتنهایی به معنی خرابی نیست. از طرف دیگر، دریافت درخواست در سرویس مقصد هم کافی نیست؛ باید مطمئن شوید درخواست پس از بررسی امضا، بهدرستی پردازش شده است.
مشاهده گزارشهای ارسال وب هوک در ووکامرس
اگر میخواهید بدانید وب هوک واقعاً ارسال شده یا هنگام ارتباط با مقصد خطایی رخ داده است، بخش گزارشهای ووکامرس را باز کنید. از مسیر ووکامرس ← وضعیت ← گزارشها یا در پیشخوان انگلیسی WooCommerce → Status → Logs وارد صفحه شوید.
در نسخههای جدید ووکامرس میتوانید منبع گزارش را روی webhooks-delivery بگذارید یا نام مرتبط را در فهرست گزارشها جستوجو کنید. سپس جزئیات ارسال و پاسخ سرور مقصد را بررسی کنید. بسته به نسخه ووکامرس و تنظیمات ثبت گزارش، ممکن است زمان ارسال، شناسه وب هوک، مقصد، کد پاسخ و پیام خطا در گزارشها دیده شود.
اگر کد پاسخ 2xx است، سرور مقصد درخواست را با پاسخ موفق دریافت کرده است. بااینحال این کد ثابت نمیکند که اطلاعات حتماً در نرمافزار حسابداری ثبت شدهاند؛ آن مرحله باید در خود سرویس مقصد بررسی شود. کدهای 401 و 403 میتوانند نشانه رد شدن درخواست توسط سیستم احراز هویت یا فایروال باشند؛ 404 معمولاً نشانی مقصد نامعتبر را مطرح میکند و 5xx به خطای سمت سرور دریافتکننده اشاره دارد.
اگر در گزارشهای تحویل اطلاعات کافی پیدا نمیکنید، از بخش ووکامرس ← وضعیت ← عملیات برنامهریزیشده نیز وضعیت عملیات پسزمینه را بررسی کنید. این بخش به تشخیص کارهای در انتظار یا ناموفق کمک میکند، اما گزارش عملیات برنامهریزیشده و گزارش پاسخ HTTP وب هوک یک چیز نیستند.
دلایل ارسال نشدن و غیرفعال شدن وب هوک
گاهی وب هوک را بهدرستی ساختهاید، اما هیچ اطلاعاتی به مقصد نمیرسد. در چنین شرایطی بهتر است بهجای حذف و ساخت دوباره وب هوک، علت را مرحلهبهمرحله پیدا کنید.
رویداد مناسب رخ نداده است
ابتدا Topic را بررسی کنید. اگر order.created را انتخاب کردهاید، ویرایش یک سفارش قدیمی لزوماً همان وب هوک را فعال نمیکند. همچنین با ایجاد سفارش، لزوماً رویداد پرداخت موفق رخ نداده است. لازم است عمل آزمایشی شما با موضوع انتخابشده مطابقت داشته باشد.
آدرس مقصد یا پاسخ آن مشکل دارد
اشتباه در Delivery URL، گواهینامه نامعتبر، قطع ارتباط اینترنتی، فایروال مقصد یا محدودیت دسترسی میتواند تحویل پیام را ناموفق کند. لاگها کمک میکنند تشخیص دهید درخواست به مقصد رسیده یا پیش از دریافت پاسخ متوقف شده است. در صورت استفاده از سرویس خارجی، محدودیتهای آن سرویس را نیز بررسی کنید.
عملیات پسزمینه ووکامرس درست اجرا نمیشوند
ووکامرس برای برخی پردازشهای پسزمینه از صف وظایف و ابزارهایی مانند Action Scheduler استفاده میکند. اگر اجرای این وظایف با مشکل روبهرو شود، تحویل وب هوک هم ممکن است به تعویق بیفتد. در این وضعیت باید خطای همان وظیفه را بررسی کنید، نه اینکه تمام عملیات ناموفق فروشگاه را یکجا پاک کنید.
وب هوک پس از چند خطا خودکار غیرفعال شده است
براساس مستندات رسمی ووکامرس، وب هوکی که بیش از پنج ارسال ناموفق متوالی داشته باشد، ممکن است بهصورت خودکار در وضعیت Disabled قرار بگیرد. پاسخهایی مانند 4xx یا 5xx میتوانند در شمارش خطاها اثر داشته باشند. بنابراین اگر وضعیت وب هوک ناگهان تغییر کرد، پیش از فعالسازی دوباره کد پاسخ مقصد را بررسی و مشکل دریافت را برطرف کنید.
برای شروع عیبیابی سه چیز را کنار هم قرار دهید: موضوع انتخابشده، زمان انجام رویداد در ووکامرس و گزارش درخواست یا پاسخ در مقصد. این مقایسه معمولاً سریعتر نشان میدهد مشکل از انتخاب رویداد، صف پردازش یا سرور دریافتکننده است.
جلوگیری از پردازش تکراری اطلاعات در سرویس مقصد
یکی از موضوعات مهم در اتصال فروشگاه به سامانههای دیگر این است که یک رویداد ممکن است بیش از یک بار به مقصد برسد یا یک سفارش در طول عمر خود چند رویداد مختلف ایجاد کند. اگر سامانه مقصد بدون بررسی هر درخواست را بهعنوان یک عملیات جدید ثبت کند، احتمال دارد یک سفارش دوبار وارد حسابداری شود یا چند پیامک یکسان ارسال شود.
راهکار این مشکل، طراحی پردازش Idempotent است؛ یعنی دریافت دوباره همان رویداد نباید باعث اجرای دوباره اثر نهایی آن شود. برای مثال، اگر پیام مربوط به ایجاد سفارش شماره ۱۲۳۴ را دریافت کردهاید، قبل از ساخت رکورد جدید بررسی کنید آیا همان سفارش از همان فروشگاه قبلاً ثبت شده است یا خیر.
البته شناسه سفارش بهتنهایی همیشه کافی نیست. ممکن است وضعیت یک سفارش چند بار تغییر کند و هر تغییر لازم باشد به سامانه مقصد منتقل شود. به همین دلیل بهتر است توسعهدهنده با توجه به موضوع وب هوک، شناسه فروشگاه، شناسه سفارش و شناسه یا نوع رویداد یک کلید قابل اعتماد برای جلوگیری از تکرار تعریف کند. در سامانههایی که عملیات مالی انجام میدهند، استفاده از شناسه یکتا و محدودیت ثبت تکراری در دیتابیس مقصد اهمیت بیشتری دارد.
پاسخ موفق نیز بهتر است بعد از دریافت معتبر و ثبت امن پیام داده شود. اگر پردازش اصلی زمانبر است، سامانه مقصد میتواند پیام معتبر را ابتدا در صف داخلی خود ذخیره کند و سپس پاسخ سریع بدهد. ثبت زمان دریافت، نتیجه اعتبارسنجی و وضعیت پردازش، پیدا کردن پیامهای گمشده یا تکراری را سادهتر میکند.
ویرایش و غیرفعال کردن وب هوکهای قدیمی
ممکن است بعد از تغییر نرمافزار حسابداری، مهاجرت به CRM جدید یا تغییر آدرس سرور مقصد، دیگر به بعضی وب هوکها نیاز نداشته باشید. بهتر است هر چند وقت یکبار فهرست آنها را بررسی کنید تا پیامها به آدرسهای قدیمی یا ناشناخته ارسال نشوند.
از مسیر ووکامرس ← پیکربندی ← پیشرفته ← وب هوکها وارد فهرست شوید و روی وب هوک موردنظر کلیک کنید. در صفحه ویرایش میتوانید نام، موضوع، Delivery URL یا وضعیت را تغییر دهید و تنظیمات جدید را ذخیره کنید.
اگر میخواهید ارسال پیام موقتاً متوقف شود، وضعیت را روی Paused قرار دهید. حالت Disabled معمولاً برای وب هوکهایی دیده میشود که بهدلیل خطاهای ارسال از کار افتادهاند. پس از رفع علت خطا میتوانید تنظیمات را بازبینی و در صورت نیاز دوباره فعال کنید. اگر وب هوکی کاملاً بلااستفاده شده، گزینه حذف دائمی نیز وجود دارد، اما بهتر است قبل از حذف مطمئن شوید هیچ سرویس فعالی به آن وابسته نیست.
هنگام تغییر سرویس مقصد، Secret را هم در دو سمت بررسی کنید. اگر کلید عوض شده اما دریافتکننده هنوز کلید قبلی را استفاده میکند، امضای درخواستها معتبر شناخته نخواهد شد. برای تغییر آدرس یا کلید در فروشگاه واقعی، ابتدا اتصال جدید را در محیط آزمایشی کنترل کنید.




