=== احرازینو برای ووکامرس ===
Contributors: ehrazino
Tags: woocommerce, iran, checkout, address, verification
Requires at least: 6.4
Tested up to: 6.7
Requires PHP: 7.4
Stable tag: 1.1.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

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

== Description ==

= ۱. تکمیل خودکار نشانی =

مشتری کد پستی را می‌زند و نشانی‌اش پر می‌شود. نشانی غلط یعنی مرسولهٔ
برگشتی، و هزینهٔ هر مرسولهٔ برگشتی از هزینهٔ صدها استعلام بیشتر است.

نتیجه‌ها یک هفته کش می‌شوند، پس کد پستی تکراری دوباره هزینه نمی‌برد.

= ۲. تطابق موبایل با کد ملی (شاهکار) =

پس از ثبت سفارش بررسی می‌شود که شمارهٔ موبایل واقعاً به همان کد ملی
تعلق دارد. برای فروشگاه‌هایی که پرداخت‌در‌محل دارند و از سفارش جعلی
ضرر می‌کنند.

= ۳. تأیید نام صاحب کارت =

ابزار صفحهٔ سفارش برای پرداخت کارت‌به‌کارت: شمارهٔ کارت واریزکننده را
وارد می‌کنید و نام صاحبش با نام سفارش مقایسه می‌شود.

**شمارهٔ کارت ذخیره نمی‌شود.** فقط چهار رقم آخر و نتیجهٔ مقایسه.

= اگر سرویس قطع باشد چه می‌شود؟ =

سفارش **ثبت می‌شود** و برچسب «نامعلوم، بررسی دستی» می‌گیرد.

یک قطعی نیم‌ساعته نباید یعنی نیم‌ساعت فروش صفر. ولی سفارش تأییدنشده هم
نباید بی‌صدا رد شود، پس در ستون «احراز» فهرست سفارش‌ها دیده می‌شود.

== Installation ==

