اولین باری که یک فروشگاه را به سیستم انبار مرکزی وصل کردم، همه‌چیز در محیط تست بی‌نقص کار می‌کرد. روز اول انتشار، اولین سفارش واقعی به سیستم انبار نرسید. دو ساعت بعد مشتری تماس گرفت که وضعیت سفارشش را می‌بیند اما انبار خبری ندارد. آن روز یاد گرفتم اتصال API بیش از آنکه به دانش کدنویسی نیاز داشته باشد، به درک چرخه داده و رفتار خطاها در دنیای واقعی وابسته است. اگر تازه با ووکامرس آشنا می‌شوید، راهنمای ساخت فروشگاه با ووکامرس نقطه شروع خوبی است.

چرا فروشگاه‌ها به API نیاز پیدا می‌کنند؟

ووکامرس به تنهایی همه‌چیز را انجام می‌دهد تا زمانی که فروشگاه در محدوده خودش بماند. اما وقتی فروشگاه به دنیای بیرون وصل می‌شود، API لازم می‌شود. چهار دلیل رایج برای اتصال API:

  • همگام‌سازی انبار: فروشگاه فیزیکی موجودی دارد و باید با فروشگاه آنلاین همگام شود.
  • اتصال به حسابداری: فاکتورها و سفارش‌ها باید به نرم‌افزار حسابداری منتقل شوند.
  • ارسال اتوماتیک: اطلاعات به شرکت حمل‌ونقل یا پست ارسال شود.
  • گزارش‌گیری پیشرفته: داده‌ها به یک بستر تحلیل مستقل منتقل شوند.

ووکامرس یک REST API (Representational State Transfer Application Programming Interface) کامل ارائه می‌دهد که تقریباً هر بخش از فروشگاه را پوشش می‌دهد: محصولات، سفارش‌ها، مشتریان، کوپن‌ها، مالیات، ارسال، گزارش‌ها و حتی سیستم. این API مبتنی بر HTTP است و با JSON (JavaScript Object Notation) کار می‌کند. برای آشنایی با مفاهیم پایه REST، صفحه REST در ویکی‌پدیا توضیح جامعی دارد. اگر با مفهوم API به صورت کلی آشنا نیستید، API چیست نقطه شروع خوبی است.

API، پل بین فروشگاه و بقیه دنیای دیجیتال است. اگر پل درست ساخته نشود، هر دو طرف در انزوا می‌مانند.

احراز هویت در API ووکامرس

ووکامرس سه روش اصلی احراز هویت در API دارد. اول، HTTPS با Basic Authentication که برای محیط تست مناسب است اما در production توصیه نمی‌شود. دوم، Authentication با Consumer Key و Consumer Secret که رایج‌ترین روش است. سوم، OAuth 1.0a که برای اتصال امن‌تر و بدون ارسال کلید در هر درخواست طراحی شده است.

برای ساخت Consumer Key در ووکامرس، به WooCommerce → Settings → Advanced → REST API بروید، کلید بسازید و سطح دسترسی را انتخاب کنید. سه سطح دسترسی وجود دارد: Read فقط خواندن، Write فقط نوشتن و Read/Write هر دو. یک قاعده امنیتی که در پروژه‌ها همیشه رعایت می‌کنم: کمترین دسترسی لازم را بدهید. اگر یک سیستم فقط می‌خواهد سفارش‌ها را بخواند، فقط Read بدهید. بدون این اصل، یک نقص امنیتی کوچک در یک سیستم خارجی، می‌تواند به دیتابیس فروشگاه هم نفوذ کند.

کلیدهای API همیشه باید در متغیرهای محیطی نگهداری شوند، نه در کد منبع. اگر تیم شما از Git استفاده می‌کند، مطمئن شوید فایل حاوی کلیدها در .gitignore قرار دارد. برای راهنمای امنیت در پروژه‌های وردپرسی، امنیت فروشگاه ووکامرس نکات مهمی دارد.

کار با REST API ووکامرس

ساختار پایه URL در REST API ووکامرس به این شکل است: https://example.com/wp-json/wc/v3/ و بعد از آن مسیر منبع. مسیرهای پرکاربرد عبارتند از: products، orders، customers، coupons و reports. هر منبع از چهار عملیات اصلی پشتیبانی می‌کند: GET برای خواندن، POST برای ساخت، PUT برای به‌روزرسانی و DELETE برای حذف. این مدل، از REST پیروی می‌کند و به همین دلیل برای هر کسی که با API های مدرن کار کرده، آشناست.

