diff --git a/app/Mail/Admin/EntitySentObject.php b/app/Mail/Admin/EntitySentObject.php index 3b9003e07e59..570c149b1cfe 100644 --- a/app/Mail/Admin/EntitySentObject.php +++ b/app/Mail/Admin/EntitySentObject.php @@ -121,7 +121,7 @@ class EntitySentObject ctrans( $this->template_subject, [ - 'client' => $this->contact->present()->name(), + 'client' => $this->contact->client->present()->name(), 'invoice' => $this->entity->number, ] ); @@ -133,7 +133,7 @@ class EntitySentObject $this->template_body, [ 'amount' => $this->getAmount(), - 'client' => $this->contact->present()->name(), + 'client' => $this->contact->client->present()->name(), 'invoice' => $this->entity->number, ] ); diff --git a/app/Models/Gateway.php b/app/Models/Gateway.php index 32fc20999409..a99f27d737e1 100644 --- a/app/Models/Gateway.php +++ b/app/Models/Gateway.php @@ -81,6 +81,9 @@ class Gateway extends StaticModel case 1: return [GatewayType::CREDIT_CARD => ['refund' => true, 'token_billing' => true]];//Authorize.net break; + case 3: + return [GatewayType::CREDIT_CARD => ['refund' => true, 'token_billing' => true]];//eWay + break; case 15: return [GatewayType::PAYPAL => ['refund' => true, 'token_billing' => false]]; //Paypal break; diff --git a/app/Models/SystemLog.php b/app/Models/SystemLog.php index 7614c01ecccc..4e0f739af243 100644 --- a/app/Models/SystemLog.php +++ b/app/Models/SystemLog.php @@ -68,7 +68,7 @@ class SystemLog extends Model const TYPE_BRAINTREE = 307; const TYPE_WEPAY = 309; const TYPE_PAYFAST = 310; - + const TYPE_EWAY = 311; const TYPE_QUOTA_EXCEEDED = 400; const TYPE_UPSTREAM_FAILURE = 401; diff --git a/app/Models/User.php b/app/Models/User.php index 8533c211784c..0960745a4d63 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -182,7 +182,6 @@ class User extends Authenticatable implements MustVerifyEmail return $company_token->company; } - // return false; throw new \Exception('No Company Found'); //return Company::find(config('ninja.company_id')); diff --git a/app/Notifications/Admin/EntitySentNotification.php b/app/Notifications/Admin/EntitySentNotification.php index 33a735bce188..4d38c3c083a4 100644 --- a/app/Notifications/Admin/EntitySentNotification.php +++ b/app/Notifications/Admin/EntitySentNotification.php @@ -103,14 +103,14 @@ class EntitySentNotification extends Notification "texts.notification_{$this->entity_name}_sent_subject", [ 'amount' => $amount, - 'client' => $this->contact->present()->name(), + 'client' => $this->contact->client->present()->name(), 'invoice' => $this->entity->number, ] )) ->attachment(function ($attachment) use ($amount) { $attachment->title(ctrans('texts.invoice_number_placeholder', ['invoice' => $this->entity->number]), $this->invitation->getAdminLink()) ->fields([ - ctrans('texts.client') => $this->contact->present()->name(), + ctrans('texts.client') => $this->contact->client->present()->name(), ctrans('texts.amount') => $amount, ]); }); diff --git a/app/PaymentDrivers/Eway/CreditCard.php b/app/PaymentDrivers/Eway/CreditCard.php new file mode 100644 index 000000000000..c656ec8b0922 --- /dev/null +++ b/app/PaymentDrivers/Eway/CreditCard.php @@ -0,0 +1,185 @@ +eway_driver = $eway_driver; + } + + public function authorizeView($data) + { + + $data['gateway'] = $this->eway_driver; + $data['api_key'] = $this->eway_driver->company_gateway->getConfigField('apiKey'); + $data['public_api_key'] = $this->eway_driver->company_gateway->getConfigField('publicApiKey'); + + return render('gateways.eway.authorize', $data); + + } + + /* + Eway\Rapid\Model\Response\CreateCustomerResponse {#2374 ▼ + #fillable: array:16 [▶] + #errors: [] + #attributes: array:11 [▼ + "AuthorisationCode" => null + "ResponseCode" => "00" + "ResponseMessage" => "A2000" + "TransactionID" => null + "TransactionStatus" => false + "TransactionType" => "MOTO" + "BeagleScore" => null + "Verification" => Eway\Rapid\Model\Verification {#2553 ▼ + #fillable: array:5 [▶] + #attributes: array:5 [▶] + } + "Customer" => Eway\Rapid\Model\Customer {#2504 ▼ + #fillable: array:38 [▶] + #attributes: array:20 [▼ + "CardDetails" => Eway\Rapid\Model\CardDetails {#2455 ▼ + #fillable: array:8 [▶] + #attributes: array:7 [▼ + "Number" => "411111XXXXXX1111" + "Name" => "Joey Diaz" + "ExpiryMonth" => "10" + "ExpiryYear" => "23" + "StartMonth" => null + "StartYear" => null + "IssueNumber" => null + ] + } + "TokenCustomerID" => 917047257342 + "Reference" => "A12345" + "Title" => "Mr." + "FirstName" => "John" + "LastName" => "Smith" + "CompanyName" => "Demo Shop 123" + "JobDescription" => "PHP Developer" + "Street1" => "Level 5" + "Street2" => "369 Queen Street" + "City" => "Sydney" + "State" => "NSW" + "PostalCode" => "2000" + "Country" => "au" + "Email" => "demo@example.org" + "Phone" => "09 889 0986" + "Mobile" => "09 889 6542" + "Comments" => "" + "Fax" => "" + "Url" => "http://www.ewaypayments.com" + ] + } + "Payment" => Eway\Rapid\Model\Payment {#2564 ▼ + #fillable: array:5 [▶] + #attributes: array:5 [▼ + "TotalAmount" => 0 + "InvoiceNumber" => "" + "InvoiceDescription" => "" + "InvoiceReference" => "" + "CurrencyCode" => "AUD" + ] + } + "Errors" => null + ] +} + */ + + public function authorizeResponse($request) + { + + $transaction = [ + 'Reference' => $this->eway_driver->client->number, + 'Title' => '', + 'FirstName' => $this->eway_driver->client->contacts()->first()->present()->last_name(), + 'LastName' => $this->eway_driver->client->contacts()->first()->present()->first_name(), + 'CompanyName' => $this->eway_driver->client->name, + 'Street1' => $this->eway_driver->client->address1, + 'Street2' => $this->eway_driver->client->address2, + 'City' => $this->eway_driver->client->city, + 'State' => $this->eway_driver->client->state, + 'PostalCode' => $this->eway_driver->client->postal_code, + 'Country' => $this->eway_driver->client->country->iso_3166_2, + 'Phone' => $this->eway_driver->client->phone, + 'Email' => $this->eway_driver->client->contacts()->first()->email, + "Url" => $this->eway_driver->client->website, + // 'Payment' => [ + // 'TotalAmount' => 0, + // ], + // 'TransactionType' => \Eway\Rapid\Enum\TransactionType::PURCHASE, + 'Method' => \Eway\Rapid\Enum\PaymentMethod::CREATE_TOKEN_CUSTOMER, + 'SecuredCardData' => $request->input('SecuredCardData'), + ]; + + $response = $this->eway_driver->init()->eway->createCustomer(\Eway\Rapid\Enum\ApiMethod::DIRECT, $transaction); + + $response_status = ErrorCode::getStatus($response->ResponseMessage); + + if(!$response_status['success']) + throw new PaymentFailed($response_status['message'], 400); + + //success + $cgt = []; + $cgt['token'] = $response->Customer->TokenCustomerID; + $cgt['payment_method_id'] = GatewayType::CREDIT_CARD; + + $payment_meta = new \stdClass; + $payment_meta->exp_month = $response->Customer->CardDetails->ExpiryMonth; + $payment_meta->exp_year = $response->Customer->CardDetails->ExpiryYear; + $payment_meta->brand = 'CC'; + $payment_meta->last4 = substr($response->Customer->CardDetails->Number, -4);; + $payment_meta->type = GatewayType::CREDIT_CARD; + + $cgt['payment_meta'] = $payment_meta; + + $token = $this->eway_driver->storeGatewayToken($cgt, []); + + return redirect()->route('client.payment_methods.index'); + + } + + public function paymentView($data) + { + + $data['gateway'] = $this->eway_driver; + $data['public_api_key'] = $this->eway_driver->company_gateway->getConfigField('publicApiKey'); + + return render('gateways.eway.pay', $data); + + } + + public function processPaymentResponse($request) + { + + } +} \ No newline at end of file diff --git a/app/PaymentDrivers/Eway/ErrorCode.php b/app/PaymentDrivers/Eway/ErrorCode.php new file mode 100644 index 000000000000..94a0bc138a93 --- /dev/null +++ b/app/PaymentDrivers/Eway/ErrorCode.php @@ -0,0 +1,105 @@ + "Transaction Approved", + "A2008" => "Honour With Identification", + "A2010" => "Approved For Partial Amount", + "A2011" => "Approved, VIP", + "A2016" => "Approved, Update Track 3", + ]; + + private static $failure = [ + "D4401" => "Refer to Issuer", + "D4402" => "Refer to Issuer, special", + "D4403" => "No Merchant", + "D4404" => "Pick Up Card", + "D4405" => "Do Not Honour", + "D4406" => "Error", + "D4407" => "Pick Up Card, Special", + "D4409" => "Request In Progress", + "D4412" => "Invalid Transaction", + "D4413" => "Invalid Amount", + "D4414" => "Invalid Card Number", + "D4415" => "No Issuer", + "D4417" => "3D Secure Error", + "D4419" => "Re-enter Last Transaction", + "D4421" => "No Action Taken", + "D4422" => "Suspected Malfunction", + "D4423" => "Unacceptable Transaction Fee", + "D4425" => "Unable to Locate Record On File", + "D4430" => "Format Error", + "D4431" => "Bank Not Supported By Switch", + "D4433" => "Expired Card, Capture", + "D4434" => "Suspected Fraud, Retain Card", + "D4435" => "Card Acceptor, Contact Acquirer, Retain Card", + "D4436" => "Restricted Card, Retain Card", + "D4437" => "Contact Acquirer Security Department, Retain Card", + "D4438" => "PIN Tries Exceeded, Capture", + "D4439" => "No Credit Account", + "D4440" => "Function Not Supported", + "D4441" => "Lost Card", + "D4442" => "No Universal Account", + "D4443" => "Stolen Card", + "D4444" => "No Investment Account", + "D4450" => "Click-to-Pay (Visa Checkout) Transaction", + "D4451" => "Insufficient Funds", + "D4452" => "No Cheque Account", + "D4453" => "No Savings Account", + "D4454" => "Expired Card", + "D4455" => "Incorrect PIN", + "D4456" => "No Card Record", + "D4457" => "Function Not Permitted to Cardholder", + "D4458" => "Function Not Permitted to Terminal", + "D4459" => "Suspected Fraud", + "D4460" => "Acceptor Contact Acquirer", + "D4461" => "Exceeds Withdrawal Limit", + "D4462" => "Restricted Card", + "D4463" => "Security Violation", + "D4464" => "Original Amount Incorrect", + "D4466" => "Acceptor Contact Acquirer, Security", + "D4467" => "Capture Card", + "D4475" => "PIN Tries Exceeded", + "D4476" => "Invalidate Txn Reference", + "D4481" => "Accumulated Transaction Counter (Amount) Exceeded", + "D4482" => "CVV Validation Error", + "D4483" => "Acquirer Is Not Accepting Transactions From You At This Time", + "D4484" => "Acquirer Is Not Accepting This Transaction", + "D4490" => "Cut off In Progress", + "D4491" => "Card Issuer Unavailable", + "D4492" => "Unable To Route Transaction", + "D4493" => "Cannot Complete, Violation Of The Law", + "D4494" => "Duplicate Transaction", + "D4495" => "Amex Declined", + "D4496" => "System Error", + "D4497" => "MasterPass Error", + "D4498" => "PayPal Create Transaction Error", + "D4499" => "Invalid Transaction for Auth/Void", + ]; + + + public static function getStatus($code) + { + if(array_key_exists($code, self::$success)) + return ['success' => true, 'message' => self::$success[$code]]; + + if(array_key_exists($code, self::$failure)) + return ['success' => false, 'message' => self::$failure[$code]]; + + return ['success' => false, 'message' => "Unknown error message code - {$code}"]; + } +} \ No newline at end of file diff --git a/app/PaymentDrivers/Eway/Token.php b/app/PaymentDrivers/Eway/Token.php new file mode 100644 index 000000000000..1bdbc2ed18a0 --- /dev/null +++ b/app/PaymentDrivers/Eway/Token.php @@ -0,0 +1,111 @@ +eway_driver = $eway_driver; + } + + public function tokenBilling(ClientGatewayToken $cgt, PaymentHash $payment_hash) + { + + $amount = array_sum(array_column($payment_hash->invoices(), 'amount')) + $payment_hash->fee_total; + + $transaction = [ + 'Customer' => [ + 'TokenCustomerID' => $cgt->token, + ], + 'Payment' => [ + 'TotalAmount' => $this->eway_driver->convertAmount($amount), + ], + 'TransactionType' => \Eway\Rapid\Enum\TransactionType::RECURRING, + ]; + + $response = $this->eway_driver->init()->eway->createTransaction(\Eway\Rapid\Enum\ApiMethod::DIRECT, $transaction); + + $response_status = ErrorCode::getStatus($response->ResponseMessage); + + if(!$response_status['success']) + return $this->processUnsuccessfulPayment($response); + + $payment = $this->processSuccessfulPayment($response); + + return $payment; + + } + + + private function processSuccessfulPayment($response) + { + $amount = array_sum(array_column($this->eway_driver->payment_hash->invoices(), 'amount')) + $this->eway_driver->payment_hash->fee_total; + + $data = [ + 'gateway_type_id' => $cgt->gateway_type_id, + 'payment_type' => GatewayType::CREDIT_CARD_OTHER, + 'transaction_reference' => $response->Customer->Reference, + 'amount' => $amount, + ]; + + $payment = $this->eway_driver->createPayment($data); + $payment->meta = $cgt->meta; + $payment->save(); + + $payment_hash->payment_id = $payment->id; + $payment_hash->save(); + + return $payment; + + } + + private function processUnsuccessfulPayment($response) + { + + $response_status = ErrorCode::getStatus($response->ResponseMessage); + + $error = $response_status['message'] + $error_code = $response->ResponseMessage; + + $data = [ + 'response' => $response, + 'error' => $error, + 'error_code' => $error_code, + ]; + + return $this->driver_class->processUnsuccessfulTransaction($data); + + } + +} \ No newline at end of file diff --git a/app/PaymentDrivers/EwayPaymentDriver.php b/app/PaymentDrivers/EwayPaymentDriver.php new file mode 100644 index 000000000000..0c6f15fbfe29 --- /dev/null +++ b/app/PaymentDrivers/EwayPaymentDriver.php @@ -0,0 +1,198 @@ + CreditCard::class, //maps GatewayType => Implementation class + ]; + + const SYSTEM_LOG_TYPE = SystemLog::TYPE_EWAY; //define a constant for your gateway ie TYPE_YOUR_CUSTOM_GATEWAY - set the const in the SystemLog model + + public function init() + { + $apiKey = $this->company_gateway->getConfigField('apiKey'); + $apiPassword = $this->company_gateway->getConfigField('password'); + $apiEndpoint = $this->company_gateway->getConfigField('testMode') ? \Eway\Rapid\Client::MODE_SANDBOX : \Eway\Rapid\Client::MODE_PRODUCTION; + $this->eway = \Eway\Rapid::createClient($apiKey, $apiPassword, $apiEndpoint); + + return $this; + } + + /* Returns an array of gateway types for the payment gateway */ + public function gatewayTypes(): array + { + $types = []; + + $types[] = GatewayType::CREDIT_CARD; + + return $types; + } + + /* Sets the payment method initialized */ + public function setPaymentMethod($payment_method_id) + { + $class = self::$methods[$payment_method_id]; + $this->payment_method = new $class($this); + return $this; + } + + public function authorizeView(array $data) + { + return $this->payment_method->authorizeView($data); + } + + public function authorizeResponse($request) + { + return $this->payment_method->authorizeResponse($request); + } + + public function processPaymentView(array $data) + { + return $this->payment_method->paymentView($data); //this is your custom implementation from here + } + + public function processPaymentResponse($request) + { + return $this->payment_method->paymentResponse($request); //this is your custom implementation from here + } + + public function refund(Payment $payment, $amount, $return_client_response = false) + { + + $refund = [ + 'Refund' => [ + 'TransactionID' => $payment->transaction_reference, + 'TotalAmount' => $this->convertAmount($amount) + ], + ]; + + $response = $this->init()->eway->client->refund($refund); + + $transaction_reference = ''; + $refund_status = true; + $refund_message = ''; + + if ($response->TransactionStatus) { + $transaction_reference = $response->TransactionID; + } else { + if ($response->getErrors()) { + foreach ($response->getErrors() as $error) { + $refund_status = false; + $refund_message = \Eway\Rapid::getMessage($error); + } + } else { + $refund_status = false; + $refund_message 'Sorry, your refund failed'; + } + } + return [ + 'transaction_reference' => $response->TransactionID, + 'transaction_response' => json_encode($response), + 'success' => $refund_status, + 'description' => $refund_message, + 'code' => '', + ]; + } + + public function tokenBilling(ClientGatewayToken $cgt, PaymentHash $payment_hash) + { + return (new Token($this))->tokenBilling($cgt, $payment_hash); + } + + public function processWebhookRequest(PaymentWebhookRequest $request, Payment $payment = null) + { + } + + public function convertAmount($amount) + { + $precision = $this->client->currency()->precision; + + if($precision == 0) + return $amount; + + if($precision == 1) + return $amount*10; + + if$precision == 2) + return $amount*100; + + + return $amount; + } + + public function getClientRequiredFields(): array + { + $fields = []; + $fields[] = ['name' => 'contact_first_name', 'label' => ctrans('texts.first_name'), 'type' => 'text', 'validation' => 'required']; + $fields[] = ['name' => 'contact_last_name', 'label' => ctrans('texts.last_name'), 'type' => 'text', 'validation' => 'required']; + $fields[] = ['name' => 'contact_email', 'label' => ctrans('texts.email'), 'type' => 'text', 'validation' => 'required,email:rfc']; + $fields[] = ['name' => 'client_country_id', 'label' => ctrans('texts.country'), 'type' => 'text', 'validation' => 'required']; + + if ($this->company_gateway->require_client_name) { + $fields[] = ['name' => 'client_name', 'label' => ctrans('texts.client_name'), 'type' => 'text', 'validation' => 'required']; + } + + // if ($this->company_gateway->require_contact_name) { + // } + + // if ($this->company_gateway->require_contact_email) { + // } + + if ($this->company_gateway->require_client_phone) { + $fields[] = ['name' => 'client_phone', 'label' => ctrans('texts.client_phone'), 'type' => 'tel', 'validation' => 'required']; + } + + if ($this->company_gateway->require_billing_address) { + $fields[] = ['name' => 'client_address_line_1', 'label' => ctrans('texts.address1'), 'type' => 'text', 'validation' => 'required']; + $fields[] = ['name' => 'client_city', 'label' => ctrans('texts.city'), 'type' => 'text', 'validation' => 'required']; + $fields[] = ['name' => 'client_state', 'label' => ctrans('texts.state'), 'type' => 'text', 'validation' => 'required']; + } + + if($this->company_gateway->require_postal_code) + $fields[] = ['name' => 'client_postal_code', 'label' => ctrans('texts.postal_code'), 'type' => 'text', 'validation' => 'required']; + + if ($this->company_gateway->require_shipping_address) { + $fields[] = ['name' => 'client_shipping_address_line_1', 'label' => ctrans('texts.shipping_address1'), 'type' => 'text', 'validation' => 'required']; + $fields[] = ['name' => 'client_shipping_city', 'label' => ctrans('texts.shipping_city'), 'type' => 'text', 'validation' => 'required']; + $fields[] = ['name' => 'client_shipping_state', 'label' => ctrans('texts.shipping_state'), 'type' => 'text', 'validation' => 'required']; + $fields[] = ['name' => 'client_shipping_postal_code', 'label' => ctrans('texts.shipping_postal_code'), 'type' => 'text', 'validation' => 'required']; + $fields[] = ['name' => 'client_shipping_country_id', 'label' => ctrans('texts.shipping_country'), 'type' => 'text', 'validation' => 'required']; + } + + + return $fields; + } +} diff --git a/app/PaymentDrivers/Sample/CreditCard.php b/app/PaymentDrivers/Sample/CreditCard.php new file mode 100644 index 000000000000..44c404ae2611 --- /dev/null +++ b/app/PaymentDrivers/Sample/CreditCard.php @@ -0,0 +1,113 @@ +driver_class = $driver_class; + } + + public function authorizeView($data) + { + + } + + public function authorizeRequest($request) + { + + } + + public function paymentView($data) + { + + } + + public function processPaymentResponse($request) + { + + } + + /* This method is stubbed ready to go - you just need to harvest the equivalent 'transaction_reference' */ + private function processSuccessfulPayment($response) + { + $amount = array_sum(array_column($this->driver_class->payment_hash->invoices(), 'amount')) + $this->driver_class->payment_hash->fee_total; + + $payment_record = []; + $payment_record['amount'] = $amount; + $payment_record['payment_type'] = PaymentType::CREDIT_CARD_OTHER; + $payment_record['gateway_type_id'] = GatewayType::CREDIT_CARD; + // $payment_record['transaction_reference'] = $response->transaction_id; + + $payment = $this->driver_class->createPayment($payment_record, Payment::STATUS_COMPLETED); + + return redirect()->route('client.payments.show', ['payment' => $this->encodePrimaryKey($payment->id)]); + + } + + private function processUnsuccessfulPayment($response) + { + /*Harvest your own errors here*/ + // $error = $response->status_message; + + // if(property_exists($response, 'approval_message') && $response->approval_message) + // $error .= " - {$response->approval_message}"; + + // $error_code = property_exists($response, 'approval_message') ? $response->approval_message : 'Undefined code'; + + $data = [ + 'response' => $response, + 'error' => $error, + 'error_code' => $error_code, + ]; + + return $this->driver_class->processUnsuccessfulTransaction($data); + + } + + + /* Helpers */ + + /* + You will need some helpers to handle successful and unsuccessful responses + + Some considerations after a succesful transaction include: + + Logging of events: success +/- failure + Recording a payment + Notifications + */ + + + + +} \ No newline at end of file diff --git a/app/PaymentDrivers/DriverTemplate.php b/app/PaymentDrivers/Sample/PaymentDriver.php similarity index 89% rename from app/PaymentDrivers/DriverTemplate.php rename to app/PaymentDrivers/Sample/PaymentDriver.php index 36c0f9bf5b72..401ceec3aed9 100644 --- a/app/PaymentDrivers/DriverTemplate.php +++ b/app/PaymentDrivers/Sample/PaymentDriver.php @@ -17,10 +17,9 @@ use App\Models\GatewayType; use App\Models\Payment; use App\Models\PaymentHash; use App\Models\SystemLog; -use App\PaymentDrivers\Stripe\CreditCard; use App\Utils\Traits\MakesHash; -class DriverTemplate extends BaseDriver +class PaymentDriver extends BaseDriver { use MakesHash; @@ -85,12 +84,12 @@ class DriverTemplate extends BaseDriver public function refund(Payment $payment, $amount, $return_client_response = false) { - return $this->payment_method->yourRefundImplementationHere(); //this is your custom implementation from here + //this is your custom implementation from here } public function tokenBilling(ClientGatewayToken $cgt, PaymentHash $payment_hash) { - return $this->payment_method->yourTokenBillingImplmentation(); //this is your custom implementation from here + //this is your custom implementation from here } public function processWebhookRequest(PaymentWebhookRequest $request, Payment $payment = null) diff --git a/app/PaymentDrivers/Sample/resources/authorize.blade.php b/app/PaymentDrivers/Sample/resources/authorize.blade.php new file mode 100644 index 000000000000..74773c67172a --- /dev/null +++ b/app/PaymentDrivers/Sample/resources/authorize.blade.php @@ -0,0 +1,34 @@ +@extends('portal.ninja2020.layout.payments', ['gateway_title' => ctrans('texts.credit_card'), 'card_title' => ctrans('texts.credit_card')]) + +@section('gateway_head') +@endsection + +@section('gateway_content') +
+ + @if(!Request::isSecure()) +

