Skip to content

Commit

Permalink
Add changes for v2
Browse files Browse the repository at this point in the history
  • Loading branch information
zarulizham committed Sep 25, 2023
1 parent 303b723 commit 35269d2
Show file tree
Hide file tree
Showing 14 changed files with 252 additions and 66 deletions.
6 changes: 6 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"cSpell.words": [
"TRANID",
"transactionable"
]
}
5 changes: 3 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,9 @@
}],
"require": {
"php": "^8.0",
"spatie/laravel-package-tools": "^1.9.2",
"illuminate/contracts": "^8.73|^9.0|^10.0"
"illuminate/contracts": "^8.73|^9.0|^10.0",
"spatie/laravel-data": "^3.9",
"spatie/laravel-package-tools": "^1.9.2"
},
"require-dev": {
"nunomaduro/collision": "^7.0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,16 @@ return new class extends Migration
{
Schema::create('ecommerce_transactions', function (Blueprint $table) {
$table->id();
$table->string('reference_id')->nullable();
$table->string('transaction_id')->nullable();
$table->bigInteger('transactionable_id')->nullable();
$table->string('transactionable_type', 100)->nullable();
$table->string('reference_id')->nullable();
$table->double('amount', 15, 2)->nullable()->default(0);
$table->string('response_code')->nullable();
$table->string('response_description', 300)->nullable();
$table->dateTime('completed_at')->nullable();
$table->json('request_payload');
$table->json('response_payload')->nullable();
$table->json('request_payload')->nullable();
$table->timestamps();
});
}
Expand Down
5 changes: 5 additions & 0 deletions resources/views/invalid_referer.blade.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
@extends('errors.minimal')

@section('title', __('Unauthorized'))
@section('code', '401')
@section('message', __('Invalid Redirection'))
6 changes: 0 additions & 6 deletions src/Contracts/Message.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,4 @@ interface Message
* @return mixed
*/
public function handle(array $options);

/**
* Format data for checksum
* @return string
*/
public function format();
}
64 changes: 64 additions & 0 deletions src/DataObjects/RedirectData.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<?php

namespace ZarulIzham\EcommercePayment\DataObjects;

use DateTime;
use Spatie\LaravelData\Data;
use Spatie\LaravelData\Casts\EnumCast;
use Spatie\LaravelData\Attributes\WithCast;
use Spatie\LaravelData\Attributes\MapInputName;
use Spatie\LaravelData\Casts\DateTimeInterfaceCast;
use ZarulIzham\EcommercePayment\Enums\TransactionStatus;

class RedirectData extends Data {
public function __construct(

#[MapInputName('AMOUNT')]
public float $amount,

#[MapInputName('AUTH_ID')]
public ?string $auth_id,

#[MapInputName('CUSTOMER_ID')]
public ?string $customer_id,

#[MapInputName('FR_LEVEL')]
public ?string $fr_level,

#[MapInputName('FR_SCORE')]
public ?string $fr_score,

#[MapInputName('MERCHANT_TRANID')]
public string $merchant_transaction_id,

#[MapInputName('RESPONSE_CODE')]
public string $response_code,

#[MapInputName('RESPONSE_DESC')]
public string $response_description,

#[MapInputName('TRANSACTION_ID')]
public string $transaction_id,

#[
MapInputName('TRAN_DATE'),
WithCast(DateTimeInterfaceCast::class, format: 'd-m-Y H:i:s')
]
public ?DateTime $transaction_date,

#[
MapInputName('SALES_DATE'),
WithCast(DateTimeInterfaceCast::class, format: 'd-m-Y H:i:s')
]
public ?DateTime $completed_at,

#[
MapInputName('TXN_STATUS'),
WithCast(EnumCast::class)
]
public TransactionStatus $transaction_status,

#[MapInputName('SECURE_SIGNATURE')]
public string $secure_signature,
) {}
}
46 changes: 46 additions & 0 deletions src/Enums/TransactionStatus.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<?php

namespace ZarulIzham\EcommercePayment\Enums;

use Spatie\LaravelData\Casts\Cast;
use ZarulIzham\EcommercePayment\Interfaces\HasLabel;

