سلام وقت بخیر
پس از اجرای دستور زیر در callback با ارور مواجه میشوم.
$receipt = Payment::amount(85000)->transactionId(000000000000000000000000000000511154)->verify();
dd($receipt );
متن ارور
Shetabit\Multipay\Exceptions\InvalidPaymentException
درخواست مورد نظر يافت نشد.
http://127.0.0.1:8000/workshop/payment/callback?Authority=000000000000000000000000000000511154&Status=OK
C:\xampp\htdocs\larashopfile\vendor\shetabit\multipay\src\Drivers\Zarinpal\Zarinpal.php:139
if ($result->Status != 100) {
$message = $this->translateStatus($result->Status);
139 throw new InvalidPaymentException($message, $result->Status);
}
این پکیج فقط پرداخت رو انجام میده. خودتون باید توی دیتابیس چیزایی که نیاز دارید رو ذخیره کنید.
وقتی میگه پرداخت قبلا موفق بوده یعنی اینکه یکبار پرداخت verify شده قبلا و موفق هم بوده و الان دوباره داره وریفای میشه و همچنان موفق هست! زرین پال بدین صورت هست که اگه دفعه اول وریفای کنید میگه پرداخت موفق هست اما اگه تکرار کنید بهتون اعلام میکنه که دارین عمل وریفای رو تکرار میکنید.
یک پرداخت رو یکبار وریفای میکنن و اگه نیاز هست عملیاتی که مربوط به پرداخت موفق هست رو انجام میدن! صد بار که وریفای نمیکنن!
مثلا شما فرض کن یه کتاب میخری بعد از اینکه پرداخت موفقیت امیز بود کتاب رو ثبت میکنی که خریده شده. اگه کاربر صفحه رو صد بار رفرش کنه شما صد تا کتاب براش ثبت نمیکنی!
دلیل اینکه خطا میده هم اینه که از سمت زرین پال این خطا میاد.
شما باید سمت خودت توی دیتابیس ثبت کنی که پرداخت موفقیت امیز بوده و دفعه های بعد اصلا موفقیت بودن یا نبودن پرداخت رو با درگاه چک نکنی.
@khanzadimahdi
من الان به جای sandbox از normal استفاده کردم و پس از پرداخت مبلغ ارور بالا نمیاد.
اما نمیدانم چرا پیغام موفقیت داخل catch میاد.
#message: "عمليات پرداخت موفق بوده و قبلا PaymentVerification تراكنش انجام شده است."
پس payment_res_num و payment_ref_num کجاست؟
@khanzadimahdi
داکیومنت در مورد اعتبار سنجی پرداخت این بود، آیا موردی غیر از این هست که باید مطالعه کنم؟
اعتبار سنجی پرداخت
بعد از پرداخت شدن صورتحساب توسط کاربر, بانک کاربر را به یکی از صفحات سایت ما برمیگردونه و ما با اعتبار سنجی میتونیم متوجه بشیم کاربر پرداخت رو انجام داده یا نه!
// At the top of the file.
use Shetabit\Payment\Facade\Payment;
use Shetabit\Multipay\Exceptions\InvalidPaymentException;
// You need to verify the payment to ensure the invoice has been paid successfully.
// We use transaction id to verify payments
// It is a good practice to add invoice amount as well.
try {
$receipt = Payment::amount(1000)->transactionId($transaction_id)->verify();
// You can show payment referenceId to the user.
echo $receipt->getReferenceId();
} catch (InvalidPaymentException $exception) {
/**
when payment is not verified, it will throw an exception.
We can catch the exception to handle invalid payments.
getMessage method, returns a suitable message that can be used in user interface.
**/
echo $exception->getMessage();
}
در صورتی که پرداخت توسط کاربر به درستی انجام نشده باشه یک استثنا از نوع InvalidPaymentException ایجاد میشود که حاوی پیام متناسب با پرداخت انجام شده است.
کد من به شکل زیره
public function callback(Request $request)
{
$transactionId = $request->query('Authority');
$payment = Payments::where('payment_transaction_id', $transactionId)->first();
try {
$receipt = Payment::amount($payment->payment_amount)->transactionId($payment->payment_transaction_id)->verify();
$payment_data = [
'payment_ref_num' => $receipt->getReferenceId(),
'payment_status' => 'پرداخت موفق',
];
Payments::updateOrCreate(['id' => $payment->id] , $payment_data);
} catch (InvalidPaymentException $exception) {
echo $exception->getMessage();
}
}
و هیچ چیز در دیتابیس ذخیره نمیشه و پیغام زیر هم نمایش داده میشه
عمليات پرداخت موفق بوده و قبلا PaymentVerification تراكنش انجام شده است.
این پکیج فقط پرداخت رو انجام میده. خودتون باید توی دیتابیس چیزایی که نیاز دارید رو ذخیره کنید.
وقتی میگه پرداخت قبلا موفق بوده یعنی اینکه یکبار پرداخت verify شده قبلا و موفق هم بوده و الان دوباره داره وریفای میشه و همچنان موفق هست! زرین پال بدین صورت هست که اگه دفعه اول وریفای کنید میگه پرداخت موفق هست اما اگه تکرار کنید بهتون اعلام میکنه که دارین عمل وریفای رو تکرار میکنید.
یک پرداخت رو یکبار وریفای میکنن و اگه نیاز هست عملیاتی که مربوط به پرداخت موفق هست رو انجام میدن! صد بار که وریفای نمیکنن!
مثلا شما فرض کن یه کتاب میخری بعد از اینکه پرداخت موفقیت امیز بود کتاب رو ثبت میکنی که خریده شده. اگه کاربر صفحه رو صد بار رفرش کنه شما صد تا کتاب براش ثبت نمیکنی!
دلیل اینکه خطا میده هم اینه که از سمت زرین پال این خطا میاد.
شما باید سمت خودت توی دیتابیس ثبت کنی که پرداخت موفقیت امیز بوده و دفعه های بعد اصلا موفقیت بودن یا نبودن پرداخت رو با درگاه چک نکنی.
@khanzadimahdi
متشکرم ، اطلاع نداشتم گه فقط یک بار verify رو باید انجام داد ( در داکیومنت ذکر نشده بود ) و چون مبلغ رو پرداخت کرده بودم و کالبک اجرا شده بود ، پس از هر بار تغییر تابع همان را مجدد اجرا میکردم.
مشکل حل شد و در نهایت با موفقیت بحث پرداخت کاملا حل شد.
متشکرم.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