{{ ctrans('texts.https_required') }}

+ @endif + + + + + @component('portal.ninja2020.components.general.card-element', ['title' => ctrans('texts.method')]) + {{ ctrans('texts.credit_card') }} + @endcomponent + +
+ +
+ +
+@endsection + +@section('gateway_footer') + +@endsection diff --git a/app/PaymentDrivers/Sample/resources/pay.blade.php b/app/PaymentDrivers/Sample/resources/pay.blade.php new file mode 100644 index 000000000000..4f8841bca6bb --- /dev/null +++ b/app/PaymentDrivers/Sample/resources/pay.blade.php @@ -0,0 +1,64 @@ +@extends('portal.ninja2020.layout.payments', ['gateway_title' => ctrans('texts.credit_card'), 'card_title' => ctrans('texts.credit_card')]) + +@section('gateway_head') +@endsection + +@section('gateway_content') +
+ + + + + @component('portal.ninja2020.components.general.card-element', ['title' => ctrans('texts.method')]) + {{ ctrans('texts.credit_card') }} + @endcomponent + + @include('portal.ninja2020.gateways.includes.payment_details') + + <-- If there are existing tokens available these are displayed here for you --> + @component('portal.ninja2020.components.general.card-element', ['title' => ctrans('texts.pay_with')]) + @if(count($tokens) > 0) + @foreach($tokens as $token) + + @endforeach + @endisset + + + @endcomponent + + + @include('portal.ninja2020.gateways.includes.save_card') + + + @include('portal.ninja2020.gateways.wepay.includes.credit_card') + + @include('portal.ninja2020.gateways.includes.pay_now') + +
+@endsection + +@section('gateway_footer') + +@endsection + diff --git a/composer.json b/composer.json index 151dd8239ab6..9eb6220ab516 100644 --- a/composer.json +++ b/composer.json @@ -41,6 +41,7 @@ "codedge/laravel-selfupdater": "^3.2", "composer/composer": "^2", "doctrine/dbal": "^2.10", + "eway/eway-rapid-php": "^1.3", "fakerphp/faker": "^1.14", "fideloper/proxy": "^4.2", "fruitcake/laravel-cors": "^2.0", diff --git a/composer.lock b/composer.lock index 15b58365b9a7..243a75a5c5d6 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d2beb37ff5fbee59ad4bb792e944eb10", + "content-hash": "c9f7d76428c6f556ae531570b7761bf5", "packages": [ { "name": "asm/php-ansible", @@ -1964,6 +1964,62 @@ ], "time": "2020-12-29T14:50:06+00:00" }, + { + "name": "eway/eway-rapid-php", + "version": "v1.3.4", + "source": { + "type": "git", + "url": "https://github.com/eWAYPayment/eway-rapid-php.git", + "reference": "5b765d83ef69e1783f391ae85aed48d47dd5f8eb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/eWAYPayment/eway-rapid-php/zipball/5b765d83ef69e1783f391ae85aed48d47dd5f8eb", + "reference": "5b765d83ef69e1783f391ae85aed48d47dd5f8eb", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "internations/http-mock": "~0.7", + "jeremeamia/superclosure": "1.0.2", + "phpdocumentor/phpdocumentor": "~2.8", + "phpunit/phpunit": "4.8.*", + "squizlabs/php_codesniffer": "2.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Eway\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "eWAY", + "homepage": "https://www.eway.com.au" + } + ], + "description": "eWAY Rapid PHP library", + "homepage": "https://www.eway.com.au", + "keywords": [ + "eway", + "payment processing", + "payments", + "rapid" + ], + "support": { + "issues": "https://github.com/eWAYPayment/eway-rapid-php/issues", + "source": "https://github.com/eWAYPayment/eway-rapid-php/tree/master" + }, + "time": "2016-09-12T05:46:41+00:00" + }, { "name": "fakerphp/faker", "version": "v1.15.0", @@ -14881,5 +14937,5 @@ "platform-dev": { "php": "^7.3|^7.4|^8.0" }, - "plugin-api-version": "2.1.0" + "plugin-api-version": "2.0.0" } diff --git a/database/migrations/2021_07_21_234227_activate_eway_payment_driver.php b/database/migrations/2021_07_21_234227_activate_eway_payment_driver.php new file mode 100644 index 000000000000..a0fc56152ddd --- /dev/null +++ b/database/migrations/2021_07_21_234227_activate_eway_payment_driver.php @@ -0,0 +1,40 @@ +visible = true; + $eway->provider = 'Eway'; + + $fields = json_decode($eway->fields); + $fields->publicApiKey = ''; + $eway->fields = json_encode($fields); + + $eway->save(); + } + + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } +} diff --git a/database/seeders/PaymentLibrariesSeeder.php b/database/seeders/PaymentLibrariesSeeder.php index b9ff0f84146f..d641f5fdf0f8 100644 --- a/database/seeders/PaymentLibrariesSeeder.php +++ b/database/seeders/PaymentLibrariesSeeder.php @@ -27,7 +27,7 @@ class PaymentLibrariesSeeder extends Seeder '], ['id' => 2, 'name' => 'CardSave', 'provider' => 'CardSave', 'key' => '46c5c1fed2c43acf4f379bae9c8b9f76', 'fields' => '{"merchantId":"","password":""} '], - ['id' => 3, 'name' => 'Eway Rapid', 'provider' => 'Eway_RapidShared', 'is_offsite' => true, 'key' => '944c20175bbe6b9972c05bcfe294c2c7', 'fields' => '{"apiKey":"","password":"","testMode":false}'], + ['id' => 3, 'name' => 'Eway Rapid', 'provider' => 'Eway', 'is_offsite' => true, 'key' => '944c20175bbe6b9972c05bcfe294c2c7', 'fields' => '{"apiKey":"","password":"","publicApiKey":"","testMode":false}'], ['id' => 4, 'name' => 'FirstData Connect', 'provider' => 'FirstData_Connect', 'key' => '4e0ed0d34552e6cb433506d1ac03a418', 'fields' => '{"storeId":"","sharedSecret":"","testMode":false}'], ['id' => 5, 'name' => 'Migs ThreeParty', 'provider' => 'Migs_ThreeParty', 'key' => '513cdc81444c87c4b07258bc2858d3fa', 'fields' => '{"merchantId":"","merchantAccessCode":"","secureHash":""}'], ['id' => 6, 'name' => 'Migs TwoParty', 'provider' => 'Migs_TwoParty', 'key' => '99c2a271b5088951334d1302e038c01a', 'fields' => '{"merchantId":"","merchantAccessCode":"","secureHash":""}'], @@ -96,7 +96,7 @@ class PaymentLibrariesSeeder extends Seeder Gateway::query()->update(['visible' => 0]); - Gateway::whereIn('id', [1,15,20,39,55,50])->update(['visible' => 1]); + Gateway::whereIn('id', [1,3,15,20,39,55,50])->update(['visible' => 1]); if (Ninja::isHosted()) { Gateway::whereIn('id', [20])->update(['visible' => 0]); diff --git a/resources/views/portal/ninja2020/gateways/eway/authorize.blade.php b/resources/views/portal/ninja2020/gateways/eway/authorize.blade.php new file mode 100644 index 000000000000..cd41a3b9a283 --- /dev/null +++ b/resources/views/portal/ninja2020/gateways/eway/authorize.blade.php @@ -0,0 +1,57 @@ +@extends('portal.ninja2020.layout.payments', ['gateway_title' => ctrans('texts.credit_card'), 'card_title' => +ctrans('texts.credit_card')]) + +@section('gateway_head') +@endsection + +@section('gateway_content') +
+ @csrf + + + + + + @if (!Request::isSecure()) +

