مدل هویت
بازی شما حسابهای بازیکن خودش را دارد، مثلاً با کلید شناسهی دستگاهی که در اولین اجرا ساخته میشود. بازینس روی همین حساب سوار میشود:
- اولین باری که پلتفرم روشن است، سرور شما یک کاربر ناشناس بازینس برای بازیکن میسازد (
create-user) وuserIdآن را روی رکورد بازیکن ذخیره میکند. - بازیکن تا وقتی با شماره موبایلش در یکی از صفحههای بازینس وارد نشود ناشناس میماند (
isLinkedToAccount: false). بعد از ورود حساب متصل است. - اگر حساب بازینسی که بازیکن واردش میشود از قبل مال بازیکن دیگری از بازیکنان شما باشد (همان شخص روی گوشی دیگر)، بازی به آن بازیکن جابهجا میشود و حساب را دو بار وصل نمیکند.
| وضعیت | userId بازینس ذخیره شده؟ |
isLinkedToAccount |
چیزی که بازیکن میبیند |
|---|---|---|---|
| بازینس خاموش | — | — | هیچ بخش بازینسی |
| مهمان | بله (کاربر ناشناس) | false |
موجودی سکه و دکمهی جایزه کار میکنند؛ «اتصال حساب» در تنظیمات |
| وارد شده | بله | true |
همهچیز، از جمله دریافت جایزههای گیتا کوین |
کل جریان
sequenceDiagram
autonumber
participant C as Game client
participant S as Game server
participant K as Platform API
participant W as Baziness page (sheet)
C->>S: GET /api/platform/config
S-->>C: { enabled, webBase, apiBase, packageName }
Note over C: Splash: Sign in with Baziness / Continue as guest
C->>S: POST /api/platform/token { deviceId, linkedToken? }
S->>K: create-user (first time) / get-user-token
K-->>S: { userId, token, isLinkedToAccount }
S-->>C: { token, bazinessUserId, isLinked, switchToDeviceId? }
C->>W: open login page (sdkType=js, linkedToken, allowGuest=false)
W-->>C: postMessage { type: "login", data: "<token>" }
C->>S: POST /api/platform/login { deviceId, token }
S->>K: validate-user-token
K-->>S: { isValid, userId }
S-->>C: { ok } — or { ok, switchToDeviceId }
C->>C: close sheet, or switch device id + reloadچیزهایی که سرور شما فراهم میکند
کلاینت شما هیچوقت خودش API سرور پلتفرم را صدا نمیزند. سه endpoint از سرور خودتان را صدا میزند:
| endpoint شما | کلاینت میفرستد | سرور شما | پاسخ |
|---|---|---|---|
GET /api/platform/config |
— | کاری نمیکند، فقط تنظیمات را میگوید | { enabled, webBase, apiBase, packageName, gameName, gameOfferUrl } یا { enabled: false } |
POST /api/platform/token |
شناسهی دستگاه، و linkedToken اگر هست |
اگر هنوز کاربر بازینس ندارد ← create-user؛ وگرنه ← get-user-token. اگر userId حاصل مال بازیکن دیگری باشد وصل نمیکند |
{ token, userId, isLinkedToAccount } یا { switchToDeviceId } |
POST /api/platform/login |
شناسهی دستگاه، توکنی که صفحهی ورود داده | validate-user-token ← این حساب مال کیست؟ مال بازیکن دیگری ← جابهجایی؛ وگرنه ← وصل به همین بازیکن |
{ ok: true } یا { ok: true, switchToDeviceId } یا { ok: false } |
اگر پلتفرم در دسترس نباشد، /token پاسخ { enabled: true, error: "platform_unavailable" } را بدون توکن میدهد و بازی به هر حال بالا میآید.
اجرای اول: مهمان یا ورود
وقتی بازینس روشن است و بازیکن نه هنوز انتخابی کرده و نه وارد شده، اسپلش به جای نوار بارگذاری دو دکمه نشان میدهد:
- «ورود با حساب بازینس»: صفحهی ورود را باز میکند و منتظر میماند.
- «ادامه به عنوان مهمان»: انتخاب را به خاطر میسپارد و ادامه میدهد.
ترتیب بالا آمدن بازی:
- بازیکن را در سیستم حساب خود بازی وارد کنید.
- از سرور
/api/platform/configرا بپرسید. اگر بازینس خاموش بود، از همهی قدمهای بعد بگذرید. - اگر انتخابی نشده و بازیکن وارد نیست، دو دکمه را نشان دهید و منتظر بمانید.
/api/platform/tokenرا صدا بزنید. اگرswitchToDeviceIdبرگشت، آن شناسه را بپذیرید و از اول شروع کنید.- اگر بازیکن همین الان وارد شد، پروفایلش را دوباره بخوانید تا صفحه حساب وارد شده را نشان دهد.
اگر بازیکن صفحهی ورود را بدون وارد شدن بست، دو دکمه را دوباره نشان دهید.
جابهجایی حساب، قدمبهقدم
جابهجایی وقتی پیش میآید که حساب بازینسی که بازیکن واردش میشود از قبل به بازیکن دیگری از بازیکنان شما وصل باشد، مثلاً بعد از نصب دوباره یا روی گوشی جدید:
- سرور پاسخ میدهد
switchToDeviceId: "<شناسهی دستگاه آن بازیکن>". - کلاینت آن شناسه را بهعنوان شناسهی خودش ذخیره میکند و توکن بازینس ذخیرهشده را فراموش میکند.
- بازی را از اول اجرا میکند، بدون
linkedTokenدر آدرس. - اجرای بعدی بازیکن دیگر را با همهی پیشرفتش بالا میآورد.
باز شدن بازی از اپ بازینس
مهم
اپ بازینس حالا
?linkCode=(یکبارمصرف) را هم میفرستد. بهجایlinkedTokenآن را به سرورتان بدهید. مهاجرت توکن را ببینید.
اپ بازینس بازیها را با ?linkedToken=<توکن> در آدرس باز میکند:
- آن توکن را بهعنوان
linkedTokenبه/api/platform/tokenبفرستید تا بازیکن در حساب درست بازینس قرار بگیرد. در اجرای بعدی آن را از آدرس پاک کنید. - اگر دستگاه از قبل توکن دیگری دارد، حساب بازینس دیگری دارد میآید: پیش از ادامه دادههای محلی را پاک کنید و از اول شروع کنید.
- ورود تعیین میکند کدام حساب بازی کند، هیچوقت تعیین نمیکند بازیکن جدید است یا نه. بازیکن تازهواردی که اینطور میآید هم باید آموزش و هدیههای خوشآمد شما را ببیند.
ورود در آینده، از تنظیمات
مهمان هر وقت بخواهد میتواند حسابش را وصل کند: تنظیمات ← باز کردن صفحهی پروفایل (پارامترها). وقتی نما بسته شد، دوباره /api/platform/token را بپرسید و موجودی سکه را تازه کنید.
خروج
وقتی صفحه logout میفرستد، نما را ببندید، هر چه بازی بهصورت محلی ذخیره کرده پاک کنید (هویت، توکن، انتخابها، پیشرفت آموزش) و مثل یک بازدیدکنندهی کاملاً جدید از اول شروع کنید.
تست ورود روی پلتفرم توسعه
پیشنهاد
روی پلتفرم توسعه (همان جایی که بازیهای تستی به آن وصلاند) با هر شماره موبایلی و کد
111111میتوانید وارد شوید. هیچ پیامکی فرستاده نمیشود. با شمارههای ساختگی هر چند حساب تستی که لازم دارید بسازید: یکی برای تست جابهجایی حساب، یکی برای یک مهمان تازه و غیره. محیط اصلی کد واقعی را پیامک میکند.
اشتباههای رایج
| اشتباه | نتیجه | راهحل |
|---|---|---|
پیام token صفحه ورود حساب شود |
فروشگاه جایزه به محض باز شدن بسته میشود؛ ورود اول پیش از وارد شدن بازیکن تمام میشود | فقط login ورود است |
وصل کردن توکن بدون validate-user-token |
هر کسی میتواند هر حسابی را مال خودش کند | همیشه در سرور بررسی کنید |
| باز کردن صفحهی ورود بدون توکن بازیکن | ورود اول از اسپلش کاربر ناشناسی ندارد که به آن وصل شود | مطمئن شوید /api/platform/token قبلاً اجرا شده و توکنش را بهعنوان linkedToken بفرستید |
نبودن allowGuest=false روی صفحهی ورود |
بازیکن یک «ادامه به عنوان مهمان» دوم میبیند | روی صفحههای ورود، پروفایل و پیشنهاد اضافهاش کنید |
| پاداش اتصال حساب بیش از یک بار | خروج و ورود دوباره، پاداش را تکرار میکند | هدیهی «حساب وصل شد» را از سرور و یک بار برای هر بازیکن بدهید |
کد آماده: endpointهای سرور، کنترلر و پیامهای کلاینت.