PDA

View Full Version : مشکل در پرداخت درون برنامه ای بازار امروز؟!



parniaznet
شنبه 26 اردیبهشت 1394, 17:09 عصر
سلام
من امروز برنامه ام به مشکل خورده چند نف تماس گفتن باهام
بدون اینکه هیچ تغییری داده باشم چه سمت سرور چه اندروید برنامه با این خطا متوقف میشه :


05-16 17:49:26.668: E/JSON(11799): Invalid access_token
05-16 17:49:26.668: E/JSON Parser(11799): Error parsing data org.json.JSONException: Value Invalid of type java.lang.String cannot be converted to JSONObject
05-16 17:49:26.686: E/AndroidRuntime(11799): FATAL EXCEPTION: AsyncTask #2
05-16 17:49:26.686: E/AndroidRuntime(11799): Process: com.fallrooz.srp, PID: 11799
05-16 17:49:26.686: E/AndroidRuntime(11799): java.lang.RuntimeException: An error occured while executing doInBackground()
05-16 17:49:26.686: E/AndroidRuntime(11799): at android.os.AsyncTask$3.done(AsyncTask.java:300)
05-16 17:49:26.686: E/AndroidRuntime(11799): at java.util.concurrent.FutureTask.finishCompletion(F utureTask.java:355)
05-16 17:49:26.686: E/AndroidRuntime(11799): at java.util.concurrent.FutureTask.setException(Futur eTask.java:222)
05-16 17:49:26.686: E/AndroidRuntime(11799): at java.util.concurrent.FutureTask.run(FutureTask.jav a:242)
05-16 17:49:26.686: E/AndroidRuntime(11799): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTas k.java:231)
05-16 17:49:26.686: E/AndroidRuntime(11799): at java.util.concurrent.ThreadPoolExecutor.runWorker( ThreadPoolExecutor.java:1112)
05-16 17:49:26.686: E/AndroidRuntime(11799): at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:587)
05-16 17:49:26.686: E/AndroidRuntime(11799): at java.lang.Thread.run(Thread.java:841)
05-16 17:49:26.686: E/AndroidRuntime(11799): Caused by: java.lang.NullPointerException
05-16 17:49:26.686: E/AndroidRuntime(11799): at com.fallrooz.srp.MainActivity$SaveProductDetails.d oInBackground(MainActivity.java:417)
05-16 17:49:26.686: E/AndroidRuntime(11799): at com.fallrooz.srp.MainActivity$SaveProductDetails.d oInBackground(MainActivity.java:1)
05-16 17:49:26.686: E/AndroidRuntime(11799): at android.os.AsyncTask$2.call(AsyncTask.java:288)
05-16 17:49:26.686: E/AndroidRuntime(11799): at java.util.concurrent.FutureTask.run(FutureTask.jav a:237)
05-16 17:49:26.686: E/AndroidRuntime(11799): ... 4 more
05-16 17:49:27.954: E/WindowManager(11799): android.view.WindowLeaked: Activity com.fallrooz.srp.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$Decor View{42c32e30 V.E..... R......D 0,0-684,192} that was originally added here
05-16 17:49:27.954: E/WindowManager(11799): at android.view.ViewRootImpl.<init>(ViewRootImpl.java:422)
05-16 17:49:27.954: E/WindowManager(11799): at android.view.WindowManagerGlobal.addView(WindowMan agerGlobal.java:250)
05-16 17:49:27.954: E/WindowManager(11799): at android.view.WindowManagerImpl.addView(WindowManag erImpl.java:69)
05-16 17:49:27.954: E/WindowManager(11799): at android.app.Dialog.show(Dialog.java:297)
05-16 17:49:27.954: E/WindowManager(11799): at com.fallrooz.srp.MainActivity$SaveProductDetails.o nPreExecute(MainActivity.java:400)
05-16 17:49:27.954: E/WindowManager(11799): at android.os.AsyncTask.executeOnExecutor(AsyncTask.j ava:587)
05-16 17:49:27.954: E/WindowManager(11799): at android.os.AsyncTask.execute(AsyncTask.java:535)
05-16 17:49:27.954: E/WindowManager(11799): at com.fallrooz.srp.MainActivity$NetCheck.onPostExecu te(MainActivity.java:382)
05-16 17:49:27.954: E/WindowManager(11799): at com.fallrooz.srp.MainActivity$NetCheck.onPostExecu te(MainActivity.java:1)
05-16 17:49:27.954: E/WindowManager(11799): at android.os.AsyncTask.finish(AsyncTask.java:632)
05-16 17:49:27.954: E/WindowManager(11799): at android.os.AsyncTask.access$600(AsyncTask.java:177 )
05-16 17:49:27.954: E/WindowManager(11799): at android.os.AsyncTask$InternalHandler.handleMessage (AsyncTask.java:645)
05-16 17:49:27.954: E/WindowManager(11799): at android.os.Handler.dispatchMessage(Handler.java:11 0)
05-16 17:49:27.954: E/WindowManager(11799): at android.os.Looper.loop(Looper.java:193)
05-16 17:49:27.954: E/WindowManager(11799): at android.app.ActivityThread.main(ActivityThread.jav a:5333)
05-16 17:49:27.954: E/WindowManager(11799): at java.lang.reflect.Method.invokeNative(Native Method)
05-16 17:49:27.954: E/WindowManager(11799): at java.lang.reflect.Method.invoke(Method.java:515)
05-16 17:49:27.954: E/WindowManager(11799): at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:829)
05-16 17:49:27.954: E/WindowManager(11799): at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:645)
05-16 17:49:27.954: E/WindowManager(11799): at dalvik.system.NativeStart.main(Native Method)



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

