# Native Code > برنامه نویسی موبایل > Android Studio >  آموزش api بازار

## raha_jon

سلام 

لطفا دوستان آموزشی مربوطه به API بازار قرار دهید منم قول میدم بعد اینکه یاد گرفتم فیلمشو تهیه کنم و بذارم اینجا دوستان استفاده کنن

با تشکر در ضمن من این لینکو دیدم اما چیزی متوجه نشدم

لطفا کامل توضیح بدین با تشکر


<?php
 
if(empty($_REQUEST['package']) || empty($_REQUEST['product']) || empty($_REQUEST['tokenid'])){
echo "error";
return;
}
 
$package = $_REQUEST['package'];
$product = $_REQUEST['product'];
$tokenid = $_REQUEST['tokenid'];
 
$refcode = 'کدی که از بازار گرفتین - رفرش کد';
 
$url = 'http://pardakht.cafebazaar.ir/auth/token/';
$data = array('grant_type' => 'refresh_token', 'client_id' => 'آیدی کلاینت', 'client_secret' => 'رمز کلاینت', '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);
 
 
?>

----------


## c0mmander

اول از همه این تاپیک رو مطالعه کنید https://barnamenevis.org/showthread.p...B1%D9%88%D8%B1

دوم باید یک هاست (ترجیحا رایگان, اما رایگان بودن هاست هم یک سری, درد سر هایی  داره ولی برای شروع بهتر هست از رایگان استفاده کنید) همراه با دامین و یا ساب  دامین ایجاد کنید.

سوم باید یک کلایت ایجاد کنید : توضیح http://pardakht.cafebazaar.ir/doc/developer-api/?l=fa
  اونجایی که گفته Redirect URI همون صفحه از php شماست که داخل هاست قرار دادید که قرار بازار با اون ارتباط داشته باشه مثلا : www.c0mmanderHost.ir/input_check.php 

بعد از اینکه بازار به شما کلایت ای دی و سیکرت کلایت و غیره رو ایجاد کرد فقط دوتا از آنها رو در لینک زیر جایگزین کن یعنی: <REDIRECT_URI>  و <CLIENT_ID> . 

https://pardakht.cafebazaar.ir/auth/authorize/?response_type=code&access_type=offline&redirect_u  ri=<REDIRECT_URI>&client_id=<CLIENT_ID>

در نهایت لینک  رو داخل مرورگر باز کن, تا دکمه تایید بیاد و تایید کن.
چند لحظه صبر کن وارد صفحه همون سایتت میشه, دقت کن بالای ادررس بار سایت جلوی اسم سایت یک نوشته هست شبیه به این:  code= asdfasdfsadfsadfsadfasdfasdfasdf یک همچین چیزی این رو داشته باش یک جایی.

و بعدش این آدرس رو در در مرورگرتون باز کنید:
https://pardakht.cafebazaar.ir/auth/token/
حالا اطلاعاتی که با توجه به توضیحات بازار در مراحل قبل گرفتید رو داخلش بزارید یعنی اطلاعات صفحه بازار و اطلاعات کلایت ایجاد کردید و کدی که در مرحله قبل گرفتید رو جای گذاری کنید و دکمه Authorize  رو بزنید

اگر همه چیز رو درست انجام داده باشید باید جوابی شبیه به زیر رو بهتون بده: (دقت کنید که جواب بازار سر هم دیگه هست مثل این جدا جدا نیست در حقیقت یک Json خروجی هست)

{
   "access_token": "GWObRK06KHLr8pCQzDXJ9hcDdSC3eV",
   "token_type": "Bearer",
   "expires_in": 3600,
   "refresh_token": "yBC4br1l6OCNWnahJvreOchIZ9B6ze",
   "scope": "androidpublisher"
}


حالا که هم اکسس کد رو گرفتید و هم ریفرش کد. میتونی حالا با جای گذاری اون اطلاعات در کد بالا, فایل PHP رو ذخیره کن و داخل همون آدرس در هاست بگذار مثلا www.c0mmanderHost.ir/input_check.php در اینجا input_check.php همون فایل PHP ذخیره شده در هاست شماست.
توضیحات حجت عزیز هم برای اون کدی هست که بالا گذاشتید:



> به این فایل سه تا پارامتر باید بفرستید، یکی اسم پکیج، یکی آیدی محصول و  دیگری توکنی که بعد از خرید به برنامه داده میشه همون purchase.getOrderId
> 
> داخل فایل باید refresh code رو که از بازار به صورت دستی گرفتید بذارید
> آیدی کلاینت و رمزش رو هم وارد کنید
> 
> در جواب به شما یک رشته JSON داده میشه، اگر خالی بود یعنی پرداخت درست نیست، اگر که شامل استاتوس و سایر مشخصات خرید بود یعنی درسته
> 
> پاسخ درست به شکل زیره
> {"consumptionState": 1, "purchaseState": 0, "kind":   "androidpublisher#inappPurchase", "developerPayload": "hojjat",   "purchaseTime": 1424267267085}
> ...



چندتا توضیح هم خودم اضافه میکنم !

ببنید ساختار این کار به این صورته:

1- شناساندن سایت معتبر به بازار جهت استعلام گرفتن بعدی:
با ثبت یک کلایت که دارای یک Client Id و Secret Client : در حقیقت اینها یوز و پسورد شما برای درست رسی به اکسس کد هستندگرفتن کد تایید وجود وب سایت این کد نشان دهنده این هست که چنین وبسایتی وجود داره(یکی از زیبایی های این کار همینه) 
 2- استعلام گرفتن خودکار اکسس کد توسط  وب سایت بعد از هر بار تقاضا از جهت برنامه اندرویدی شما به وب سایت شما
در حقیقت این API تمام در یک قسمت کار خودش رو انجام میده به دوتا دستور : authorization_code برای گرفتن کد ها ضروری و refresh_token برای گفتن اکسس کد.امنیتی که باز هم در اینجا رعایت شده این هست که اکسس کد یک کد اعتباری هست و بعد از چند لحظه دیگه کاربردی نداره پس باید وب سایت شما خودش بتونه اکسس کد رو بگیره حالا ریفرش کد refresh_token دقیقا همون کاری code در مرحله قبلی برای شما انجام میده با چند تفاوت یک تغییر نمیکنه و ثابته دوم مختص همان آدرسی از وب سایت هست که شما در بازار ثبت کردید. 
3- استعلام خرید و دریافت پاسخ نهایی

در از دریافت اکسس کد حالا میتونید با ارسال توکن دریافتی از خرید در اندروید و ارسال اون به وب سایت در این مرحله همراه با اکسس کد ارسال میشه جهت بررسی اگر جواب موجود بود وب سایت شما json کامل دریافت میکنه اگر هم توکن اشتباه بود مقادیر خالی رو یافت میکنید. 
_ file_get_contents در کد PHP بالا کار مت post , رو انجام میده که اونم خیلی زیباست :)_

