Page tree
Skip to end of metadata
Go to start of metadata

مقدمه

شرکت Anywhere software پلتفرمی با نام Basic4Android جهت تولید و توسعه ساده‌تر برنامه‌های قابل اجرا بر روی سیستم عامل اندروید ارائه کرده است. در این پلتفورم از زبان برنامه‌سازی Basic استفاده می‌شود. Anywhere software برای اتصال به سرویس پرداخت‌ درون‌برنامه‌ای گوگل‌پلی، ماژولی را در اختیار کاربران خود قرار داده است. با توجه به اینکه API پرداخت درون‌برنامه‌ای مایکت دقیقا مانند گوگل پلی است، با تغییراتی اندک این ماژول را برای اتصال به مایکت آماده کرده‌ایم. در ادامه با فرایند اضافه کردن این ماژول به برنامه خود آشنا می‌شوید.

 

تعاریف پرداخت درون‌برنامه‌ای در B4A

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

 

مراحل اضافه کردن ماژول مایکت

برای اضافه کردن کتابخانه سرویس خرید درون‌برنامه مایکت در B4A کافی است، مراحل زیر را انجام دهید:

۱. کتابخانه خرید درون برنامه مایکت در B4A را از اینجا دریافت نمایید.

 ۲. دو فایل MyketIAP.jar و MyketIAP.xml را در پوشه کتابخانه‌های Basic4Android کپی نمایید.

 ۳. در پنل سمت راست B4A، تب libs را انتخاب و Refresh نمایید تا کتابخانه MyketIAP نمایان شود.

 ۴. با استفاده از Manifest Editor  (واقع در منوی Project) کد زیر را به Manifest برنامه خود اضافه کنید:

معرفی API در B4A

 

کلاس BillingManager3

BillingManager3 رابط B4A با سرویس خرید درون برنامه مایکت است. برای استفاده از این کلاس کافی است در  Process_Globals برنامه خود، این کلاس را تعریف نمایید:

از BillingManager3 برای دریافت اطلاعات محصولات خریده‌شده، خرید یک محصول (فروشی یا اشتراکی) و مصرف کردن آن استفاده می‌شود. در ادامه با نحوه استفاده از متد‌های BillingManager3 آشنا می‌شوید:

 

متد Initialize

برای استفاده از BillingManager3 ابتدا حتما باید این کلاس را Initialize نمود:

پارامتر اول EventName است و ابتدای نام CallBack‌های BillingManager3 را مشخص می کند. که در این مستند فرض بر این است که پارامتر EventName را "BillingManager" مقدار‌دهی نموده‌ایم.

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

 

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

چک کردن پشتیبانی از سرویس درون‌خرید مایکت

این Callback، پس از اتمام عملیات متد Initialize صدا زده می شود مشخص می‌کند که آیا دستگاه کاربر از سرویس درون خرید مایکت پشتیبانی می‌کند یا خیر. در صورتی که مقدار Supported برابر True باشد، دستگاه کاربر از خرید درون‌برنامه‌ای مایکت پشتیبانی می‌کند.

متد RequestPayment

از RequestPayment برای خریدن یک محصول (فروشی یا اشتراکی) استفاده می‌گردد:

پارامتر اول نام محصول است که در پنل برنامه‌نویسان مایکت وارد نموده اید. پارامتر دوم نوع محصول را مشخص می‌کند. که برای محصولات فروشی مقدار "inapp" و برای محصولات اشتراکی مقدار "subs" را می‌پذیرد. پارامتر سوم اطلاعات اضافی یا Developer Payload می‌باشد. این فیلد شامل رشته‌ای است که مقدار‌دهی آن اختیاری است و در پردازش مایکت تاثیری ندارد. مقداری که به این پارامتر تخصیص داده می‌شود عینا در CallBack اتمام خرید (که در ادامه توضیح داده می‌شود)، باز‌می‌گردد. برای آشنایی بیشتر با مفهوم Developer Payload به اینجا مراجعه نمایید.


اتمام فرایند خرید 

این Callback، پس از اتمام عملیات متد RequestPayment صدا زده می‌شود و وضعیت خرید Product را مشخص می‌کند. درصورتی که Success برابر True باشد خرید با موفقیت انجام شده است. اگر محصول خریداری‌ شده از نوع فروشی و مصرف‌شدنی بود، باید این محصول را با استفاده از متد ConsumeProduct در سرور مایکت مصرف نمود. در صورتی که محصول از نوع فروشی و مصرف‌نشدنی و یا از نوع اشتراکی بود، نباید متد ConsumeProduct صدا زده شود.


