Blockonomics::class, //maps GatewayType => Implementation class ]; public const SYSTEM_LOG_TYPE = SystemLog::TYPE_BLOCKONOMICS; //define a constant for your gateway ie TYPE_YOUR_CUSTOM_GATEWAY - set the const in the SystemLog model public $BASE_URL = 'https://www.blockonomics.co'; public $NEW_ADDRESS_URL = 'https://www.blockonomics.co/api/new_address'; public $PRICE_URL = 'https://www.blockonomics.co/api/price'; public function init() { return $this; /* This is where you boot the gateway with your auth credentials*/ } /* Returns an array of gateway types for the payment gateway */ public function gatewayTypes(): array { $types = []; $types[] = GatewayType::CRYPTO; return $types; } public function setPaymentMethod($payment_method_id) { $class = self::$methods[$payment_method_id]; $this->payment_method = new $class($this); return $this; } public function processPaymentView(array $data) { $this->init(); return $this->payment_method->paymentView($data); //this is your custom implementation from here } public function processPaymentResponse($request) { $this->init(); return $this->payment_method->paymentResponse($request); } public function processWebhookRequest(PaymentWebhookRequest $request) { $company = $request->getCompany(); $url_callback_secret = $request->secret; $db_callback_secret = $this->company_gateway->getConfigField('callbackSecret'); if ($url_callback_secret != $db_callback_secret) { throw new PaymentFailed('Secret does not match'); } $txid = $request->txid; $value = $request->value; $status = $request->status; $addr = $request->addr; $payment = Payment::query() ->where('company_id', $company->id) ->where('transaction_reference', $txid) ->firstOrFail(); if (!$payment) { return response()->json([], 200); // TODO: Implement logic to create new payment in case user sends payment to the address after closing the payment page } $statusId = Payment::STATUS_PENDING; switch ($status) { case 0: $statusId = Payment::STATUS_PENDING; break; case 1: $statusId = Payment::STATUS_PENDING; break; case 2: $statusId = Payment::STATUS_COMPLETED; break; } if($payment->status_id == $statusId) { return response()->json([], 200); } else { $payment->status_id = $statusId; $payment->save(); return response()->json([], 200); } } public function refund(Payment $payment, $amount, $return_client_response = false) { $this->setPaymentMethod(GatewayType::CRYPTO); return $this->payment_method->refund($payment, $amount); //this is your custom implementation from here } }