djtrex
شنبه 26 اردیبهشت 1394, 19:17 عصر
احیانا از api بازار برای تایید پرداخت درون برنامه ایتون استفاده میکنید؟
این ارور مربوط به نا معتبر بودن access token هست.

(در ضمن اگه از api بازار درون اپتون استفاده میکنید تا پرداختتون رو تایید کنید این روش امنیتی نداره! باید سمت سرور انجام بشه)

poorman
شنبه 26 اردیبهشت 1394, 20:18 عصر
این خطا برای من هم پیش اومده امروز و رفرش کدی که میگیرم از بازار فقط یکبار جواب میده
ظاهرا باز دوباره بازار اون سمت داره یه کارایی میکنه
معلوم نیست این قضیه باگ هست یا آپدیت سیستم

من بهشون ایمیل دادم ببینم قضیه چیه

djtrex
شنبه 26 اردیبهشت 1394, 21:10 عصر
این خطا برای من هم پیش اومده امروز و رفرش کدی که میگیرم از بازار فقط یکبار جواب میده
ظاهرا باز دوباره بازار اون سمت داره یه کارایی میکنه
معلوم نیست این قضیه باگ هست یا آپدیت سیستم

من بهشون ایمیل دادم ببینم قضیه چیه

بررسی کردم انگار بازار refresh token rotation رو فعال کرده.
در نتیجه برای هر ریکوئست refresh token به شما یه refresh_token جدید میده در نتیجه اون رو باید جایگزین قبلی کنید برای درخواست های بعدی
انقضای اکسس توکن شده 3600000 ثانیه و با هر ریکوئست رفرش توکن قبلی نا معتبر می شود و ارور


{
"error": "invalid_grant"
}


به شما نشون میده.

131320

parniaznet
شنبه 26 اردیبهشت 1394, 21:22 عصر
خب الان باید چه تغییری در کد های سمت سرور داد؟
من یکبار کلا کلاینت رو پاک کردم مجدد کلاینت ساختم و همه چیز رو تنظیم کردم و تست کردم درست شد اما دوباره الان تست کردم دوباره اینولید شده
کاربرا همینجوری دارن یه ستاره میدن و نظر دری وری میزارن

djtrex
شنبه 26 اردیبهشت 1394, 21:30 عصر
کد سمت سرورتون به چه صورت هست؟

(باید با هر بار درخواست refresh token مقدار refresh_token رو جایی ذخیره کنید (دیتابیس - فایل - کش و ...) و همچنین برای پرفرمنس بهتر access_token رو به اندازه مقدار expires_in ذخیره کنید و هر موقع اون از اون مقدار گذشت (اینجا حدود ۴۱ روز میشه) دوباره درخواست refresh token بدید. عملا در بیشتر موارد برای تایید خریدتون فقط یک درخواست به بازار میدید و تاخیر برای کاربر کمتر میشه (و به سرور های بازار هم کمتر فشار میارید!!)‌ )

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

