رفتن به مطلب

MrMedia

کاربر فعال
  • تعداد ارسال ها

    273
  • تاریخ عضویت

  • روز های برد

    13

پست ها ارسال شده توسط MrMedia

  1. سلام به دوستان عزیز
    این آموزش برای امن کردن درون پرداخت کافه بازار با توجه به مستندات خود کافه بازار هستش.
    اگه نمی دونید api کافه بازار چیه کافیه به لینک زیر یه سر بزنی 😉


    https://developers.cafebazaar.ir/fa/guidelines/in-app-billing/api#
     

    برای راه اندازی API ابتدا باید یک Client ایجاد کنید. هر Client شامل اطلاعاتی است که از طرف بازار برای شناخته‌شدن یک کاربر API لازم است. برای ساخت Client به پیشخان بازار مراجعه نمایید و از منو تنظیمات، قسمت API توسعه‌دهندگان روی گزینه کلاینت جدید کلیک کنید.
    در پنجرهٔ باز شده، مقدار مورد نظر خود برای Redirect URI را وارد کنید. این آدرس، مشخص می‌کند که بازار در پاسخ به درخواست اولیه شما برای دریافت Authorization Code، باید پاسخ را به چه آدرسی بفرستد.
    به عکس زیر توجه کنید:


    1.jpg.5d2041f08087cedca6328c26e021054b.jpg


    ما آدرس فایل php که برای چک کردن و مصرف خرید کاربران کافه بازار هستش رو درج کردیم (پایین پست فایل رو میزارم) و بعد از زدن دکمه ایجاد کلاینت، کلاینت ایجاد میشه و با عکسی مشابه عکس زیر مواجه میشید.


    2.jpg.aa1ad9a4b99a9e99eb63fb290146b7a5.jpg

    ⚠️برای امنیت برنامه خودم مقادیر رو در عکس مخدوش کردم ⚠️
     


    خب حالا دو مقدار Client Id و Client Secret رو یکجا کپی کنید چون نیازمون میشه

    حالا بجای سخت کار می رسیم!! به اینجای کار با خوب دقت کنید

    در این مرحله در مرورگر خود یک New Tab یا پنجره جدید باز کنید و آدرس زیر را تکمیل کنید:

    https://pardakht.cafebazaar.ir/devapi/v2/auth/authorize/?response_type=code&access_type=offline&redirect_uri=&client_id=

    خب چطور باید تکمیلش کنیم؟ ببینید دوستان این همون متد GET هستش شما باید جلوی مساوی هایی که خالی هستش رو پر کنید
    جلوی redirect_uri همون آدرس فایل php که برای ساخت کلاینت دادیم رو میزاریم (عکس 1) و جلوی client_id هم مقداری که در عکس 2 زیر همون عنوان می بینید رو درج می کنیم.
    پس با این حساب آدرس ما میشه این:

    https://pardakht.cafebazaar.ir/devapi/v2/auth/authorize/?response_type=code&access_type=offline&redirect_uri=https://website.ir/bazaar.php&client_id=JFNF85BFPHKSVBJ67CNNDMMSUYHWNKRLLJDGRK


    خب حالا آدرس رو در مرورگر وارد کنید و Enter را بزنید تا صفحه لود شود
    بعد از لود شدن صفحه با چنین صفحه ای مواجه می شوید:


    spacer.png


    حالا کافیه روی تایید کلیک کنید تا به آدرس فایل php که برای ساخت کلاینت استفاده کردیم (عکس 1) ارجاع داده بشیم.
    خب به آدرس مرورگر نگاه کنید آدرس مرورگر شما چیزی شبیه به این هستش:

    https://website.ir/bazaar.php?code=GWObRK06KHLr8pCQzDXJ9hcDdSC3eV


    حالا مقداری که جلوی =code هستش رو یجا کپی کنید
    خب تا اینجا ما 3 تا مقدارو گفتیم یجا کپی کنید، یادتونه؟؟؟ اون مقادیر اینا بودن: Client Id و Client Secret و code
    اون مقادیر الان به کار میاد:
    باید اونا رو در کد زیر جایگزین کنی

    <?php
    
    $curl = curl_init();
    
    curl_setopt_array($curl, array(
      CURLOPT_URL => "https://pardakht.cafebazaar.ir/devapi/v2/auth/token/",
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => "",
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 30,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => "POST",
      CURLOPT_POSTFIELDS => array(
        'grant_type' => 'authorization_code',
        'code' => 'کد',
        'client_id' => 'کلاینت آیدی',
        'client_secret' => 'کلاینت سکرت',
        'redirect_uri' => 'آدرس فایل پی اچ پی'
      ),
    ));
    
    $response = curl_exec($curl);
    $err = curl_error($curl);
    
    curl_close($curl);
    
    if ($err) {
      echo "cURL Error #:" . $err;
    } else {
      echo $response;
    }


    خب فایل رو با فرمت php ذخیره کن و در هاستت آپلود کن و در مرورگر آدرسشو وارد و Enter رو بزن تا صفحه بارگذاری بشه
    این کار Postman خیلی راحت تر هستش ولی گفتم شاید برخی از دوستان آشنایی ندارند با این روش جلو میریم و اگه با Postman آشنایی داری با کد curl زیر انجامش بده:

    curl --location --request POST 'https://pardakht.cafebazaar.ir/devapi/v2/auth/token/' \
    --form 'grant_type="authorization_code"' \
    --form 'code="کد"' \
    --form 'client_id="کلاینت آیدی"' \
    --form 'client_secret="کلاینت سکرت"' \
    --form 'redirect_uri="آدرس فایل پی اچ پی"'


    خب حالا  برگردیم به مرورگرمون که بارگذاری شده
    نتیجه به صورت متنی در قالب JSON دریافت می‌شه که حاوی access token ، زمان انقضا ، نوع توکن مورد‌نظر، scope و refresh token هستش.
    ما از این مقادیر جیسون فقط به refresh token نیاز داریم پس یجا کپی کن.

    از این جا به بعد دیگه آسون میشه 🥰
    خب یادتونه یک آدرس برای ساخت کلاینت وارد کرده بودیم؟ (عکس 1) که از آدرس https://website.ir/bazaar.php استفاده کرده بودیم؟
    این کد class که باید درون این فایل قرار بگیره:
     

    <?php
    /**
     * Class cafebazaar.ir
     * Author: milad kantoori
     */
    
    define("clientId", "کلاینت آیدی");
    define("clientSecret", "کلاینت سکرت");
    define("refreshToken", "رفرش توکن");
    
    class cafebazaar
    {
        private $access_token = '';
        public function __construct()
        {
            $this->refreshTokenRequest();
        }
    
        function checkPurchase($package_name, $product_id, $purchase_token, $userid)
        {
    
            $url = "https://pardakht.cafebazaar.ir/devapi/v2/api/validate/$package_name/inapp/$product_id/purchases/$purchase_token/?access_token=" . $this->access_token;
    
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_FAILONERROR, true);
    
            $response = curl_exec($ch);
            curl_close($ch);
            $responseData = json_decode($response, true);
    
            if (isset($responseData['consumptionState'])) {
                if ($responseData['consumptionState'] == 1 && $responseData['purchaseState'] == 0) {
                    if ($this->consumePurchase($package_name, $purchase_token) == true && $responseData['developerPayload'] == $userid) {
                        return true;
                    }
                }
            }
            return false;
        }
    
        private function consumePurchase($package_name, $purchase_token)
        {
            $url = "https://pardakht.cafebazaar.ir/devapi/v2/api/consume/$package_name/purchases/?access_token=" . $this->access_token;
            $data = [
                'token' => $purchase_token
            ];
    
            $ch = curl_init($url);
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
            $response = curl_exec($ch);
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            curl_close($ch);
    
            if ($httpCode === 200) {
                return true;
            } else {
                return false;
            }
        }
    
        private function refreshTokenRequest()
        {
            $url = "https://pardakht.cafebazaar.ir/devapi/v2/auth/token/";
            $data = [
                'grant_type' => 'refresh_token',
                'client_id' => clientId,
                'client_secret' => clientSecret,
                'refresh_token' => refreshToken
            ];
    
            $ch = curl_init($url);
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
            $response = curl_exec($ch);
            $responseData = json_decode($response, true);
    
            if (isset($responseData['access_token'])) {
                $this->access_token = $responseData['access_token'];
            }
            curl_close($ch);
        }
    
    }
    
    ?>


    خب در خط 7 و 8 و 9 مقادیری که گفتم کپی کن رو جایگزین کنید و تمام 🥳
    دیگه می مونه فقط نحوه استفاده از این کلاس ولی چندتا نکنه هست که باید بهتون بگم:

    چرا بصورت class نوشتم کدرو؟ چون می تونیم در همه پروژه هامون ازش استفاده کنیم و نیازی به کپی فایل و دستکاری و... نداره (یکی از مزیت های شی گرائی اینه)
    چرا مصرف خرید درسمت سرور انجام میشه؟ چون من معتقدم که هیچ کار مهمی  نباید برای امنیت در سمت کلاینت (کاربر) انجام بشه و کاربر فقط باید مشاهده کننده باشه!!!

    خب چطور استفاده کنیم از این کلاس؟؟؟
    شما درون فایل php که به اپلیکیشنت وصله کافیه این class رو اینجوری فراخونی کنی:

    require_once('bazar.php');
    $cafebazaar = new cafebazaar();

     

    بعد کافیه هر جایی از کدت خواستی خرید کاربر رو بررسی کنی این کد رو استفاده کنی:

    $result = $cafebazaar->checkPurchase($_REQUEST['package_name'], $_REQUEST['product_id'], $_REQUEST['purchase_token'], $_REQUEST['userid']);
    if ($result) {
        // خرید معتبر است
    }else{
        // خرید جعلی است
    }


    خب کد که کاملا مشخص هستش و کافیه شما در جاهایی نوشته شده خرید معتبر و جعلی، کدهای خودت رو بنویسی.

    حالا نکته آخر که باید سمت اپلیکیشن انجام بدی که مهم هستش پس خوب توجه کن:

    شما در سمت کاربر یا همون اپلیکیشن باید این موارد رو انجام بدی:
    1. حتما و حتما وقتی که از کتابخونه Poolaky یک متغییر PoolakeyPurchaseRequest تعریف کردی از Payload استفاده کن مقدارش رو هم آیدی یکتا کاربر بزار (android_id)
    2. موقعی که میخای به سمت سرور درخواست بدی باید موارد زیر رو ارسال کنی:
    پکیج نیم
    آیدی محصول
    توکن خرید
    آیدی یکتا کاربر

    درخواست به صورت GET فرستاده بشه و با کلید های:
    🔑 package_name
    🔑 product_id
    🔑 purchase_token
    🔑 userid


    برای مثال:

    https://website.ir/api.php?package_name=پکیج_نیم&product_id=آیدی_محصول&purchase_token=توکن_خرید&userid=آیدی_یکتا_کاربر


    در مثال بالا مواردی که فارسی هستند باید جایگزین شه
    همه موارد کاملا مشخصه فقط شاید توکن خرید براتون ناآشنا باشه 🤔

    بعد از خرید موفق از بازار یک تابع که با اول نام ایونتی که شما موقع تعریف کتابخونه پولکی داشتید فراخونی میشه. ما اینجا فکر میکنیم نام این ایونت یا رویداد رو گذاشته بودیم bazaar پس این تابع بعد از خرید موفق فراخونی میشه:

    Private Sub bazaar_PurchaseSucceed (PurchaseInfo As PoolakeyPurchaseInfo)
    		PToken = PurchaseInfo.PurchaseToken
    End Sub


    در مثال بالا PToken همون مقدار string توکن خرید هستش که باید موقع بررسی خرید ارسال کنیم.
    دیگه شما از چه کتابخونه ای برای ارسال مقادیر با متد GET استفاده می کنید با خودتونه. میتونی کتابخونه پیشفرض b4a باشه یا کتابخونه ای که خرید کردین 🥰

    امیدوارم این آموزش به کارتون بیاد 🤩

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

    لینک حمایت مالی جهت حفظ و ارتقا سیستم انجمن و ارتقا کتابخانه ها + به روزرسانی و حمایت از تیم برنامه نویسی





     

    • پسندیدن 5
    • تشکر 1
  2. ۴ دقیقه قبل، محمدرضا شاهپیری گفته است:

    یه متد جداگونه بنویسید واسه مصرف کردن خرید  بعد توی onIabPurchaseFinished با دستور calsubdelayed اونو صدا بزنید ببینید اکی میشه یا نه‌ نتیجه رو اعلام کنید لطفا

    من با متد CallSubDelayed2 انجامش دادم و الان عین ساعت کار میکنه.
    خیلی ممنون از راهنماییتون 🌹

    • پسندیدن 1
  3. ۱ دقیقه قبل، محمدرضا شاهپیری گفته است:

    یه متد جداگونه بنویسید واسه مصرف کردن خرید  بعد توی onIabPurchaseFinished با دستور calsubdelayed اونو صدا بزنید ببینید اکی میشه یا نه‌ نتیجه رو اعلام کنید لطفا

    بله حتما، الان انجامش میدم

  4. سلام و خسته نباشید.
    من هم چنان در مشکل دارم و این خطا رو بعد از خرید دریاافت میکنم:

    main$ResumableSub_myb_onIabPurchaseFinishedresume (java line: 4990)
    java.lang.NullPointerException: Attempt to read from field 'anywheresoftware.b4a.BA ir.caller.id.main.activityBA' on a null object reference in method 'void ir.caller.id.main$ResumableSub_myb_onIabPurchaseFinished.resume(anywheresoftware.b4a.BA, java.lang.Object[])'
    	at ir.caller.id.main$ResumableSub_myb_onIabPurchaseFinished.resume(main.java:4990)
    	at ir.caller.id.main._myb_oniabpurchasefinished(main.java:4908)
    	at java.lang.reflect.Method.invoke(Native Method)
    	at anywheresoftware.b4a.BA.raiseEvent2(BA.java:221)
    	at anywheresoftware.b4a.BA.raiseEvent2(BA.java:205)
    	at com.myketbilling.core.MyketBilling$3.onIabPurchaseFinished(MyketBilling.java:67)
    	at ir.myket.billingclient.util.IAB$1.onReceiveResult(IAB.java:115)
    	at android.os.ResultReceiver$MyRunnable.run(ResultReceiver.java:50)
    	at android.os.Handler.handleCallback(Handler.java:938)
    	at android.os.Handler.dispatchMessage(Handler.java:99)
    	at android.os.Looper.loopOnce(Looper.java:210)
    	at android.os.Looper.loop(Looper.java:299)
    	at android.app.ActivityThread.main(ActivityThread.java:8319)
    	at java.lang.reflect.Method.invoke(Native Method)
    	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556)
    	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1038)
    main$ResumableSub_myb_onIabPurchaseFinishedresume (java line: 4990)
    java.lang.NullPointerException: Attempt to read from field 'anywheresoftware.b4a.BA ir.caller.id.main.activityBA' on a null object reference in method 'void ir.caller.id.main$ResumableSub_myb_onIabPurchaseFinished.resume(anywheresoftware.b4a.BA, java.lang.Object[])'
    	at ir.caller.id.main$ResumableSub_myb_onIabPurchaseFinished.resume(main.java:4990)
    	at ir.caller.id.main._myb_oniabpurchasefinished(main.java:4908)
    	at java.lang.reflect.Method.invoke(Native Method)
    	at anywheresoftware.b4a.BA.raiseEvent2(BA.java:221)
    	at anywheresoftware.b4a.BA.raiseEvent2(BA.java:205)
    	at com.myketbilling.core.MyketBilling$3.onIabPurchaseFinished(MyketBilling.java:67)
    	at ir.myket.billingclient.util.IAB$1.onReceiveResult(IAB.java:115)
    	at android.os.ResultReceiver$MyRunnable.run(ResultReceiver.java:50)
    	at android.os.Handler.handleCallback(Handler.java:938)
    	at android.os.Handler.dispatchMessage(Handler.java:99)
    	at android.os.Looper.loopOnce(Looper.java:210)
    	at android.os.Looper.loop(Looper.java:299)
    	at android.app.ActivityThread.main(ActivityThread.java:8319)
    	at java.lang.reflect.Method.invoke(Native Method)
    	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556)
    	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1038)

    در حال دیباگ اصلا مشکلی برای خرید و خرج کردن ندارم ولی در حالت Release و Release (obfuscated) خطا بالا رو میده
     

  5. سلام و ممنون بابت کتابخونه خوبتون
    من برای مصرف خرید مشکل دارم و از روش هایی که در این پست گفتید هم استفاده کردم.
    ولی به خطا میخورم و به محض اجرای ساب
     

    Private Sub myket_onIabPurchaseFinished(result As IabResult,purchase As Purchase)

    به خطای زیر بر میخورم.
     

    ** Activity (main) Pause, UserClosed = false **
    Sleep not resumed (context is paused): b4a.example3.b4xloadingindicator$ResumableSub_MainLoop
    main$ResumableSub_myket_onIabPurchaseFinishedresume (java line: 5006)
    java.lang.NullPointerException: Attempt to read from field 'anywheresoftware.b4a.BA ir.caller.id.main.activityBA' on a null object reference in method 'void ir.caller.id.main$ResumableSub_myket_onIabPurchaseFinished.resume(anywheresoftware.b4a.BA, java.lang.Object[])'
    	at ir.caller.id.main$ResumableSub_myket_onIabPurchaseFinished.resume(main.java:5006)
    	at ir.caller.id.main._myket_oniabpurchasefinished(main.java:4908)
    	at java.lang.reflect.Method.invoke(Native Method)
    	at anywheresoftware.b4a.BA.raiseEvent2(BA.java:221)
    	at anywheresoftware.b4a.BA.raiseEvent2(BA.java:205)
    	at com.myketbilling.core.MyketBilling$3.onIabPurchaseFinished(MyketBilling.java:67)
    	at ir.myket.billingclient.util.IAB$1.onReceiveResult(IAB.java:115)
    	at android.os.ResultReceiver$MyRunnable.run(ResultReceiver.java:50)
    	at android.os.Handler.handleCallback(Handler.java:938)
    	at android.os.Handler.dispatchMessage(Handler.java:99)
    	at android.os.Looper.loopOnce(Looper.java:210)
    	at android.os.Looper.loop(Looper.java:299)
    	at android.app.ActivityThread.main(ActivityThread.java:8319)
    	at java.lang.reflect.Method.invoke(Native Method)
    	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556)
    	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1038)
    main$ResumableSub_myket_onIabPurchaseFinishedresume (java line: 5006)
    java.lang.NullPointerException: Attempt to read from field 'anywheresoftware.b4a.BA ir.caller.id.main.activityBA' on a null object reference in method 'void ir.caller.id.main$ResumableSub_myket_onIabPurchaseFinished.resume(anywheresoftware.b4a.BA, java.lang.Object[])'
    	at ir.caller.id.main$ResumableSub_myket_onIabPurchaseFinished.resume(main.java:5006)
    	at ir.caller.id.main._myket_oniabpurchasefinished(main.java:4908)
    	at java.lang.reflect.Method.invoke(Native Method)
    	at anywheresoftware.b4a.BA.raiseEvent2(BA.java:221)
    	at anywheresoftware.b4a.BA.raiseEvent2(BA.java:205)
    	at com.myketbilling.core.MyketBilling$3.onIabPurchaseFinished(MyketBilling.java:67)
    	at ir.myket.billingclient.util.IAB$1.onReceiveResult(IAB.java:115)
    	at android.os.ResultReceiver$MyRunnable.run(ResultReceiver.java:50)
    	at android.os.Handler.handleCallback(Handler.java:938)
    	at android.os.Handler.dispatchMessage(Handler.java:99)
    	at android.os.Looper.loopOnce(Looper.java:210)
    	at android.os.Looper.loop(Looper.java:299)
    	at android.app.ActivityThread.main(ActivityThread.java:8319)
    	at java.lang.reflect.Method.invoke(Native Method)
    	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556)
    	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1038)

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

  6. 2 ساعت قبل، محمدرضا شاهپیری گفته است:

    سلام و درود. از wait For استفاده نکنید. متدهای success  و  error رو به صورت ایونت پیاده کنید. تایم اوت رو هم بالا بزارید یک دیقه معمولا میزارن

    چرا تو حالت wait for کار نمیکنه؟ بعدا اضافه میشه به کتابخونه؟ 

  7. سلام من از آخرین نسخه کتابخونه استفاده میکنم ولی متد 

    WithTimeOut

    برام کار نمی کنه
    کدم هم اینه

     

    Dim fn As FastNetSetup
    Dim Request As PersianFastNetwork
    
    fn.SetupFastNet.WithSSL.WithTLS.WithCookieManager.WithTimeOut(10000).Build
    Request.initialize("fn")
    GetRequest = Request.BuildGetQuery("sample_url","sample_tag")
    GetRequest.addHeader("sample_header")).executRequest
    wait For fn_onSucsess(value As String , Tag As Object )
    'my code...
    
    Sub fn_onError(Error As ResponseError , Tag As Object)
    		Log(Error.ErrorMsage)
    End Sub

    این مشکل باعث شده لودینگ برنامه که قبل درخواست فرستادن نشون میدم و تایم اوت کار نمیکنه نمی تونم مخفیش کنم و لودینگ دائما بچرخه و همین باعث شده کافه بازار به برنامم اشکال بگیره

     

  8. در 6 ساعت قبل، محمدرضا شاهپیری گفته است :

    35 کیلوبایت برای post حجم زیادیه. سعی کنید هنگام پست کردن یا از progressdialog استفاده کنید یا از asynctask

    چیزی که برام مهمه اینکه اپلیکیشن فریز نشه که متاسفانه میشه
    شما کدوم روشی رو پیشنهاد میکنید که فریز اتفاق نیوفته؟
    من خطا هایی که در برنامه رخ داده رو در قالب متن به سرور پست میکنم و نمی تونم از پروگرس دیالوگ استفاده کنم
    و اگه ممکنه درباره asynctask کمی توضیح بدین اگه ممکنه با مثال، چون از این گزینه تا حالا استفاده نکردم
    ممنون :53:

  9. آقای شاهپیری من با نسخه 5.50 کتابخونه با متد PostRequest یک مقدار متنی رو به سرور ارسال میکنم، مشکلی در ارسال و دریافت ندارم
    مقدار متنی که ارسال میشه گاها حجمش 35kb میشه
    اما در هنگام ارسال اپلیکیشن چند ثانیه فریز میشه
    مشکل به نظرتون از کجاست؟

  10. سلام آقای شاهپیری
    من از نسخه 5.50 کتابخونه شما در یکی از پروژه هام استفاده میکنم  و بخاطر اینکه تست کلی اپم به خاطر عمل کرد حساسش خیلی زمان میبره از بروز کردن کتابخونه صرف نظر کردم و تا حالا مشکلی نداشتم
    حالا میخوام یه آپدیت به برنامه بدم و در آپلود فایل مشکل دارم
    کدهام اینه:

    Dim per As PersianFastNetwork
    per.initialize("con").WithSSL.WithTLS.WithCookieManager.Build
    Dim postquery As UploadRequest = per.BuildUploadQuery("https://mysite.com/upload.php","up")
    postquery.addMultipartFile("note.db",File.DirRootExternal & "/myapp")
    postquery.startUploadAsString
    
    Private Sub up_onStringUploadOK(response As String  , Tag As String)
    	ToastMessageShow("ارسال شد",False)
    End Sub
    
    Private Sub up_onStringUploadError(Error As ResponseError , Tag As String)
    	ToastMessageShow("ارسال نشد !",True)
    End Sub

    من تا حالا از این متد استفاده نکردم و از جستجو ها هم چیزی دستگیرم نشد
    اگه ممکنه منو راهنمایی کنید و کد های php سمت سرور رو هم برای عملکرد درست برنامه در اختیارم بذارید
     

  11. ** توضیحات تکمیلی
    اگر سوالی درباره کتابخانه دارید می تونید مطرح کنید تا جواب بدم، اما قبل از پرسیدن سوال حتما ویدئوی کتابخانه را ببینید

    کد و دیکد کردن متن ها، url و... با کلید 16 کارکتری که توسط شما انتخاب میشه انجام میگیره
    و برای سهولت کار ابزار کمکی ویندوز هم به پکیج اضافه شده

    • تشکر 1
  12. سلام به همگی
    کتابخانه ای تهیه کردم تحت عنوان MrNetUtils
    خیلی از مواقع توسعه دهنده ها برای امنیت پرداخت نگرانی دارن و یا برای گرفتن آیدی یکتا گوشی به دلیل محدودیت دسترسی phone در اندروید دچار مشکل می شوند و نگرانی هایی مثل دیکامپایل شدن اپلیکیشن و لو رفتن url های درون اپلیکیشن و...
    و برای اپلیکیشن نیاز به دیتابیس استان ها و شهر ها دارن و یا لیست کشورها و پیش شماره آنها
    و یا اطلاعات  قبل از ثبت مورد راستی آزمایی قرار بگیرن مثل کد ملی، ایمیل و...

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

    ویدوئوی این کتابخونه را می توانید در زیر مشاهده کنید

     
    Trait.png برخی ویژگی های کتابخانه:
     
    tick.png دیتابیس کشورها + پیش شماره آنها
    tick.png دیتابیس استان ها و شهر ها
    tick.png به دست آوردن آیدی یکتای گوشی بدون نیاز به دسترسی
    tick.png کد و دیکد کردن اطلاعات در اپلیکیشن و سمت سرور + فایل php
    tick.png خواندن اطلاعات از api های json
    tick.png ایجاد user-agent رندوم برای ارسال درخواست به یک url
    tick.png چک کردن یک پروکسی
    tick.png چک کردن بالا بودن وی پی ان پروکسی در گوشی
    tick.png چک کردن وجود یک url
    tick.png چک کردن ایمیل
    و...
     
    * ابزار کمکی برای کد و دیکد کردن متن ها برای ویندوز به پکیج اضافه شد *

    این کتابخانه دارای مثال کاربردی هم می باشد و فایل php برای کد و دیکد کردن همراه با مثال هم به آن ضمیمه شده است

    لینک خرید کتابخانه
    • پسندیدن 2
  13. در هم اکنون، caesar.f گفته است :

    سلام، پژمان جان ارادتمندم ممنون برای این کتابخانه و سورس، اما فیلم آموزشش رو نزاشتی داداش، اونو اگه میشه بزار ، اون فیلم دمو نشون میداد انگار یه فیلم آموزشی هم براش گذاشتی اما فیلمی نبود داخل فایل بعد از خرید

    تو مثالش همه چیز با توضیحات هستش، کجاش رو مشکل دارید بگید تا راهنمایی کنم

  14. سلام آقای شاهپیری اول از همه خیلی ممنون بابت این کتابخونه عالی و شاهکارتون
    من یه مشکل داشتم برای ssl هاستم که با دستور WithTLS رفع شد ولی در میان کار به مشکل دیگه ای برخوردم و api سمت سرورم خطایی مبنی بر cookie میداد که اپلیکیشنم از یک جایی جلوتر نمی رفت این مشکلم رو هم با دستور WithCookieManager حل کردم
    این پست هم جهت تشکر هستش هم می خواستم بدونم WithCookieManager دقیقا چه عملی انجام میده
    البته از اسمش معلومه برای مدیریت کوکی ها هستش

  15. در هم اکنون، محمدرضا شاهپیری گفته است :

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

    آقای شاهپیری ممکنه کمی کار با کتابخونه رو بلد نباشم ولی کپی ساب تو ساب چیز نشدی هستش حتی اگه کاربر آماتور باشه
    مشکلم حل شد 
    موقع ران کردن دیباگر به آخرین لاین اشاره میکرد که خالی بود رفتم و روی همون لاین و DELETE رو زدم درست شد!!!!

    ممنون از شما
     

    • تشکر 1
  16. از کد های نمونه شما در پروژه استفاده کردم ولی وقتی کد ها رو paste میکنم این خطا لاگ نمایش داده میشه

    con_onGetStringErrorListener is not a valid identifier
    یا
    Input string was not a correct format.


    در ضمن اگه من در میان کدهام از wait for برای ساب con_onGetStringOkListener استفاده کنم حتما زمانی که اطلاعات دریافت بشه این ساب اجرا میشه اگه به مشکل بربخوره درخواست حتما ساب دیگه ای اجرا میشه و کد های بعد از wait for اجرا نمیشن، فکری دربارش کردید؟ 

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

    	ir.init("ir")
    	ir.AddHeader("User-Agent", "Mozilla/5.0...")
    	ir.get("https://site.com/db.php?name=farhad")
    	wait For  ir_Response (Success As Boolean , Res As String,header() As Object)
    	If Success Then
    	  ''my code
    	End If

    سرور من از ssl استفاده میکنه و برام خیلی مهمه که کتابخونه شما بتونه به راحتی بهش وصل بشه و یا در صورت بروز اشکال این کار رو بدون ssl انجام بده
    ممنون میشم راهنمایی کنید

  18. در در 1396/09/01, 01:36:16، محمدرضا شاهپیری گفته است :

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

    همین کار رو هم کردم ولی بازم همون ارور رو میده، کیدونم کد خاصی نداره ولی اگه یه نمونه بزارید که چک کم ممنون میشم

  19. سلام من موقع کامپایل این خطا رو دارم:

    Compiling generated Java code.    Error
    B4A line: 30
    fl.initialize
    javac 1.8.0_25
    src\b4a\flash\main.java:336: error: cannot access CameraAccessException
    _fl.initialize(processBA);
                  ^
      class file for android.hardware.camera2.CameraAccessException not found

    مشکل چیه؟

    آیا در مانیفست باید دسترسی هم اضافه کرد؟

  20. آقا پژمان خسته نباشید، من کتابخونه شما رو تهیه کردم

    کد:

    <string name="service_name">pnalarmreceiver</string>

    گزینه pnalarmreceiver برای چی هست؟

    بعد دریافت آلارم بالا میاد؟ اگه اینطوریه میشه کلا سرویس رو حذف کرد و سرویس خودم رو جایگزینش کنم؟ البته بوت سرویس رو هم true میزام

    این امکان هست؟

  21. بله حتما تهیه میکنم سوال من بیشتر از این جهت هستش که اطمینان پیدا کنم که این کتابخونه مشکلات که دارم رو حل میکنه
    یه سوال دیگه:

    من میخوام این الارم رو 

    pn.setNewAlarmRepeating(0,60000,dateTime.Now)

    در سرویسی ست کنم که در مانفیست هم معرفی کردم
    مشکلی که پیش نمیاد؟

×
×
  • اضافه کردن...