بعضی وقتا هم کپی‌کردن جواب نیست.

پیاده‌سازی همزمان پرداخت درون برنامه‌ای گوگل و بازار


یه روش فروش خدمات و کالای دیجیتال توی برنامه‌های موبایل، پرداخت درون برنامه‌ایه. به این صورت که شما پول می‌دید و یه چیزی توی برنامه براتون باز میشه. مثلاً یه تعداد سکه یا حذف تبلیغات یا هر چی.

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

برای همه‌ی دنیا، ما از خدمات پرداخت درون برنامه‌ای گوگل استفاده می‌کنیم و برای ایرانی‌ها یکی از راه‌های عرضه کالای دیجیتال، پرداخت درون برنامه‌ای کافه بازاره.

داستان پرداخت درون برنامه‌ای، یه همچین چیزیه:

عملکرد پرداخت درون برنامه ای
عملکرد پرداخت درون برنامه ای

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

به این واسط میگن فایل AIDL. این فایل AIDL یه اینترفیسه که با زبان AIDL یا همون Android Interface Definition Language نوشته شده و اسمش روشه دیگه، واسطه!

یه چنین چیزی یعنی:

نقش فایل AIDL
نقش فایل AIDL

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

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

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

اما راه حل چیه؟

راه‌حل‌هایی که به ذهن من رسید، شامل این موارد بود:

راه حل اول: فایل AIDL بازار رو بذار یه جای دیگه، تا با گوگل‌پلی به مشکل نخوره.
نتیجه: باخت!
فایل AIDL یه واسط دو طرفس، اگه توی برنامه‌ی شما در جای درستی قرار نگرفته باشه، توی برنامه مقصد شناسایی نمیشه و کاری براتون انجام نمیده.


راه حل دوم: اسم یکی از فایل‌های AIDL رو عوض کن.
نتیجه: یه برد شانسی و در مجموع باخت!
تغییر نام، به همون دلیلی که راه‌حل اول جواب نداد، جواب نمیده.
منتهی توی برنامه اندروید ما به دلیلی که خودمم تا چند ساعت قبل نوشتن این مطلب نمی‌دونستم جواب داد که بعداً میگم چی بود داستان.


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


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


مشکل من خیلی شانسی با راه‌حل دوم حل شد و گذشت تا اینکه دوباره این مشکل برای یکی از بازی‌های شرکت و برنامه‌نویس یونیتی به وجود اومد و ایشون هم ایمیل زدند که این جواب از طرف بازار اومد:

این کار ممکن نیست.
این کار ممکن نیست.


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

اما داستان این کار کردن شانسی چی بود؟

همونطور که بالاتر توی تصویر یه اشاراتی کردم، یه سری فایل کمکی توسط بازار و گوگل‌پلی ارائه شده تا برنامه‌نویس مستقیماً درگیر پیچیدگی‌های AIDL نشه و با کمک این فایل‌ها کارشو راه بندازه. یعنی یه سری فایل دوباره نقش واسط برنامه‌نویس و AIDL رو ایفا می‌کنن.
وقتی من اسم فایل AIDL بازار رو عوض کرده بودم، اسمش توی این فایل‌های کمکی عوض نشده بود! یعنی این فایل‌های کمکی همچنان از فایل AIDL با اسم قبلی استفاده می‌کردن و این فایل چیزی نبود جز فایل AIDL گوگل‌پلی!
کلاس‌های کمکی بازار من با استفاده از AIDL گوگل‌پلی با بازار ارتباط برقرار می‌کردن و انقدر کپی بازار مو به مو و دقیق انجام شده که هیج مشکلی پیش نمیاد.

فایل AIDL بازار از مدار خارج شده!
فایل AIDL بازار از مدار خارج شده!

عکس بالا نشون میده که چطور شانسی شانسی اپ کار کرده بود.

حالا راه حل چیه؟ همون عوض کردن اسم فایل AIDL؟

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


خلاصه عرایضم این که اگه توی اپ اندروید قصد دارید همزمان از پرداخت درون برنامه‌ای بازار و گوگل‌پلی استفاده کنید و فایل‌های AIDLشون دچار تداخل میشن یکی رو نادیده بگیرید یعنی کلاً ازش استفاده نکنید (تا زمانی که بازار عیناً از گوگل‌پلی کپی کرده، احتمالاً تا ابد!) و اگه توی یونیتی قصد دارید چنین کاری بکنید، فایل Jar پرداخت درون برنامه‌ای بازار رو باز کنید و سه تا فایلی که مربوط به AIDL هستند رو از توش پاک کنید.

BazaarIAB. com/android/vending/billing
BazaarIAB. com/android/vending/billing

همین!


مطلب قبلیم

برناhttps://virgool.io/@khaleghi/chernobyl-aqocjmxfkjxb