Merhaba arkadaşlar bu yazımda laravel’in open source olan bagisto e ticaret platformuna Iyzico entegrasyonunu nasıl yapabileceğimizi öğreneceğiz.
Öncelikle bagisto’yu host’umuza kuruyoruz kurduk tan sonra aşağıdaki paketleri kuruyoruz.
composer require bagisto/bagisto-package-generatorcomposer require iyzico/iyzipay-php
Paketlerimizi kurduktan sonra aşağıdaki komutumuzu çalıştırıyoruz sonra bu komut bize yeni bir ödeme method'u oluşturuyor.
php artisan package:make-payment-method Webkul\IyzicoPayment
Ödeme method'umuzu oluşturduk şimdi bu method’umuzu bagisto’ya tanıtalım.
config/app.phpWebkul\IyzicoPayment\Providers\IyzicoPaymentServiceProvider::class,
Bunu ekledikten sonra composer.json dosyamızın içindeki psr-4 alanına aşağıdaki kodu ekliyoruz.
"Webkul\\IyzicoPayment\\": "packages/Webkul/IyzicoPayment/src"
Son olarak aşağıdaki komutumuzu çalıştırıyoruz ve paket tanıtma işlemimiz bitmiş oluyor.
composer dumpautoload
Şimdi gelelim ödeme method’umuza aşağıdaki yapıyı kuruyoruz.
Paketimizde bu yapıyı kurduktan sonra gelelim kodlarımıza. ilk olarak api key’lerimizi almamız gerekiyor buraya tıklayarak test için api keylerinizi alabilirsiniz. Aldıktak sonra aşağıdaki alanları doldurunuz.
Helpers/IyzicoApi.php<?php
namespace Webkul\IyzicoPayment\Helpers;
class IyzicoApi
{
public static function options() {
$options = new \Iyzipay\Options();
$options->setApiKey("api key");
$options->setSecretKey("secret key");
$options->setBaseUrl("base url");
return $options;
}
}
Aşağıdaki Ipn dosyamızıda aynı şekilde dosyanızın için yapıştırın bu bize sepet’teki ürünlerimizi almamız için yardımcı olacak.
Helpers/Ipn.php<?php
namespace Webkul\IyzicoPayment\Helpers;
use Webkul\Sales\Repositories\OrderRepository;
use Webkul\Sales\Repositories\InvoiceRepository;
class Ipn
{
/**
* Ipn post data
*
* @var array
*/
protected $post;
/**
* Order object
*
* @var \Webkul\Sales\Contracts\Order
*/
protected $order;
/**
* OrderRepository object
*
* @var \Webkul\Sales\Repositories\OrderRepository
*/
protected $orderRepository;
/**
* InvoiceRepository object
*
* @var \Webkul\Sales\Repositories\InvoiceRepository
*/
protected $invoiceRepository;
/**
* Create a new helper instance.
*
* @param \Webkul\Sales\Repositories\OrderRepository $orderRepository
* @param \Webkul\Sales\Repositories\InvoiceRepository $invoiceRepository
* @return void
*/
public function __construct(
OrderRepository $orderRepository,
InvoiceRepository $invoiceRepository
)
{
$this->orderRepository = $orderRepository;
$this->invoiceRepository = $invoiceRepository;
}
/**
* This function process the ipn sent from iyzico end
*
* @param array $post
* @return null|void|\Exception
*/
public function processIpn($post)
{
$this->post = $post;
if (! $this->postBack()) {
return;
}
try {
if (isset($this->post['txn_type']) && 'recurring_payment' == $this->post['txn_type']) {
} else {
$this->getOrder();
$this->processOrder();
}
} catch (\Exception $e) {
throw $e;
}
}
/**
* Load order via ipn invoice id
*
* @return void
*/
protected function getOrder()
{
if (empty($this->order)) {
$this->order = $this->orderRepository->findOneByField(['cart_id' => $this->post['invoice']]);
}
}
/**
* Process order and create invoice
*
* @return void
*/
protected function processOrder()
{
if ($this->post['payment_status'] == 'Completed') {
if ($this->post['mc_gross'] != $this->order->grand_total) {
return;
} else {
$this->orderRepository->update(['status' => 'processing'], $this->order->id);
if ($this->order->canInvoice()) {
$invoice = $this->invoiceRepository->create($this->prepareInvoiceData());
}
}
}
}
/**
* Prepares order's invoice data for creation
*
* @return array
*/
protected function prepareInvoiceData()
{
$invoiceData = [
"order_id" => $this->order->id,
];
foreach ($this->order->items as $item) {
$invoiceData['invoice']['items'][$item->id] = $item->qty_to_invoice;
}
return $invoiceData;
}
}
Burada ise ödeme yöntemi iyzico seçildiğinde göndereceğimiz route’u ayarlıyoruz.
Payment/IyzicoPayment.php<?phpnamespace Webkul\IyzicoPayment\Payment;use Webkul\Payment\Payment\Payment;class IyzicoPayment extends Payment
{
/**
* Payment method code
*
* @var string
*/
protected $code = 'iyzicopayment'; public function getRedirectUrl()
{
return route('iyzico.redirect');
}
}
Aşağıdada route dosyamızı ve view dosyamızın yolunu tanıtıyoruz.
Providers/IyzicoPaymentServiceProvider.phppublic function boot()
{
include __DIR__ . '/../Http/routes.php'; $this->loadViewsFrom(__DIR__ . '/../Resources/views', 'iyzico');
}
Aynı şekilde controller’ı da PaymentController kontrol etmek için kullanacağız.
Http/Controllers/Controller.php<?php
namespace Webkul\IyzicoPayment\Http\Controllers;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
class Controller extends BaseController
{
use DispatchesJobs, ValidatesRequests;
}
Route’larımızıda aynı şekilde dosyamıza alıyoruz.
Http/routes.php<?phpRoute::group(['middleware' => ['web']], function () {
Route::get('/iyzico-redirect', 'Webkul\IyzicoPayment\Http\Controllers\PaymentController@redirect')->name('iyzico.redirect');
Route::get('/iyzico-success', 'Webkul\IyzicoPayment\Http\Controllers\PaymentController@success')->name('iyzico.success');
Route::post('/iyzico-callback', 'Webkul\IyzicoPayment\Http\Controllers\PaymentController@callback')->name('iyzico.callback');
});
Buradada iyzico dan gelen callback'imizde csrf hatası almamak için 'iyzico-callback' callback url'imizi ekliyoruz
app/Http/Middlware/VerifyCsrfToken.php protected $except = [ 'iyzico-callback', 'paypal/standard/ipn' ];
Gelelim en önemli yerlerden birine aşağıdaki redirect olan alanımızda sepet’teki ürünlerimizi ,müşterimizin seçtiği adresi iyzicoya gönderiyoruz.
Gönderdikten sonra callback alanımızdada iyzico’dan gelen yanıtımızı alıyoruz eğer ödeme işlemi başarılıysa success url’ine gönderiyoruz. Başarısız ise de ödeme sayfamıza yeniden gönderiyoruz.
Success işleminde ise sepetimizdeki ürünleri boşaltıyoruz ve ödeme başarılı işlemine gönderiyoruz.
Http/Controller/PaymentController.php<?php
namespace Webkul\IyzicoPayment\Http\Controllers;
use Illuminate\Http\Request;
use Webkul\Checkout\Facades\Cart;
use Webkul\Customer\Models\Customer;
use Webkul\IyzicoPayment\Helpers\IyzicoApi;
use Webkul\Sales\Repositories\OrderRepository;
use Webkul\IyzicoPayment\Helpers\Ipn;
use Webkul\Shop\Http\Controllers\Controller;
class PaymentController extends Controller
{
/**
* OrderRepository object
*
* @var \Webkul\Sales\Repositories\OrderRepository
*/
protected $orderRepository;
/**
* Ipn object
*
* @var \Webkul\IyzicoPayment\Helpers\Ipn
*/
protected $ipnHelper;
/**
* Create a new controller instance.
*
* @param \Webkul\Attribute\Repositories\OrderRepository $orderRepository
* @param \Webkul\IyzicoPayment\Helpers\Ipn $ipnHelper
* @return void
*/
public function __construct(
OrderRepository $orderRepository,
Ipn $ipnHelper
)
{
$this->orderRepository = $orderRepository;
$this->ipnHelper = $ipnHelper;
}
public function redirect(Request $request) {
$cart = Cart::getCart();
$address = $cart->billing_address;
$user = Customer::find($cart->customer_id);
$requestIyzico = new \Iyzipay\Request\CreateCheckoutFormInitializeRequest();
$requestIyzico->setLocale(\Iyzipay\Model\Locale::TR);
$requestIyzico->setConversationId(rand());
$requestIyzico->setPrice(number_format($cart['base_sub_total'],'2','.',''));
$requestIyzico->setPaidPrice(number_format($cart['base_grand_total'],'2','.',''));
$requestIyzico->setCurrency(\Iyzipay\Model\Currency::TL);
$requestIyzico->setBasketId("B67832");
$requestIyzico->setPaymentGroup(\Iyzipay\Model\PaymentGroup::PRODUCT);
$requestIyzico->setCallbackUrl(route('iyzico.callback'));
$requestIyzico->setEnabledInstallments(array(2, 3, 6, 9));
$buyer = new \Iyzipay\Model\Buyer();
$buyer->setId($cart->id);
$buyer->setName($cart->customer_first_name);
$buyer->setSurname($cart->customer_last_name);
$buyer->setGsmNumber($address->phone);
$buyer->setEmail($address->email);
$buyer->setIdentityNumber(rand());
$buyer->setLastLoginDate((string) $cart->created_at);
$buyer->setRegistrationDate((string) $user->created_at);
$buyer->setRegistrationAddress($address->address1);
$buyer->setIp($request->ip());
$buyer->setCity($address->state);
$buyer->setCountry($address->country);
$buyer->setZipCode($address->postcode);
$requestIyzico->setBuyer($buyer);
$shippingAddress = new \Iyzipay\Model\Address();
$shippingAddress->setContactName($cart->customer_first_name . ' ' . $cart->customer_last_name);
$shippingAddress->setCity($address->state);
$shippingAddress->setCountry($address->city);
$shippingAddress->setAddress($address->address1);
$shippingAddress->setZipCode($address->postcode);
$requestIyzico->setShippingAddress($shippingAddress);
$billingAddress = new \Iyzipay\Model\Address();
$billingAddress->setContactName($cart->customer_first_name . ' ' . $cart->customer_last_name);
$billingAddress->setCity($address->state);
$billingAddress->setCountry($address->city);
$billingAddress->setAddress($address->address1);
$billingAddress->setZipCode($address->postcode);
$requestIyzico->setBillingAddress($billingAddress);
$basketItems = array();
$products = 0;
foreach ($cart['items'] as $product) {
$BasketItem = new \Iyzipay\Model\BasketItem();
$BasketItem->setId($product->id);
$BasketItem->setName($product->name);
$BasketItem->setCategory1("Teknoloji");
$BasketItem->setCategory2("Bilgisayar");
$BasketItem->setItemType(\Iyzipay\Model\BasketItemType::PHYSICAL);
$BasketItem->setPrice(number_format($product['total'],'2','.',''));
$basketItems[$products] = $BasketItem;
$products++;
}
$requestIyzico->setBasketItems($basketItems);
$checkoutFormInitialize = \Iyzipay\Model\CheckoutFormInitialize::create($requestIyzico, IyzicoApi::options());
$paymentForm = $checkoutFormInitialize->getCheckoutFormContent();
return view('iyzico::iyzico-form',compact('paymentForm'));
}
public function callback(Request $request) {
$requestIyzico = new \Iyzipay\Request\RetrieveCheckoutFormRequest();
$requestIyzico->setLocale(\Iyzipay\Model\Locale::TR);
$requestIyzico->setToken($request->token);
$checkoutForm = \Iyzipay\Model\CheckoutForm::retrieve($requestIyzico, IyzicoApi::options());
if ($checkoutForm->getPaymentStatus() == 'SUCCESS') {
return redirect()->route('iyzico.success');
} else {
return redirect('/checkout/onepage');
}
}
public function success() {
$order = $this->orderRepository->create(Cart::prepareDataForOrder());
Cart::deActivateCart();
session()->flash('order', $order);
return redirect()->route('shop.checkout.success');
}
}
Burada ise iyzico’nun ödeme formunu çağırıyoruz.
Resources/views/iyzico-form.blade.php<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
{!! $paymentForm !!}
<div id="iyzipay-checkout-form" ></div>
</body>
</html>
Tüm işlemleri tamamladık son bir adım kaldı sadece aşağıdaki komutlarıda çalıştırıyoruz
php artisan route:cache
composer dumpautoload
Yorum Yap