در پروژه‌های واقعی، سه چالش مهم در کار با REST API ووکامرس وجود دارد. اول، صفحه‌بندی: اگر بیش از صد محصول یا هزار سفارش دارید، باید درخواست‌ها را صفحه‌بندی کنید و هر صفحه را جدا بخوانید. دوم، نرخ درخواست: بعضی هاست‌ها محدودیت تعداد درخواست در دقیقه دارند و اگر از آن عبور کنید، درخواست‌ها مسدود می‌شوند. سوم، اندازه پاسخ: پاسخ‌های API می‌توانند بسیار سنگین باشند و اگر بدون فیلتر استفاده شوند، باعث کندی سرور می‌شوند. برای آشنایی با ابزارهایی که این چالش‌ها را مدیریت می‌کنند، استفاده از REST API در وردپرس راهنمای کاملی دارد.

یک نکته عملی که در پروژه‌ها به کارم آمده: همیشه از یک ابزار تست API مثل Postman استفاده کنید تا قبل از کدنویسی، رفتار دقیق endpoint را ببینید. این کار جلوی بسیاری از خطاهای زمان توسعه را می‌گیرد. اگر با Postman آشنا نیستید، تست REST API با Postman نقطه شروع خوبی است.

Webhook: اطلاع‌رسانی به موقع رخدادها

در REST API، شما درخواست می‌فرستید و پاسخ می‌گیرید. اما در Webhook، ووکامرس خودش وقتی رخدادی اتفاق می‌افتد، به یک URL شما اطلاع می‌دهد. این مدل برای همگام‌سازی زمان‌واقعی بسیار کارآمد است. مثلاً وقتی مشتری سفارشی ثبت می‌کند، ووکامرس می‌تواند به صورت خودکار به سیستم انبار اطلاع بدهد.

ووکامرس از چند Webhook رایج پشتیبانی می‌کند: order.created، order.updated، order.deleted، product.created، product.updated، customer.created و چند مورد دیگر. Webhook به صورت پیش‌فرض چند بار تلاش می‌کند تا ارسال موفق شود اما برای اطمینان بیشتر، باید در سمت گیرنده هم یک مکانیزم idempotent داشته باشید که اگر یک پیام دوبار رسید، دوبار اعمال نشود.

یک الگوی حرفه‌ای که در پروژه‌ها به کارم آمده: به جای اینکه Webhook مستقیماً به سیستم هدف برود، اول به یک صف پیام میانی برود و بعد پردازش شود. این کار باعث می‌شود در صورت خطا در سیستم هدف، داده از دست نرود و بتوان دوباره پردازش کرد. اگر حجم داده‌ها بالا رفت، این صف به یک سیستم حرفه‌ای تبدیل می‌شود که بخشی از معماری کلان فروشگاه است.

الگوهای همگام‌سازی داده

سه الگوی اصلی برای همگام‌سازی داده بین ووکامرس و سرویس خارجی وجود دارد. اول، همگام‌سازی زمان‌واقعی که با هر تغییر، بلافاصله داده منتقل می‌شود. دوم، همگام‌سازی دوره‌ای که در بازه‌های مشخص داده‌ها را مقایسه و به‌روزرسانی می‌کند. سوم، همگام‌سازی دسته‌ای که در بازه‌های طولانی‌تر اجرا می‌شود و برای داده‌های بزرگ مناسب است.

الگومناسب برایهزینه
زمان‌واقعیسفارش‌ها، موجودی بحرانیپیچیدگی بالاتر، بار سرور بیشتر
دوره‌ایمحصولات، قیمت‌هاتأخیر چند دقیقه‌ای تا چند ساعتی
دسته‌ایگزارش‌ها، حسابدارینیاز به پردازش سنگین در ساعات کم‌ترافیک

در فروشگاه‌های واقعی، معمولاً ترکیبی از این سه الگو استفاده می‌شود. مثلاً سفارش‌ها در زمان واقعی همگام می‌شوند تا انبار بلافاصله بداند، اما گزارش‌ها به صورت دسته‌ای شبانه ارسال می‌شوند. این ترکیب، بار سرور را متعادل نگه می‌دارد و در عین حال تجربه مشتری را حفظ می‌کند.

در همگام‌سازی موجودی که یکی از پرکاربردترین سناریوهای API است، نکته‌ای حیاتی وجود دارد: همیشه فرض کنید که هر منبع داده، احتمال خطا دارد. باید مکانیزم reconcile داشته باشید که در بازه‌های مشخص، داده‌های دو طرف را مقایسه کند و مغایرت‌ها را گزارش دهد. بدون این مکانیزم، فروشگاه در طول زمان از انبار جدا می‌شود. برای مدیریت دقیق‌تر موجودی، مدیریت موجودی محصولات در ووکامرس راهنمای کاملی دارد.

خطاهای رایج در اتصال API و رفع آن‌ها