----------


## raha_jon

ممنون میشم کامل توضیح بدین ،باشه عب نداره شب می ذارین

----------


## raha_jon

در مقدار <REDIRECT_URI> که یک ادرس هست چی داخلش باشه؟یعنی مثلا اگه
http://123.com/text.php
بود چی داخل فایل پی اچ پی باشه؟

----------


## c0mmander

> در مقدار <REDIRECT_URI> که یک ادرس هست چی داخلش باشه؟یعنی مثلا اگه
> http://123.com/text.php
> بود چی داخل فایل پی اچ پی باشه؟


پست بالا رو ویرایش کردم.

همون سایتی که شما قرار کدتون رو چک کنید هست .. همون هاست و دامینی که برای این کار شما تهیه کردیده. یعنی شما اول یک سایت ایجاد میکنید با نام http://123.com در نهایت فایل text.php رو داخل اون سایت قرار میدید که آدرس سایت شما برای REDIRECT_URI میشه http://123.com/text.php

----------


## hamedg1366

من خیلی معذرت میخوام !

منظور از api بازار  چی هس؟!
آیا راهی برای چک کردن خرید بصورت آنلاین هستش؟


ممنون میشم فیلمی هم که گفتین رو تهیه کنین

----------


## c0mmander

> من خیلی معذرت میخوام !
> 
> منظور از api بازار  چی هس؟!
> آیا راهی برای چک کردن خرید بصورت آنلاین هستش؟
> 
> 
> ممنون میشم فیلمی هم که گفتین رو تهیه کنین


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

api بازار در حیقیت یک امکانی هست برای اینکه یک صورت تاییدیه خریدی با استفاده از REST از وبسایت بگیریم . این کار فقط برای برنامه هایی که پرداخت درون برنامه دارند امکان پذیره. بعد از اینکه شما پرداخت درون برنامه رو ساختید باز باید بیاد اینجا تا از شر ملعونک معروف و دوستانش رها بشید (البته شوخی بود و اما ه ک ر ها رو نمیشه کاریشون کرد. *ه ک ر ها : معلون بزرگند  , لاکی پچر و سایر برنامه های این چنینی : ملعونک* )

----------


## raha_jon

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


<?php
 
if(empty($_REQUEST['package']) || empty($_REQUEST['product']) || empty($_REQUEST['tokenid'])){
echo "error";
return;
}
 
$package = $_REQUEST['package'];
$product = $_REQUEST['product'];
$tokenid = $_REQUEST['tokenid'];
 
$refcode = 'کدی که از بازار گرفتین - رفرش کد';
 
