نوید
5 سال پیش توسط نوید مطرح شد
34 پاسخ

مشکل در پرداخت با shetabit

سلام
اپ روی لوکال کار میکنه و پرداخت انجام میشه ، فایلها رومنتقل میکنم به سرور این پیغام رو میده

Shetabit \ Payment \ Exceptions \ DriverNotFoundException
Driver not selected or default driver does not exist.

درایور : زرین پال

@khanzadimahdi
@hesammousavi
@ali.bayat
@Alimotreb


ثبت پرسش جدید
علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
1

Driver not selected or default driver does not exist.

چک کنید ببینید درایور رو بدرستی کانفیگ کردید؟


نوید
تخصص : برنامه نویس Go / Django
@navids 5 سال پیش مطرح شد
0

آره ، همون روی لوکال کار میکنه و به سادگی عملیات پرداخت انجام میشه (حتی حروف کوچک و بزرگ رو هم چک کردم) ولی وقتی فایلها رو اپلود میکنی روی هاست این اررور رو میده
@ali.bayat


mahdi khanzadi
تخصص : backend developer at Snapp mar...
@khanzadimahdi 5 سال پیش آپدیت شد
0

سلام. دستور وندور پابلیش رو اجرا کردین؟ اسم درایور رو به درستی وارد کردین؟


نوید
تخصص : برنامه نویس Go / Django
@navids 5 سال پیش مطرح شد
0

@khanzadimahdi
سلام
بله ، در لوکال پرداخت به درستی انجام میشود ، ولی روی هاست این پیغام رو دریافت میکنم


mahdi khanzadi
تخصص : backend developer at Snapp mar...
@khanzadimahdi 5 سال پیش مطرح شد
0

مشکل از هاست شما هست. روی هاست ورژن php رو روی بالاتر از 7.2 قرار بدید مشکل باید رفع بشه. همچنین قبل از اپلود فایل ها روی سرور composer dump-autoload بزنید.


نوید
تخصص : برنامه نویس Go / Django
@navids 5 سال پیش مطرح شد
0

@khanzadimahdi
سلام
، هاست بر روی PHP 7.2 ست شده ؛ دستور composer dump-autoload رو هم زدم
باز هم پیغام

Shetabit \ Payment \ Exceptions \ DriverNotFoundException
Driver not selected or default driver does not exist.

میدهد


Alimotreb
تخصص : کانفیگ سرور و برنامه نویس
@Alimotreb 5 سال پیش مطرح شد
0

سلام
@navids

کد جایی که درایور رو مشخص کردید ،اونجا رو بزارید!


mahdi khanzadi
تخصص : backend developer at Snapp mar...
@khanzadimahdi 5 سال پیش مطرح شد
0

پکیج تست شده هست و مشکلی نداره. در صورتی که مشکلی پیدا کردین رفعش کنید و توی گیت هاب pull request بدید تا merge کنم.


reza gerami
@r.gerami25 4 سال پیش آپدیت شد
0

سلام و وقت بخیر
دوستان در پکیج Shetabit هنگامی که میخواهیم verify رو انجام بدیم توی خط پایین من این مقدار transaction_id رو متوجه نمیشم باید از کجا بگیرم.خب توی مرحله اول که درگاه اون رو به من میدهد توی دیتابیس ذخیره می کنم ولی توی مرحله دوم نمی دونم چطوری باید ازش استفاده کنم.یکم برام گنگه اینجاش که چند تا تراکنش که داره با هم انجام میشه چطوری باید هندل بشه.پرداخت انجام میشه و ریدایرکت میشه و موقع وریفای به همین پارامتر گیر میده.
کسی می تونه کمک کنه

$receipt = Payment::amount(1000)->transactionId($transaction_id)->verify()

@khanzadimahdi


mahdi khanzadi
تخصص : backend developer at Snapp mar...
@khanzadimahdi 4 سال پیش مطرح شد
0

