سلام خسته نباشید...
من در سایتم میخوام از پکیج shetabit استفاده کنم اما به یه مشکلی بر خوردم
وقتی کاربر روی دکمه خرید کلیک میکنه یک کنترلر خونده میشه و به درگاه پرداخت منتقل میشه :
$invoice = new Invoice;
$invoice->amount(1000);
$invoice->detail(['detailName' => $transaction->transactionable_type]);
$payment = Payment::purchase($invoice, function($driver, $transactionId){
return;
});
return $payment->pay()->render();
بعد از اتمام خرید کاربر به صفحه ی verify منتقل میشه. اونجا من این کد ها رو قرار دادم تا وریفای کنه اما خطای (کد تراکنش صحیح نیست) به من میده :
$userId = auth()->user()->id;
$transaction = Transaction::where('user_id', $userId)->orderBy('id', 'DESC')->first();
try {
// check and save informations
$receipt = Payment::amount((int)$transaction->total_price)->verify();
$transaction->ref_id = $receipt->getReferenceId();
$transaction->status = 1;
$transaction->save();
...
}
نمیدونم چرا خطا میده به من لطفا راهنماییم کنید.
@mohsenbostan
@mohammadeng3731
@MehdiAghighi
@ali.bayat
@behzadd
@milad
شما هم کمکم کنید کاربرای برتر
@rmorteza3000
سلام.
به نظر من همه چیز درست میومد.
اما آقای خانزادی بهتر می تونن کمک کنن. به هر حال ایشون سازنده این پکیج هستن.
@rmorteza3000
بوسیله dd تست کنید درخواست شما تا کجا می رسه. اصلا به متد وریفای کنترلر میرسه یانه. اینو تست کنید اول و پیدا کنید کجا کدوم فانکشن شما این ارور رو generate میکنه
@behzadd
بهزاد من متد dd تست کردم از مرحله اول رد میشه و یک transaction id هم ایجاد میشه.
در مرحله verify هم dd($request)
میزنم اما null برمیگردونه. اگه dd($transaction)
رو بزنم (که یک جدول در دیتابیس هست) اطلاعات اون کاربر رو نشون میده. حالا نمیدونم اینجا شاید خود درگاه بانکی nextpay، مقادیر خاصی رو به فانکشن verify من ارسال میکنه، و من باید اونو دریافت کنم تا مشکل برطرف بشه. نمیدونم دیگه... راهنماییم کنید.
خلاصه تا اون متد verify میره و اونجا چون transaction_id تایید نمیشه میره و از try رد میشه و catch رو اجرا میکنه.
@rmorteza3000
ببینید وریفای نباید $request داخلش نال باشه! و البته یادتون باشه که route وریفای شما رو nextpay کال میکنه و ریدایرکت میده.
پس اگر این null رو شما با کال بک گرفتن از نکست پی دریافت کردی که یه جای کار اشکال داره. ولی اگه خودت مسیر وریفای رو هیت کردی ، این کار اشتباهه و این کار رو با انجام مراحل و کال بک گرفتن از نکست پی دوباره تکرار کن.
یه مطلب دیگه ، یبار اون کدی که به عنوان کد تراکنش میفرستی رو چک کن ببین موقع برگشت هم همون رو وریفای میکنی یا نه؟اینو بررسی کن
@behzadd
@khanzadimahdi
مسیر وریفای رو خودم در روت تعریف کردم و براش یک کنترلر ایجاد کردم که رَوش خود داکیومنتیشن این پکیج هست.
ولی شاید همینجا یه مشکلی هست که نمیدونم.
اون کد تراکنش رو هم چون خود آقای خانزادی گفتند که تو آپدیت جدید این پکیج نیازی به دریافت و ذخیره transaction id نیست من هم این کار رو نکردم.
وقتی از متد purchase استفاده میکنی، باید داخل کلوژر transactionId رو ذخیره کنی..
توی مستندات که این رو نوشته و من هم به همین شکل استفاده کردم و مشکلی نداشته.
@ali.bayat
احتمالا من مستنداتش رو خوب متوجه نشدم ولی خوندمش
میشه بگید دقیقا باید چه تغییراتی در کدم ایجاد کنم؟
باید اول یه Order بسازی که بعدا بتونی داخل کلوژر از transactionId استفاده کنی و فیلد Order رو مقدار دهی کنی.
function () {
$order->update(['transaction_id' => $transactionId]);
}
بعد هم که خواستی verify کنی .. فیلد Order که همون transactionId هست رو پاس میدی.
Payment::amount($price)
->transactionId($order->transaction_id)
->verify()
شما یا باید طبق چیزی که اقای بیات گفت ایدی تراکنش رو واسه وریفای شدن پاس بدی یا اینکه خودش اون رو از request میگیره.
طبق صحبتی که کردی request هم مثل اینکه نال هست! مشکل از پکیج نیست و از جای دیگه ای هست.
وقتی که request برابر با null میشه طبیعی هست که توی verify نمیتونه کد تراکنش رو از درخواست برگشتی درگاه بگیره.
https://github.com/shetabit/multipay/blob/master/src/Drivers/Nextpay/Nextpay.php
کدهای درایور نکست پی درون مسیر بالا قرار داره. پیشنهاد میکنم یه نگاهی بهش بندازید و متد های purchase و verify رو بررسی کنید.
@khanzadimahdi
درود آقای خانزادی
یا اینکه خودش اون رو از request میگیره.
این ویژگی تو نسخه جدید اضافه شده؟
بله. البته بهتره که خودتون کد تراکنش رو ذخیره کنید و موقع وریفای ازش استفاده کنید.
توی تمامی درایور ها در صورتی که کد تراکنش رو پاس نداده باشید سعی میکنه اون رو از request برگشتی بانک پیدا کنه و استفاده کنه. اما خیلی از درگاه ها توی request بازگشت دیگه کد تراکنش رو نمیزارن! من این فیچر رو به این دلیل اظافه کردم که اگه یه موقع مشکلی در گرفتن کد تراکنش بود, مرحله ی وریفای fail نشه و به درستی انجام بشه.
/**
* Verify payment
*
* @return ReceiptInterface
*
* @throws InvalidPaymentException
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function verify() : ReceiptInterface
{
$transactionId = $this->invoice->getTransactionId() ?? Request::input('trans_id');
$data = [
'api_key' => $this->settings->merchantId,
'order_id' => Request::input('order_id'),
'amount' => $this->invoice->getAmount(),
'trans_id' => $transactionId,
];
یه تیکه از کد وریفای رو میزارم. دقت کنید اگه کد تراکنش رو پاس بدید از چیزی که شما دادین استفاده میکنه اما اگه اون رو بنا به هر دلایلی پاس ندید از درخواست بازگشتی بانک استفاده میشه).
واسه پکیج باید change log هم بزارم تا فیچر ها رو بشه مرور کرد.
از پاسختون متشکرم
من در داخل دیتابیس یک فیلدی به نام transaction_id دارم و میخوام اون مقدار رو داخل کلوژر سیو کنم.
$payment = Payment::purchase($invoice, function($driver, $transactionId){
$transaction->transaction_id = $transactionId;
$transaction->save();
});
return $payment->pay()->render();
منتهی اینجا مشکلی هست و برام یک ارور میاد :
ErrorException
Creating default object from empty value
مشکل چیه؟
درضمن آقای بیات روشی که شما گفتید (ساختن یک Order و مقدار دهی اون) من این روش رو متوجه نشدم
شما باید در یه جایی اون شماره تراکنش رو ذخیره کنید..
روشی که من اشتفاده میکنم، ذخیره شماره تراکنش داخل آبجکت Order هست
شما میتونید هر جا که دوست دارید ذخیرش کنید و بعد وریفای کنید
@khanzadimahdi
بسیار عالی، جدیدا سورس کد رو چک نکرده بودم..
بله change log هم باشه، عالی میشه
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