$url = 'http://pardakht.cafebazaar.ir/auth/token/';
$data = array('grant_type' => 'refresh_token', 'client_id' => 'آیدی کلاینت', 'client_secret' => 'رمز کلاینت', '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 = *'wlofRGW2OGLaxenZFf30SNADTsduP1*';
 
$result = file_get_contents("https://pardakht.cafebazaar.ir/api/validate/$package/inapp/$product/purchases/$tokenid/?access_token=$access_token");
 
echo $result;
 
curl_close($ch);
 
 
?>



اینم نتتیجه

{"consumptionState": 0, "purchaseState": 0, "kind":  "androidpublisher#inappPurchase", "developerPayload": "payload-string",  "purchaseTime": 1426095144074}


اما مشکل اینه بعدا میگه توکن معتبر نیست 

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

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

----------


## c0mmander

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


سلام .
من توضیحاتی رو به پست اول اضافه کردم که دلیل این ارور شما هم مشخصه.
دلیلش اینکه که اکسس توکن کد یک کد اعتباری و مدت دار هست یعنی بعد از یک مدتی از بین میره. و باید دوباره اون رو گرفت برای همین فقط باید از کد زیر استفاده کرد:
$access_token = $jsonResponse['access_token'];

 
تا مستقیما اکسس کدی که از بازار تولید کرده رو برای ادامه فرایند داخل $access_token بریزه !

ویرایش...

----------


## mavera

سلام

بنده همه مراحل متوجه شدم، 
جز این! داخل هاست چی بریزم؟ . چی فایلی نیاز داره تا روی هاست اپلود کنم؟؟!!
یعنی داخل هاست، یه فایل php خالی ایجاد کنم؟؟ در اینصورت خطا میده، میگه
*خطا*

درخواست اشتباه است.!!





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

----------


## ehsanh22

سلام من همه مراحل رو میرم ، ولی الان فایل php آمادست و سایر مراحل هم رفتم ، حالا چجور در بخش PaymentActivity برناممون بهش بگیم به اون صفحه مراجعه کنه ؟

----------


## raha_jon

> سلام
> 
> بنده همه مراحل متوجه شدم، 
> جز این! داخل هاست چی بریزم؟ . چی فایلی نیاز داره تا روی هاست اپلود کنم؟؟!!
> یعنی داخل هاست، یه فایل php خالی ایجاد کنم؟؟ در اینصورت خطا میده، میگه
> *خطا*
> 
> درخواست اشتباه است.!!
> 
> ...


سلام
در پی اچ پی همون اطلاعاتو که من در بالا گذاشته ام استفاده کنید به همین راحتی :لبخند:

----------


## mavera

سلام


ببخشید که متوجه نشدم،
منظور اون بالا ، کد در اول پست ، داخل فایل php بریزم بعدش توی هاست آپلود کنم؟؟؟؟


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

----------


## raha_jon

بینید 
اره تو افیطل پی اچ پی محتویات بالا را قرار بدین 
بعدش اطلاعاتی که9 بازار میده بهتون را باهاش کامل کنید 
فارسی هم نوشته شده اینجا چی وارد کنید
مثلا رفرش کد را بازار میده بذار اونجا 
بعدش مثلا نوشته آیدی کلاینت فارسی را پاک کن و بجاش ایدی کلاینت را بده

بعدا مثلا ادرست اینه
http://testha.com/m/ch.php
خوب بعد اینجوری ادرس بده
http://testha.com/m/ch.php?package=t...hgbvjhbvjhbhjb


به جایtest.my.pack پکیج برنامه
به جای milio شناسه که تو بازار ساختی 
به جای hgbvjhbvjhbhjb توکن محصول

----------


## mavera

سلام

ولله خطا میده

ابنم فایل php ، ضمیمه کردم،  و ببنید

با تشکر

----------


## c0mmander

> سلام  ولله خطا میده  ابنم فایل php ، ضمیمه کردم،  و ببنید  با تشکر


  عزیز با UTF-8 سیو کن فایل رو. بعد داخل هاست فایل منیجرت رو باز کن و گزینه آپلود فایل رو بزن یا اگر از نرم افزار فایلزیلا استفاده میکنی که بهتر.

----------


## mavera

UFT-8 سیو کردم، بعدش ریختم روی هاست

متاسفانه میگه 

*خطا*درخواست اشتباه است.

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

----------


## Abbas Naghdi

سلام بچه ها من یه مشکل دارم خط 35 error میده $result = file_get_contents("https://pardakht.cafebazaar.ir/api/validate/$package/inapp/$product/purchases/$tokenid/?access_token=$access_token");بعد حالا کد نویسی سمت اندرویدش باید چیکار بشه ؟بعد برای هر برنامه باید این کارا رو انجام داد ؟و این grant_type باید مقدارش چی باشه ؟و این product_id چیه ؟با تشکر از همراهی شما .

----------


## ali-star

سلام دوستان از اونجایی که خیلی از کاربران با این موضوع مشکل دارن گفتم آموزش استفاده از API بازار رو در اختیارتون قرار بدم.

مراحل به ترتیب:

۱- اول باید یک سایت داشته باشید تا پاسخ بازار به درخواست شما به اونجا ارسال بشه.

۲- یک فایل php ایجاد کنید و داخلش کد های زیر رو قرار بدید(فعلا هیچی ویرایش نکنید و فقط کدها رو توش قرار بدید):

<?php

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

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

$refcode = 'کدی که از بازار گرفتین - رفرش کد';

$url = 'http://pardakht.cafebazaar.ir/auth/token/';
$data = array('grant_type' => 'refresh_token', 'client_id' =>  'آیدی کلاینت', 'client_secret' => 'رمز کلاینت', '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);


?>


۵- حالا اونو با انکود UTF-8 سیو کنید.
۶- فایل رو آپلود کنید (سایت خودتون).
۷- حالا فایل رو با ویرایشگر هاستتون باز کنید.
۸- حالا به بازار برید و یک کلاینت ایجاد کنید در قسمت "Redirect URI" هم آدرس فایل php که در سایتتون آپلود کردن رو قرار بدید بعد از ایجاد کلاینت بازار:
"CLIENT ID"
"CLIENT SECRET"
"REDIRECT URIS"
رو بهتون میده.

۱۰ - آدرس زیر رو در مروگرتون باز کنید به جای <REDIRECT_URI> هم REDIRECT URIS مرحله قبل و به جای <CLIENT_ID> هم CLIENT ID مرحله قبلی رو قرار بدید.
https://pardakht.cafebazaar.ir/auth/authorize/?response_type=code&access_type=offline&redirect_u  ri=<REDIRECT_URI>&client_id=<CLIENT_ID>

۱۱- یک صفحه باز میشه که توش نوشته مجوز دسترسی. روی تایید کیک کنید بعد به آدرست فایل php که قبلا آپلود کردیم فراخوانی می شیم که یه error توشته شده... کاری بهش نداریم... توی آدرس بار مروگرتون اگه توجه کنید به غیر آدرس فایل php یه کد هم همراهش هست مثل این:



```
http://website.domin/test_api.php?code=RPL1TgBTlBs6kJad3hyDYebtkd521inRCQR
```

در آدرس بالا اینو داریم:
code=RPL1TgBTlBs6kJad3hyDYebtkd521inRCQR
ما هم به:
RPL1TgBTlBs6kJad3hyDYebtkd521inRCQR
برای مرحله بعد نیاز داریم البته کدی که شما دریافت می کنید با کد بالا فرق داره.

۱۲- حالا به این آدرس برید:



```
https://pardakht.cafebazaar.ir/auth/token/
```

در قسمت grant_type عبارت ریز رو بنویسید:
authorization_code

در قسمت code کدی که مرحله قبلی دریافت کردید رو قرار بدید.
در قسمت client_id هم CLIENT ID مرحله ۸ رو قرار بدید.
درقسمت client_secret هم CLIENT SECRET مرحله ۸ رو قرار بدید.
در قسمت redirect_uri هم REDIRECT URIS مرحله ۸ رو قرار بدید.

بعد روی Authorize کلیک کنید.

۱۳- حالا پاسخ به صورت زیر خواهد بود:

{
   "access_token": "GWObRK06KHLr8pCQzDXJ9hcDdSC3eV",
   "token_type": "Bearer",
   "expires_in": 3600,
   "refresh_token": "yBC4br1l6OCNWnahJvreOchIZ9B6ze",
   "scope": "androidpublisher"
}

۱۴- حالا برمیگردیم به فایل php! حالا همه چی واضح شد! و بر اساس پاسخ مرحله قبلی فایل php رو کامل و سیو کنید.
۱۵- تموم شد! کافیه توی مروگرتون آدرس زیر رو باز کنید به جای <package_name> نام پکیج برنامتون و به جای <product_id> نام محصول و به جای <access_token> یک توکن که در لیست فروش هست قرار بدید به جای:
http://website.domin/test_api.php

آدرس فایل php رو قرار بدید.



```
http://website.domin/test_api.php?package=<package_name>&product=<product_id>&tokenid=<access_token>
```

پاسخ درست به صورت زیر:

{
   "consumptionState": 1,
   "purchaseState": 0,
   "kind": "androidpublisher#inappPurchase",
   "developerPayload": "something",
   "purchaseTime": 1414181378566
}

و پاسخ اشتباه به صورت زیر(اگر برنامه خریداری نشده):

"{}"



امیدوارم کامل و ساده توضیح داده باشم ولی خودم یه مشکل دارم! اونم اینه که برنامه چطور بفهمه که خرید درست بوده چون نمیدونه کاربر هنگام خرید چه توکنی براش ساخته شده؟!

مرحله ۱۵ ویرایش شد دوستان از اشتباهم عذر میخوام...

----------


## Abbas Naghdi

سلام برنامه نویسا

با تشکر از ali-star 
من مشکلم حل شد ....  ظاهرا کدی که در پست اول هست مشکل داره 
حالا میمونه پیاده سازیش داخل اندروید که :)
کسی بلده ؟

باید بعد پرداخت توکن رو بگیریم و ارسال کنیم به آدرس مورد نظر با HTTP و اطلاعات رو بریزیم داخل یه StringBuilder و ... 
و بعد چک کنیم ... فقط مسئله اصلی همون به دست آوردن توکن هست ... کسی بلده ؟

----------


## raha_jon

سلام اینکه دوستمون میگه از کجا بفهمیم خرید شده باید بگیم هنگام ارسال اطلاعات از کلاس Purchase با متد getOrderId توکن را به دست میاریم و ارسال می کنیم بازم مشکل داشتین در بپرسید

----------


## mavera

سلام

خیلی ممنون از توضیحاتون، مرحله دوم به بعد شفاف گفتید، دمت گرم

بنده مرحله دقت انجام دادم، باز متاسفانه میگه در خواست اشتباه است!!!!! :(

اطلاعاتمون پیام خصوصی می کنم

 باتشکر

----------


## ali-star

آپ

ویرایش مرحله ۱۵ از اشتباهم عذر میخوام دوستان.

----------


## mavera

سلام

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


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



این هم باید اصلاح کنیم؟، اولش نام پک برنامه و دومیش نام محصول و آخریش که...  یا اینکه هیچکدام دست نزنیم؟

یا 


$access_token = $jsonResponse['access_token'];


با تشکر

----------


## ali-star

> سلام
> 
> جاهای که به فارسی نوشته شده، اصلاح و جایگزن کردم ولی بقیه اش چی کار کنیم،
> مثلا این کد
> 
> 
> $package = $_REQUEST['package'];$product = $_REQUEST['product'];$tokenid = $_REQUEST['tokenid'];
> 
> 
> ...


فقط جاهای که فارسی توضیح داده شده رو ویرایش کنید.

----------


## raha_jon

متوجه نشدیم

----------


## shs1377

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

----------


## c0mmander

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


بعد از اون قسمتی از کدتون که تاییده بازار برای پرداخت رو دریافت کردید. یک نخ ایجاد کنید یک دونه پروگرس دیالوگ هم اجرا کنید . توکن بازگشتی رو همراه با اسم پکیج برنامه و اسم محصول برنامه تون رو به ترتیب به وبسایتون بفرستید.(من ترجیه میدم post بشه تا request) جواب برگشتی رو بخونید. جواب برگشتی رو داخل یک شی json پارس کنید تا به راحت تر بشه مقادیر رو مقایسه کرد.

----------


## shs1377

> بعد از اون قسمتی از کدتون که تاییده بازار برای پرداخت رو دریافت کردید. یک نخ ایجاد کنید یک دونه پروگرس دیالوگ هم اجرا کنید . توکن بازگشتی رو همراه با اسم پکیج برنامه و اسم محصول برنامه تون رو به ترتیب به وبسایتون بفرستید.(من ترجیه میدم post بشه تا request) جواب برگشتی رو بخونید. جواب برگشتی رو داخل یک شی json پارس کنید تا به راحت تر بشه مقادیر رو مقایسه کرد.


سلام تا حدودی متوجه شدم ولی چون تاحالا با مبحث ارتباط با سرور کار نکردم نمیدونم چجوری باید این کد رو بنویسم کدش رو ندارید؟

----------


## raha_jon

سلام کدی نمیخواد فقط یک یو ار ال ر ا صدا بزن

----------


## shs1377

پیادش کردم خیلی خوب کار میکنه  :لبخند گشاده!:  از دوستان و آموزش های خوبشون هم ممنونم

----------


## mavera

سلام
خیلی ممنون دوستان

حالا همه چی حله

فقط یک چیز مونده، اونم آغاز خرید و ارتقا برنامه روی دکمه
باید چی کد جایگزن و اضافه کنیم؟؟

کاربر محترم *raha_jon* ، گفتید که فقط یک url صدا بزن، میشه بگید چجوری؟ چی کدی؟؟  

ممنون

----------


## mavera

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

----------


## shs1377

> سلام
> کسی نیست بهم کمک کنه
> خدا ثواب بده


دوست عزیز 

شما باید اول این خط رو به قسمت (boolean verifyDeveloperPayload(Purchase p اضافه کنید :

order = p.getOrderId();

بعد در قسمت ((if (purchase.getSku().equals(SKU_PREMIUM که بهش میگیم بعد از خرید چه اتفاقی بیفته شما کد های داخلش رو کپی کنید بعد از اون جا پاک بکنید

حالا این کد رو به همین قسمت اضافه کنید :

verifytoken();


این کد ها و کلاس رو به آخر کدهاتون اضافه کنید :

    public void verifytoken() {        
        progressDialog = ProgressDialog.show(this, "بررسی خرید", "لطفا صبر کنید");
      new RequestTask().execute("**** در این قسمت کد ارتباط با api بازار رو وارد کنید****" + order);
      


        
    
    }
    
    class RequestTask extends AsyncTask<String, String, String>{


        @Override
        protected String doInBackground(String... uri) {
            HttpClient httpclient = new DefaultHttpClient();
            HttpResponse response;
            String responseString = null;
            try {
                response = httpclient.execute(new HttpGet(uri[0]));
                StatusLine statusLine = response.getStatusLine();
                if(statusLine.getStatusCode() == HttpStatus.SC_OK){
                    ByteArrayOutputStream out = new ByteArrayOutputStream();
                    response.getEntity().writeTo(out);
                    responseString = out.toString();
                    out.close();
                } else{
                    //Closes the connection.
                    response.getEntity().getContent().close();
                    throw new IOException(statusLine.getReasonPhrase());
                }
            } catch (ClientProtocolException e) {
                //TODO Handle problems..
            } catch (IOException e) {
                //TODO Handle problems..
            }
            return responseString;
        }


        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            
            progressDialog.dismiss();
            
            if (result.length() > 5){
                
                
                Log.d(TAG, "Purchase is premium upgrade. Congratulating user." + result + result.length());
                   Toast.makeText(getApplicationContext(), R.string.upgrade, Toast.LENGTH_SHORT).show();
                mIsPremium = true;
                updateUi();
                setWaitScreen(false);
            } else {
                Log.d(TAG, "natigeh" + result);
                setWaitScreen(false);
                Toast.makeText(getApplicationContext(), "پرداخت انجام نشد", Toast.LENGTH_SHORT).show();
                
            }  
        }
    }

توجه : در قسمتی که کد ارتباط با api بازار خودتون رو باید وارد بکنید به این صورت باید باشه مثلا اگر کد شما این باشد
http://google.com/check.php?package=ir.app&product=sku&tokenid=123456789

باشد باید اون رو اینجوری استفاده کنید

"http://google.com/check.php?package=ir.app&product=sku&tokenid=" + order

موفق باشید

----------


## c0mmander

دوستان متاسفانه در کد های سمت سرور یک بی توجهی کوچکی شده که خیلیا نتونستن پیاده سازی کنن و بعضی از دوستان  هم به من ایمیل دادن و با کلی اعصاب خوردی دق دلشون رو سر من بی نوا خالی کردن  :افسرده: 

مشکل اصلی این است پروتکل بازار HTTP نیست بلکه HTTPS هست یعنی باید در قسمت دریافت ریفرش توکن این کد باشه به جای:

$url = 'http://pardakht.cafebazaar.ir/auth/token/';


باید این کد باشه:

$url = 'https://pardakht.cafebazaar.ir/auth/token/';


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

----------


## mavera

سلام
عزیز *shs1377*

بی نهایت سپاس گزارم،  :قلب: 

ان شالله عاقبت به خیر و سرافراز بشی

----------


## mavera

سلام
با تشکر از *shs1377*
برنامه ام با کمک *shs1377* قبلا با موفقیت از پرداخت جعلی جلوگیری کرده

یه مشکل دیگه، اینه که تا زمانی که لاک-ی پچ.ر ملعون توی گوشی نصب باشه، بعد برنامه ای که می خواد پرداخت کنه، قبل از اینکه صفحه پرداخت کافه بازار بیاد، لاکی پچ.ر فضول تمام عیار میاد!
ولی نمی تونه پرداخت واقعی انجام بدهد و هم چنین از پرداخت جعلی هم جلوگیری می کنه

مثل اینه نه می تونه بخره و نه هم می تونه پچ کنه!!

بعضی ها دوست دارن لا.کی پچ.ر توی گوشی داشته باشه،  چی کارمیشه کرد؟

با سپاس

----------


## parniaznet

سلام
ممنون از آموزشتون اما سمت اندروید رو میشه کد های کاملش رو بزارید و یکم واضح تر توضیح بدید چجوری باید پیاده سازی کرد؟

----------


## Ebrahimkh

سلام
من هر کاری می کنم {} یا همون null برمیگردونه

ممکنه بگویید بجای 
tokenid
و
product
تو لینک زیر چی باید وارد کنیم؟؟؟

http://website.domin/test_api.php?package=<package_name>&product=<product_id>&tokenid=<access_token>

----------


## c0mmander

> سلام
> من هر کاری می کنم {} یا همون null برمیگردونه
> 
> ممکنه بگویید بجای 
> tokenid
> و
> product
> تو لینک زیر چی باید وارد کنیم؟؟؟
> 
> http://website.domin/test_api.php?package=<package_name>&product=<product_id>&tokenid=<access_token>


فکر کنم منظورتون به جای <product_id> و  <access_token> هست که برای تست میخواهید نتیجه صحیح رو ببنید. باید جای <access_token> باید یک توکن معتبری که خرید انجام شده و در بازار ثبت شده هست رو بدید(در قسمت تراکنش های پنل بازار قرار دارد.). و <product_id> نام محصولتون هست

----------


## Ebrahimkh

سلام دوست عزیز ممنون بابت راهنمایی 
همونطوری که گفتید بنده انجام دادم تست با موفقیت انجام گرفت

فقط یه سوال می مونه ؟؟؟!!


*زمانی که tokenid خرید رو در سورس جاوای خودم قرار میدم پیغام موفقیت آمیز میاد ولی وقتی متغیر order رو قرار میدم میگه خرید ناموفق بوده

هرچی هست تو این متغیر  order = p.getOrderId(); هستش ای نمی تونه tokenid رو بدست بیاره در کل کار این متغیر چیه این چی رو داره بدست میاره من تابع
**verify رو اینجوری بازنویسی کردم درسته یا کار من اشتباست (البته با توضیحات بالایی دوست عزیزمون پیش رفتم)*

*متغیر order رو چک کردم Null بر میگردونه :(*

    boolean verifyDeveloperPayload(Purchase p) {
        //String payload =p.getDeveloperPayload();
        order=p.getOrderId();
        return true;
    }

**********************************************

*یه چیز دیگه هم که هست من متغیر order رو زمانی در شی ای که از کلاس     IabHelper.OnIabPurchaseFinishedListener  با نام
mPurchaseFinishedListener تعریف کردم و مقدار دهی می کنم خیلی خوب جواب میده ولی دوستان فرمودن باید تو تابع
verifyDeveloperPayload مقدار دهی کنید حالا این دو چه تفاوتی با هم دارن؟؟؟
منظورم مقادیری هست که به متغیرها میدهیم( هر دو تابع بالا متغیر purchase رو به عنوان آرگومان دارند)*

بازم ممنون

----------


## c0mmander

> سلام دوست عزیز ممنون بابت راهنمایی 
> همونطوری که گفتید بنده انجام دادم تست با موفقیت انجام گرفت
> 
> فقط یه سوال می مونه ؟؟؟!!
> 
> 
> *زمانی که tokenid خرید رو در سورس جاوای خودم قرار میدم پیغام موفقیت آمیز میاد ولی وقتی متغیر order رو قرار میدم میگه خرید ناموفق بوده
> 
> هرچی هست تو این متغیر  order = p.getOrderId(); هستش ای نمی تونه tokenid رو بدست بیاره در کل کار این متغیر چیه این چی رو داره بدست میاره من تابع
> ...


کد همون کدی هست که دوستمون قرار دادن
بستگی به کد خودتون داره اگر *verifyDeveloperPayload * فراخوانی نمیشه پس جای دیگه ازش استفاده کنید مهم این هست که شی purchase معتبر باشه.

----------


## Ebrahimkh

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






> *یه چیز دیگه هم که هست من متغیر order رو زمانی در شی ای که از کلاس     IabHelper.OnIabPurchaseFinishedListener  با نام
> mPurchaseFinishedListener تعریف کردم و مقدار دهی می کنم خیلی خوب جواب میده ولی دوستان فرمودن باید تو تابع
> verifyDeveloperPayload مقدار دهی کنید حالا این دو چه تفاوتی با هم دارن؟؟؟
> منظورم مقادیری هست که به متغیرها میدهیم( هر دو تابع بالا متغیر purchase رو به عنوان آرگومان دارند)*




راستی یه چیزدیگه سورسهای دیگه نیازی به دستکاری ندارن یعنی تو همون حالت اولیه باشن درسته؟؟!؟!(منظور سورس پرداخت درون برنامه ای هستش)



ممنون...

----------


## Ebrahimkh

*اینم سورس پرداخت
بنظورتون مشکلش چیه؟؟!!
*




public class Pool extends Activity {

    private ProgressDialog progressDialog;
    public static String order;
    private Dialog dialog;
    public static int g = 0;
    SharedPreferences preferences = null;

    private String PACKAGENAME = "";

    final String KEY = "PERIMIUM";
    
    // Debug tag, for logging
    static final String TAG = "savedPremium";

    // SKUs for our products: the premium upgrade (non-consumable)
    static final String SKU_PREMIUM = "how";

    // Does the user have the premium upgrade?
    boolean mIsPremium1 = false;

    // (arbitrary) request code for the purchase flow
    static final int RC_REQUEST = 10001;

    // The helper object
    IabHelper mHelper;
    
    private SharedPreferences shared;
    private SharedPreferences.Editor editor;
    private Typeface typeface;
    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pool);
        
        button = (Button) findViewById(R.id.btnpool);

        typeface = Typeface.createFromAsset(getAssets(), "fonts/titr.ttf");

        button.setTypeface(typeface);
        button.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                onSavedUpgradeAppButtonClicked(arg0);
            //    verifytoken();
            }
        });

        shared = getSharedPreferences("Pref", MODE_PRIVATE);
        editor = shared.edit();
        g = shared.getInt("mon", 0);

        /**************************************************  **************************************************  *******/
        preferences = getSharedPreferences(PACKAGENAME, Context.MODE_PRIVATE);
        PACKAGENAME = getClass().getName();
        Log.e("TAG", PACKAGENAME);
        mIsPremium1 = preferences.getBoolean(KEY, false);
        if (mIsPremium1 == true) {
            updateUi();
            return;
        }

        String base64EncodedPublicKey = "MIHNMA0GCSqGSCpgXp3J1b4KKwYgzNx3EyqOpRccZXk4pJtwO  nXVavJxiooZHNRul5v0eT2NvCPmPoNeqgRIX1MilemLyqfksJt  m8hxFTQYfcFriFXl8+Sq2RPtL2z+RIG1wECAwEAAQ==";
        mHelper = new IabHelper(this, base64EncodedPublicKey);
        Log.d(TAG, "Starting setup.");
        mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
            public void onIabSetupFinished(IabResult result) {
                Log.d(TAG, "Setup finished.");

                if (!result.isSuccess()) {
                    // Oh noes, there was a problem.
                    Log.d(TAG, "Problem setting up In-app Billing: " + result);
                }

            }
        });
        /**************************************************  **************************************************  *******/
    }
    

    /**************************************************  **************************************************  *******/
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        Log.d(TAG, "onActivityResult(" + requestCode + "," + resultCode + ","
                + data);

        // Pass on the activity result to the helper for handling
        if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
            super.onActivityResult(requestCode, resultCode, data);
        } else {
            Log.d(TAG, "onActivityResult handled by IABUtil.");
        }

    }

    public void onSavedUpgradeAppButtonClicked(View arg0) {
        Log.d(TAG,
                "Upgrade button clicked; launching purchase flow for upgrade.");
        // setWaitScreen(true);

        String payload = "gdhassdflsldaslfkahsjahsjakaasa";

        mHelper.launchPurchaseFlow(this, SKU_PREMIUM, RC_REQUEST,
                mPurchaseFinishedListener, payload);
    }

    boolean verifyDeveloperPayload(Purchase p) {
        //String payload =p.getDeveloperPayload();
        order=p.getOrderId();
        
        return true;
    }

    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
            Log.d(TAG, "Purchase finished: " + result + ", purchase: "
                    + purchase);
            Inventory inv = null;
            try {
                inv = mHelper.queryInventory(true, null);
                if (inv.hasPurchase(SKU_PREMIUM)) {
                
//                    alert("تبريک شما به کاربر ويژه ارتقا يافتيد");
                    if (purchase.getSku().equals(SKU_PREMIUM)) {
//                        Log.d(TAG,
//                                "Purchase is premium upgrade. Congratulating user.");
//                        // alert("تبريک شما به کاربر ويژه ارتقا يافتيد");
//                        editor.putInt("mon", 1);
//                        editor.apply();
//
//                        mIsPremium1 = true;
//                        updateUi();
                        // setWaitScreen(false);
                        order=purchase.getOrderId();
                        verifytoken();

                    }
                    
                    // حالا برنامه را فعال کنيد
                } else {
                    if (result.isFailure()) {
                        Log.d(TAG, "Error purchasing: " + result);
                        // setWaitScreen(false);
                        return;
                    }
                    if (!verifyDeveloperPayload(purchase)) {
                        complain("Error purchasing. Authenticity verification failed.");
                        // setWaitScreen(false);
                        return;
                    }
                    Log.d(TAG, "خريد نادرست است");
                }
            } catch (IabException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    };

    // Update button with updateUi
    public void updateUi() {

        if (mIsPremium1) {

            AlertDialog.Builder builder=new  AlertDialog.Builder(Pool.this);
            builder.setTitle("کاربر ويژه");
            builder.setMessage("تبريک ميگم"+"\n"+"دوست عزيز شما به کاربر ويژه ارتقا يافتيد");
            builder.setPositiveButton("خب", new DialogInterface.OnClickListener() {
                
                @Override
                public void onClick(DialogInterface arg0, int arg1) {
                    // TODO Auto-generated method stub
                    startActivity(new Intent(Pool.this,StartActivity.class));
                }
            });
            builder.show();
    
            
            SharedPreferences.Editor newtask = preferences.edit();
            newtask.putBoolean(KEY, true);
            newtask.commit();

        }
    }

    void complain(String message) {
        Log.e(TAG, "**** testbilling Error: " + message);
        alert("Error: " + message);
    }

    void alert(String message) {
        AlertDialog.Builder bld = new AlertDialog.Builder(this);
        bld.setMessage(message);
        bld.setNeutralButton("OK", null);
        Log.d(TAG, "Showing alert dialog: " + message);
        bld.create().show();

    }

    /**************************************************  **************************************************  *******/

    @Override
    public void onDestroy() {
        super.onDestroy();

        Log.d(TAG, "Destroying helper.");
        if (mHelper != null)
            mHelper.dispose();
        mHelper = null;
    }
    
    public void verifytoken() {  
        progressDialog=new ProgressDialog(Pool.this);
        
        progressDialog = ProgressDialog.show(this, "خريد", "لطفا چند لحظه صبر کنيد تا بررسي خريد صورت بگيرد...");
      new RequestTask().execute("http://www.BBccountry.ir/token/token.php?package=com.dev.howold&product=howold&to  kenid="+order);
       
    }
     
    class RequestTask extends AsyncTask<String, String, String>{

        @Override
        protected String doInBackground(String... uri) {
            HttpClient httpclient = new DefaultHttpClient();
            HttpResponse response;
            String responseString = null;
            try {
                response = httpclient.execute(new HttpGet(uri[0]));
                StatusLine statusLine = response.getStatusLine();
                if(statusLine.getStatusCode() == HttpStatus.SC_OK){
                    ByteArrayOutputStream out = new ByteArrayOutputStream();
                    response.getEntity().writeTo(out);
                    responseString = out.toString();
                    out.close();
                } else{
                    //Closes the connection.
                    response.getEntity().getContent().close();
                    throw new IOException(statusLine.getReasonPhrase());
                }
            } catch (ClientProtocolException e) {
                //TODO Handle problems..
            } catch (IOException e) {
                //TODO Handle problems..
            }
            return responseString;
        }
     
     
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
             
            progressDialog.dismiss();
             
            if (result.length() > 5){
                 
                 
                Log.d(TAG, "Purchase is premium upgrade. Congratulating user." + result + result.length());
                   Toast.makeText(getApplicationContext(), "پرداخت انجام شد", Toast.LENGTH_SHORT).show();
                mIsPremium1 = true;
                updateUi();
             //   setWaitScreen(false);
            } else {
                Log.d(TAG, "natigeh" + result);
              //  setWaitScreen(false);
                Toast.makeText(getApplicationContext(), "پرداخت انجام نشد", Toast.LENGTH_SHORT).show();
                 
            } 
        }
    }
}