1. افزونه را نصب و فعال کنید.
2. در [پنل کسب‌وکار احرازینو](https://ehrazino.com/dashboard/api/keys/) یک کلید API بسازید.
3. ووکامرس ← تنظیمات ← احرازینو: کلید را وارد و قابلیت‌های دلخواه را روشن کنید.

همهٔ قابلیت‌ها پیش‌فرض **خاموش**اند. افزونه تا وقتی خودتان نگویید،
هیچ فراخوانی نمی‌زند و هیچ هزینه‌ای نمی‌سازد.

= پیش از روشن‌کردن، در آزمایشگاه امتحان کنید =

پنل احرازینو یک [آزمایشگاه](https://ehrazino.com/dashboard/api/lab/)
دارد که ورودی را رایگان می‌سنجد و قطعه‌کد آماده می‌دهد.

== Frequently Asked Questions ==

= کلید API من کجا ذخیره می‌شود؟ =

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

= هزینه چطور حساب می‌شود؟ =

هر استعلام از موجودی پنل شما کم می‌شود و قیمتش پیش از فراخوان قطعی
است. مصرف را در [گزارش مصرف](https://ehrazino.com/dashboard/api/reports/)
روز‌به‌روز می‌بینید.

= آیا یک ربات می‌تواند موجودی من را خرج کند؟ =

مسیر تکمیل نشانی از صفحهٔ پرداخت صدا زده می‌شود و برای مهمان‌ها هم باز
است. سه لایه جلویش ایستاده‌اند:

1. **سقف هر IP در ساعت** (پیش‌فرض ۲۰)، جلوی مهاجم ساده را می‌گیرد.
2. **سقف سراسری در ساعت** (پیش‌فرض ۲۰۰)، کران بالای خسارت. در آزمون
   نفوذ، سقف IP به‌تنهایی با ۵۰ پروکسی دور زده شد و ۱۰۰۰ فراخوان
   خورد؛ با سقف سراسری، ۲۵۰ آی‌پی هم همان ۲۰۰ فراخوان می‌گیرد.
3. **کش هفتگی**: کد پستی تکراری دوباره هزینه نمی‌برد.

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

= کد ملی مشتری‌ها کجا می‌رود؟ =

در متای سفارش می‌ماند (برای فاکتور رسمی)، ولی سه جا **نمی‌آید**: در
یادداشت سفارش ماسک می‌شود، در لاگ نوشته نمی‌شود، و از پاسخ REST API
ووکامرس حذف می‌شود، چون پیشوند زیرخط فقط از رابط کاربری پنهان می‌کند
و نه از REST.

= با HPOS و چک‌اوت بلوکی کار می‌کند؟ =

بله، هر دو. افزونه سازگاری‌اش را رسماً اعلام می‌کند و هیچ‌جا
`get_post_meta` روی سفارش صدا نمی‌زند.

== Changelog ==

= 1.1.0 =
* 🔴 باگ جدی: «تأیید نام صاحب کارت» هر بررسیِ موفق را «عدم تطابق» ثبت می‌کرد. این سرویس کلید `matched` برنمی‌گرداند و پاسخ موفقش نامِ صاحب کارت است؛ افزونه دنبال کلیدی می‌گشت که وجود نداشت. یعنی روی سفارش مشتریِ سالم یادداشتی می‌نشست که او را به پرداخت با کارت دیگری متهم می‌کرد. حالا نام برگشتی با نام سفارش مقایسه می‌شود، با یکسان‌سازی «ي/ی»، «ك/ک» و نیم‌فاصله.
* 🔴 «نمی‌دانم» دیگر به «مردود» ترجمه نمی‌شود. اگر شکل پاسخ شناخته نشود، نتیجه «نامعلوم، بررسی دستی» ثبت می‌شود، نه «تطابق ندارد». پیش‌تر هر تغییری در پاسخ سرویس، بی‌صدا مشتری‌های سالم را متهم می‌کرد.
* 🔴 سقف نرخ روی فروشگاه‌های پشت CDN یا پراکسی، همهٔ بازدیدکننده‌ها را یک نفر می‌دید (`REMOTE_ADDR` نشانی پراکسی است). یعنی بیستمین مشتری هر ساعت تکمیل نشانی نداشت، و یک مهاجم با بیست درخواست این قابلیت را برای همه می‌بست. حالا از `WC_Geolocation` استفاده می‌شود. کران واقعی خسارت همان سقف سراسری است که دست‌نخورده مانده.
* 🔴 امنیتی: کلید API دیگر تغییرمسیر را دنبال نمی‌کند (`redirection => 0`). WordPress سرآیند `Authorization` را هنگام تغییرمسیر با خود می‌برد، یعنی یک ۳۰۱ به میزبان دیگر کلید را تحویل می‌داد. راستی‌آزمایی TLS هم صریح روشن شد تا فیلترهای سراسری خاموشش نکنند.
* ستون «احراز» در فهرست سفارش‌ها روی فروشگاه‌های بدون HPOS همیشه خالی بود.
* بازگشت پس از «بررسی نام صاحب کارت» روی فروشگاه‌های بدون HPOS به صفحهٔ سفارش نمی‌رسید.
* حذف افزونه، تنظیمات تک‌تک و کشِ نشانی مشتری‌ها را هم پاک می‌کند. پیش‌تر نصب دوباره، قابلیت‌ها را روشن تحویل می‌داد، در حالی که قاعده «پیش‌فرض خاموش» است.
* ⚠️ هشدار پیشخوان: اگر صفحهٔ پرداخت از چک‌اوت بلوکی استفاده کند، تکمیل نشانی و فیلد کد ملی کار نمی‌کنند. پیش‌تر بی‌صدا هیچ‌کاری نمی‌کردند.
* متن خطای سرویس، پیش از نشستن در یادداشت سفارش، از تگ‌های HTML پاک می‌شود.

= 1.0.1 =
* 🔴 امنیتی: سقف سراسری در ساعت اضافه شد. سقف هر IP با چرخش آی‌پی دور می‌خورد و کران بالایی روی خسارت نمی‌گذاشت.
* 🔴 امنیتی: پنجرهٔ سقف نرخ روی فروشگاه‌های دارای کش شیء (Redis) با هر درخواست جلو می‌رفت و عملاً بی‌اثر بود.
* 🔴 حریم خصوصی: کد ملی از پاسخ REST API ووکامرس حذف شد.
* کلید API دیگر در HTML صفحهٔ تنظیمات نمی‌نشیند.
* اعلان پیشخوان هنگام پر شدن سقف سراسری.

= 1.0.0 =
* نسخهٔ اول: تکمیل نشانی از کد پستی، تطابق موبایل با کد ملی، تأیید نام صاحب کارت.