از چه درگاه بانکی استفاده میکنید؟

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


r.gerami25
@r.gerami25497 4 سال پیش مطرح شد
0

سلام اقای خانزادی و دیگر دوستان راکتی
من از درگاه زرین پال استفاده می کنم.
ببینید من این کد رو موقع purchase کردن دریافت می کنم و تو دیتابیس ذخیره می کنم.بعد که بانک به من ریدایرکت می کنه و میخوام وریفای رو انجام بدم نمی دونم باید کدوم رکورد رو از دیتابیس بگیرم و وریفای رو انجام بدم. الزاما اخرین رکورد نیست چون ممکنه تراکنش های دیگری هم تو این فاصله انجام بشه.
درواقع سوال من اینه که توی خط کدی که تو سوال قبلیم گذاشتم مقدار transaction_id رو اول از همه ایا باید از دیتابیس بگیرم و به این متد بدم؟؟؟ اگه اره کدوم رکورد از دیتابیس رو باید بگیرم؟
شایدم توی درک این مرحله مشکل دارم.ممنون میشم راهنمایی بفرمایید
@khanzadimahdi
@ali.bayat
@hesammousavi


mahdi khanzadi
تخصص : backend developer at Snapp mar...
@khanzadimahdi 4 سال پیش آپدیت شد
1

اخرین تراکنش واسه کدوم کاربر هست؟ شما بر حسب کاربر اخرین تراکنش رو بگیرید. یا اینکه این کد رو داخل سشن قرار بدید.

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

$receipt = Payment::amount(1000)->verify()

اما اگه اصرار دارید که حتما شماره تراکنش رو بر حسب نیازتون تنظیم کنید میتونید داخل سشن اون رو قرار بدید و سپس از سشن دریافت کنید. همچنین بر حسب کاربر میتونید اخرین شماره تراکنش مربوط به سبد خریدی که داشته رو بگیرید و استفاده کنید. یا اینکه اون رو داخل ادرس برگشتی به صورت query string قرار بدید و سپس دریافتش کنید و ازش استفاده کنید.


maryam
@m.momeni9283 4 سال پیش مطرح شد
0

@khanzadimahdi
سلام وقت بخیر
ببخشید شما یک مقدار دستی برای وریفای تعیین کردید(amount=1000) اما من میخوام مقدار صورتحسابم رو پاس بدم.
چطور میشه اون را پاس داد؟
با تشکر


mahdi khanzadi
تخصص : backend developer at Snapp mar...
@khanzadimahdi 4 سال پیش مطرح شد
0

@m.momeni9283
موقعی که صورتحساب رو ایجاد میکنید باید اونو توی دیتابیس ذخیره کنید (مبلغش و شماره تراکنشی که از بانک در مرحله purchase دریافت کردین).

بعد از برگشت از بانک میتونید دوباره به دیتابیس برید و اون صورتحساب رو بگیرید و مبلغش رو ست کنید.


ftp
تخصص : ساده
@ftp 4 سال پیش مطرح شد
0

@navids
@m.momeni9283
@r.gerami25497

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


سید مهرداد حسین زاده ساداتی
تخصص : برنامه نویس
@mehrdadhosseinzadeh 4 سال پیش مطرح شد
0

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

من بنا به نیازم میخوام تو پروژه لاراول و api از این کد استفاده کنم
منظورم از لاراول و api بودن اینه بنا به هر اتفاقی باید من یک جی سان برگردونم به کاربر و سناریو کاملی هم باید داشته باشم

منتها چیزی که من فهمیدم اینه : ما بجای یک مبلغ از یک invoice که نمیدونم میشه چند تا عدد بهش داد و مجموع اعداد و بفرسته به بانک که بشه به عنوان سبد خرید ازش استفاده کرد یاد کرد یا خیر و فقط در حد یک عدد و یک شماره سفارش هست ( order_id )

