کار با api و ساخت یک بخش از payment gateway با پایتون برای CSC

با سلام خدمت جامعه توسعه دهندگان بلاکچین و قرار داد های هوشمند
من 0Xlive هستم و در این تاپیک به بهونه کار کردن با api اسکنرها میخوایم باهمدیگه یک درگاه پرداخت ( البته نه به معنای واقعی ) رو باهمدیگه بنویسیم

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

f4b1ed867f903661437779f548a5978e9a817f6b_2_690x192

دریافت api key
از اونجایی که اغلب این سرویس ها یک open api یا public api نیستن که ما بتونیم ازادانه هرچقدر که خواستیم بهشون درخواست بدیم نیاز هست که اول از همه برای اینکه بتونیم با اون provider ارتباط برقرار کنیم نیاز داریم که یک کلید برای اینکه بتونیم با api کار بکنیم. یعنی بتونیم درخواست بدیم و پاسخ بگیریم

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

اول از همه برای دریافت کلید به ادرس زیر میریم و ثبت نام میکنیم ( من شبکه تست رو انتخاب کردم ):

بعد از ثبت نام کردن مستقیما وارد پنل میشیم و مطابق شکل زیر به بخش API Keys میریم و یک api جدید رو add میکنیم:

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

حالا بریم که پروژه خودمون رو تنظیم کنیم

نصب و استفاده از requests

کتابخونه requests یک کتابخونه پایتونی برای ایجاد درخواست های http هستش که به شکل پیش نصب در پایتون قرار داره و میتونیم در سر خط کدمون به این شکل ایمپورتش کنیم:

import requests

اما با این حال اگر خطایی مبنی بر اینکه این کتابخونه وجود نداره مواجه شدید میتونید با pip اون رو نصبش کنید:

pip install requests

از اونجایی که قصد داریم با json هم کار کنیم نیاز داریم که اون رو هم به پروژه ایمپورت کنیم:

import json

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

https://www.json.org/json-en.html

در پایتون یک api تعریف میکنیم:

api = requests.get("https://www.coinex.net/api/v1/statistics/cet", headers=headers).json()

در کد بالا ما یک api تعریف کردیم و لینک اون رو بهش معرفی کردیم اما header چیه؟ ۲ راه برای اینکه ما خودمون رو به provider ( که برای درخواست از ما کلید میخواد ) معرفی کنیم وجود داره.
راه اول اینکه کلید رو در url وارد کنیم و دیگری اینکه در بدنه درخواستمون کلید رو تعبیه کنیم
راه اول به این دلیل که امکان لو رفتن کلید از طریق حملات مرد میانی ( MITM ) و یا ذخیره شدن در تاریخچه مروگر و… وجود داره اصلا توصیه نمیشه برای همین طبق گفته مستندات خود coinex.net باید اون رو در هدر قرار بدیم.

من یک متغیر به نام headers میسازم و کلیدم رو در اون ذخیره میکنم:

headers = {'apikey': 'YOU API KEY',}

حالا بریم کمی با اطلاعاتی که برای ما تامین میکنه اشنا بشیم

برای مثال من میخوام قیمت CET رو از api بگیرم:

print(api['data']['price'])

کد بالا قیمت رو برای ما میگیره و در خروجی اون رو چاپ میکنه

اما ما درباره کوین این شبکه حرف زدیم بیاید باهم وضعیت شبکه رو از طریق api بررسی کنیم. برای اینکار من متغیر api رو بروز میکنم:

api = requests.get("https://www.coinex.net/api/v1/statistics/chain", headers=headers).json()

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

active
average_time
latest_height
staking
tx_count
tx_per_second

اما این بخش ها چه اطلاعاتی به ما میدن:

active: تعداد ولیدیتور های موثر در ولیدیت کردن رو نشون میده
average_time : میانگین مدت زمان تولید بلاک
latest_height : شماره اخرین بلاک رو برمیگردونه
staking : تعداد کوین های استیک شده رو نشون میده
tx_count : تعداد تراکنش های کل شبکه رو نشون میده
tx_per_second : میانگین تعداد تراکنش ها در ثانیه رو نشون میده

برای چاپ کردن مقدار هرکدوم از اینها میتونیم به این شکل عمل کنیم:

print(api['data']['tx_count'])

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

بررسی تراکنش

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

برای اینکار api و بروز میکنم:

api = requests.get("https://www.coinex.net/api/v1/transactions/"+tx, headers=headers).json()

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

tx = input("Enter TX Hash")

اما ببینیم چه اطلاعاتی رو برای ما تامین میکنه ( به دلیل زیاد بودن موارد من فقط بعضی ها رو ذکر میکنم ):

data
error
fee
timestamp
value

data: داده های ورودی تراکنش رو بر میگردونه
error: در صورت وجود ایراد در تراکنش مقدار میگیره ( خالی بودن به معنی موفقیت امیز بودن تراکنش هست )
fee: کارمزد تراکنش رو برمیگردونه
timestamp: زمان انجام تراکنش رو برمیگردونه
value: مقدار جابه جا شده رو برمیگردونه

گفتیم که error در صورتی که تراکنش ایرادی داشته باشه و نا موفق باشه مقدار میگیره و در صورتی که خالی باشه تراکنش موفقیت امیز بوده حالا بریم با یک شرط این رو بررسی کنیم:

if ( len(api['data']['error']) == 0 ):
    print("transaction was successfull")
else:
    print("something wrong!")

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

این یک مثال ساده و کاربردی از api ها بود در تاپیک بعدی سعی میکنم یک درگاه پرداخت کریپتویی مبتنی بر وب با php بنویسم