# چک‌لیست انتشار و رفع اشکال

> هر چیزی که باید پیش از روشن کردن بازینس در محیط اصلی بررسی کنید، و راه‌حل رایج‌ترین مشکلات یکپارچه‌سازی.

## پیش از انتشار
### تنظیمات
- [ ] شناسه و کلید محرمانه‌ی **محیط اصلی** (جدا از توسعه)، فقط روی سرور.
- [ ] `BAZINESS_PLATFORM_ENABLED=true`، `BAZINESS_PLATFORM_USE_PRODUCTION=true`، و نام بسته‌ی پلتفرم و نام بازی تنظیم شده.
- [ ] `BAZINESS_PAY_ENABLED=true`، `BAZINESS_PAY_BASE_URL=https://pay.baziness.com` و نام بسته‌ی پرداخت تنظیم شده؛ درگاه آزمایشی محلی خاموش.
- [ ] بیلد کلاینت را برای کلید محرمانه جست‌وجو کنید: **نباید** آنجا باشد.
- [ ] `/api/platform/config` مقدار `enabled: true` را با آدرس‌های **محیط اصلی** برمی‌گرداند.

### ورود
روی پلتفرم توسعه همه‌ی حالت‌ها را با شماره‌های ساختگی و کد `111111` تست کنید، چون پیامکی فرستاده نمی‌شود ([جزئیات](login.md#testing-logins-on-the-dev-platform)).

- [ ] اسپلش «ورود با حساب بازینس» / «ادامه به عنوان مهمان» را برای هر دستگاه یک بار می‌پرسد.
- [ ] بستن صفحه‌ی ورود بدون وارد شدن، دو دکمه را برمی‌گرداند.
- [ ] ورود به حسابی که روی دستگاه دیگری استفاده شده، به آن **جابه‌جا** می‌کند و پیشرفتش سر جایش است.
- [ ] تنظیمات ← اتصال حساب، صفحه‌ی پروفایل را باز می‌کند و بعدش «متصل» نشان می‌دهد.
- [ ] خروج داخل یک صفحه‌ی بازینس، بازی را به حالت یک بازدیدکننده‌ی کاملاً جدید برمی‌گرداند.
- [ ] باز کردن بازی از اپ بازینس (`?linkedToken=`) آموزش را برای بازیکن جدید اجرا می‌کند.

### سکه و صفحه‌ها
- [ ] موجودی گیتا کوین از پلتفرم می‌آید: تا وقتی معلوم نیست `…`، هیچ‌وقت یک `0` ساختگی.
- [ ] موجودی بعد از بسته شدن صفحه و بعد از فوکوس دوباره‌ی بازی تازه می‌شود.
- [ ] هر پرداخت یک‌باره `transactionId`ای دارد که از ماهیت پرداخت ساخته شده، و `400` پرداخت‌شده حساب می‌شود.
- [ ] «انتخاب جایزه» `/shop?game_name=…` را بدون دیوار ورود باز می‌کند.
- [ ] (اگر استفاده می‌کنید) ضربه‌ی اول آموزش `/game-offer` را باز می‌کند و بستنش به بسته‌ی شروع می‌رسد.
- [ ] نما با دستگیره، با زدن بیرون و با دکمه‌ی خود صفحه بسته می‌شود.

### لینک‌ها
- [ ] لینک هر صفحه `packageName` و `sdkType=js` و در صورت وجود `linkedToken` را دارد.
- [ ] لینک‌های کمپین هر چهار `utm_*` را به ASCII دارند و نوار آدرس بعد از بارگذاری تمیز است.
- [ ] کمپین بعد از ورود بازینس و جابه‌جایی حساب حفظ می‌شود.

### پرداخت بازینس
- [ ] همه‌ی SKUها زیر نام بسته‌ی پرداخت شما ثبت شده‌اند.
- [ ] یک خرید واقعی در محیط اصلی **یک بار** تحویل و بعد consume شده.
- [ ] خریدن دو بار پشت سر هم همان بسته کار می‌کند، که نشان می‌دهد `consume` اجرا شده.
- [ ] پرداختی که بعد از بستن بازی تمام شده، دفعه‌ی بعد که فروشگاه باز می‌شود تحویل داده می‌شود.

## رفع اشکال
| نشانه | علت احتمالی | راه‌حل |
| --- | --- | --- |
| دکمه‌ی بستن صفحه کاری نمی‌کند | `sdkType=js` نیست، یا بررسی origin پیام با origin اشتباه مقایسه می‌کند | `sdkType=js` را به **همه‌ی** لینک‌های صفحه اضافه کنید و origin پیام را با آدرسی که باز کرده‌اید مقایسه کنید |
| فروشگاه جایزه به محض باز شدن بسته می‌شود | دست‌دادن `token` ورود حساب شده | `token` را نادیده بگیرید؛ فقط `login` ورود است |
| ورود اول گیر می‌کند یا سرور 400 می‌دهد | ورود پیش از اینکه بازیکن کاربر بازینس و توکن داشته باشد شروع شده | اول `/api/platform/token` را صدا بزنید و صفحه را با همان توکن باز کنید |
| وارد شده ولی بازی هنوز مهمان نشان می‌دهد | `/api/platform/login` صدا زده نشده یا پروفایل دوباره خوانده نشده | با `login` صدایش بزنید و بعد پروفایل بازیکن را دوباره بخوانید |
| صفحه‌ی ورود «ادامه به عنوان مهمان» نشان می‌دهد | `allowGuest=false` نیست | روی صفحه‌های ورود، پروفایل و پیشنهاد اضافه‌اش کنید (نه `/shop`) |
| صفحه‌ی جایزه از بازیکن می‌خواهد وارد شود | ریشه‌ی سایت به جای `/shop` باز شده | `{web}/shop?game_name=…` را با `linkedToken` باز کنید |
| درخواست‌های پلتفرم بعد از مدتی شکست می‌خورند | توکن کلاینت منقضی شده (`401`) | توکن تازه بگیرید ([قدم ۱](platform-api.md#step-1-get-a-client-token)) و یک بار دیگر بفرستید |
| توکنی که درست به نظر می‌رسد رد می‌شود | `validate-user-token` پاسخ `isValid: false` داده (HTTP 200) | فیلد `isValid` را بررسی کنید، نه فقط کد HTTP؛ کلاینت دوباره وارد شود |
| یک بازیکن همان سکه‌ها را دو بار گرفت | `transactionId` از زمان ساخته شده | آن را از ماهیت پرداخت بسازید ([قدم ۵](platform-api.md#step-5-give-gita-coins)) |
| دریافت جایزه بعد از یک کرش برای همیشه شکست می‌خورد | `add-coin` پاسخ `400` داده و دریافت آن را خطا حساب کرده | `400` را «قبلاً پرداخت شده» حساب کنید |
| تب پرداخت سفید می‌ماند | تب بعد از منتظر ماندن برای سرور یا با `noopener` باز شده | داخل همان ضربه یک تب خالی باز کنید و بعد آدرسش را تنظیم کنید |
| بازیکن پرداخت کرد ولی چیزی نگرفت | هیچ‌وقت برنگشت، پس بررسی اجرا نشد | با فوکوس و «پرداخت کردم» بررسی کنید، و هنگام باز شدن فروشگاه پرداخت‌های در انتظار را بررسی کنید |
| `verify_payment` همیشه شکست می‌خورد | به شکل JSON فرستاده شده | بدنه‌ی فرم بفرستید |
| پرداخت پاسخ `no_required_params` می‌دهد | `uid` عددی نیست | شناسه‌ی عددی بازیکن را بفرستید |
| خرید دوم همان بسته مسدود است | خرید consume نشده | بعد از دادن آیتم و با چند بار تلاش `consume` را صدا بزنید |
| بازیکنانی که از اپ بازینس می‌آیند از آموزش رد می‌شوند | `?linkedToken=` نشانه‌ی «بازیکن قدیمی» گرفته شده | «بازیکن جدید» را از داده‌های خودتان تشخیص دهید |
| کمپین بعد از ورود گم می‌شود | برچسب‌ها فقط از آدرس خوانده شده‌اند و بازی از اول اجرا شده | پیش از ورود آن‌ها را روی دستگاه ذخیره کنید |
| نام فارسی کمپین‌ها نیست | مقدارهای UTM فقط به‌صورت ASCII نگه داشته می‌شوند | از نام ASCII استفاده کنید (`shahrivar_1405`) |
| نمای ورود روی اسپلش دیده نمی‌شود | نما زیر اسپلش است | آن را بالای همه‌چیز بگذارید |

## کمک گرفتن
- کلیدها، صفحه‌ی پیشنهاد بازی و SKUها: از **تیم پلتفرم بازینس** بپرسید.
- برای دیدن همه‌چیز در کنار هم، کد [بازی نمونه](example.md) را بخوانید.