موضوعی هم که این دوستمون گفتند هم واقعا مشکل هست :
ما تا بوده تو درگاه های بانکی یک شماره order_id داشتیم
که به بانک میدادیمش و بانک به ما ref_id میداد
ما این ref_id و تو دیتابیس میریختیم و فیلد paid و برابر با صفر قرار میدادیم
البته اینم بگم مبلغی هم که به بانک میدادیم تا به ما کد پرداخت بده هم همراه با order_id تو بانک ذخیره میکردیم.

بانک تو برگشت به ما همون order_id و میده
ما از این کدی که بانک میده ref_id که برای ارتباط با وب سرویس تاییدیه با بانک هست و میگیریم
با کدی که تو خط بالا گفتم هم از وضعیت پرداخت مطلع میشیم و هم میتونیم بفهمیدم که مبلغی که واقعا تو بانک پرداخت شده با مبلغی که واقعا مربوط هست به order_id ما یکسان هست یا خیر
و چیز دیگه ای هم که چک میکردیم این بوده که از یک پرداخت موفق دوبار یا چند بار استفاده نشه.
این چیزایی هست که عمومیت داره

حالا شما لطفا بفرمایید کدوم بخش هارو داریم ما الان تو پکیج شما.

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

من transaction_id که تو مرحله request میدید و میتونم بریزم تو دیتابیس
تو مرحله برگشت هم که تو مقادیری که بانک ارسال میکنه به callback همین مقدار refrense_id و با اسم token میده به ما ! حالا سوال اینه چه لزومی داره ما تو دیتابیس بریزیم پس ؟
تا جایی که من میدونم مقدار سکرت ما همین مقدار refrense یا transcation_id هست
تو برگشت از بانک یک مقدار order_id وجود دارهکه من تو مرحله اول(درخواست ) نتونستم پیداش کنم. لطفا بفرمایید این و چجوری میشه گرفت و یا ست کردو که ما حد عقل با این بتونیم کار کنیم.

شما اومدید راحت کنید کار مارو اما فکر کنم بیشتر گیج شدیم .

دو تا سوال دیگه هم دارم :

تو verify پرداخت
من مبلغ و عوض کردم با چیزی که تو بانک پرداخت کردم اما هیچ عکسلعملی نشون نداد !

سوال اخر :
من با دستور config مقادیر ترمینال و غیره و به صورت داینامیک دادم
و اگر اشتباه بدم xception میده که نمیدونم چجوری باید هندلش کنم و بتونم به کاربر خطا بدم بجای ارور تو برنامه !

@khanzadimahdi
@ali.bayat
@hesammousavi


سید مهرداد حسین زاده ساداتی
تخصص : برنامه نویس
@mehrdadhosseinzadeh 4 سال پیش مطرح شد
1

من این پکیج و میخوام تو لاراول و react استفاده کنم و تو یک سایت ساز که ۱۱ هزار تا فروشگاه داره که هر کاربر میتونه چندین توکن تو چندین فروشگاه بگیره

اینکه خود پکیج بره اخرین رکورد و تشخیص بده خیلی عجیبه و همه چیز قاطی میشه ...


حسام موسوی
تخصص : طراح و برنامه نویس
@hesammousavi 4 سال پیش مطرح شد
1

@mehrdadhosseinzadeh
متاسفانه مستداتش مشکل داره، خود منم خواستم ازش برای آموزش استفاده کنم گیج و منگ بودم گفتن درست میکنن که هنوز نکردن.
@khanzadimahdi
پیشنهاد دادن از روت‌های پویا برای callback به جای ref_id استفاده بشه چون بعضی از بانکها گفتن ref_id بر نمیگردونن که من نمدونم واقعا کدوم بانک بر نمیگردونه اگر شفاف سازی بشه خیلی هم عالی میشه و بعد اون روت پویا هم باید singed هم بشه توسط لاراول که این مشکل داره چون url که singed بشه در هنگام برگشت از بانک یکسری query بهش اضافه میشه از طرف بانک که در عملیات تایید verify signed شخص رو دچار مشکل میکنه.


