در اوایل شروع کار و راه اندازی فروشگاه اینترنتی و یا بخشی برای دریافت وجه از مشتریان در سایت, نیازمند یک درگاه پرداخت است که مراحل طولانی برای دریافت درگاه مستقیم بانکی که نیازمند لوگوی طلای وزارت ارشاد و نماد اعتماد الکترونک است, می تواند موقعیت هایی را که برای فروش آنلاین محصولات و خدمات سایت می توانستید داشته باشید را از بین ببرد.
برای همین توصیه میشه به محض راه اندازی فروشگاه آنلاین و یا اضافه کردن بخش پولی و محصولات به وب سایت یک درگاه پرداخت داشته باشید تا بتوانید بدون وقفه ای, محصولات را بفروش برسانید.
برای ساده تر شدن کار ما از درگاه واسط پرداخت استفاده می کنیم که یکی از آنها ZarinPal است.
مزیت دیگری که درگاه واسط پرداخت دارد این است که شما در صورت قطعی موقت درگاه مستقیم بانکی خود می توانید بدون مشکل از خدمات پرداخت آنلاین رو سایت بهره ببرید که بسیار مهم و ضروی است چرا که در کمپین های تبلیغاتی و یا ایمیل مارکتینگ , بوجود آمدن این مشکل هزینه بر است.
پس در این آموزش قصد داریم به شما نحوه اتصال به درگاه زرین پال php را با یک مثال کاربردی و سورس کد php درگاه زرین پال به شما نمایش بدیم.
دریافت درگاه زرین پال
کافی است یک وب سایت که در آن بخش فروشگاه یا خدمات پرداخت را دارد داشته باشید و بعد ثبت نام و ارسال مدارک , مرچنت کد درگاه پرداخت خود را دریافت کنید.
اتصال به درگاه زرین پال php
به منظور استفاده هرچه راحتر یک نمونه کد ” اتصال به درگاه زرین پال php ” برای ارسال تراکنش و یک نمونه کد برسی تراکنش بعد از برگشت از بانک نوشتم که کار شما رو تا حد زیادی راحت میکنه
در آخر پست از بخش دانلود باکس می توانید سورس کد کامل برای اتصال به درگاه واسط را به همراه دیتابیس و ذخیره سفارشات را دریافت کنید.
config.php – تنظبمات مربوط مربوط به پروژه
1 2 3 4 5 |
<?php $MerchantID = 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'; //Required $CallbackURL = 'http://www.site.com/verify.php'; // Required |
کد مرچنت که از درگاه واسط دریافت کردید را وارد کنید. همچنین به جای www.site.com آدرس وبسایت خود را وارد کنید (به همراه فولدر این پروژه)
send.php – ارسال تراکنش به درگاه زرین پال ZarinPal :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php require_once('config.php'); $Amount = 1000; // Toman - Required $Description = 'توضیحات تراکنش'; // Required $Email = 'U'; // Optional $Mobile = ''; // Optional $client = new SoapClient('https://zarinpal.com/pg/services/WebGate/wsdl', ['encoding' => 'UTF-8']); $result = $client->PaymentRequest([ 'MerchantID' => $MerchantID, 'Amount' => $Amount, 'Description' => $Description, 'Email' => $Email, 'Mobile' => $Mobile, 'CallbackURL' => $CallbackURL,]); //Redirect to URL You can do it also by creating a form if ($result->Status == 100) { Header('Location: https://zarinpal.com/pg/StartPay/'.$result->Authority); } else { echo'ERR: '.$result->Status; } |
در بالا مقدار اصلی $amount
است که باید بنابر قیمت محصول خود که از دیتابیس می خوانید به تومان قرار بدید .همچنین بخش Description
رو میتونید شماره فاکتور یا نام محصول رو قرار بدید.
بقیه متغییرها اطلاعاتی در مورد سفارش و مشتری است که می توانید خالی قرار بدید
verify.php – جهت برسی نتیجه تراکنش :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php require_once('config.php'); $Amount = 1000; //Amount will be based on Toman $Authority = $_GET['Authority']; if ($_GET['Status'] == 'OK') { $client = new SoapClient('https://zarinpal.com/pg/services/WebGate/wsdl', ['encoding' => 'UTF-8']); $result = $client->PaymentVerification([ 'MerchantID' => $MerchantID, 'Authority' => $Authority, 'Amount' => $Amount,]); if ($result->Status == 100) { echo 'تراکنش موفقیت آمیز بود . شمارهه پیگیری:'.$result->RefID; } else { echo 'ترانکش با خطا مواجه شد . وضعیت : '.$result->Status; } else { echo 'عملیات پرداخت توسط کاربر لغو شد.'; } |
همانطور که در بالا دیدید تمام مقدار ها ثابت بودند مثل قیمت و ما هیچ عملیاتی مثل ذخیره سازی اطلاعات سفارش در دیتابیس mysql و همچنین دادن محصول یا لینک دانلود و یا هر خدمت دیگری را انجام ندادیم.
در صورتی که نیاز است قبل از اتصال به درگاه پرداخت ما ابتدا به دیتابیس متصل و قیمت واقعی رو بیرون بکشیم و داخل متغییر$amount
قرار بدیم.
بعد از آن یک سطر را در جدول مثلا orders
ثبت و id
آن سفارش را به صورت یک query string در url
بازگشتی (callback.php
) قرار بدیم تا هنگام بازگشت کاربر از درگاه, آن id
را از url دریافت بر اساس نتیجه تراکنش, وضعیت پرداخت را در جدول orders تغییر بدیم.
همچنین اگر پرداخت موفقیت آمیز بود, محصول را برای کاربر ثبت کنید.
بنابراین کد بالا یک مثال ساده از نحوه اتصال و بررسی وضعیت تراکنش بعد از بازگشت بود و در صورتی که مرچنت کد زرین پال را ندارید می توانید بصورت تستی این مورد رو روی هاست تست کنید.
برای همین به جای آدرس های https://zarinpal.com
در کدها آدرس https://sandbox.zarinpal.com
را جایگزین کنید و همچنین در حالت تست می توانید مقدار $MerchantID
را هر کاراکتری که خواستید قرار بدید.
در سورس کد نمونه ما یک دیتابیس و جدول برای ثبت سفارشات کاربر داریم که بنابر آن هنگام بازگشت از درگاه, وضعیت آن را در جدول مورد نظر بروزرسانی می کنیم.
برای دانلود سورس کد آموزش آموزش اتصال به درگاه زرین پال php + کد های نمونه + مستندات PDF به همراه دیتابیس MySQL به باکس دانلود مراجعه کنید
هر سوالی داشتید از نظرات همین مطلب ارسال کنید. سریعا, پاسخگوی سوالات شما هستیم.
موفق و پیروز باشید.
سلام اقای شفیعی.
دو تا سوال داشتم ازتون ممنون میشم راهنماییم کنید.
۱: چطوری میتونم شماره تماس یا ایدی کاربر از ادرس کال بک بانکی دریافت کنم؟
۲:
من از درگاه پرداخت زرین پال استفاده میکنم و زمانی که به ادرس کال بک پارامتر علامت سوال (؟) اضافه میکنم ادرس برگشتی به صورت خودکار این علامت (&) اضافه میکنه بین (verify.php&Authority) که باعث میشه صفحه ارور بده.
http://www.yoursite.ir/?/verify.php&Authority=A00000000000000000000000000217909057&Status=OK
ولی پارامتر های دیگه مشکلی نداره و ادرس کال بک اجرا میشه به صورت زیر ولی باید حتما علامت ؟ باشه تا بتونه به ادرس صفحه برگرده :
http://www.yoursite.ir/=ok/verify.php?Authority=A00000000000000000000000000217909057&Status=OK
سلام.
به اخر ادرس کال بک اصن ؟ نمیخواد اضافه کنید فقط شماره سفارش رو به آخر کال بک اضافه کنید و تو دیتابیس یه سطر میسازید با شماره سفارش که تو اون رکورد شماره تماس و ایدی کاربر و بقیه اطلاعات رو ذخیره میکنید
کال بک با شماره سفارش
site/verify.php?orderid=121
ممنون بابت پاسخ .
بله تمام مراحل مثل مثال شما انجام دادم و درست انجام میشه ولی
چون از دیپ لینک استفاده میکنم نیاز دارم پارامتر اضافه کنم به ادرس کال بک تا بتونم ادرس دریافت کنم .
الان مشکلم همین علامت سوال هستش که .
از دیپ لینک برای کال بک نمیتونید استفاده کنید
ادرس دیپ لینک پارامتر (/no=?/) به صورت زیر انجام میدم
CallbackURL = “poc://deeplink.dev/?=no/https://site.ir/verify.php$”;
و بعد با استفاده از دیپ لینک ادرس دریافت میکنم و با split(‘/=no/’).last ادرس به صورت زیر دریافت میکنم.علامت سوال اخر کال بک خود زرین پال اضافه میکنه .
https://site.ir/verify.php?Authority=A00000000000000000000000000217909057&Status=OK
من چیکار کنم که مثلا یه محصول گذاشتم قیمتش مثلا ۶۰ هزار تومن وقتی کاربر کلیک کرد اون قیمت نمایش بده درصورتی که کدamount باید مبلغ وارد کنی خب محصول ۱۰۰۰ باشه نمیشع دونه دونه amount بزنی قیمت چطور به صورت خودکار ثبت بشه مرسی از اموزش خوبت
سلام. باید محصولات رو به همراه قیمت ها داخل یه دیتابیس ذخیره کنید و نمایش بدید
فهمیدم بعد ادرس پایگاه داده بدم amount و قیمت بهش بدم که کاربر کلیک کرد همون قیمت باشه مرسی از راهنماییت
سلام و تشکر از مطالب مفید. میتونیم uid و vip رو تو سشن session ذخیره کنیم؟
سلام خوشحالیم که مفید واقع شده.
بله مشکلی نیست میتونید تو سشن هم ذخیره کنید
سلام . ممنون از سورستون .
من به این شکل مقدار میدم ولی ارور ۵۰۰ میده چرا
pay.php?uid=65465465146351654165165&vip=1
سلام.
شاید مقدار عددی uid زیاد گذاشتید چون این مقدار وارد دیتابیس ذخیره میشه و سرور این اجازه رو نمیده چون این عدد زیاده یا باید عدد رو کاهش بدید یا فیلدش رو داخل دیتابیس به varchar تغییر بدید
دوست عزیز، در مثال مربوط به متن اموزش وقتی فایل send.php رو اجرا میکنم خطای زیر رو میده در حالی همه چیز درسته و روی هاست واقعی هم تست میکنم:
خطای برگشتی:
ERR: -1
در سورسی که فرستادید ، فایل کانفیگ همه اطلاعات لازم را میگیره اما به دیتابیس کانکت نمیشه . اصلاحش کنید لطفا
سلام.
حتما در فایل config.php باید اطلاعات دیتابیس خودتان را وارد کنید و همچنین فایل .sql را ایمورت کنید.
داخل فایل core.php اطلاعات کلاس تابع pdo اتصال به دیتابیس قرار داده شده.
این مورد تست شده هست و مشکلی از این نظر نداره.
اگر موردی دیدید دقیق با خطا بفرمایید راهنمایی بشه.
موفق باشید.
سلام خسته نباشید فرض کنید من ربات فروشگاه میخوام بسازم الان کسی از طریق زرین پال پرداخت کرد چطور میتونم کاری بکنم هرکسی برا خودش حساب داشته باشه و این در حساب زخیره بشه؟زخیره بشه منظورم پولی که پرداخت میکنه که اگه چیزی خرید از حسابش کم ششه
سلام. ممنونم.
باید اعتبار کیف پول ایجاد کنید که خود یک جدول جداست و نیاز داره در هنگام ثبت سفارش هم از این جدول استفاده بشه که userid کاربر سطری هست که اعتبار را به عدد ذخیره می کند.
در ربات فروشگاه آنلاین خدمات این کار رو انجام دادیم :
https://netparadis.com/market-telegram-bot-source
سلام وقت بخیر
من یه چیزیو درست متوجه نمیشم، هنوزم برای اپلیکیشن ام تست نکردم کد رو، فقط میخوام قبل از تست بدونم اگه در خط ۲۱ فایل send.php محتوای verify.php رو قرار بدیم (تا دیگه لازم نباشه دوباره یه شی soapClient بسازیم یا مقادیر مختلف رو مثه همین Authority از طریق GET دریافت کنیم یا config.php رو require کنیم) و نتیجه ی نهایی مد نظرو بفرستیم برای اپلیکیشن بهتر نیس؟
سلام. ممنون.
بله میتونید هر دو عملیات رو در یک فایل انجام بدید. دلیل اینکه هر دو را در دو فایل جداگانه send.php و verify.php انتقال درک بهتر نحوه پیاده سازی این درگاه است تا دوستانی که تازه شروع کردند بتوانند به راحتی درگاه پرداخت را به پروژه خود اضافه کنند.
موفق باشید.
سلام ببخشید از من ارور
Fatal error: Uncaught Error: Call to a member function query() on null in C:\wamp64\www\zar\pay.php on line 11
این رو میگیره من نمیدون متغیر $telegram دقیقا چیه
سلام.
اطلاعات دیتابیس را باید بدرستی وارد کنید و همچنین جداول رو هم باید داخل دیتابیس ایمپورت کنید.
موفق باشید.
همه این کارا رو انجام دادم ولی مشکل اینجاست که متغیر $telegram اصلا تعریف نشده که چیه
بله الان چک شد درست می فرمایید. این متغییر مربوط به کانکشن دیتابس بود که فایل اصلی آن در فایل zip قرار داده نشده بود.
الان فایل تغییر کرد مجدد از باکس دانلود فایل جدید را دریافت و استفاده کنید.
موفق باشید.
خیلی از شما ممنونم بابات رسیدگی سریع به مشکلات
خوشحالیم که مفید واقع شده.
موفق باشید.
سلام
چجوری می تونم روی لوکال تست کنم زرین پال رو ؟
Transaction canceled by user
مشکل در تأیید جواز امنیتی
همچین اروری به من نشون میده
سلام. از ساب دامین sandbox استفاده کنید.
موفق باشید.
سلام و درود
خیلی خوب بود
ممنون.
زنده باد
سلام ممنون. خوشحالیم که مفید واقع شده.
موفق باشید.
دمت گرم ، عالی بود.
سلام. خوشحالیم که مفید واقع شده.
موفق باشید.
همچنین ، فقط یه ‘}’ داخل verify.php بعد از خط ۱۸ کم گذاشتید.
این بخش از کد صحیح است و مشکلی ندارد.
موفق باشید.
حق با شماست نیاز به اصلاح داره و هنوز اصلاح نشده.
فوق العاده بود
خوشحالم که مفید واقع شده. موفق باشید.