----------


## Ebrahimkh

*دوستان کسی هست بگه مشکل
کد بالا چیه که قیمت برنامه رو نشون نمیده در کل هر قیمتی میزارم میگه قیمت برنامه شما صفر تومن هستش



خواهشن راهنمایی کنید
*

----------


## Ebrahimkh

*کسی نیست راهنمایی کنه
*

----------


## Ebrahimkh

خداروشکر پیداش کردم 

فقط اینجا باید h رو بزرگ می نوشتم


 static final String SKU_PREMIUM = "how";


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

----------


## pbm_soy

آیا این api میتواند اطلاعات خرید نرم افزار را برگرداند؟ منظورم خریدهای مستقل است؟ نه پرداختهای درون برنامه!
آیا برای خریدهای مستقل نرم افزار توکن آیدی میدهد و یا order میدهد؟
من هنوز بازار را درست نمیشناسم

----------


## hamedg1366

> آیا این api میتواند اطلاعات خرید نرم افزار را برگرداند؟ منظورم خریدهای مستقل است؟ نه پرداختهای درون برنامه!
> آیا برای خریدهای مستقل نرم افزار توکن آیدی میدهد و یا order میدهد؟
> من هنوز بازار را درست نمیشناسم


متاسفانه نخیر، بازار برای خرید های مستقیم تا اونجایی که من در میدونم هیچ توکنی رو برای برنامه نویس ارائه نمیده

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


لطفا اگه به نتیجه ای رسیدین توی همون تایپیک ارائه بفرمائید

با تشکر

----------


## karimi1993

سلام دوستان گرامی
من در پیاده سازی api بازار مشکل دارم. هاست دارم و اون کدهای پی اچ پی رو عینن کپی کردم و داخل سی پنل اپلود کردم
ولی  وقتی ادرس مربوط به پی اچ پی رو میزنم میگه error نمیدونم چیکار کنم . با  همین ادرس کلاینت میسازه ولی وقتی تویه لینک زیر جاگذاری میکنم بازار خطا  میده....
چیکار کنم به نظر شما؟

----------


## shervin_boy

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

----------


## hamidreza.geo

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

----------

