Laravel 8集成iyzico支付加载表单返回Failure状态问题咨询
iyzico支付返回Failure状态排查及修复方案
第一步:先获取具体错误信息
iyzico接口返回Failure时会附带明确的错误描述,你可以先打印接口返回的完整结果定位问题:
在控制器的payment方法中调用paymentForm()后,添加如下代码打印完整返回值:
dd($payment->getRawResult()); // 或单独打印错误信息 dd($payment->getErrorMessage(), $payment->getErrorGroup());
根据返回的错误提示可以直接定位对应参数或配置问题。
第二步:修复必填参数缺失问题
iyzico创建支付表单接口要求必须传入以下字段,你的代码均未配置,是返回失败的核心原因:
1. 补充setForm方法内的必填参数
你当前的setForm只设置了会话ID和订单金额,还需要补充:
- 实付金额
paidPrice(无优惠时和price一致即可) - 货币类型
currency(一般为\Iyzipay\Model\Currency::TL土耳其里拉) - 支付分组
paymentGroup(一般为\Iyzipay\Model\PaymentGroup::PRODUCT) - 支付回调地址
callbackUrl(用户支付完成后iyzico会推送支付结果到这个地址)
2. 调用所有必填的参数设置方法
你的控制器里只调用了setForm,其余必填的买家信息、地址信息、商品列表方法都没有调用,修改后的控制器代码示例:
public function payment() { $iyzico = new Iyzico(); $payment = $iyzico->setForm([ 'conversationID' => '123456789', 'price' => '120.0', 'paidPrice' => '120.0', 'currency' => \Iyzipay\Model\Currency::TL, 'paymentGroup' => \Iyzipay\Model\PaymentGroup::PRODUCT, 'callbackUrl' => route('iyzico.callback') // 替换为你自己的回调路由 ]) // 补充买家信息,所有字段都是必填 ->setBuyer([ 'id' => '1', 'name' => 'test', 'surname' => 'user', 'email' => 'test@test.com', 'gsmNumber' => '+905555555555', 'identityNumber' => '11111111111', // 沙箱环境可使用测试身份证号 'lastLoginDate' => '2023-01-01 12:00:00', 'registrationDate' => '2023-01-01 12:00:00', 'registrationAddress' => 'Test address', 'ip' => request()->ip(), 'city' => 'Istanbul', 'country' => 'Turkey', 'zipCode' => '34000' ]) // 补充配送地址 ->setShipping([ 'name' => 'test user', 'city' => 'Istanbul', 'country' => 'Turkey', 'address' => 'Test address', 'zipCode' => '34000' ]) // 补充账单地址 ->setBilling([ 'name' => 'test user', 'city' => 'Istanbul', 'country' => 'Turkey', 'address' => 'Test address', 'zipCode' => '34000' ]) // 补充商品列表 ->setItem([ [ 'id' => 'item1', 'name' => 'Test Product', 'category1' => 'General', 'itemType' => \Iyzipay\Model\BasketItemType::PHYSICAL, 'price' => '120.0' ] ]) ->paymentForm(); $paymentContent = $payment->getCheckoutFormContent(); $paymentStatus = $payment->getStatus(); return view( 'iyzico', compact('paymentContent', 'paymentStatus') ); }
3. 完善Iyzico类里的参数赋值逻辑
你现有的setBuyer、setShipping、setBilling、setItem方法都只设置了部分字段,需要把上面新增的必填字段补全到对应方法里,示例:
// setBuyer方法补全示例 public function setBuyer(array $params) { $buyer = new \Iyzipay\Model\Buyer(); $buyer->setId($params['id']); $buyer->setName($params['name']); $buyer->setSurname($params['surname']); $buyer->setEmail($params['email']); $buyer->setGsmNumber($params['gsmNumber']); $buyer->setIdentityNumber($params['identityNumber']); $buyer->setLastLoginDate($params['lastLoginDate']); $buyer->setRegistrationDate($params['registrationDate']); $buyer->setRegistrationAddress($params['registrationAddress']); $buyer->setIp($params['ip']); $buyer->setCity($params['city']); $buyer->setCountry($params['country']); $buyer->setZipCode($params['zipCode']); // 把创建的buyer对象赋值给request $this->request->setBuyer($buyer); return $this; } // setItem方法补全示例 public function setItem(array $items) { foreach ($items as $key => $value) { $basketItem = new \Iyzipay\Model\BasketItem(); $basketItem->setId($value['id']); $basketItem->setName($value['name']); $basketItem->setCategory1($value['category1']); $basketItem->setItemType($value['itemType']); $basketItem->setPrice($value['price']); array_push($this->basketItems, $basketItem); } $this->request->setBasketItems($this->basketItems); return $this; } // 同理补全setShipping、setBilling里的其余字段赋值
第三步:修复Blade模板渲染问题
你当前用{{ $paymentContent }}输出表单内容,Laravel Blade会自动转义HTML标签,导致表单无法正常渲染,需要改成非转义输出:
<article> <h1>odeme sayfa</h1> <div> {!! $paymentContent !!} {{ $paymentStatus }} <div id="iyzipay-checkout-form" class="responsive"></div> </div> </article>
第四步:检查配置正确性
确认你Iyzico类里填写的沙箱apiKey、secretKey是从iyzico商户后台沙箱环境获取的正确值,没有填写错误。
内容的提问来源于stack exchange,提问作者ALAA ELDIN
相关产品推荐
相关产品推荐