چند خطا که در پروژه‌های مختلف دیده‌ام:

  • خطای احراز هویت 401: معمولاً به دلیل Consumer Key اشتباه، منقضی یا عدم تطابق با دامنه.
  • خطای 403 Forbidden: سطح دسترسی ناکافی است یا IP درخواست‌کننده در لیست مسدود است.
  • خطای timeout در همگام‌سازی: پاسخ API کند است یا سرویس خارجی نمی‌تواند پاسخ دهد.
  • داده تکراری: وقتی Webhook بیش از یک بار ارسال می‌شود و سمت گیرنده idempotent نیست.
  • ناهماهنگی داده: یک رخداد در سمت ووکامرس ثبت شده اما در سمت خارجی نه، و مکانیزم reconcile نبوده.

اگر با خطای پرداخت در حین همگام‌سازی مواجه شدید، رفع خطای پرداخت ووکامرس نقطه شروع خوبی است. برای خطای ارسال سفارش، رفع خطای ارسال سفارش در ووکامرس راهنمای گام‌به‌گام دارد. و برای خطاهای عمومی، خطاهای رایج ووکامرس بررسی کاملی ارائه می‌دهد.

در API، خطاها پیام نیستند؛ سیگنال هستند. هر خطا یک فرض غلط را لو می‌دهد که باید تصحیح شود.

پرسش‌های پرتکرار درباره API ووکامرس

آیا REST API ووکامرس به صورت پیش‌فرض فعال است؟ از ووکامرس نسخه ۲.۶ به بعد، بله. برای دسترسی به آن باید Consumer Key بسازید. اگر کلید قدیمی دارید، بهتر است آن را غیرفعال و دوباره بسازید.

چه تفاوتی بین REST API و Webhook است؟ REST API مدل درخواست-پاسخ است؛ شما درخواست می‌دهید و پاسخ می‌گیرید. Webhook مدل اطلاع‌رسانی است؛ ووکامرس وقتی رخدادی می‌شود، به شما اطلاع می‌دهد. این دو مکمل یکدیگرند.

آیا می‌توانم کلید API ووکامرس را بین دو سایت مشترک کنم؟ بله، در سمت دیگر به عنوان یک کلاینت عمل می‌کنید. اما برای هر سایت مصرف‌کننده، یک Consumer Key جدا بهتر است تا در صورت لزوم بتوانید یکی را بدون اثر روی دیگری غیرفعال کنید.

چگونه روی سرعت سایت اثر نگذارم؟ بهترین روش، اجرای همگام‌سازی در پس‌زمینه با WP-Cron یا صف پیام است، نه در چرخه رندر صفحه. برای آشنایی با WP-Cron، عیب‌یابی کرون وردپرس نقطه شروع خوبی است.

آیا اتصال به چند سرویس خارجی همزمان ممکن است؟ بله. اما هر اتصال یک نقطه شکست جدید است. توصیه من این است که هر اتصال را مستقل از بقیه طراحی کنید تا خطا در یکی، بقیه را تحت تأثیر قرار ندهد.

برای اتصال درگاه پرداخت به سیستم حسابداری، اتصال ووکامرس به درگاه‌های پرداخت راهنمای مفیدی است. برای مدیریت مشتریان در سیستم‌های بیرونی، مدیریت مشتریان در ووکامرس را ببینید. و برای مدیریت چرخه سفارش که در همگام‌سازی نقش محوری دارد، مدیریت سفارش‌ها در ووکامرس توصیه می‌شود.

آنچه از پروژه‌های یکپارچه‌سازی یاد گرفتم

سه چیز بعد از سال‌ها کار با API ووکامرس در ذهنم جا افتاده. اول، همیشه فرض کنید که سرویس خارجی می‌تواند خطا بدهد و برای این خطا برنامه داشته باشید. دوم، لاگ‌گیری دقیق در هر دو سمت، ارزان‌ترین بیمه در همگام‌سازی است. سوم، API فقط در لحظه راه‌اندازی مهم نیست؛ در درازمدت نگهداری مهم‌تر است. اگر فروشگاه شما روی API های متعدد کار می‌کند، داشتن یک مستند از هر اتصال، نقطه شروع خوبی است. برای بازگردانی سریع در صورت خطای همگام‌سازی گسترده، بکاپ‌گیری از فروشگاه ووکامرس را جدی بگیرید. برای سفارشی‌سازی صفحه محصول که داده‌های API را به کاربر نمایش می‌دهد، سفارشی‌سازی صفحه محصول در ووکامرس راهنمای کاملی دارد. و اگر با کوپن و تخفیف کار می‌کنید، تخفیف و کد تخفیف در ووکامرس را ببینید.

اگر تجربه‌ای از یکپارچه‌سازی ووکامرس با یک سرویس خارجی دارید که نکته‌ای برایتان داشت یا با خطای عجیبی مواجه شدید، در دیدگاه بنویسید. برای من جالب است بدانم کدام سناریو بیشترین زمان تیم شما را در پروژه‌های واقعی گرفته و چه راه‌حلی برای آن پیدا کرده‌اید. 🔌