parniaznet
شنبه 26 اردیبهشت 1394, 21:31 عصر
این کد های سمت سرور من هست :

<?php

if(empty($_REQUEST['package']) || empty($_REQUEST['product']) || empty($_REQUEST['tokenid'])){
echo "error";
return;
}

$package = $_REQUEST['package'];
$product = $_REQUEST['product'];
$tokenid = $_REQUEST['tokenid'];

$refcode = 'xxxxxxxxxxxxxxxxx';

$url = 'http://pardakht.cafebazaar.ir/auth/token/';
$data = array('grant_type' => 'refresh_token', 'client_id' => 'xxxxxxxxxxxxxxxxx', 'client_secret' => 'xxxxxxxxxxxxxxxxxxxxxxxx', 'refresh_token' => $refcode);

# Create a connection
$ch = curl_init($url);

# Form data string
$postString = http_build_query($data, '', '&');

# Setting our options
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postString);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

# Get the response
$response = curl_exec($ch);

$jsonResponse = json_decode($response, true);
$access_token = $jsonResponse['access_token'];
$result = file_get_contents("https://pardakht.cafebazaar.ir/api/validate/$package/inapp/$product/purchases/$tokenid/?access_token=$access_token");


echo $result;

curl_close($ch);


?>

djtrex
شنبه 26 اردیبهشت 1394, 22:23 عصر
یه همچین کدی میشه access_token و refresh_token رو توی فایل ذخیره میکنه. شما باید مسیر فایل رو مشخص کنید + مجوز نوشتن داشته باشه. (برای امنیت بهتر فایلتونو در مسیر امنی بذارید)

این بخشی از پکیجی (https://github.com/nikapps/bazaar-api-php) هست که ساختم برای php و منتظرم بازار داکیومنت هاشو آپدیت کنه تا تغییر بدم. با کد های شما ترکیب کردم. کدهای شما exception handler و error handler نداره + اگه از بستر امن فرستاده نشه مثل https خیلی راحت میشه دورش زد (با پاسخ جعلی از سرور شما) )

کد php:
http://pastie.org/10192325
یا
http://codeviewer.org/view/code:50dc

این از پکیج carbon استفاده میکنه اونم باید اضافه کنید:
https://github.com/briannesbitt/Carbon

همچنین نسخه php شما باید حداقل 5.4 باشه.

(در ضمن تست نکردم کد رو :دی)

--------------
اطلاعات محرمانه کلاینتتون بین کدها بود یه کلاینت جدید بسازید و کلاینت قبلی رو پاک کنید :)

parniaznet
شنبه 26 اردیبهشت 1394, 22:39 عصر
کد شما رو با کد های خودم جا به جا کردم :

http://codeviewer.org/view/code:50dc

پکیج carbon رو هم دانلود و روی سرور اپلود کردم

لینک نمونه برای تست :

http://www.eydkojaberim.ir/sajad/fall/barresi.php?package=com.fallrooz.srp&product=fall3&tokenid=PVsS4JkmnoM_aXeUl

کار نمیکنه متاسفانه
ورژن php سرورم رو نمیدونم

parniaznet
شنبه 26 اردیبهشت 1394, 22:42 عصر
ورژن php سرور من 5.3.29 هست
باید صبح ایمیل بزنم ارتقا بدن

djtrex
شنبه 26 اردیبهشت 1394, 22:50 عصر
array هارو از
[]
به
array()
تغییر بدید فکر کنم مشکلتون حل بشه. چون من کد جدید دیگه ای نزدم نسبت به php 5.3.

ولی خوب در هر صورت php 5.3 دیگه پشتیبانی نمیشه از طرف php.net .بهتره بروز کنید:)

parniaznet
شنبه 26 اردیبهشت 1394, 23:07 عصر
نه هیچ فرقی نکرد

poorman
یک شنبه 27 اردیبهشت 1394, 09:15 صبح
متاسفانه من نتونستم این تغییرات جدید رو راه اندازی کنم
یک بار رفرش کد گرفته میشه و داخل دیتابیس ذخیره میکنم، برای بار اول با اون رفرش کد، یک رفرش کد جدید و یک access code داده میشه
حالا نه با رفرش کد جدید و نه با رفرش کد قبلی دیگه جواب درست برگشت داده نمیشه

دوباره باید تمام مراحل دستی طی بشه ...