{{ ctrans('texts.https_required') }}

+ @endif + + + + + @component('portal.ninja2020.components.general.card-element', ['title' => ctrans('texts.method')]) + {{ ctrans('texts.credit_card') }} + @endcomponent + +
+ + @component('portal.ninja2020.gateways.includes.pay_now', ['id' => 'authorize-card']) + {{ ctrans('texts.add_payment_method') }} + @endcomponent +
+@endsection + +@section('gateway_footer') + + + +@include('portal.ninja2020.gateways.eway.includes.credt_card') + + +@endsection diff --git a/resources/views/portal/ninja2020/gateways/eway/includes/credit_card.blade.php b/resources/views/portal/ninja2020/gateways/eway/includes/credit_card.blade.php new file mode 100644 index 000000000000..3d2730fcf759 --- /dev/null +++ b/resources/views/portal/ninja2020/gateways/eway/includes/credit_card.blade.php @@ -0,0 +1,289 @@ + \ No newline at end of file diff --git a/resources/views/portal/ninja2020/gateways/eway/pay.blade.php b/resources/views/portal/ninja2020/gateways/eway/pay.blade.php new file mode 100644 index 000000000000..e58ffcabc759 --- /dev/null +++ b/resources/views/portal/ninja2020/gateways/eway/pay.blade.php @@ -0,0 +1,94 @@ +@extends('portal.ninja2020.layout.payments', ['gateway_title' => ctrans('texts.credit_card'), 'card_title' => ctrans('texts.credit_card')]) + +@section('gateway_head') +@endsection + +@section('gateway_content') +
+ @csrf + + + + + + +
+ + + + @component('portal.ninja2020.components.general.card-element', ['title' => ctrans('texts.payment_type')]) + {{ ctrans('texts.credit_card') }} + @endcomponent + + @include('portal.ninja2020.gateways.includes.payment_details') + + @component('portal.ninja2020.components.general.card-element', ['title' => ctrans('texts.pay_with')]) + @if(count($tokens) > 0) + @foreach($tokens as $token) + + @endforeach + @endisset + + + @endcomponent + +
+ + + @include('portal.ninja2020.gateways.includes.save_card') +
+ + + + @include('portal.ninja2020.gateways.includes.pay_now') +@endsection + +@section('gateway_footer') + + @include('portal.ninja2020.gateways.eway.includes.credit_card') + + + + + +@endsection