25 دی 1400
چگونگی پیادهسازی درگاه پرداخت رمرارز - در وبسایت - برایم مسئلهای چالشبرانگیز و جذاب بوده و مدتها بود دنبال فرصتی برای اجراش بودم، صد البته با شرایطی خاص که در نظر داشتم. اگر شما هم تمایل دارید خدمات سایت php خودتون رو به جای «ریال»، با دریافت انواع «رمزارز» در اختیار مشتریان خود قرار دهید و دایره خریداران خودتان را فراتر از مرزها ببینید، این مقاله برای شماست.
با توجه به دانش فعلی من در این زمینه، به سراغ سایتهایی رفتم که به صورت واسطه عمل کرده و دارای ویژگیهای زیر باشند:
از تعداد زیادی رمزارز پشتیبانی کنند
به آدرس کیف پول من متصل شوند
رابط کاربری و API مناسبی داشته باشند
پشتیبانی خوبی داشته و معتبر باشند
ترجیحا درگاه در سایت شخصی خودم به نمایش درآید
در این میان وبسایت nowpayments.io - که توسط صرافی ChangeNOW راه اندازی شده است - با این خواستهها مطابقت میکرد. بنابراین ضمن معرفی مختصری از این وبسایت، نمونه کدهای آن را بررسی کرده و در نهایت مطابق «دمو»ی این مقاله خروجی کار را خواهید دید.
الف) معرفی و ثبت نام در nowpayments.io
ب) چگونگی کار با API و برنامهنویسی آن
الف) معرفی و ثبت نام در nowpayments.io
ثبت نام در سایت nowpayments.io نکته خاصی ندارد؛ پس از ورود به وبسایت و برای پیادهسازی درگاه پرداخت، بیش از هر بخشی با منوی Store Settings کار داریم.
گزینه API Key: شناسه درگاه وبسایت ماست؛ بنابراین روی Add new key کلیک کرده و کلید تولید شده را برای استفاده در برنامه خود - که در ادامه خواهید دید - ذخیره میکنیم.
گزینه Outcome Wallet: خوشبختانه این وبسایت از ارزهای دیجیتال زیادی پشتیبانی میکند. ارزهای دلخواه خود را انتخاب کرده و آدرس کیف پول خود را روبروی هر کدام وارد کنید و در نهایت دکمه Save را فشار دهید.
گزینه Secret key: اجباری در تولید این کلید نیست. ما به عنوان پذیرنده از دو روش میتوانیم از نتیجه تراکنش مطلع شویم که یکی از آنها همین بخش Instant Payment Notifications و استفاده از Secret key است که در ادامه به آن خواهیم پرداخت.
ب) چگونگی کار با API و برنامهنویسی آن
<?php $api_key = "<your_api_key>"; //api درگاه $secret_key = "<your_secret_key>"; //اختیاری - جهت دریافت نوتیفیکشن $ipn_callback_url = "<your_callback_url>"; //اختیاری - جهت دریافت نوتیفیکشن $fromEmail = "<your_email_address>"; //ایمیل شما $fromName = "<your_account_name>"; //نام ایمیل شما ?>
در فایل config.php - که در بخش دانلود این مقاله قرار دادم - میبایست API Key را که پس از ثبتنام در اختیار شما قرار میگیرد در این قسمت وارد کنید. Secret Key و Callback Url را نیز در صورتی نیاز دارید که بخواهید خودِ سایت nowpayments.io نتیجه تراکنش را به آدرسی که شما اعلام میکنید ارسال کند. هر چند که خود نیز میتوانید به کمک توابعی که در اختیار دارید، نتیجه تراکنش را استعلام کنید. همچنین لازم است ذکر کنم فایلهای مورد نیاز بیشتری را در بخش دانلود مقاله قرار دادم تا بتوانید گامهای سریعتری برای ساخت درگاه بردارید.
<?php //Get API status function get_api_status() { $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'https://api.nowpayments.io/v1/status', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', )); $response = curl_exec($curl); curl_close($curl); return $response; } //Get available currencies function get_available_currencies($fixed_rate,$api_key) { $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'https://api.nowpayments.io/v1/currencies?fixed_rate='.$fixed_rate, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => array( 'x-api-key: '.$api_key ), )); $response = curl_exec($curl); curl_close($curl); return $response; } //Get estimated price function get_estimated_price($amount,$from,$to,$api_key) { $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'https://api.nowpayments.io/v1/estimate?amount='.$amount.'¤cy_from='.$from.'¤cy_to='.$to, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => array( 'x-api-key: '.$api_key ), )); $response = curl_exec($curl); curl_close($curl); return $response; } //Create payment function create_payment($price_amount,$price_currency,$pay_currency,$ipn_callback_url,$order_id,$order_description,$api_key) { $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'https://api.nowpayments.io/v1/payment', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS =>'{ "price_amount": "'.$price_amount.'", "price_currency": "'.$price_currency.'", "pay_currency": "'.$pay_currency.'", "ipn_callback_url": "'.$ipn_callback_url.'", "order_id": "'.$order_id.'", "order_description": "'.$order_description.'" }', CURLOPT_HTTPHEADER => array( 'x-api-key: '.$api_key, 'Content-Type: application/json' ), )); $response = curl_exec($curl); curl_close($curl); return $response; } //Get payment status function get_payment_status($payment_id,$api_key) { $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'https://api.nowpayments.io/v1/payment/'.$payment_id, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => array( 'x-api-key: '.$api_key ), )); $response = curl_exec($curl); curl_close($curl); return $response; } //Get the minimum payment amount function get_the_minimum_payment_amount($from,$to,$fiat_equivalent,$api_key) { $fiat_cond = '&fiat_equivalent='.$fiat_equivalent; if($fiat_equivalent == '') $fiat_cond = ""; $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'https://api.nowpayments.io/v1/min-amount?currency_from='.$from.'¤cy_to='.$to.$fiat_cond, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => array( 'x-api-key: '.$api_key ), )); $response = curl_exec($curl); curl_close($curl); return $response; } ?>
در فایل function.php توابع زیر را مشاهده میکنیم:
1) تابع Get API status
2) تابع Get available currencies
3) تابع Get estimated price
4) تابع Create payment
5) تابع Get payment status
6) تابع Get the minimum payment amount
1) تابع Get API status: وضعیت API را مشخص میکند. چنانچه پاسخ برابر OK باشد میتوان به ادامه کار پرداخت.
2) تابع Get available currencies: با کمک این تابع میتوانید فهرست تازهترین رمز ارزهای پشتیبانی شده در این سایت را مشاهده کنید. این تابع دو ورودی دارد که یکی API Key ودیگری متغیر Fixed Rate با مقدار پیشفرض false است.
3) تابع Get estimated price: معادل تقریبی رمزارز مبنای شما را محاسبه میکند. مثلا چنانچه قیمت کالا یا خدمت خود را 20 تتر قرار دهید و بخواهید معادل آن را به بیتکوین نمایش دهید، از این دستور استفاده میکنید.
4) تابع Create payment: اصلیترین تابع ایجاد درگاه همین مورد و مورد بعدی هستند. شما می بایست کلید API را به همراه مبلغ و واحد رمرزارز مبنا (مثلا 20 تتر)، واحد ارز مقصد (که خریدار میخواهد آن ارز را واریز کند مثلا بیت کوین)، شماره سفارش که توسط شما تولید میشود، شرح سفارش و... را به این تابع ارسال کنید. لطفا توجه داشته باشید که ارز مقصد باید در Outcome Wallet داشبورد شما تعریف شده باشد. خروجیهای مهمی که این تابع به شما میدهد به شرح زیر است که بایست در دیتابیس خود ذخیره کنید:
مقدار payment_id: شماره پیگیری و یکتایی است که درگاه برای شما تولید کرده و بر میگرداند.
مقدار payment_status: وضعیت پرداخت را مشخص میکند که معمولا در اینجا waiting یا «در انتظار پرداخت» است.
مقدار pay_address: درگاه یک آدرس کیف پول میسازد و ابتدا ارز را توسط این نشانی دریافت کرده و سپس برای کیف پول شما ارسال میکند.
مقدار price_amount: مبلغ تعریف شده و مبنای شما
مقدار price_currency: واحد ارز دیجیتال مبنای شما
مقدار pay_amount: معادل لحظهای رمز ارز مقصد
مقدار pay_currency: واحد رمزارز مقصد
5) تابع Get payment status: با شماره رهگیری که از تابع قبل به دست آوردید، میتوانید هر لحظه وضعیت پرداختی تراکنش را استعلام کنید. خروجی این تابع با کمی اختلاف شبیه به تابع قبلی است.
مقدار payment_status: وضعیت پرداخت که میتواند یکی از حالات waiting در انتظار پرداخت، confirming در حال پردازش، confirmed پردازش شده، sending در حال ارسال به کیف پول شخصی، partially_paid نشاندهنده واریز کمتر از مبلغ تعیینشده، finished ارسال موفق و نهایی به کیف پول شخصی، failed اشکال در انتقال، refunded برگشت به مشتری و expired عدم واریز در مهلت تعیینشده باشد.
مقدار outcome_amount: مبلغ رسیده به کیف پول شخصی
مقدار outcome_currency: واحد رمزارز رسیده به کیف پول شخصی
6) تابع Get the minimum payment amount: بهتر است پیش از ورود مشتری به درگاه، بررسی کنید که مبلغ تبدیل شده از حد مجاز کمتر نباشد؛ در واقع شما نمیتوانید مبالغ کمتر از استاندارد شبکه را به این شیوه در درگاه شخصی خود بپذیرید.