enum TransactionStatus : string implements HasLabel {
case PENDING_NOT_AUTHORIZED = "N";
case AUTHORIZED = "A";
case CAPTURED = "C";
case SALES_COMPLETED = "S";
case VOID = "V";
case CHARGE_BACK = 'CB';
case EXCEPTION = "E";
case NOT_APPROVED = 'F';
case BLACKLISTED = 'BL';
case BLOCKED = 'B';

public function label() : string
{
return match($this) {
self::PENDING_NOT_AUTHORIZED => 'Pending/Not Authorized',
self::AUTHORIZED => 'Authorized',
self::CAPTURED => 'Captured',
self::SALES_COMPLETED => 'Sales Completed',
self::VOID => 'Void',
self::EXCEPTION => 'Error/Exception Occurred',
self::NOT_APPROVED => 'Not Approved',
self::CHARGE_BACK => 'Charge Back',
self::BLACKLISTED => 'Blacklisted',
self::BLOCKED => 'Blocked',
default => 'Unknown',
};
}

public function group(): string
{
return match ($this) {
self::PENDING_NOT_AUTHORIZED, self::AUTHORIZED, self::CAPTURED => 'Pending',
self::SALES_COMPLETED => 'Paid',
self::VOID, self::EXCEPTION, self::NOT_APPROVED, self::CHARGE_BACK, self::BLACKLISTED, self::BLOCKED => 'Failed',
default => $this,
};
}
}
29 changes: 29 additions & 0 deletions src/Exceptions/InvalidReferrer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace ZarulIzham\EcommercePayment\Exceptions;

use Exception;

class InvalidReferrer extends Exception
{
/**
* Report the exception.
*
* @return bool|null
*/
public function report()
{
return true;
}

/**
* Render the exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Contracts\View\View
*/
public function render($request)
{
return view('ecommerce-payment::invalid_referer');
}
}
19 changes: 19 additions & 0 deletions src/Http/Requests/AuthorizationConfirmation.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace ZarulIzham\EcommercePayment\Http\Requests;

use ZarulIzham\EcommercePayment\Exceptions\InvalidReferrer;
use Illuminate\Foundation\Http\FormRequest;
use ZarulIzham\EcommercePayment\Messages\AuthorizationConfirmation as AuthorizationConfirmationMessage;

Expand Down Expand Up @@ -32,8 +33,26 @@ public function rules()
*/
public function handle()
{
$this->verifyReferrer();
$data = $this->all();

return (new AuthorizationConfirmationMessage())->handle($data);
}

public function headers()
{
return $this->headers->all();
}

public function getHeader($key)
{
return $this->headers->get($key);
}

protected function verifyReferrer()
{
if (! in_array($this->headers->get('referer'), ["https://3dgatewaytest.ambankgroup.com/","https://3dgateway.ambankgroup.com/"])) {
throw new InvalidReferrer();
}
}
}
7 changes: 7 additions & 0 deletions src/Interfaces/HasGroup.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?php

namespace ZarulIzham\EcommercePayment\Interfaces;

interface HasGroup {
public function group() : string;
}
7 changes: 7 additions & 0 deletions src/Interfaces/HasLabel.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?php

namespace ZarulIzham\EcommercePayment\Interfaces;

interface HasLabel {
public function label() : string;
}
47 changes: 12 additions & 35 deletions src/Messages/AuthorizationConfirmation.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,14 @@

namespace ZarulIzham\EcommercePayment\Messages;

use ZarulIzham\EcommercePayment\Contracts\Message as Contract;
use ZarulIzham\EcommercePayment\DataObjects\RedirectData;
use ZarulIzham\EcommercePayment\Models\EcommerceTransaction;
use ZarulIzham\EcommercePayment\Contracts\Message as Contract;

class AuthorizationConfirmation implements Contract
{
public $responseData;

/**
* handle a message
*
Expand All @@ -15,52 +18,26 @@ class AuthorizationConfirmation implements Contract
*/
public function handle($options)
{
$this->amount = @$options['AMOUNT'];
$this->responseCode = @$options['RESPONSE_CODE'];
$this->transactionId = @$options['TRANSACTION_ID'];
$this->merchantTransactionId = @$options['MERCHANT_TRANID'];
$this->responseDescription = @$options['RESPONSE_DESC'];
$this->responseData = @$options;

$this->responseData = RedirectData::from($options);
$this->saveTransaction();

return $this;
}

/**
* Format data for checksum
* @return string
*/
public function format()
{
return $this->list()->join('|');
}

/**
* returns collection of all fields
*
* @return collection
*/
public function list()
{
return collect($this->responseData);
}

/**
* Save response to transaction
*
* @return FpxTransaction
* @return \ZarulIzham\EcommercePayment\Models\EcommerceTransaction;
*/
public function saveTransaction(): EcommerceTransaction
{
$transaction = EcommerceTransaction::where(['transaction_id' => $this->merchantTransactionId])->firstOrNew();

$transaction->response_code = $this->responseCode;
$transaction->response_description = $this->responseDescription;
$transaction->amount = $this->amount;
$transaction->response_payload = $this->list();
$transaction->save();
$data = array_merge($this->responseData->toArray(), [
'response_payload' => $this->responseData->toArray(),
]);

return $transaction;
return EcommerceTransaction::updateOrCreate([
'reference_id' => $this->responseData->merchant_transaction_id,
], $data);
}
}
Loading

0 comments on commit 35269d2

Please sign in to comment.