دوستان شما تونستید اتوماتیک access code بگیرید به صورت نامحدود؟

یه سوال دیگه اینکه، آیا زمان اعتبار access code به ثانیه ست یا میلی ثانیه؟؟؟ چون به میلی ثانیه میشه تقریبا 10 ساعت

poorman
یک شنبه 27 اردیبهشت 1394, 09:22 صبح
من فعلا اکسس کدی که گرفتم رو دستی توی سرور ذخیره کردم که حداقل برای 10 ساعت آینده خریدهام به درستی تایید بشه
امیدوارم بازار زودتر جواب بده

واقعا خیلی بده که بدون هیچ اطلاعی این تغییرات رو میدن

parniaznet
یک شنبه 27 اردیبهشت 1394, 09:28 صبح
بله من هم ایمیل زدم دقیقا همینا رو گفتم ، گفتم اگه تغییری می خواید بدید اطلاع رسانی کنید بد نیست یکم ادای حرفه ای ها رو در بیارید اگه حرفه ای هم نیستید، کاربرا هم خبر داشته باشن که به ما فحشش رو ندن

c0mmander
یک شنبه 27 اردیبهشت 1394, 10:31 صبح
آقا برای منم همین مشکل به وجود اومده کاربرا از چشم ما می بینن :عصبانی:

یعنی باید هر 40 روز یک بار یک رفرش کد جدید بگیریم؟!

poorman
یک شنبه 27 اردیبهشت 1394, 10:37 صبح
امیر جان دعا کن 40 روز باشه و 10 ساعت نباشه :لبخند:
اگر زمان اعتبار به میلی ثانیه باشه اونجاست که باید منفجر شد

c0mmander
یک شنبه 27 اردیبهشت 1394, 10:47 صبح
امیر جان دعا کن 40 روز باشه و 10 ساعت نباشه :لبخند:
اگر زمان اعتبار به میلی ثانیه باشه اونجاست که باید منفجر شد

خدا نکنه که 10 ساعت به 10 ساعت باشه! چون واقعا افتضاح میشه..

حجت جان این رو بخون : http://developersblog.cafebazaar.ir (http://developersblog.cafebazaar.ir/1394/01/24/%D8%A7%D8%B6%D8%A7%D9%81%D9%87-%D8%B4%D8%AF%D9%86-%D8%B3%D8%B1%D9%88%DB%8C%D8%B3-%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D8%A8%D9%87-%D8%B1%D9%88%D8%B2-%D8%A8%D9%88%D8%AF%D9%86-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%A8%D9%87-%DA%A9%D9%84%D8%A7%DB%8C%D9%86%D8%AA-%D8%A8%D8%A7%D8%B2%D8%A7%D8%B1)

خودم هم خوندم بی ربط بود هنوز هیچ اطلاع رسانی هم انجام نشده!

poorman
یک شنبه 27 اردیبهشت 1394, 11:05 صبح
خدا نکنه که 10 ساعت به 10 ساعت باشه! چون واقعا افتضاح میشه..

حجت جان این رو بخون : http://developersblog.cafebazaar.ir/1394/01/24/%D8%A7%D8%B6%D8%A7%D9%81%D9%87-%D8%B4%D8%AF%D9%86-%D8%B3%D8%B1%D9%88%DB%8C%D8%B3-%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D8%A8%D9%87-%D8%B1%D9%88%D8%B2-%D8%A8%D9%88%D8%AF%D9%86-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%A8%D9%87-%DA%A9%D9%84%D8%A7%DB%8C%D9%86%D8%AA-%D8%A8%D8%A7%D8%B2%D8%A7%D8%B1

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

c0mmander
یک شنبه 27 اردیبهشت 1394, 11:25 صبح
ایول امکان جالب و خوبیه
گرچه پیاده سازیش در حالت عادی هم کار زیاد سختی نیست، ولی خب اینکه یه API براش دادن خیلی خوبه

تازه دیده بودمش هرچند که ربطی به موضوع نداشت.
منم فعلا یک اکسس کد داخل سرور گذاشتم تا علی حساب مشکل رفع بشه. تا بعدا مشخص بشه که چی کار باید کرد.