متد ConsumeProduct 

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


این متد Object محصولی که باید مصرف شود را در تنها پارامتر ورودی خود می‌گیرد. (این object در callback اتمام خرید ارسال شده است.)

 

اتمام عملیات مصرف شدن محصول

این Callback، پس از اتمام عملیات متد ConsumeProduct صدا زده می‌شود و در صورتی که پارامتر Success برابر True باشد،  باید محصول را به کاربر تحویل داد.


متد GetOwnedProducts

این متد در اول برنامه پس از Initialize شدن BillingManager صدا زده می‌شود. هدف از این کار دریافت محصولات فروشی که در سرور مایکت مصرف نشده‌اند و محصولات اشتراکی می‌باشد. بعد از اتمام کار، این متد در Callback دریافت محصولات کاربر لیستی از محصولات برمی‌گرداند.

به عنوان مثال زمانی که کاربر در برنامه شما اکانت ویژه (Premium Account) خریداری می‌کند همیشه این محصول در Callback‌ برگردانده می‌شود.

برای صدا زدن این متد کافی است:

دریافت محصولات کاربر

این Callback، پس از فراخوانی متد GetOwnedProducts صدا زده می شود و لیست purchases شامل محصولات مصرف‌نشدنی کاربر و محصولات مصرف‌شدنی که در سرور مایکت مصرف نشده‌اند می‌باشد.

فعال و غیرفعال کردن Log

برای فعال یا غیر‌فعال کردن Log کتابخانه سرویس خرید درون‌برنامه‌ای مایکت، کافیست مقدار True/False را به متد DebugLogging بدهید:

پیشنهاد می‌شود DebugLogging را در زمان توسعه فعال و پس از انتشار برنامه خود غیرفعال کنید.

پروژه تستی

این پروژه همان پروژه Trivial Drive گوگل تغییر یافته است. می‌توانید این پروژه را از اینجا دانلود کنید و یا روی GitHub ببینید.

در این پروژه سه نوع محصول وجود دارد:

محصول مصرف شدنی(gas)

 محصول مصرف نشدنی(premium)

 محصول اشتراکی(infinity)


به خاطر داشته باشید برای شروع کار با محصولات باید ابتدا آن‌ها را در پنل توسعه‌دهندگان تعریف نمایید

این پروژه شامل چهار دکمه خرید بنزین، استفاده بنزین، خرید اکانت ویژه و خرید اکانت اشتراکی است. که در زیر به اختصار توضیح داده شده است:

 

 

خرید بنزین یا Buy Gas

بنزین در این مثال در دسته‌ی محصولات فروشی و مصرف‌شدنی است. با فشردن این دکمه در صورتی که مخزن بنزین پر نباشد برنامه به خرید درون‌برنامه‌ای مایکت وصل شده و بعد از پرداخت هزینه مورد نظر تعداد ۱۰ واحد به مخزن بنزین اضافه می‌شود.

 

استفاده بنزین یا Use Gas

در صورتی که تعداد بنزین ذخیره بیشتر از ۱۰ واحد باشد، ۱۰ واحد بنزین مصرف می‌شود.

 

خرید اکانت ویژه یا Buy Premium

اکانت ویژه در این مثال در دسته‌ی محصولات فروشی و مصرف‌نشدنی است. با انتخاب این گزینه برنامه به خرید درون‌برنامه‌ای مایکت وصل شده و با پرداخت هزینه اکانت ویژه خریداری می‌شود این نوع پرداخت مصرف‌نشدنی است.

 

خرید اکانت اشتراکی یا Get Inifite Gas

این اکانت به صورت زمان‌دار است که کاربر با پرداخت هزینه می‌تواند اکانت (ماهانه، هفتگی و یا سالانه) را خریداری کند. توجه داشته باشید که کاربر با خریدن اکانت ویژه می‌تواند به صورت نامحدود بنزین مصرف کند بدیهی است که در این مدت زمان کاربر نباید بنزین خریداری کند و همچنین نمی‌تواند اکانت زمان‌دار دیگری نیز بخرد به همین دلیل دکمه اکانت نامحدود مخفی شده و خرید بنزین نیز غیرفعال می‌شود.

ویدئو آموزشی

در این ویدئو نحوه اضافه کردن ماژول مایکت در B4A و فرایند استفاده از سرویس خرید درون‌برنامه‌ای آموزش داده شده است. این ویدئو را می‌توانید از اینجا دانلود کنید و یا در آپارات مشاهده نمایید.

  • No labels

