diff --git a/app/Http/Controllers/PaymentController.php b/app/Http/Controllers/PaymentController.php index b23f0cb7b7ab..13101a7dc0ca 100644 --- a/app/Http/Controllers/PaymentController.php +++ b/app/Http/Controllers/PaymentController.php @@ -482,49 +482,7 @@ class PaymentController extends BaseController } if ($response->isSuccessful()) { - $last4 = null; - $expiration = null; - $card_type_id = null; - - if (!empty($details['card'])) { - $card = $details['card']; - $last4 = substr($card->number, -4); - $year = $card->expiryYear; - if (strlen($year) == 2) { - $year = '20' . $year; - } - - $expiration = $year . '-' . $card->expiryMonth . '-00'; - $card_type_id = $this->detectCardType($card->number); - } - - if ($accountGateway->gateway_id == GATEWAY_STRIPE) { - $card = $response->getSource(); - if (!$card) { - $card = $response->getCard(); - } - - if ($card) { - $last4 = $card['last4']; - $expiration = $card['exp_year'] . '-' . $card['exp_month'] . '-00'; - $stripe_card_types = array( - 'Visa' => CARD_VISA, - 'American Express' => CARD_AMERICAN_EXPRESS, - 'MasterCard' => CARD_MASTERCARD, - 'Discover' => CARD_DISCOVER, - 'JCB' => CARD_JCB, - 'Diners Club' => CARD_DINERS_CLUB - ); - - if (!empty($stripe_card_types[$card['brand']])) { - $card_type_id = $stripe_card_types[$card['brand']]; - } else { - $card_type_id = CARD_UNKNOWN; - } - } - } - - $payment = $this->paymentService->createPayment($invitation, $accountGateway, $ref, null, $last4, $expiration, $card_type_id); + $payment = $this->paymentService->createPayment($invitation, $accountGateway, $ref, null, $details, $response); Session::flash('message', trans('texts.applied_payment')); if ($account->account_key == NINJA_ACCOUNT_KEY) { @@ -557,24 +515,6 @@ class PaymentController extends BaseController } } } - - private function detectCardType($number) - { - if (preg_match('/^3[47][0-9]{13}$/',$number)) { - return CARD_AMERICAN_EXPRESS; - } elseif (preg_match('/^3(?:0[0-5]|[68][0-9])[0-9]{11}$/',$number)) { - return CARD_DINERS_CLUB; - } elseif (preg_match('/^6(?:011|5[0-9][0-9])[0-9]{12}$/',$number)) { - return CARD_DISCOVER; - } elseif (preg_match('/^(?:2131|1800|35\d{3})\d{11}$/',$number)) { - return CARD_JCB; - } elseif (preg_match('/^5[1-5][0-9]{14}$/',$number)) { - return CARD_MASTERCARD; - } elseif (preg_match('/^4[0-9]{12}(?:[0-9]{3})?$/',$number)) { - return CARD_VISA; - } - return CARD_UNKNOWN; - } public function offsite_payment() { @@ -637,7 +577,7 @@ class PaymentController extends BaseController if ($response->isCancelled()) { // do nothing } elseif ($response->isSuccessful()) { - $payment = $this->paymentService->createPayment($invitation, $accountGateway, $ref, $payerId); + $payment = $this->paymentService->createPayment($invitation, $accountGateway, $ref, $payerId, $details, $purchaseResponse); Session::flash('message', trans('texts.applied_payment')); } else { $this->error('offsite', $response->getMessage(), $accountGateway); diff --git a/app/Http/Controllers/PublicClientController.php b/app/Http/Controllers/PublicClientController.php index 085098827e1b..66aa0f618fa0 100644 --- a/app/Http/Controllers/PublicClientController.php +++ b/app/Http/Controllers/PublicClientController.php @@ -344,7 +344,7 @@ class PublicClientController extends BaseController ->addColumn('payment_source', function ($model) { if (!$model->card_type_code) return ''; $card_type = trans("texts.card_" . $model->card_type_code); - $expiration = trans('texts.card_expiration', array('expires'=>Utils::fromSqlDate($model->expiration, false)->format('m/d'))); + $expiration = trans('texts.card_expiration', array('expires'=>Utils::fromSqlDate($model->expiration, false)->format('m/y'))); return ''.htmlentities($card_type).'  •••'.$model->last4.' '.$expiration; }) ->addColumn('amount', function ($model) { return Utils::formatMoney($model->amount, $model->currency_id, $model->country_id); }) diff --git a/app/Services/PaymentService.php b/app/Services/PaymentService.php index 7756071348ca..40eb61685a54 100644 --- a/app/Services/PaymentService.php +++ b/app/Services/PaymentService.php @@ -214,7 +214,7 @@ class PaymentService extends BaseService return $token; } - public function createPayment($invitation, $accountGateway, $ref, $payerId = null, $last4 = null, $expiration = null, $card_type_id = null, $routing_number = null) + public function createPayment($invitation, $accountGateway, $ref, $payerId = null, $paymentDetails = null, $purchaseResponse = null) { $invoice = $invitation->invoice; @@ -227,10 +227,44 @@ class PaymentService extends BaseService $payment->contact_id = $invitation->contact_id; $payment->transaction_reference = $ref; $payment->payment_date = date_create()->format('Y-m-d'); - $payment->last4 = $last4; - $payment->expiration = $expiration; - $payment->card_type_id = $card_type_id; - $payment->routing_number = $routing_number; + + if (!empty($paymentDetails['card'])) { + $card = $paymentDetails['card']; + $payment->last4 = substr($card->number, -4); + $year = $card->expiryYear; + if (strlen($year) == 2) { + $year = '20' . $year; + } + + $payment->expiration = $year . '-' . $card->expiryMonth . '-00'; + $payment->card_type_id = $this->detectCardType($card->number); + } + + if ($accountGateway->gateway_id == GATEWAY_STRIPE) { + $card = $purchaseResponse->getSource(); + if (!$card) { + $card = $purchaseResponse->getCard(); + } + + if ($card) { + $payment->last4 = $card['last4']; + $payment->expiration = $card['exp_year'] . '-' . $card['exp_month'] . '-00'; + $stripe_card_types = array( + 'Visa' => CARD_VISA, + 'American Express' => CARD_AMERICAN_EXPRESS, + 'MasterCard' => CARD_MASTERCARD, + 'Discover' => CARD_DISCOVER, + 'JCB' => CARD_JCB, + 'Diners Club' => CARD_DINERS_CLUB + ); + + if (!empty($stripe_card_types[$card['brand']])) { + $payment->card_type_id = $stripe_card_types[$card['brand']]; + } else { + $payment->card_type_id = CARD_UNKNOWN; + } + } + } if ($payerId) { $payment->payer_id = $payerId; @@ -293,6 +327,24 @@ class PaymentService extends BaseService return $payment; } + + private function detectCardType($number) + { + if (preg_match('/^3[47][0-9]{13}$/',$number)) { + return CARD_AMERICAN_EXPRESS; + } elseif (preg_match('/^3(?:0[0-5]|[68][0-9])[0-9]{11}$/',$number)) { + return CARD_DINERS_CLUB; + } elseif (preg_match('/^6(?:011|5[0-9][0-9])[0-9]{12}$/',$number)) { + return CARD_DISCOVER; + } elseif (preg_match('/^(?:2131|1800|35\d{3})\d{11}$/',$number)) { + return CARD_JCB; + } elseif (preg_match('/^5[1-5][0-9]{14}$/',$number)) { + return CARD_MASTERCARD; + } elseif (preg_match('/^4[0-9]{12}(?:[0-9]{3})?$/',$number)) { + return CARD_VISA; + } + return CARD_UNKNOWN; + } public function completePurchase($gateway, $accountGateway, $details, $token) { @@ -328,7 +380,7 @@ class PaymentService extends BaseService if ($response->isSuccessful()) { $ref = $response->getTransactionReference(); - return $this->createPayment($invitation, $accountGateway, $ref); + return $this->createPayment($invitation, $accountGateway, $ref, $details, $response); } else { return false; } @@ -387,7 +439,7 @@ class PaymentService extends BaseService function ($model) { if (!$model->card_type_code) return ''; $card_type = trans("texts.card_" . $model->card_type_code); - $expiration = trans('texts.card_expiration', array('expires'=>Utils::fromSqlDate($model->expiration, false)->format('m/d'))); + $expiration = trans('texts.card_expiration', array('expires'=>Utils::fromSqlDate($model->expiration, false)->format('m/y'))); return ''.htmlentities($card_type).'  •••'.$model->last4.' '.$expiration; } ],