mahdi khanzadi
تخصص : backend developer at Snapp mar...
@khanzadimahdi 4 سال پیش مطرح شد
0

@hesammousavi
@mehrdadhosseinzadeh

بعله حق با شماست. فردا مستندات رو تکمیل تر میکنم و نمونه کد + اموزش هم براش میزارم که مشکلات و سوالات رفع بشه.

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

ممنون که یادآوری کردین.


mahdi khanzadi
تخصص : backend developer at Snapp mar...
@khanzadimahdi 4 سال پیش مطرح شد
1

@hesammousavi
@mehrdadhosseinzadeh

در خصوص نحوه ی پرداخت و استفاده از پکیج هم توضیحات زیر رو باید بدم:

شما به دو ادرس نیاز دارید

  • آدرس پرداخت صورتحساب
  • آدرس وریفای کردن پرداخت

آدرس پرداخت صورتحساب : شما باید یک ادرس یا URL داشته باشید که وقتی کاربر به اون ادرس میره اون رو هدایت کنید به درگاه پرداخت. این ادرس باید یونیک + دارای طول عمر کوتاه باشه و برای صورتحساب هر دفعه یه صورت داینامیک این ادرس تولید بشه.

چرا باید طول عمر داشته باشه و داینامیک باشه؟ چون اگه بشه اون رو حدس زد و طول عمر بالایی داشته باشه, یوزرها میتونن ادرس های پرداخت شما رو حدس بزنن و روی درگاه بانکی ترافیک ایجاد کنن و بانک شما رو مسدود میکنه چون دارید بهش brute force میزنید.

ادرس پرداخت باید طوری باشه که با استفاده از اون بشه مشخصات صورتحساب رو بدست اورد (میتونید از model binding استفاده کنید).

آدرس ویریفای کردن صورتحساب : این ادرس باید به صورت داینامیک تولید بشه و دارای طول عمر باشه. با استفاده از این ادرس باید بتونید مشخصات صورتحساب رو بدست بیارید (میتونید از مدل بایندیگ استفاده کنید). وقتی مشخصات صورتحساب رو داشته باشید میتونید اون رو verify کنید.

وقتی کاربر به ادرس پرداخت میره شما باید ادرس برگشت یا همون کالبک رو ایجاد کنید عملیات purchase رو انجام بدین و بانک بهتون یک trans_id یا کد تراکنش میده. شما باید این کد تراکنش رو ذخیره کنید و داشته باشید.

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

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

ما دوتا مفهموم توی پرداخت های بانکی داریم که خیلی مهم هستن:

۱- کد تراکنش یا trans_id : این کد موقعی که صورتحساب رو ثبت میکنید (purchase) به شما داده میشه و با این کد میتونید payment ایجاد شده درون بانک رو پرداخت کنید.

2- شناسه پرداخت یا ref_id این کد موقعی به شما داده میشه که payment رو انجام داده باشید (واریز بانکی رو انجام داده باشید.) شناسه پرداخت برای پیگیری پرداخت ها استفاده میشه و ما معمولا اون رو به کاربرمون میدیم تا بعدا با استفاده از اون بتونه پرداختشو پیگیری کنه. این شناسه رو باید درون دیتابیس ذخیره کنیم.

مشکلی که وجود داره چیه؟

ما در مرحله ی اول صورتحساب رو purchase میکنیم و بانک بهمون trans_id رو میده. حالا با استفاده از اون کاربر رو هدایت میکنیم به درگاه پرداخت.
مشکلی که هست اینه که در هنگام بازگشت از درگاه , برخی بانک ها دیگه به ما trans_id رو نمیدن تا بتونیم پرداخت رو وریفای کنیم! خودمون باید با استفاده از ادرس داینامیکی که ساختیم اینکار رو انجام بدیم. (دقیقا الان یادم نیست کدوم درگاه بود).


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام