Laravel Bagisto E-Ticaret Platformu İyzico Entegrasyonu Yapımı

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

  Alıntı Yap

KARABAY A, 2020 . Laravel Bagisto E-Ticaret Platformu İyzico Entegrasyonu Yapımı,

https://www.karabayyazilim.com/blog/laravel-bagisto-e-ticaret-platformu-iyzico-entegrasyonu-yapimi-2020-12-17-112159

(Erişim Tarihi : 17 Aralık 2020).


  Bu yazıyı paylaş

Yorumlar (0)

Yorum Yap

Abone Ol
Blog yazılarımdan ilk siz haberdar olmak için email bültenine kaydolun