ali-star
یک شنبه 27 اردیبهشت 1394, 13:31 عصر
من دیشب با این مشکل مواجه شدم ظاهرا مشکل از بازار هست دو روز پیش شب از ساعت فکر کنم 11 سیستم پرداخت بازار کاملا از کار افتاد تقریبا به مدت 2 ساعت بود حتما دارن یه چیزی سرهم می کنن... کلاینت جدید هم درست کردم با این ارور رو میده "Invalid access_token".
البته دوستان همیشه باید به فکر چنین مواقعی باشید چون صدای کاربرا درمیاد.
خوبه که فکر اینجاش رو کرده بودم!:چشمک:

parniaznet
یک شنبه 27 اردیبهشت 1394, 13:58 عصر
دوستان زمان تغییر ده ساعت نیست، من ساعت ۱۱ اکسس کد جدید گذاشتم الان از کار افتاده

poorman
یک شنبه 27 اردیبهشت 1394, 18:38 عصر
سلام،





توسعه‌دهندهٔ گرامی،


مشکل از سوی بازار است. همکاران در تیم فنی تلاش می‌کنند تا مشکل را برطرف نمایند.


ممنون از همراهی شما.





با احترام،
مهرناز احمدی



این هم جواب بازار

parniaznet
یک شنبه 27 اردیبهشت 1394, 21:05 عصر
به منم همین جواب رو دادن


سلام،




توسعه‌دهندهٔ گرامی،


متأسفانه مشکلی اتفاق افتاده است که همکاران در تیم فنی تلاش می‌کنند تا آن را رفع کنند.



ممنون از اطلاع‌رسانی و بردباری شما.

djtrex
دوشنبه 28 اردیبهشت 1394, 00:51 صبح
دوباره به حالت قبل برگشته انگار
در حال تغییر مستندات هستن:
http://pardakht.cafebazaar.ir/doc/developer-api/?l=fa

تغییری که من دیدم زمان انقضا access_token از یه ساعت شده حدود ۴۱ روز. بهتر به جای هر بار ۲ تا ریکوئست زدن (ممکنه بازار بلاک کنه درخواست های رفرش توکن زیاد رو خیلی از سایت هایی که api دارن اینجورین)
access_token رو ذخیره کنید جایی هر موقع از تاریخ انقضاش رد شد دوباره درخواست refresh_token رو بفرستید.
هم بهینه تره هم کاربر کمتر منتظر میمونه تا تایید خرید بشه.

+ از بستر امن استفاده کنید برای تایید خرید هاتون مثل https یا https://github.com/serpro/Android-PHP-Encrypt-Decrypt و ...


131373

parniaznet
دوشنبه 28 اردیبهشت 1394, 12:09 عصر
به من همچنان invalid میده. برای بقیه دوستان حل شده مشکل؟

poorman
دوشنبه 28 اردیبهشت 1394, 12:24 عصر
آره الان مشکلی وجود نداره، یک بار اکسس کد بگیرید و توی فایل php ذخیره کنید، ظاهرا تاریخ اعتبارش همون 41 روز هست

چون من دیروز ظهر گذاشتم هنوز هم داره کار میکنه

فعلا کاری به رفرش کد نداشته باشید، مشکل رو موقت حل کنید تا بازار اطلاع بده دقیقا چی شده

djtrex
دوشنبه 28 اردیبهشت 1394, 13:32 عصر
آره الان مشکلی وجود نداره، یک بار اکسس کد بگیرید و توی فایل php ذخیره کنید، ظاهرا تاریخ اعتبارش همون 41 روز هست

چون من دیروز ظهر گذاشتم هنوز هم داره کار میکنه

فعلا کاری به رفرش کد نداشته باشید، مشکل رو موقت حل کنید تا بازار اطلاع بده دقیقا چی شده

من پیشنهاد میکنم شما پروتکل OAuth 2 رو مطالعه بفرمایید. این روش دستی روش یه برنامه نویس نیست :)

poorman
دوشنبه 28 اردیبهشت 1394, 15:18 عصر
من پیشنهاد میکنم شما پروتکل OAuth 2 رو مطالعه بفرمایید. این روش دستی روش یه برنامه نویس نیست :)

تا قبل از این تغییرات همه چیز اتوماتیک بود دوست عزیز، اما این تغییرات از اونجایی که اتومات اکسس کی نمیده، مجبور به این کار شدم تا درست بشه
به هرحال من برنامه نویس وب نیستم، و اینکارها رو میشه اولین تجربه های PHP بنده دونست