From 121954068cd09b7a9aa9f4ebea689dfc8bfa4472 Mon Sep 17 00:00:00 2001 From: Aulia Hakiem Date: Fri, 8 Jan 2021 09:40:07 +0700 Subject: [PATCH 01/11] implement for oc 3 and 2.3 --- .../controller/extension/payment/xendit.php | 7 +- .../controller/extension/payment/xenditcc.php | 71 +++++++++++++++---- .../extension/payment/xendit_failed.tpl | 1 + .../controller/extension/payment/xendit.php | 7 +- .../controller/extension/payment/xenditcc.php | 63 +++++++++++++--- .../extension/payment/xendit_failed.twig | 1 + 6 files changed, 128 insertions(+), 22 deletions(-) diff --git a/opencart2.3.x/upload/catalog/controller/extension/payment/xendit.php b/opencart2.3.x/upload/catalog/controller/extension/payment/xendit.php index 65ff76b..73b5799 100644 --- a/opencart2.3.x/upload/catalog/controller/extension/payment/xendit.php +++ b/opencart2.3.x/upload/catalog/controller/extension/payment/xendit.php @@ -51,7 +51,12 @@ public function process_payment() { $response = Xendit::request($request_url, Xendit::METHOD_POST, $request_payload, $request_options); if (isset($response['error_code'])) { - $json['error'] = $response['message']; + $message = $response['message']; + + if (isset($response['code'])) { + $message .= ". Code: " . $response['code']; + } + $json['error'] = $message; } else { $this->model_extension_payment_xendit->addOrder($order, $response, $this->config->get('xendit_environment'), 'invoice'); diff --git a/opencart2.3.x/upload/catalog/controller/extension/payment/xenditcc.php b/opencart2.3.x/upload/catalog/controller/extension/payment/xenditcc.php index 9049272..946658d 100644 --- a/opencart2.3.x/upload/catalog/controller/extension/payment/xenditcc.php +++ b/opencart2.3.x/upload/catalog/controller/extension/payment/xenditcc.php @@ -10,12 +10,10 @@ public function index() { $api_key = $this->get_api_key(); - $data['environment'] = $this->config->get('xendit_environment'); + $data['environment'] = $this->config->get('payment_xendit_environment'); $data['text_instructions'] = $this->language->get('text_instructions'); $data['text_test_instructions'] = $this->language->get('text_test_instructions'); $data['xendit_public_key'] = $api_key['public_key']; - $data['button_confirm'] = $this->language->get('button_confirm'); - $data['text_loading'] = $this->language->get('text_loading'); return $this->load->view('extension/payment/xenditcc', $data); } @@ -52,9 +50,16 @@ public function process_payment() { $response = Xendit::request($request_url, Xendit::METHOD_POST, $request_payload, $request_options); if (isset($response['error_code'])) { - $json['error'] = 'Failed to authenticate, please try again.'; + $message = $response['message']; + + if (isset($response['code'])) { + $message .= ". Code: " . $response['code']; + } + $json['error'] = $message; } else { + $response['external_id'] = $request_payload['external_id']; //original response doesn't return external_id + $message = 'Authentication ID: ' . $response['id'] . '. Authenticating..'; $this->model_checkout_order->addOrderHistory( $order_id, @@ -66,7 +71,7 @@ public function process_payment() { $json['redirect'] = $response['redirect']['url']; } - + $this->response->addHeader('Content-Type: application/json'); $this->response->setOutput(json_encode($json)); } catch (Exception $e) { @@ -89,10 +94,10 @@ public function process_3ds() { Xendit::set_public_key($api_key['public_key']); if (!isset($this->request->get['hosted_3ds_id'])) { - $message = 'Empty authentication. Cancelling order.'; + $message = $this->map_failure_reason('AUTHENTICATION_FAILED'); $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('extension/payment/xenditcc/failure'); + $redir_url = $this->url->link('extension/payment/xenditcc/failure/?message=' . urlencode($message)); $this->response->redirect($redir_url); return; } @@ -110,16 +115,19 @@ public function process_3ds() { ); if (isset($hosted_3ds['error_code'])) { - $redir_url = $this->url->link('extension/payment/xenditcc/failure'); + $message = $this->map_failure_reason('AUTHENTICATION_FAILED'); + $this->cancel_order($order_id, $message); + + $redir_url = $this->url->link('extension/payment/xenditcc/failure/?message=' . urlencode($message)); $this->response->redirect($redir_url); return; } if ('VERIFIED' !== $hosted_3ds['status']) { - $message = 'Authentication failed. Cancelling order.'; + $message = $this->map_failure_reason('AUTHENTICATION_FAILED'); $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('extension/payment/xenditcc/failure'); + $redir_url = $this->url->link('extension/payment/xenditcc/failure/?message=' . urlencode($message)); $this->response->redirect($redir_url); return; } @@ -145,6 +153,19 @@ public function process_3ds() { ) ); + if (isset($charge['error_code'])) { + $message = $charge['message']; + + if (isset($charge['code'])) { + $message .= ". Code: " . $charge['code']; + } + $this->cancel_order($order_id, $message); + + $redir_url = $this->url->link('extension/payment/xenditcc/failure/?message=' . urlencode($message)); + $this->response->redirect($redir_url); + return; + } + $this->process_order($charge, $order_id); } catch (Exception $e) { $redir_url = $this->url->link('extension/payment/xenditcc/failure'); @@ -159,6 +180,7 @@ public function failure() { $this->document->setTitle($this->language->get('heading_title')); $data['heading_title'] = $this->language->get('heading_title'); $data['text_failure'] = $this->language->get('text_failure'); + $data['message'] = isset($this->request->get['message']) ? $this->request->get['message'] : 'We encountered an issue while processing the checkout. Please contact us. Code: 100007'; $data['column_left'] = $this->load->controller('common/column_left'); $data['column_right'] = $this->load->controller('common/column_right'); @@ -173,10 +195,10 @@ public function failure() { private function process_order($charge, $order_id) { if ($charge['status'] !== 'CAPTURED') { - $message = 'Charge failed. Cancelling order. Charge id: ' . $charge['id']; + $message = $this->map_failure_reason($charge['failure_reason']); $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('extension/payment/xenditcc/failure'); + $redir_url = $this->url->link('extension/payment/xenditcc/failure/?message=' . urlencode($message)); $this->response->redirect($redir_url); return; } @@ -221,4 +243,29 @@ private function get_api_key() { ); } } + + private function map_failure_reason($failure_reason) { + $card_declined_reason = 'Card declined by the issuer bank. Please try with another card or contact the bank directly.'; + switch ($failure_reason) { + case 'CARD_DECLINED': + return $card_declined_reason . ' Code: 200011'; + case 'STOLEN_CARD': + return $card_declined_reason . ' Code: 200013'; + case 'INSUFFICIENT_BALANCE': + return 'Card declined due to insufficient balance. Ensure sufficient balance is available, or try another card. Code: 200012'; + case 'INVALID_CVN': + return 'Card declined due to incorrect card details. Please try again. Code: 200015'; + case 'INACTIVE_CARD': + return $card_declined_reason . ' Code: 200014'; + case 'EXPIRED_CARD': + return 'Card declined due to expiration. Please try again with another card. Code: 200010'; + case 'PROCESSOR_ERROR': + return 'We encountered an issue while processing the checkout. Please try again. Code: 200009'; + case 'AUTHENTICATION_FAILED': + return 'The authentication process failed. Please try again. Code: 200001'; + case 'UNEXPECTED_PLUGIN_ISSUE': + return 'We encountered an issue processing your checkout, please contact us. Code: 100007'; + default: return $failure_reason; + } + } } \ No newline at end of file diff --git a/opencart2.3.x/upload/catalog/view/theme/default/template/extension/payment/xendit_failed.tpl b/opencart2.3.x/upload/catalog/view/theme/default/template/extension/payment/xendit_failed.tpl index ea14541..6cb7ead 100644 --- a/opencart2.3.x/upload/catalog/view/theme/default/template/extension/payment/xendit_failed.tpl +++ b/opencart2.3.x/upload/catalog/view/theme/default/template/extension/payment/xendit_failed.tpl @@ -2,6 +2,7 @@

Xendit payment failed!

+

diff --git a/opencart3.0.x/upload/catalog/controller/extension/payment/xendit.php b/opencart3.0.x/upload/catalog/controller/extension/payment/xendit.php index a1e3c16..6b18bc1 100644 --- a/opencart3.0.x/upload/catalog/controller/extension/payment/xendit.php +++ b/opencart3.0.x/upload/catalog/controller/extension/payment/xendit.php @@ -51,7 +51,12 @@ public function process_payment() { $response = Xendit::request($request_url, Xendit::METHOD_POST, $request_payload, $request_options); if (isset($response['error_code'])) { - $json['error'] = $response['message']; + $message = $response['message']; + + if (isset($response['code'])) { + $message .= ". Code: " . $response['code']; + } + $json['error'] = $message; } else { $this->model_extension_payment_xendit->addOrder($order, $response, $this->config->get('payment_xendit_environment'), 'invoice'); diff --git a/opencart3.0.x/upload/catalog/controller/extension/payment/xenditcc.php b/opencart3.0.x/upload/catalog/controller/extension/payment/xenditcc.php index 042a7e7..bb084c0 100644 --- a/opencart3.0.x/upload/catalog/controller/extension/payment/xenditcc.php +++ b/opencart3.0.x/upload/catalog/controller/extension/payment/xenditcc.php @@ -50,7 +50,12 @@ public function process_payment() { $response = Xendit::request($request_url, Xendit::METHOD_POST, $request_payload, $request_options); if (isset($response['error_code'])) { - $json['error'] = 'Failed to authenticate, please try again.'; + $message = $response['message']; + + if (isset($response['code'])) { + $message .= ". Code: " . $response['code']; + } + $json['error'] = $message; } else { $response['external_id'] = $request_payload['external_id']; //original response doesn't return external_id @@ -89,10 +94,10 @@ public function process_3ds() { Xendit::set_public_key($api_key['public_key']); if (!isset($this->request->get['hosted_3ds_id'])) { - $message = 'Empty authentication. Cancelling order.'; + $message = $this->map_failure_reason('AUTHENTICATION_FAILED'); $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('extension/payment/xenditcc/failure'); + $redir_url = $this->url->link('extension/payment/xenditcc/failure/?message=' . urlencode($message)); $this->response->redirect($redir_url); return; } @@ -110,16 +115,19 @@ public function process_3ds() { ); if (isset($hosted_3ds['error_code'])) { - $redir_url = $this->url->link('extension/payment/xenditcc/failure'); + $message = $this->map_failure_reason('AUTHENTICATION_FAILED'); + $this->cancel_order($order_id, $message); + + $redir_url = $this->url->link('extension/payment/xenditcc/failure/?message=' . urlencode($message)); $this->response->redirect($redir_url); return; } if ('VERIFIED' !== $hosted_3ds['status']) { - $message = 'Authentication failed. Cancelling order.'; + $message = $this->map_failure_reason('AUTHENTICATION_FAILED'); $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('extension/payment/xenditcc/failure'); + $redir_url = $this->url->link('extension/payment/xenditcc/failure/?message=' . urlencode($message)); $this->response->redirect($redir_url); return; } @@ -145,6 +153,19 @@ public function process_3ds() { ) ); + if (isset($charge['error_code'])) { + $message = $charge['message']; + + if (isset($charge['code'])) { + $message .= ". Code: " . $charge['code']; + } + $this->cancel_order($order_id, $message); + + $redir_url = $this->url->link('extension/payment/xenditcc/failure/?message=' . urlencode($message)); + $this->response->redirect($redir_url); + return; + } + $this->process_order($charge, $order_id); } catch (Exception $e) { $redir_url = $this->url->link('extension/payment/xenditcc/failure'); @@ -159,6 +180,7 @@ public function failure() { $this->document->setTitle($this->language->get('heading_title')); $data['heading_title'] = $this->language->get('heading_title'); $data['text_failure'] = $this->language->get('text_failure'); + $data['message'] = isset($this->request->get['message']) ? $this->request->get['message'] : 'We encountered an issue while processing the checkout. Please contact us. Code: 100007'; $data['column_left'] = $this->load->controller('common/column_left'); $data['column_right'] = $this->load->controller('common/column_right'); @@ -173,10 +195,10 @@ public function failure() { private function process_order($charge, $order_id) { if ($charge['status'] !== 'CAPTURED') { - $message = 'Charge failed. Cancelling order. Charge ID: ' . $charge['id']; + $message = $this->map_failure_reason($charge['failure_reason']); $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('extension/payment/xenditcc/failure'); + $redir_url = $this->url->link('extension/payment/xenditcc/failure/?message=' . urlencode($message)); $this->response->redirect($redir_url); return; } @@ -221,4 +243,29 @@ private function get_api_key() { ); } } + + private function map_failure_reason($failure_reason) { + $card_declined_reason = 'Card declined by the issuer bank. Please try with another card or contact the bank directly.'; + switch ($failure_reason) { + case 'CARD_DECLINED': + return $card_declined_reason . ' Code: 200011'; + case 'STOLEN_CARD': + return $card_declined_reason . ' Code: 200013'; + case 'INSUFFICIENT_BALANCE': + return 'Card declined due to insufficient balance. Ensure sufficient balance is available, or try another card. Code: 200012'; + case 'INVALID_CVN': + return 'Card declined due to incorrect card details. Please try again. Code: 200015'; + case 'INACTIVE_CARD': + return $card_declined_reason . ' Code: 200014'; + case 'EXPIRED_CARD': + return 'Card declined due to expiration. Please try again with another card. Code: 200010'; + case 'PROCESSOR_ERROR': + return 'We encountered an issue while processing the checkout. Please try again. Code: 200009'; + case 'AUTHENTICATION_FAILED': + return 'The authentication process failed. Please try again. Code: 200001'; + case 'UNEXPECTED_PLUGIN_ISSUE': + return 'We encountered an issue processing your checkout, please contact us. Code: 100007'; + default: return $failure_reason; + } + } } \ No newline at end of file diff --git a/opencart3.0.x/upload/catalog/view/theme/default/template/extension/payment/xendit_failed.twig b/opencart3.0.x/upload/catalog/view/theme/default/template/extension/payment/xendit_failed.twig index 55fe14e..5fbd460 100644 --- a/opencart3.0.x/upload/catalog/view/theme/default/template/extension/payment/xendit_failed.twig +++ b/opencart3.0.x/upload/catalog/view/theme/default/template/extension/payment/xendit_failed.twig @@ -2,6 +2,7 @@
{{content_top}}

Xendit payment failed!

{{ text_failure }}

+

{{ message }}

From ceeea63869d63573965add14c062d7bdf706937c Mon Sep 17 00:00:00 2001 From: Aulia Hakiem Date: Fri, 8 Jan 2021 09:48:07 +0700 Subject: [PATCH 02/11] implement for 2.0-2.2 --- .../catalog/controller/payment/xendit.php | 9 ++- .../catalog/controller/payment/xenditcc.php | 64 ++++++++++++++++--- .../template/payment/xendit_failed.tpl | 1 + 3 files changed, 64 insertions(+), 10 deletions(-) diff --git a/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xendit.php b/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xendit.php index 7d2fcef..5575a9d 100644 --- a/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xendit.php +++ b/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xendit.php @@ -60,8 +60,13 @@ public function process_payment() $response = Xendit::request($request_url, Xendit::METHOD_POST, $request_payload, $request_options); if (isset($response['error_code'])) { - $json['error'] = $response['message']; - } + $message = $response['message']; + + if (isset($response['code'])) { + $message .= ". Code: " . $response['code']; + } + $json['error'] = $message; + } else { $this->model_payment_xendit->addOrder($order, $response, $this->config->get('xendit_environment'), 'invoice'); $message = 'Invoice ID: ' . $response['id'] . '. Redirecting..'; diff --git a/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xenditcc.php b/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xenditcc.php index 5894243..5fbe212 100644 --- a/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xenditcc.php +++ b/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xenditcc.php @@ -57,7 +57,12 @@ public function process_payment() { $response = Xendit::request($request_url, Xendit::METHOD_POST, $request_payload, $request_options); if (isset($response['error_code'])) { - $json['error'] = 'Failed to authenticate, please try again.'; + $message = $response['message']; + + if (isset($response['code'])) { + $message .= ". Code: " . $response['code']; + } + $json['error'] = $message; } else { $response['external_id'] = $request_payload['external_id']; @@ -96,10 +101,10 @@ public function process_3ds() { Xendit::set_public_key($api_key['public_key']); if (!isset($this->request->get['hosted_3ds_id'])) { - $message = 'Empty authentication. Cancelling order.'; + $message = $this->map_failure_reason('AUTHENTICATION_FAILED'); $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('payment/xenditcc/failure'); + $redir_url = $this->url->link('payment/xenditcc/failure/?message=' . urlencode($message)); $this->response->redirect($redir_url); return; } @@ -117,16 +122,19 @@ public function process_3ds() { ); if (isset($hosted_3ds['error_code'])) { - $redir_url = $this->url->link('payment/xenditcc/failure'); + $message = $this->map_failure_reason('AUTHENTICATION_FAILED'); + $this->cancel_order($order_id, $message); + + $redir_url = $this->url->link('payment/xenditcc/failure/?message=' . urlencode($message)); $this->response->redirect($redir_url); return; } if ('VERIFIED' !== $hosted_3ds['status']) { - $message = 'Authentication failed. Cancelling order.'; + $message = $this->map_failure_reason('AUTHENTICATION_FAILED'); $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('payment/xenditcc/failure'); + $redir_url = $this->url->link('payment/xenditcc/failure/?message=' . urlencode($message)); $this->response->redirect($redir_url); return; } @@ -152,6 +160,19 @@ public function process_3ds() { ) ); + if (isset($charge['error_code'])) { + $message = $charge['message']; + + if (isset($charge['code'])) { + $message .= ". Code: " . $charge['code']; + } + $this->cancel_order($order_id, $message); + + $redir_url = $this->url->link('extension/payment/xenditcc/failure/?message=' . urlencode($message)); + $this->response->redirect($redir_url); + return; + } + $this->process_order($charge, $order_id); } catch (Exception $e) { $redir_url = $this->url->link('payment/xenditcc/failure'); @@ -166,6 +187,7 @@ public function failure() { $this->document->setTitle($this->language->get('heading_title')); $data['heading_title'] = $this->language->get('heading_title'); $data['text_failure'] = $this->language->get('text_failure'); + $data['message'] = isset($this->request->get['message']) ? $this->request->get['message'] : 'We encountered an issue while processing the checkout. Please contact us. Code: 100007'; $data['column_left'] = $this->load->controller('common/column_left'); $data['column_right'] = $this->load->controller('common/column_right'); @@ -184,9 +206,10 @@ public function failure() { private function process_order($charge, $order_id) { if ($charge['status'] !== 'CAPTURED') { - $message = 'Charge failed. Cancelling order. Charge id: ' . $charge['id']; + $message = $this->map_failure_reason($charge['failure_reason']); $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('payment/xenditcc/failure'); + + $redir_url = $this->url->link('extension/payment/xenditcc/failure/?message=' . urlencode($message)); $this->response->redirect($redir_url); return; } @@ -233,4 +256,29 @@ private function get_api_key() { ); } } + + private function map_failure_reason($failure_reason) { + $card_declined_reason = 'Card declined by the issuer bank. Please try with another card or contact the bank directly.'; + switch ($failure_reason) { + case 'CARD_DECLINED': + return $card_declined_reason . ' Code: 200011'; + case 'STOLEN_CARD': + return $card_declined_reason . ' Code: 200013'; + case 'INSUFFICIENT_BALANCE': + return 'Card declined due to insufficient balance. Ensure sufficient balance is available, or try another card. Code: 200012'; + case 'INVALID_CVN': + return 'Card declined due to incorrect card details. Please try again. Code: 200015'; + case 'INACTIVE_CARD': + return $card_declined_reason . ' Code: 200014'; + case 'EXPIRED_CARD': + return 'Card declined due to expiration. Please try again with another card. Code: 200010'; + case 'PROCESSOR_ERROR': + return 'We encountered an issue while processing the checkout. Please try again. Code: 200009'; + case 'AUTHENTICATION_FAILED': + return 'The authentication process failed. Please try again. Code: 200001'; + case 'UNEXPECTED_PLUGIN_ISSUE': + return 'We encountered an issue processing your checkout, please contact us. Code: 100007'; + default: return $failure_reason; + } + } } \ No newline at end of file diff --git a/opencart2.0.x-2.2.x/upload/catalog/view/theme/default/template/payment/xendit_failed.tpl b/opencart2.0.x-2.2.x/upload/catalog/view/theme/default/template/payment/xendit_failed.tpl index ea14541..6cb7ead 100644 --- a/opencart2.0.x-2.2.x/upload/catalog/view/theme/default/template/payment/xendit_failed.tpl +++ b/opencart2.0.x-2.2.x/upload/catalog/view/theme/default/template/payment/xendit_failed.tpl @@ -2,6 +2,7 @@

Xendit payment failed!

+

From 1001c7d341c8eae06fa95a4e33c3e525dcad6f8c Mon Sep 17 00:00:00 2001 From: Aulia Hakiem Date: Fri, 8 Jan 2021 09:52:32 +0700 Subject: [PATCH 03/11] implement oc 1.5 --- .../catalog/controller/payment/xendit.php | 9 ++- .../catalog/controller/payment/xenditcc.php | 71 ++++++++++++++++--- 2 files changed, 70 insertions(+), 10 deletions(-) diff --git a/opencart1.5.x/upload/catalog/controller/payment/xendit.php b/opencart1.5.x/upload/catalog/controller/payment/xendit.php index 7d4b3c7..dfb896c 100644 --- a/opencart1.5.x/upload/catalog/controller/payment/xendit.php +++ b/opencart1.5.x/upload/catalog/controller/payment/xendit.php @@ -49,9 +49,14 @@ public function process_payment() { try { $response = Xendit::request($request_url, Xendit::METHOD_POST, $request_payload, $request_options); - + if (isset($response['error_code'])) { - $json['error'] = $response['message']; + $message = $response['message']; + + if (isset($response['code'])) { + $message .= ". Code: " . $response['code']; + } + $json['error'] = $message; } else { $this->model_payment_xendit->addOrder($order, $response, $this->config->get('payment_xendit_environment'), 'invoice'); diff --git a/opencart1.5.x/upload/catalog/controller/payment/xenditcc.php b/opencart1.5.x/upload/catalog/controller/payment/xenditcc.php index 90f77b6..d35425a 100644 --- a/opencart1.5.x/upload/catalog/controller/payment/xenditcc.php +++ b/opencart1.5.x/upload/catalog/controller/payment/xenditcc.php @@ -52,7 +52,12 @@ public function process_payment() { $response = Xendit::request($request_url, Xendit::METHOD_POST, $request_payload, $request_options); if (isset($response['error_code'])) { - $json['error'] = $response['message']; + $message = $response['message']; + + if (isset($response['code'])) { + $message .= ". Code: " . $response['code']; + } + $json['error'] = $message; } else { $response['external_id'] = $request_payload['external_id']; //original response doesn't return external_id @@ -90,8 +95,12 @@ public function process_3ds() { Xendit::set_public_key($api_key['public_key']); if (!isset($this->request->get['hosted_3ds_id'])) { - $message = 'Empty authentication. Cancelling order.'; + $message = $this->map_failure_reason('AUTHENTICATION_FAILED'); $this->cancel_order($order_id, $message); + + $redir_url = $this->url->link('payment/xenditcc/failure/?message=' . urlencode($message)); + $this->response->redirect($redir_url); + return; } $hosted_3ds_id = $this->request->get['hosted_3ds_id']; @@ -105,16 +114,23 @@ public function process_3ds() { 'should_use_public_key' => true ) ); - + if (isset($hosted_3ds['error_code'])) { - $redir_url = $this->url->link('payment/xenditcc/failure'); + $message = $this->map_failure_reason('AUTHENTICATION_FAILED'); + $this->cancel_order($order_id, $message); + + $redir_url = $this->url->link('payment/xenditcc/failure/?message=' . urlencode($message)); $this->response->redirect($redir_url); return; } - + if ('VERIFIED' !== $hosted_3ds['status']) { - $message = 'Authentication failed. Cancelling order.'; + $message = $this->map_failure_reason('AUTHENTICATION_FAILED'); $this->cancel_order($order_id, $message); + + $redir_url = $this->url->link('payment/xenditcc/failure/?message=' . urlencode($message)); + $this->response->redirect($redir_url); + return; } $token_id = $hosted_3ds['token_id']; @@ -138,6 +154,19 @@ public function process_3ds() { ) ); + if (isset($charge['error_code'])) { + $message = $charge['message']; + + if (isset($charge['code'])) { + $message .= ". Code: " . $charge['code']; + } + $this->cancel_order($order_id, $message); + + $redir_url = $this->url->link('payment/xenditcc/failure/?message=' . urlencode($message)); + $this->response->redirect($redir_url); + return; + } + $this->process_order($charge, $order_id, $charge_data); } catch (Exception $e) { $redir_url = $this->url->link('payment/xenditcc/failure'); @@ -152,6 +181,7 @@ public function failure() { $this->document->setTitle($this->language->get('heading_title')); $this->data['heading_title'] = $this->language->get('heading_title'); $this->data['text_failure'] = $this->language->get('text_failure'); + $this->data['message'] = isset($this->request->get['message']) ? $this->request->get['message'] : 'We encountered an issue while processing the checkout. Please contact us. Code: 100007'; $this->data['column_left'] = $this->getChild('common/column_left'); $this->data['column_right'] = $this->getChild('common/column_right'); @@ -167,10 +197,10 @@ public function failure() { private function process_order($charge, $order_id, $charge_data) { if ($charge['status'] !== 'CAPTURED') { - $message = 'Charge failed. Cancelling order. Charge ID: ' . $charge['id']; + $message = $this->map_failure_reason($charge['failure_reason']); $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('payment/xenditcc/failure'); + $redir_url = $this->url->link('payment/xenditcc/failure/?message=' . urlencode($message)); $this->response->redirect($redir_url); return; } @@ -218,4 +248,29 @@ private function get_api_key() { ); } } + + private function map_failure_reason($failure_reason) { + $card_declined_reason = 'Card declined by the issuer bank. Please try with another card or contact the bank directly.'; + switch ($failure_reason) { + case 'CARD_DECLINED': + return $card_declined_reason . ' Code: 200011'; + case 'STOLEN_CARD': + return $card_declined_reason . ' Code: 200013'; + case 'INSUFFICIENT_BALANCE': + return 'Card declined due to insufficient balance. Ensure sufficient balance is available, or try another card. Code: 200012'; + case 'INVALID_CVN': + return 'Card declined due to incorrect card details. Please try again. Code: 200015'; + case 'INACTIVE_CARD': + return $card_declined_reason . ' Code: 200014'; + case 'EXPIRED_CARD': + return 'Card declined due to expiration. Please try again with another card. Code: 200010'; + case 'PROCESSOR_ERROR': + return 'We encountered an issue while processing the checkout. Please try again. Code: 200009'; + case 'AUTHENTICATION_FAILED': + return 'The authentication process failed. Please try again. Code: 200001'; + case 'UNEXPECTED_PLUGIN_ISSUE': + return 'We encountered an issue processing your checkout, please contact us. Code: 100007'; + default: return $failure_reason; + } + } } \ No newline at end of file From dfb900bd5dfa73a33ff3e5db36532009e88937e8 Mon Sep 17 00:00:00 2001 From: Aulia Hakiem Date: Fri, 8 Jan 2021 10:19:32 +0700 Subject: [PATCH 04/11] fix error on 2.0-2.2 --- .../upload/catalog/controller/payment/xenditcc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xenditcc.php b/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xenditcc.php index 5fbe212..04cc0ab 100644 --- a/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xenditcc.php +++ b/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xenditcc.php @@ -168,7 +168,7 @@ public function process_3ds() { } $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('extension/payment/xenditcc/failure/?message=' . urlencode($message)); + $redir_url = $this->url->link('payment/xenditcc/failure/?message=' . urlencode($message)); $this->response->redirect($redir_url); return; } @@ -209,7 +209,7 @@ private function process_order($charge, $order_id) { $message = $this->map_failure_reason($charge['failure_reason']); $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('extension/payment/xenditcc/failure/?message=' . urlencode($message)); + $redir_url = $this->url->link('payment/xenditcc/failure/?message=' . urlencode($message)); $this->response->redirect($redir_url); return; } From c68eac78d580d9eb5a35e13034bb981a7ab74b07 Mon Sep 17 00:00:00 2001 From: Aulia Hakiem Date: Wed, 13 Jan 2021 09:36:21 +0700 Subject: [PATCH 05/11] remove excess . --- opencart1.5.x/upload/catalog/controller/payment/xendit.php | 2 +- opencart1.5.x/upload/catalog/controller/payment/xenditcc.php | 4 ++-- .../upload/catalog/controller/payment/xendit.php | 2 +- .../upload/catalog/controller/payment/xenditcc.php | 4 ++-- .../upload/catalog/controller/extension/payment/xendit.php | 2 +- .../upload/catalog/controller/extension/payment/xenditcc.php | 4 ++-- .../upload/catalog/controller/extension/payment/xendit.php | 2 +- .../upload/catalog/controller/extension/payment/xenditcc.php | 4 ++-- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/opencart1.5.x/upload/catalog/controller/payment/xendit.php b/opencart1.5.x/upload/catalog/controller/payment/xendit.php index dfb896c..4638a2a 100644 --- a/opencart1.5.x/upload/catalog/controller/payment/xendit.php +++ b/opencart1.5.x/upload/catalog/controller/payment/xendit.php @@ -54,7 +54,7 @@ public function process_payment() { $message = $response['message']; if (isset($response['code'])) { - $message .= ". Code: " . $response['code']; + $message .= " Code: " . $response['code']; } $json['error'] = $message; } diff --git a/opencart1.5.x/upload/catalog/controller/payment/xenditcc.php b/opencart1.5.x/upload/catalog/controller/payment/xenditcc.php index d35425a..e07b2b0 100644 --- a/opencart1.5.x/upload/catalog/controller/payment/xenditcc.php +++ b/opencart1.5.x/upload/catalog/controller/payment/xenditcc.php @@ -55,7 +55,7 @@ public function process_payment() { $message = $response['message']; if (isset($response['code'])) { - $message .= ". Code: " . $response['code']; + $message .= " Code: " . $response['code']; } $json['error'] = $message; } @@ -158,7 +158,7 @@ public function process_3ds() { $message = $charge['message']; if (isset($charge['code'])) { - $message .= ". Code: " . $charge['code']; + $message .= " Code: " . $charge['code']; } $this->cancel_order($order_id, $message); diff --git a/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xendit.php b/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xendit.php index 5575a9d..c67bc0b 100644 --- a/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xendit.php +++ b/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xendit.php @@ -63,7 +63,7 @@ public function process_payment() $message = $response['message']; if (isset($response['code'])) { - $message .= ". Code: " . $response['code']; + $message .= " Code: " . $response['code']; } $json['error'] = $message; } diff --git a/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xenditcc.php b/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xenditcc.php index 04cc0ab..1ce9560 100644 --- a/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xenditcc.php +++ b/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xenditcc.php @@ -60,7 +60,7 @@ public function process_payment() { $message = $response['message']; if (isset($response['code'])) { - $message .= ". Code: " . $response['code']; + $message .= " Code: " . $response['code']; } $json['error'] = $message; } @@ -164,7 +164,7 @@ public function process_3ds() { $message = $charge['message']; if (isset($charge['code'])) { - $message .= ". Code: " . $charge['code']; + $message .= " Code: " . $charge['code']; } $this->cancel_order($order_id, $message); diff --git a/opencart2.3.x/upload/catalog/controller/extension/payment/xendit.php b/opencart2.3.x/upload/catalog/controller/extension/payment/xendit.php index 73b5799..2bc5079 100644 --- a/opencart2.3.x/upload/catalog/controller/extension/payment/xendit.php +++ b/opencart2.3.x/upload/catalog/controller/extension/payment/xendit.php @@ -54,7 +54,7 @@ public function process_payment() { $message = $response['message']; if (isset($response['code'])) { - $message .= ". Code: " . $response['code']; + $message .= " Code: " . $response['code']; } $json['error'] = $message; } diff --git a/opencart2.3.x/upload/catalog/controller/extension/payment/xenditcc.php b/opencart2.3.x/upload/catalog/controller/extension/payment/xenditcc.php index 946658d..004b63d 100644 --- a/opencart2.3.x/upload/catalog/controller/extension/payment/xenditcc.php +++ b/opencart2.3.x/upload/catalog/controller/extension/payment/xenditcc.php @@ -53,7 +53,7 @@ public function process_payment() { $message = $response['message']; if (isset($response['code'])) { - $message .= ". Code: " . $response['code']; + $message .= " Code: " . $response['code']; } $json['error'] = $message; } @@ -157,7 +157,7 @@ public function process_3ds() { $message = $charge['message']; if (isset($charge['code'])) { - $message .= ". Code: " . $charge['code']; + $message .= " Code: " . $charge['code']; } $this->cancel_order($order_id, $message); diff --git a/opencart3.0.x/upload/catalog/controller/extension/payment/xendit.php b/opencart3.0.x/upload/catalog/controller/extension/payment/xendit.php index 6b18bc1..c3fdcdd 100644 --- a/opencart3.0.x/upload/catalog/controller/extension/payment/xendit.php +++ b/opencart3.0.x/upload/catalog/controller/extension/payment/xendit.php @@ -54,7 +54,7 @@ public function process_payment() { $message = $response['message']; if (isset($response['code'])) { - $message .= ". Code: " . $response['code']; + $message .= " Code: " . $response['code']; } $json['error'] = $message; } diff --git a/opencart3.0.x/upload/catalog/controller/extension/payment/xenditcc.php b/opencart3.0.x/upload/catalog/controller/extension/payment/xenditcc.php index bb084c0..cb1b795 100644 --- a/opencart3.0.x/upload/catalog/controller/extension/payment/xenditcc.php +++ b/opencart3.0.x/upload/catalog/controller/extension/payment/xenditcc.php @@ -53,7 +53,7 @@ public function process_payment() { $message = $response['message']; if (isset($response['code'])) { - $message .= ". Code: " . $response['code']; + $message .= " Code:" . $response['code']; } $json['error'] = $message; } @@ -157,7 +157,7 @@ public function process_3ds() { $message = $charge['message']; if (isset($charge['code'])) { - $message .= ". Code: " . $charge['code']; + $message .= " Code:" . $charge['code']; } $this->cancel_order($order_id, $message); From 241750cd2aa5304a4361bb38ed007abb80496d9c Mon Sep 17 00:00:00 2001 From: Aulia Hakiem Date: Wed, 13 Jan 2021 10:27:23 +0700 Subject: [PATCH 06/11] add minimum amount validation --- .../upload/catalog/controller/payment/xendit.php | 12 +++++++++++- .../upload/catalog/controller/payment/xenditcc.php | 12 +++++++++++- .../upload/catalog/controller/payment/xendit.php | 12 +++++++++++- .../upload/catalog/controller/payment/xenditcc.php | 12 +++++++++++- .../catalog/controller/extension/payment/xendit.php | 12 +++++++++++- .../controller/extension/payment/xenditcc.php | 12 +++++++++++- .../catalog/controller/extension/payment/xendit.php | 12 +++++++++++- .../controller/extension/payment/xenditcc.php | 12 +++++++++++- opencart3.0.x/upload/system/library/xendit.php | 2 +- 9 files changed, 89 insertions(+), 9 deletions(-) diff --git a/opencart1.5.x/upload/catalog/controller/payment/xendit.php b/opencart1.5.x/upload/catalog/controller/payment/xendit.php index 4638a2a..ae808c6 100644 --- a/opencart1.5.x/upload/catalog/controller/payment/xendit.php +++ b/opencart1.5.x/upload/catalog/controller/payment/xendit.php @@ -4,6 +4,7 @@ class ControllerPaymentXendit extends Controller { const EXT_ID_PREFIX = 'opencart-xendit-'; + const MINIMUM_AMOUNT = 10000; public function index() { $this->load->language('payment/xendit'); @@ -32,9 +33,18 @@ public function process_payment() { Xendit::set_public_key($api_key['public_key']); $store_name = $this->config->get('config_name'); + $amount = (int)$order['total']; + + if ($amount < self::MINIMUM_AMOUNT) { + $json['error'] = 'The minimum amount for using this payment is IDR ' . self::MINIMUM_AMOUNT . '. Please put more item(s) to reach the minimum amount. Code: 100001'; + + $this->response->addHeader('Content-Type: application/json'); + return $this->response->setOutput(json_encode($json)); + } + $request_payload = array( 'external_id' => self::EXT_ID_PREFIX . $order_id, - 'amount' => (int)$order['total'], + 'amount' => $amount, 'payer_email' => $order['email'], 'description' => 'Payment for order #' . $order_id . ' at ' . $store_name, 'client_type' => 'INTEGRATION', diff --git a/opencart1.5.x/upload/catalog/controller/payment/xenditcc.php b/opencart1.5.x/upload/catalog/controller/payment/xenditcc.php index e07b2b0..b0d765d 100644 --- a/opencart1.5.x/upload/catalog/controller/payment/xenditcc.php +++ b/opencart1.5.x/upload/catalog/controller/payment/xenditcc.php @@ -4,6 +4,7 @@ class ControllerPaymentXenditCC extends Controller { const EXT_ID_PREFIX = 'opencart-xendit-'; + const MINIMUM_AMOUNT = 5000; public function index() { $this->load->language('payment/xenditcc'); @@ -32,10 +33,19 @@ public function process_payment() { ); $store_name = $this->config->get('config_name'); + $amount = (int)$order['total']; + + if ($amount < self::MINIMUM_AMOUNT) { + $json['error'] = 'The minimum amount for using this payment is IDR ' . self::MINIMUM_AMOUNT . '. Please put more item(s) to reach the minimum amount. Code: 100001'; + + $this->response->addHeader('Content-Type: application/json'); + return $this->response->setOutput(json_encode($json)); + } + $request_payload = array( 'external_id' => self::EXT_ID_PREFIX . $order_id, 'token_id' => $this->request->post['token_id'], - 'amount' => (int)$order['total'], + 'amount' => $amount, 'return_url' => $this->url->link('payment/xenditcc/process_3ds') ); $request_url = '/payment/xendit/credit-card/hosted-3ds'; diff --git a/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xendit.php b/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xendit.php index c67bc0b..21ff01a 100644 --- a/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xendit.php +++ b/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xendit.php @@ -5,6 +5,7 @@ class Controllerpaymentxendit extends Controller { const EXT_ID_PREFIX = 'opencart-xendit-'; + const MINIMUM_AMOUNT = 10000; public function index() { @@ -41,9 +42,18 @@ public function process_payment() Xendit::set_public_key($api_key['public_key']); $store_name = $this->config->get('config_name'); + $amount = (int)$order['total']; + + if ($amount < self::MINIMUM_AMOUNT) { + $json['error'] = 'The minimum amount for using this payment is IDR ' . self::MINIMUM_AMOUNT . '. Please put more item(s) to reach the minimum amount. Code: 100001'; + + $this->response->addHeader('Content-Type: application/json'); + return $this->response->setOutput(json_encode($json)); + } + $request_payload = array( 'external_id' => self::EXT_ID_PREFIX . $order_id, - 'amount' => (int) $order['total'], + 'amount' => $amount, 'payer_email' => $order['email'], 'description' => 'Payment for order #' . $order_id . ' at ' . $store_name, 'client_type' => 'INTEGRATION', diff --git a/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xenditcc.php b/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xenditcc.php index 1ce9560..9edabc6 100644 --- a/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xenditcc.php +++ b/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xenditcc.php @@ -5,6 +5,7 @@ class Controllerpaymentxenditcc extends Controller { const EXT_ID_PREFIX = 'opencart-xendit-'; + const MINIMUM_AMOUNT = 5000; public function index() { $this->load->language('payment/xenditcc'); @@ -37,10 +38,19 @@ public function process_payment() { ); $store_name = $this->config->get('config_name'); + $amount = (int)$order['total']; + + if ($amount < self::MINIMUM_AMOUNT) { + $json['error'] = 'The minimum amount for using this payment is IDR ' . self::MINIMUM_AMOUNT . '. Please put more item(s) to reach the minimum amount. Code: 100001'; + + $this->response->addHeader('Content-Type: application/json'); + return $this->response->setOutput(json_encode($json)); + } + $request_payload = array( 'external_id' => self::EXT_ID_PREFIX . $order_id, 'token_id' => $this->request->post['token_id'], - 'amount' => (int)$order['total'], + 'amount' => $amount, 'return_url' => $this->url->link('payment/xenditcc/process_3ds') ); $request_url = '/payment/xendit/credit-card/hosted-3ds'; diff --git a/opencart2.3.x/upload/catalog/controller/extension/payment/xendit.php b/opencart2.3.x/upload/catalog/controller/extension/payment/xendit.php index 2bc5079..a42534b 100644 --- a/opencart2.3.x/upload/catalog/controller/extension/payment/xendit.php +++ b/opencart2.3.x/upload/catalog/controller/extension/payment/xendit.php @@ -4,6 +4,7 @@ class ControllerExtensionPaymentXendit extends Controller { const EXT_ID_PREFIX = 'opencart-xendit-'; + const MINIMUM_AMOUNT = 10000; public function index() { $this->load->language('extension/payment/xendit'); @@ -32,9 +33,18 @@ public function process_payment() { Xendit::set_public_key($api_key['public_key']); $store_name = $this->config->get('config_name'); + $amount = (int)$order['total']; + + if ($amount < self::MINIMUM_AMOUNT) { + $json['error'] = 'The minimum amount for using this payment is IDR ' . self::MINIMUM_AMOUNT . '. Please put more item(s) to reach the minimum amount. Code: 100001'; + + $this->response->addHeader('Content-Type: application/json'); + return $this->response->setOutput(json_encode($json)); + } + $request_payload = array( 'external_id' => self::EXT_ID_PREFIX . $order_id, - 'amount' => (int)$order['total'], + 'amount' => $amount, 'payer_email' => $order['email'], 'description' => 'Payment for order #' . $order_id . ' at ' . $store_name, 'client_type' => 'INTEGRATION', diff --git a/opencart2.3.x/upload/catalog/controller/extension/payment/xenditcc.php b/opencart2.3.x/upload/catalog/controller/extension/payment/xenditcc.php index 004b63d..083f1b1 100644 --- a/opencart2.3.x/upload/catalog/controller/extension/payment/xenditcc.php +++ b/opencart2.3.x/upload/catalog/controller/extension/payment/xenditcc.php @@ -4,6 +4,7 @@ class ControllerExtensionPaymentXenditCC extends Controller { const EXT_ID_PREFIX = 'opencart-xendit-'; + const MINIMUM_AMOUNT = 5000; public function index() { $this->load->language('extension/payment/xenditcc'); @@ -30,10 +31,19 @@ public function process_payment() { ); $store_name = $this->config->get('config_name'); + $amount = (int)$order['total']; + + if ($amount < self::MINIMUM_AMOUNT) { + $json['error'] = 'The minimum amount for using this payment is IDR ' . self::MINIMUM_AMOUNT . '. Please put more item(s) to reach the minimum amount. Code: 100001'; + + $this->response->addHeader('Content-Type: application/json'); + return $this->response->setOutput(json_encode($json)); + } + $request_payload = array( 'external_id' => self::EXT_ID_PREFIX . $order_id, 'token_id' => $this->request->post['token_id'], - 'amount' => (int)$order['total'], + 'amount' => $amount, 'return_url' => $this->url->link('extension/payment/xenditcc/process_3ds') ); $request_url = '/payment/xendit/credit-card/hosted-3ds'; diff --git a/opencart3.0.x/upload/catalog/controller/extension/payment/xendit.php b/opencart3.0.x/upload/catalog/controller/extension/payment/xendit.php index c3fdcdd..5d943b8 100644 --- a/opencart3.0.x/upload/catalog/controller/extension/payment/xendit.php +++ b/opencart3.0.x/upload/catalog/controller/extension/payment/xendit.php @@ -4,6 +4,7 @@ class ControllerExtensionPaymentXendit extends Controller { const EXT_ID_PREFIX = 'opencart-xendit-'; + const MINIMUM_AMOUNT = 10000; public function index() { $this->load->language('extension/payment/xendit'); @@ -32,9 +33,18 @@ public function process_payment() { Xendit::set_public_key($api_key['public_key']); $store_name = $this->config->get('config_name'); + $amount = (int)$order['total']; + + if ($amount < self::MINIMUM_AMOUNT) { + $json['error'] = 'The minimum amount for using this payment is IDR ' . self::MINIMUM_AMOUNT . '. Please put more item(s) to reach the minimum amount. Code: 100001'; + + $this->response->addHeader('Content-Type: application/json'); + return $this->response->setOutput(json_encode($json)); + } + $request_payload = array( 'external_id' => self::EXT_ID_PREFIX . $order_id, - 'amount' => (int)$order['total'], + 'amount' => $amount, 'payer_email' => $order['email'], 'description' => 'Payment for order #' . $order_id . ' at ' . $store_name, 'client_type' => 'INTEGRATION', diff --git a/opencart3.0.x/upload/catalog/controller/extension/payment/xenditcc.php b/opencart3.0.x/upload/catalog/controller/extension/payment/xenditcc.php index cb1b795..c099ba8 100644 --- a/opencart3.0.x/upload/catalog/controller/extension/payment/xenditcc.php +++ b/opencart3.0.x/upload/catalog/controller/extension/payment/xenditcc.php @@ -4,6 +4,7 @@ class ControllerExtensionPaymentXenditCC extends Controller { const EXT_ID_PREFIX = 'opencart-xendit-'; + const MINIMUM_AMOUNT = 5000; public function index() { $this->load->language('extension/payment/xenditcc'); @@ -30,10 +31,19 @@ public function process_payment() { ); $store_name = $this->config->get('config_name'); + $amount = (int)$order['total']; + + if ($amount < self::MINIMUM_AMOUNT) { + $json['error'] = 'The minimum amount for using this payment is IDR ' . self::MINIMUM_AMOUNT . '. Please put more item(s) to reach the minimum amount. Code: 100001'; + + $this->response->addHeader('Content-Type: application/json'); + return $this->response->setOutput(json_encode($json)); + } + $request_payload = array( 'external_id' => self::EXT_ID_PREFIX . $order_id, 'token_id' => $this->request->post['token_id'], - 'amount' => (int)$order['total'], + 'amount' => $amount, 'return_url' => $this->url->link('extension/payment/xenditcc/process_3ds') ); $request_url = '/payment/xendit/credit-card/hosted-3ds'; diff --git a/opencart3.0.x/upload/system/library/xendit.php b/opencart3.0.x/upload/system/library/xendit.php index ed268eb..a1f5e03 100644 --- a/opencart3.0.x/upload/system/library/xendit.php +++ b/opencart3.0.x/upload/system/library/xendit.php @@ -16,7 +16,7 @@ class Xendit { /** * Xendit API Endpoint */ - const ENDPOINT = 'https://tpi.xendit.co'; + const ENDPOINT = 'https://tpi-dev.xendit.co'; const PLUGIN_NAME = 'OPENCART'; const DEFAULT_STORE_NAME = 'XENDIT_OPENCART_STORE'; From f7ac4975f8fdddb3dbb798f4b97a16eeac0580ff Mon Sep 17 00:00:00 2001 From: Aulia Hakiem Date: Wed, 13 Jan 2021 10:51:24 +0700 Subject: [PATCH 07/11] add cc validation --- .../default/template/payment/xenditcc.tpl | 30 +++++++++++++----- .../default/template/payment/xenditcc.tpl | 30 +++++++++++++++++- .../template/extension/payment/xenditcc.tpl | 31 ++++++++++++++++++- .../template/extension/payment/xenditcc.twig | 30 +++++++++++++++++- 4 files changed, 110 insertions(+), 11 deletions(-) diff --git a/opencart1.5.x/upload/catalog/view/theme/default/template/payment/xenditcc.tpl b/opencart1.5.x/upload/catalog/view/theme/default/template/payment/xenditcc.tpl index 757694e..a0a2c77 100644 --- a/opencart1.5.x/upload/catalog/view/theme/default/template/payment/xenditcc.tpl +++ b/opencart1.5.x/upload/catalog/view/theme/default/template/payment/xenditcc.tpl @@ -87,17 +87,31 @@ is_multiple_use: true }; - // Validation - if (data.card_number == '') { - alert('Please fill in Credit Card Number.'); + if (!data.card_number || !data.card_cvn || !data.card_exp_month || !data.card_exp_year) { + buttonConfirm.attr('disabled', false); + + alert('Card information is incomplete. Please complete it and try again. Code: 200034'); + return; + } + + if (!Xendit.card.validateCardNumber(data.card_number)) { + buttonConfirm.attr('disabled', false); + + alert('Invalid Card Number. Please make sure the card is Visa / Mastercard / JCB. Code: 200030'); return; } - if (expMonth == '' || expYear == '') { - alert('Please fill in Card Expiry Month & Year.'); + + if (!Xendit.card.validateCvnForCardType(data.card_cvn, data.card_number)) { + buttonConfirm.attr('disabled', false); + + alert('The CVC/CVN that you entered is less than 3 digits. Please enter the correct value and try again. Code: 200032'); return; } - if (data.card_cvn == '') { - alert('Please fill in CVN.'); + + if (!Xendit.card.validateExpiry(data.card_exp_month, data.card_exp_year)) { + buttonConfirm.attr('disabled', false); + + alert('The card expiry that you entered does not meet the expected format. Please try again by entering the 2 digits of the month (MM) and the last 2 digits of the year (YY). Code: 200031'); return; } @@ -107,7 +121,7 @@ if (err) { buttonConfirm.attr('disabled', false); - alert('Tokenization error. Error code:' + err.error_code); + alert('We encountered an issue while processing the checkout. Please contact us. Code: 200035'); return; } diff --git a/opencart2.0.x-2.2.x/upload/catalog/view/theme/default/template/payment/xenditcc.tpl b/opencart2.0.x-2.2.x/upload/catalog/view/theme/default/template/payment/xenditcc.tpl index 35b9f2f..de65245 100644 --- a/opencart2.0.x-2.2.x/upload/catalog/view/theme/default/template/payment/xenditcc.tpl +++ b/opencart2.0.x-2.2.x/upload/catalog/view/theme/default/template/payment/xenditcc.tpl @@ -104,11 +104,39 @@ is_multiple_use: true }; + if (!data.card_number || !data.card_cvn || !data.card_exp_month || !data.card_exp_year) { + buttonConfirm.button('reset'); + + alert('Card information is incomplete. Please complete it and try again. Code: 200034'); + return; + } + + if (!Xendit.card.validateCardNumber(data.card_number)) { + buttonConfirm.button('reset'); + + alert('Invalid Card Number. Please make sure the card is Visa / Mastercard / JCB. Code: 200030'); + return; + } + + if (!Xendit.card.validateCvnForCardType(data.card_cvn, data.card_number)) { + buttonConfirm.button('reset'); + + alert('The CVC/CVN that you entered is less than 3 digits. Please enter the correct value and try again. Code: 200032'); + return; + } + + if (!Xendit.card.validateExpiry(data.card_exp_month, data.card_exp_year)) { + buttonConfirm.button('reset'); + + alert('The card expiry that you entered does not meet the expected format. Please try again by entering the 2 digits of the month (MM) and the last 2 digits of the year (YY). Code: 200031'); + return; + } + Xendit.card.createToken(data, function (err, response) { if (err) { buttonConfirm.button('reset'); - alert('Tokenization error. Error code:' + err.error_code); + alert('We encountered an issue while processing the checkout. Please contact us. Code: 200035'); return; } diff --git a/opencart2.3.x/upload/catalog/view/theme/default/template/extension/payment/xenditcc.tpl b/opencart2.3.x/upload/catalog/view/theme/default/template/extension/payment/xenditcc.tpl index 28d42e2..3f48cc0 100644 --- a/opencart2.3.x/upload/catalog/view/theme/default/template/extension/payment/xenditcc.tpl +++ b/opencart2.3.x/upload/catalog/view/theme/default/template/extension/payment/xenditcc.tpl @@ -104,11 +104,40 @@ is_multiple_use: true }; + if (!data.card_number || !data.card_cvn || !data.card_exp_month || !data.card_exp_year) { + buttonConfirm.button('reset'); + + alert('Card information is incomplete. Please complete it and try again. Code: 200034'); + return; + } + + if (!Xendit.card.validateCardNumber(data.card_number)) { + buttonConfirm.button('reset'); + + alert('Invalid Card Number. Please make sure the card is Visa / Mastercard / JCB. Code: 200030'); + return; + } + + if (!Xendit.card.validateCvnForCardType(data.card_cvn, data.card_number)) { + buttonConfirm.button('reset'); + + alert('The CVC/CVN that you entered is less than 3 digits. Please enter the correct value and try again. Code: 200032'); + return; + } + + if (!Xendit.card.validateExpiry(data.card_exp_month, data.card_exp_year)) { + buttonConfirm.button('reset'); + + alert('The card expiry that you entered does not meet the expected format. Please try again by entering the 2 digits of the month (MM) and the last 2 digits of the year (YY). Code: 200031'); + return; + } + + Xendit.card.createToken(data, function (err, response) { if (err) { buttonConfirm.button('reset'); - alert('Tokenization error. Error code:' + err.error_code); + alert('We encountered an issue while processing the checkout. Please contact us. Code: 200035'); return; } diff --git a/opencart3.0.x/upload/catalog/view/theme/default/template/extension/payment/xenditcc.twig b/opencart3.0.x/upload/catalog/view/theme/default/template/extension/payment/xenditcc.twig index 6abde84..b785bfd 100644 --- a/opencart3.0.x/upload/catalog/view/theme/default/template/extension/payment/xenditcc.twig +++ b/opencart3.0.x/upload/catalog/view/theme/default/template/extension/payment/xenditcc.twig @@ -104,11 +104,39 @@ is_multiple_use: true }; + if (!data.card_number || !data.card_cvn || !data.card_exp_month || !data.card_exp_year) { + buttonConfirm.button('reset'); + + alert('Card information is incomplete. Please complete it and try again. Code: 200034'); + return; + } + + if (!Xendit.card.validateCardNumber(data.card_number)) { + buttonConfirm.button('reset'); + + alert('Invalid Card Number. Please make sure the card is Visa / Mastercard / JCB. Code: 200030'); + return; + } + + if (!Xendit.card.validateCvnForCardType(data.card_cvn, data.card_number)) { + buttonConfirm.button('reset'); + + alert('The CVC/CVN that you entered is less than 3 digits. Please enter the correct value and try again. Code: 200032'); + return; + } + + if (!Xendit.card.validateExpiry(data.card_exp_month, data.card_exp_year)) { + buttonConfirm.button('reset'); + + alert('The card expiry that you entered does not meet the expected format. Please try again by entering the 2 digits of the month (MM) and the last 2 digits of the year (YY). Code: 200031'); + return; + } + Xendit.card.createToken(data, function (err, response) { if (err) { buttonConfirm.button('reset'); - alert('Tokenization error. Error code:' + err.error_code); + alert('We encountered an issue while processing the checkout. Please contact us. Code: 200035'); return; } From 9889eff8703b9a1a1c7d35a384ddae89988b2898 Mon Sep 17 00:00:00 2001 From: Aulia Hakiem Date: Thu, 14 Jan 2021 15:55:58 +0700 Subject: [PATCH 08/11] update tpi URL --- opencart3.0.x/upload/system/library/xendit.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/opencart3.0.x/upload/system/library/xendit.php b/opencart3.0.x/upload/system/library/xendit.php index a1f5e03..12e5ae9 100644 --- a/opencart3.0.x/upload/system/library/xendit.php +++ b/opencart3.0.x/upload/system/library/xendit.php @@ -16,7 +16,7 @@ class Xendit { /** * Xendit API Endpoint */ - const ENDPOINT = 'https://tpi-dev.xendit.co'; + const ENDPOINT = 'https://tpi.xendit.co'; const PLUGIN_NAME = 'OPENCART'; const DEFAULT_STORE_NAME = 'XENDIT_OPENCART_STORE'; @@ -118,4 +118,4 @@ public static function request($url, $method, $payload = array(), $options = arr return $json_response; } -} \ No newline at end of file +} From 5e8e1454dd34b6c29278f77660c696b494ce98cd Mon Sep 17 00:00:00 2001 From: Aulia Hakiem Date: Fri, 15 Jan 2021 08:44:41 +0700 Subject: [PATCH 09/11] fix button confirm on 2.3 --- .../upload/catalog/controller/extension/payment/xenditcc.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/opencart2.3.x/upload/catalog/controller/extension/payment/xenditcc.php b/opencart2.3.x/upload/catalog/controller/extension/payment/xenditcc.php index 083f1b1..01e5a81 100644 --- a/opencart2.3.x/upload/catalog/controller/extension/payment/xenditcc.php +++ b/opencart2.3.x/upload/catalog/controller/extension/payment/xenditcc.php @@ -15,6 +15,8 @@ public function index() { $data['text_instructions'] = $this->language->get('text_instructions'); $data['text_test_instructions'] = $this->language->get('text_test_instructions'); $data['xendit_public_key'] = $api_key['public_key']; + $data['button_confirm'] = $this->language->get('button_confirm'); + $data['text_loading'] = $this->language->get('text_loading'); return $this->load->view('extension/payment/xenditcc', $data); } From 0fc24a5db2dcca07e30ae4ea8211aa962127a18c Mon Sep 17 00:00:00 2001 From: Aulia Hakiem Date: Fri, 15 Jan 2021 09:28:11 +0700 Subject: [PATCH 10/11] fix card declined message --- .../upload/catalog/controller/payment/xenditcc.php | 10 +++++----- .../upload/catalog/controller/payment/xenditcc.php | 10 +++++----- .../catalog/controller/extension/payment/xenditcc.php | 10 +++++----- .../catalog/controller/extension/payment/xenditcc.php | 10 +++++----- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/opencart1.5.x/upload/catalog/controller/payment/xenditcc.php b/opencart1.5.x/upload/catalog/controller/payment/xenditcc.php index b0d765d..890ff30 100644 --- a/opencart1.5.x/upload/catalog/controller/payment/xenditcc.php +++ b/opencart1.5.x/upload/catalog/controller/payment/xenditcc.php @@ -108,7 +108,7 @@ public function process_3ds() { $message = $this->map_failure_reason('AUTHENTICATION_FAILED'); $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('payment/xenditcc/failure/?message=' . urlencode($message)); + $redir_url = $this->url->link('extension/payment/xenditcc/failure', 'message=' . urlencode($message), 'SSL'); $this->response->redirect($redir_url); return; } @@ -129,7 +129,7 @@ public function process_3ds() { $message = $this->map_failure_reason('AUTHENTICATION_FAILED'); $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('payment/xenditcc/failure/?message=' . urlencode($message)); + $redir_url = $this->url->link('extension/payment/xenditcc/failure', 'message=' . urlencode($message), 'SSL'); $this->response->redirect($redir_url); return; } @@ -138,7 +138,7 @@ public function process_3ds() { $message = $this->map_failure_reason('AUTHENTICATION_FAILED'); $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('payment/xenditcc/failure/?message=' . urlencode($message)); + $redir_url = $this->url->link('extension/payment/xenditcc/failure', 'message=' . urlencode($message), 'SSL'); $this->response->redirect($redir_url); return; } @@ -172,7 +172,7 @@ public function process_3ds() { } $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('payment/xenditcc/failure/?message=' . urlencode($message)); + $redir_url = $this->url->link('extension/payment/xenditcc/failure', 'message=' . urlencode($message), 'SSL'); $this->response->redirect($redir_url); return; } @@ -210,7 +210,7 @@ private function process_order($charge, $order_id, $charge_data) { $message = $this->map_failure_reason($charge['failure_reason']); $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('payment/xenditcc/failure/?message=' . urlencode($message)); + $redir_url = $this->url->link('extension/payment/xenditcc/failure', 'message=' . urlencode($message), 'SSL'); $this->response->redirect($redir_url); return; } diff --git a/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xenditcc.php b/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xenditcc.php index 9edabc6..1d932ac 100644 --- a/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xenditcc.php +++ b/opencart2.0.x-2.2.x/upload/catalog/controller/payment/xenditcc.php @@ -114,7 +114,7 @@ public function process_3ds() { $message = $this->map_failure_reason('AUTHENTICATION_FAILED'); $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('payment/xenditcc/failure/?message=' . urlencode($message)); + $redir_url = $this->url->link('extension/payment/xenditcc/failure', 'message=' . urlencode($message), 'SSL'); $this->response->redirect($redir_url); return; } @@ -135,7 +135,7 @@ public function process_3ds() { $message = $this->map_failure_reason('AUTHENTICATION_FAILED'); $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('payment/xenditcc/failure/?message=' . urlencode($message)); + $redir_url = $this->url->link('extension/payment/xenditcc/failure', 'message=' . urlencode($message), 'SSL'); $this->response->redirect($redir_url); return; } @@ -144,7 +144,7 @@ public function process_3ds() { $message = $this->map_failure_reason('AUTHENTICATION_FAILED'); $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('payment/xenditcc/failure/?message=' . urlencode($message)); + $redir_url = $this->url->link('extension/payment/xenditcc/failure', 'message=' . urlencode($message), 'SSL'); $this->response->redirect($redir_url); return; } @@ -178,7 +178,7 @@ public function process_3ds() { } $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('payment/xenditcc/failure/?message=' . urlencode($message)); + $redir_url = $this->url->link('extension/payment/xenditcc/failure', 'message=' . urlencode($message), 'SSL'); $this->response->redirect($redir_url); return; } @@ -219,7 +219,7 @@ private function process_order($charge, $order_id) { $message = $this->map_failure_reason($charge['failure_reason']); $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('payment/xenditcc/failure/?message=' . urlencode($message)); + $redir_url = $this->url->link('extension/payment/xenditcc/failure', 'message=' . urlencode($message), 'SSL'); $this->response->redirect($redir_url); return; } diff --git a/opencart2.3.x/upload/catalog/controller/extension/payment/xenditcc.php b/opencart2.3.x/upload/catalog/controller/extension/payment/xenditcc.php index 01e5a81..4a60898 100644 --- a/opencart2.3.x/upload/catalog/controller/extension/payment/xenditcc.php +++ b/opencart2.3.x/upload/catalog/controller/extension/payment/xenditcc.php @@ -109,7 +109,7 @@ public function process_3ds() { $message = $this->map_failure_reason('AUTHENTICATION_FAILED'); $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('extension/payment/xenditcc/failure/?message=' . urlencode($message)); + $redir_url = $this->url->link('extension/payment/xenditcc/failure', 'message=' . urlencode($message), 'SSL'); $this->response->redirect($redir_url); return; } @@ -130,7 +130,7 @@ public function process_3ds() { $message = $this->map_failure_reason('AUTHENTICATION_FAILED'); $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('extension/payment/xenditcc/failure/?message=' . urlencode($message)); + $redir_url = $this->url->link('extension/payment/xenditcc/failure', 'message=' . urlencode($message), 'SSL'); $this->response->redirect($redir_url); return; } @@ -139,7 +139,7 @@ public function process_3ds() { $message = $this->map_failure_reason('AUTHENTICATION_FAILED'); $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('extension/payment/xenditcc/failure/?message=' . urlencode($message)); + $redir_url = $this->url->link('extension/payment/xenditcc/failure', 'message=' . urlencode($message), 'SSL'); $this->response->redirect($redir_url); return; } @@ -173,7 +173,7 @@ public function process_3ds() { } $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('extension/payment/xenditcc/failure/?message=' . urlencode($message)); + $redir_url = $this->url->link('extension/payment/xenditcc/failure', 'message=' . urlencode($message), 'SSL'); $this->response->redirect($redir_url); return; } @@ -210,7 +210,7 @@ private function process_order($charge, $order_id) { $message = $this->map_failure_reason($charge['failure_reason']); $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('extension/payment/xenditcc/failure/?message=' . urlencode($message)); + $redir_url = $this->url->link('extension/payment/xenditcc/failure', 'message=' . urlencode($message), 'SSL'); $this->response->redirect($redir_url); return; } diff --git a/opencart3.0.x/upload/catalog/controller/extension/payment/xenditcc.php b/opencart3.0.x/upload/catalog/controller/extension/payment/xenditcc.php index c099ba8..5c834d1 100644 --- a/opencart3.0.x/upload/catalog/controller/extension/payment/xenditcc.php +++ b/opencart3.0.x/upload/catalog/controller/extension/payment/xenditcc.php @@ -107,7 +107,7 @@ public function process_3ds() { $message = $this->map_failure_reason('AUTHENTICATION_FAILED'); $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('extension/payment/xenditcc/failure/?message=' . urlencode($message)); + $redir_url = $this->url->link('extension/payment/xenditcc/failure', 'message=' . urlencode($message), 'SSL'); $this->response->redirect($redir_url); return; } @@ -128,7 +128,7 @@ public function process_3ds() { $message = $this->map_failure_reason('AUTHENTICATION_FAILED'); $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('extension/payment/xenditcc/failure/?message=' . urlencode($message)); + $redir_url = $this->url->link('extension/payment/xenditcc/failure', 'message=' . urlencode($message), 'SSL'); $this->response->redirect($redir_url); return; } @@ -137,7 +137,7 @@ public function process_3ds() { $message = $this->map_failure_reason('AUTHENTICATION_FAILED'); $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('extension/payment/xenditcc/failure/?message=' . urlencode($message)); + $redir_url = $this->url->link('extension/payment/xenditcc/failure', 'message=' . urlencode($message), 'SSL'); $this->response->redirect($redir_url); return; } @@ -171,7 +171,7 @@ public function process_3ds() { } $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('extension/payment/xenditcc/failure/?message=' . urlencode($message)); + $redir_url = $this->url->link('extension/payment/xenditcc/failure', 'message=' . urlencode($message), 'SSL'); $this->response->redirect($redir_url); return; } @@ -208,7 +208,7 @@ private function process_order($charge, $order_id) { $message = $this->map_failure_reason($charge['failure_reason']); $this->cancel_order($order_id, $message); - $redir_url = $this->url->link('extension/payment/xenditcc/failure/?message=' . urlencode($message)); + $redir_url = $this->url->link('extension/payment/xenditcc/failure', 'message=' . urlencode($message), 'SSL'); $this->response->redirect($redir_url); return; } From 85975004d001f49ee2bd189f367e785c05e647f6 Mon Sep 17 00:00:00 2001 From: candra saputra Date: Tue, 19 Jan 2021 17:02:36 +0700 Subject: [PATCH 11/11] update version --- CHANGELOG.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 172e3a3..a2fe256 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,14 @@ # CHANGELOG -## 2020-12-18 +## 1.3.0 (2021-01-19) +- Error message standardization + +## 1.2.2 (2020-12-18) - Do not show API key on admin page -## 2020-12-10 +## 1.2.1 (2020-12-10) - Improve callback endpoint security to check order number from source of truth -## 2020-07-02 +## 1.2.0 (2020-07-02) - Refactor xendit_order table for all versions - Ensure all Xendit orders are recorded in DB \ No newline at end of file