من تقریبا طبق داکیومنتش پیش رفتم و تونستم اوکیش کنم
حالا تیکه کدتون رو بزارید ببینیم مشکل چیه
public function Sending_to_zarinpal(Bill $bill){
$invoice = new Invoice;
$invoice->amount($bill->price)->via('zarinpal')->transactionId(123);
$invoice->detail(['detailName' => 'your detail goes here']);
return Payment::purchase($invoice, function($driver, $transactionId) {
// Store transactionId in database as we need it to verify payment in the future.
})->pay()->render();
}
و اینم نمیدونم کهtransactionId ما باید بهش بدیم یا خودش خودکار میسازه چون تو داکیومنتش فقط گفته بهش نیاز داریم و نگفته بهش بدیم یا نه؟ و نکته بعدی اینکه الان پروژه من روی لوکال هست آیا روی لوکال امکانپذیر هست یا پروژه حتما باید بره روی هاست؟
و البته اینم از فایل config
'zarinpal' => [
/* normal api */
'apiPurchaseUrl' => 'https://ir.zarinpal.com/pg/services/WebGate/wsdl',
'apiPaymentUrl' => 'https://www.zarinpal.com/pg/StartPay/',
'apiVerificationUrl' => 'https://ir.zarinpal.com/pg/services/WebGate/wsdl',
/* sandbox api */
'sandboxApiPurchaseUrl' => 'https://sandbox.zarinpal.com/pg/services/WebGate/wsdl',
'sandboxApiPaymentUrl' => 'https://sandbox.zarinpal.com/pg/StartPay/',
'sandboxApiVerificationUrl' => 'https://sandbox.zarinpal.com/pg/services/WebGate/wsdl',
/* zarinGate api */
'zaringateApiPurchaseUrl' => 'https://ir.zarinpal.com/pg/services/WebGate/wsdl',
'zaringateApiPaymentUrl' => 'https://www.zarinpal.com/pg/StartPay/:authority/ZarinGate',
'zaringateApiVerificationUrl' => 'https://ir.zarinpal.com/pg/services/WebGate/wsdl',
'mode' => 'normal', // can be normal, sandbox, zaringate
'merchantId' => 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX',
'callbackUrl' => 'http://spirutik.com/',
'description' => 'payment using zarinpal',
],
$invoice = new Invoice;
$invoice->amount('amount');
$invoice->detail('price','price');
Payment::purchase($invoice,function($driver, $transactionId) {});
return Payment::pay()->render();
اتفاقا خیلی سر راست هست
این پکیج عملیات ساخت صورت حساب رو برای شما انجام میده..
و هر صورت حساب یک مبلغ یا amount داره.
سپس شما اقدام به پرداخت صورتحساب میکنید..
در این حین یک transaction_id یا شماره تراکنش به شما داده میشه که باید ذخیره کنید.
و سپس به درگاه بانک منتقل میشید.
بانک هم در نهایت شما رو به یک آدرس مشخص ریدایرکت میکنه.
که اونجا میتونید با شماره تراکنشی که قبلا ذخیره کردید، صحت پرداخت رو بررسی کنید.
سلام وقت بخیر
در داکیومنت به شکل زیر نوشته
قبل از انجام هرکاری نیاز به ایجاد یک صورتحساب دارید.
سوال: ایجاد صورت حساب یعنی چی؟ ما در صفحه محصول وقتی روی پرداخت میکنیم تنظیم کردم که کنترلر redirect اجرا باشه.
حالا باید اینجا چکار کنم؟ ابتدا یک رکورد صورتحساب در جدول payment ثبت کنم؟
ثبت درخواست برای پرداخت صورتحساب
پرداخت صورتحساب
متوجه این دو بخش نمیشم ، تفاوتشون چیه؟
در آخر در قسمت redirect چی باید بنویسم؟
روال کار به این شکل هست:
پس ابتدا یه صورت حساب میسازیم و مبلغ قابل پرداخت رو بهش پاس میدیم
use Shetabit\Multipay\Invoice;
use Shetabit\Payment\Facade\Payment;
$invoice = (new Invoice)->amount(1000);
حالا با متد Purchase این صورت حساب رو آماده پرداخت میکنیم
return Payment::purchase($invoice, function($driver, $transactionId) {
// Store transactionId in database as we need it to verify payment in the future.
})->pay()->render();
که در نتیجه یک شماره تراکنش به وجود میاد که میتونی توی دیتابیس ذخیرش کنی
و در نهایت متدهای pay & render هم اعمال میشند و کاربر رو به درگاه بانک ریدایرکت میکنه
@ali.bayat
احسنت متشکرم خیلی شفاف شد.
که در نتیجه یک شماره تراکنش به وجود میاد که میتونی توی دیتابیس ذخیرش کنی
شماره تراکنش رو کی باید ذخیره کنم؟ دقیقا قبل render شدن در کنترلر redirect یا در کنترلر callback ؟
برای قسمت callback من یک کنترلر ایجاد کردم و وقتی dd($request) میگیرم میگه
The GET method is not supported for this route. Supported methods: POST.
اگر پاسخ پرداخت به صورت get بیاد چطور باید بررسی کنم؟
کد قسمت کنترلر callback رو هم بهم میگید؟
داخل کلوژر
اونجا میتوی شماره تراکنش و مبلغ رو توی یه جدول ذخیره کنی
بعد که به کالبک ریدایرکت بشی میتونی با همون شماره تراکنش، پرداخت رو تائید کنی:
try {
$receipt = Payment::amount(1000)->transactionId($transaction_id)->verify();
echo $receipt->getReferenceId();
...
} catch (InvalidPaymentException $exception) {
echo $exception->getMessage();
}
@ali.bayat
یعنی ما به یک جدول جدای از payment نیاز داریم برای ذخیره transaction_id ؟
چنین جدولی باید به اسم transaction باشه؟ و چه فیلد های دیگه ای نیاز داره؟
برای اینکه بررسی کنیم که کاربر محصول رو خریداری کرده باید جدول transaction بررسی بشه یا payment ؟
بعد که به کالبک ریدایرکت بشی میتونی با همون شماره تراکنش، پرداخت رو تائید کنی:
درخواست Get میاد ؟
سلام دوستان. زرین بال چند وقت اخیر توی API پرداخت خودش تغییراتی داده به همین دلیل توی پکیج shetabit الان فقط sandbox درست کار میکنه.
اگه توی استفاده از زرین پال به مشکل خوردین نگران نباشید تا اخر همین هفته درست میشه و اخر هفته فقط باید پکیج رو بروز رسانی کنید. (همون کدهایی که نوشتین و توی حالت sandbox کار میکنه رو میتونید واسه تمام درگاه ها استفاده کنید)
برای برگشت هم پیشنهاد میکنم any بزارید.
موفق باشید.
قاعدتا درخواست get مناسب این کار نیست
پس دلیل ارور زیر در callback چیه؟
The GET method is not supported for this route. Supported methods: POST.
لطفا سوال زیر را هم پاسخ بدید متشکرم
یعنی ما به یک جدول جدای از payment نیاز داریم برای ذخیره transaction_id ؟
چنین جدولی باید به اسم transaction باشه؟ و چه فیلد های دیگه ای نیاز داره؟
@ali.bayat @khanzadimahdi @hamidpour17
@mohaligateway
سلام
در این قطعه کد متغیر Workshop در order_data به دو شیوه $this->Workshop و $Workshop در دسترس نیست.
راه کار چیه؟
public function redirect(Request $request , $id_workshop)
{
$Workshop = Workshop::find($id_workshop);
$invoice = new Invoice;
$invoice->amount($Workshop->workshops_price);
return Payment::purchase($invoice, function($driver, $transactionId) {
$order_data = [
'system_discount' => $this->Workshop->workshops_discount_percentage, //در دسترس نیست
'original_price' => $Workshop->workshops_price, //در دسترس نیست
];
$order = Orders::create($order_data);
})->pay()->render();
}
باید از use استفاده کنی
تا متغیر داخل کلوژر قابل دسترسی باشه
return Payment::purchase($invoice, function($driver, $transactionId) use ($Workshop) {
$order_data = [
'system_discount' => $this->Workshop->workshops_discount_percentage, //در دسترس نیست
'original_price' => $Workshop->workshops_price, //در دسترس نیست
];
$order = Orders::create($order_data);
})->pay()->render();
سلام درگاه زرین پال رو با توجه به اخرین ورژن ای پی آی که ارائه دادن بروز رسانی کردم. لطفا پکیج رو اپدیت کنید و فایل کانفیگ پکیج رو حذف کنید و دوباره پابلیش کنید.
سلام خسته نباشید کسی هست این سوال رو توضیح بده؟ من هم از api استفاده میکنم و در کال بک مشکل دارم .البته الان د رمحیط لوکال دارم تست میکنم
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