17 Comments

  1. Anonymous

    سلام وخسته نباشید

    ,این کتابخانه جدیدی رو که پرداخت درون برنامه ای گذاشتین با 

    !بیسیک فور اندروید هماهنگی نداره ومن هر چقدر تغییرات میدیم بازم ارور میده نمیدونم مشکل از کجاست

    لطفا راهنمایی کنید

  2. Anonymous

    چرا از کتابخونتون در زمان کامپال شدن خطا گرفته میشه؟

     

    B4A version: 5.02
    Parsing code. (0.07s)
    Compiling code. (0.35s)

    ObfuscatorMap.txt file created in Objects folder.
    Compiling layouts code. (0.07s)
    Generating R file. (0.08s)
    Compiling generated Java code. (4.59s)
    Convert byte code - optimized dex. Error
    UNEXPECTED TOP-LEVEL EXCEPTION:
    java.lang.RuntimeException: Exception parsing classes
    at com.android.dx.command.dexer.Main.processClass(Main.java:752)
    at com.android.dx.command.dexer.Main.processFileBytes(Main.java:718)
    at com.android.dx.command.dexer.Main.access$1200(Main.java:85)
    at com.android.dx.command.dexer.Main$FileBytesConsumer.processFileBytes(Main.java:1645)
    at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284)
    at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166)
    at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
    at com.android.dx.command.dexer.Main.processOne(Main.java:672)
    at com.android.dx.command.dexer.Main.processAllFiles(Main.java:574)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:311)
    at com.android.dx.command.dexer.Main.run(Main.java:277)
    at com.android.dx.command.dexer.Main.main(Main.java:245)
    at com.android.dx.command.Main.main(Main.java:106)
    Caused by: com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000)
    at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:472)
    at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406)
    at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388)
    at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251)
    at com.android.dx.command.dexer.Main.parseClass(Main.java:764)
    at com.android.dx.command.dexer.Main.access$1500(Main.java:85)
    at com.android.dx.command.dexer.Main$ClassParserTask.call(Main.java:1684)
    at com.android.dx.command.dexer.Main.processClass(Main.java:749)
    ... 12 more
    Uncaught translation error: java.lang.IllegalArgumentException: already added: Lanywheresoftware/b4a/AbsObjectWrapper;
    Uncaught translation error: java.lang.IllegalArgumentException: already added: Lanywheresoftware/b4a/B4AActivity;
    Uncaught translation error: java.lang.IllegalArgumentException: already added: Lanywheresoftware/b4a/B4AClass;
    Uncaught translation error: java.lang.IllegalArgumentException: already added: Lanywheresoftware/b4a/B4AClass$ImplB4AClass;
    Uncaught translation error: java.lang.IllegalArgumentException: already added: Lanywheresoftware/b4a/B4AMenuItem;
    Uncaught translation error: java.lang.IllegalArgumentException: already added: Lanywheresoftware/b4a/B4AThreadPool;
    Uncaught translation error: java.lang.IllegalArgumentException: already added: Lanywheresoftware/b4a/B4AThreadPool$1;
    Uncaught translation error: java.lang.IllegalArgumentException: already added: Lanywheresoftware/b4a/B4AThreadPool$MyThreadFactory;
    UNEXPECTED TOP-LEVEL EXCEPTION:
    java.lang.RuntimeException: Translation has been interrupted
    at com.android.dx.command.dexer.Main.processAllFiles(Main.java:608)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:311)
    at com.android.dx.command.dexer.Main.run(Main.java:277)
    at com.android.dx.command.dexer.Main.main(Main.java:245)
    at com.android.dx.command.Main.main(Main.java:106)
    Caused by: java.lang.InterruptedException: Too many errors
    at com.android.dx.command.dexer.Main.processAllFiles(Main.java:600)
    ... 4 more

  3. Anonymous

    قبلا کتابخانه پرداخت درون برنامه ای  ورژن 1.20 49/6 کیلو بایت بود , ولی الان 17/2 مگابایت شده نمیدونم چرا اینقدر حجمش بیشتر شده و  بخاطراین هم کلا تو برنامه ارور میده و هماهنگ با بیسییک فور اندورید نیست

    Error : 

    B4A version: 5.02
    Parsing code. (0.00s)
    Compiling code. (0.09s)
    Compiling layouts code. (0.00s)
    Generating R file. (2.17s)
    Compiling generated Java code. (3.38s)
    Convert byte code - optimized dex. Error
    UNEXPECTED TOP-LEVEL EXCEPTION:
    com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000)
    at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:472)
    at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406)
    at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388)
    at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251)
    at com.android.dx.command.dexer.Main.processClass(Main.java:665)
    at com.android.dx.command.dexer.Main.processFileBytes(Main.java:634)
    at com.android.dx.command.dexer.Main.access$600(Main.java:78)
    at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:572)
    at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284)
    at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166)
    at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
    at com.android.dx.command.dexer.Main.processOne(Main.java:596)
    at com.android.dx.command.dexer.Main.processAllFiles(Main.java:498)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:264)
    at com.android.dx.command.dexer.Main.run(Main.java:230)
    at com.android.dx.command.dexer.Main.main(Main.java:199)
    at com.android.dx.command.Main.main(Main.java:103)
    ...while parsing anywheresoftware/b4a/inappbilling3/BillingManager3$4.class
    1 error; aborting

     

    این ارور میده , لطفا علت ارور ,توضیح بدید

     

    با تشکر

    1. Anonymous

      دوست عزیز کتابخانه هیچ مشکلی نداره

  4. Anonymous

    مشکل داره , اگه مشکل نداشت , اینقدر حجمش به یکباره زیاد نمیشد

  5. Anonymous

    بعدش هم , , کتابخانه قبلی فقط توی شبیه سازها نمایش داده میشه , توی گوشی ها اصل دیده نمیشه ,این به این خاطر هست که  کتابخانه آپدیت شده , ولی متاسفانه به درستی اصلاح و تغییر داده نشده  و مشکل بوجود میاره , وهنگام کامپایل ارور میده

  6. Anonymous

    راست میگه

  7. Anonymous

    سلام من میخوام همزمان از کتابخانه پرداخت درون برنامه بازار و مایکت هردو با هم در یک برنامه استفاده کنم اما هردوتاشون به نام BillingManager3 تعریف میشن!! چیکار باید بکنم؟؟

  8. Anonymous

    با سلام  هنگام لود برنامه خودم از اینشینلایز ارور میگیره 

  9. Anonymous

    با عرض سلام آقا من خیلی به یک مثال ساده درون پرداخت برای بیسیک4 نیاز دارم و البته سالم باشه و خطا نده این کتابخانه ای که در حال حاضر وجود داره خرابه نمی دونم شاید من بلد نیستم لطفا یک مثال ساده که در صورت خرید یک دکمه فعال بشه رو قرار بدید با تشکر

    ایمیل :ysbt93@gmail.com

    1. Anonymous

      عزیز الان هزاران توسعه دهنده دارن از همین کتابخانه استفاده میکنن کجاش خرابه!

  10. Anonymous

    سلام

    ابتدا در دستگاه واقعی تست کنید.

    آخرین کتابخانه که لینکش هم در بالا هست حجمش همون 49.4 کیلوبایت هست و ورژنش هم 1.2

    دقت کنید اشتباهی دانلود نکنید.

    مایکت هم باید در دستگاه نصب باشد.

    موفق باشید

  11. Anonymous

    سلام

    چطور میشه پس از خرید توکن خرید رو گرفت ؟

    و اینکه در بخش مالی پنل توسعه دهندگان چرا جستجوی توکن وجود نداره ؟

    خب اگر کاربری اعتراض داشت و توکن خریدش رو داد ما چطور خریدش رو بررسی کنیم ؟!

    با تشکر

  12. Anonymous

    سلام

    در مثالی که پیوست کردید ، عجیبه که...

    اشتباه است. BillingManager_OwnedProducts کد رویداد

                  If P.ProductId = SKU_GAS Then

                    oBillingManager.ConsumeProduct(P)

                    Add_Gas

                End If

    اگر محصولی مصرف نشده بود نباید همونجا گاز اضافه بشه... باید شبیه وضعیت نرمال اضافه شدن گاز رو در رویداد مصرف شدن نوشت.

     

     

  13. Anonymous

    سلام

    کسی جوابگو سوالات هم هست یا الکیه ؟

    من برنامم رو روی گوشی سونی آیون با اندروید 4.0 تست میکنم اما در اینیشیالایز کردم کتابخانه درون پرداخت ارور میده... روی چند دستگاه دیگه مشکلی نداره و فقط روی سونی آیون این مشکل رو دیدم.

    مایکت هم نصب و با اکانت هم لاگین کردم.

    لطفا راهنمایی کنید.

    با تشکر

  14. Anonymous

    سلام.

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

    من همون سورسی که خود مایکت قرار داده را موقع کامپایل خطا می گیره 

    کتاب خونه اش رو هم اضافه کردم ولی بازم خطا می گیره 

    لطفا اگه کسی میدونه کمک کنه

Write a comment…