diff --git a/inc/class-wooviet-onepay-domestic.php b/inc/class-wooviet-onepay-domestic.php
index 9437884..c03dbce 100644
--- a/inc/class-wooviet-onepay-domestic.php
+++ b/inc/class-wooviet-onepay-domestic.php
@@ -8,57 +8,16 @@ if ( ! defined( 'ABSPATH' ) ) {
*
*
* @author htdat
- * @since 1.3
+ * @since 1.5.0
*
*/
-class WooViet_OnePay_Domestic extends WC_Payment_Gateway {
- /** @var bool Whether or not logging is enabled */
- public static $log_enabled = false;
- /** @var WC_Logger Logger instance */
- public static $log = false;
+require_once('onepay/abstract-payment.php');
+class WooViet_OnePay_Domestic extends WooViet_OnePay_Abstract {
- /**
- * Constructor for the gateway.
- */
- public function __construct() {
- $this->id = strtolower( __CLASS__ );
- $this->has_fields = false;
- $this->order_button_text = __( 'Proceed to OnePay', 'woo-viet' );
+ public function configure_payment() {
$this->method_title = __( 'OnePay Domestic Gateway (by Woo Viet)', 'woo-viet' );
$this->method_description = __( 'OnePay supports all major bank ATMs in Vietnam.', 'woo-viet' );
- $this->supports = array(
- 'products',
- );
-
- // Load the settings.
- $this->init_form_fields();
- $this->init_settings();
-
- // Define user set variables.
- $this->title = $this->get_option( 'title' );
- $this->description = $this->get_option( 'description' ) . sprintf( '

', WOO_VIET_URL . 'assets/onepay_domestic.png' );
-
- $this->testmode = 'yes' === $this->get_option( 'testmode', 'no' );
- $this->merchant_id = $this->get_option( 'merchant_id' );
- $this->access_code = $this->get_option( 'access_code' );
- $this->secure_secret = $this->get_option( 'secure_secret' );
- $this->user = $this->get_option( 'user' );
- $this->password = $this->get_option( 'password' );
- $this->debug = 'yes' === $this->get_option( 'debug', 'no' );
-
- self::$log_enabled = $this->debug;
-
- // Process the admin options
- add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array(
- $this,
- 'process_admin_options'
- ) );
-
- add_action( 'woocommerce_thankyou_' . $this->id, array( $this, 'handle_onepay_return_url' ) );
-
- add_action( 'woocommerce_api_' . strtolower( __CLASS__ ), array( $this, 'handle_onepay_ipn' ) );
-
}
/**
@@ -68,412 +27,5 @@ class WooViet_OnePay_Domestic extends WC_Payment_Gateway {
$this->form_fields = include( 'onepay/domestic-settings.php' );
}
- /**
- * Get the IPN URL for OnePay
- * Format: http://my-site.com/wc-api/WooViet_OnePay_Domestic/
- */
- static function get_onepay_ipn_url() {
- return WC()->api_request_url( __CLASS__ );
- }
- /**
- * Process the payment
- *
- * @param int $order_id
- *
- * @return array
- */
- public function process_payment( $order_id ) {
- $order = wc_get_order( $order_id );
-
- return array(
- 'result' => 'success',
- 'redirect' => $this->get_pay_url( $order )
- );
- }
-
- /**
- * Get the OnePay pay URL for an order
- * AND set the queryDR cron for this transaction
- *
- * @param WC_Order $order
- *
- * @return string
- */
- public function get_pay_url( $order ) {
- $args = array(
- 'Title' => __( 'OnePay Payment Title', 'woo-viet' ),
- 'vpc_Merchant' => $this->merchant_id,
- 'vpc_AccessCode' => $this->access_code,
- 'vpc_MerchTxnRef' => sprintf( '%1$s_%2$s', $order->get_id(), date( 'YmdHis' ) ),
- 'vpc_OrderInfo' => substr(
- sprintf( 'Order #%1$s - %2$s', $order->get_id(), get_home_url() ),
- 0,
- 32 ), // Limit 32 characters
- 'vpc_Amount' => $order->get_total() * 100, // Multiplying 100 is a requirement from OnePay
- 'vpc_ReturnURL' => $this->get_return_url( $order ),
- 'vpc_Version' => '2',
- 'vpc_Command' => 'pay',
- 'vpc_Locale' => ( 'vi' == get_locale() ) ? 'vn' : 'en',
- 'vpc_Currency' => 'VND',
- 'vpc_TicketNo' => $_SERVER['REMOTE_ADDR'],
- 'AgainLink' => mb_strimwidth( wc_get_checkout_url(), 0, 64 ),
- );
-
- // Set the queryDR cron for this transaction
- $this->set_onepay_querydr_cron( $args['vpc_MerchTxnRef'] );
-
- // Get the secure hash
- $vpc_SecureHash = $this->create_vpc_SecureHash( $args );
-
- // Add the secure hash to the args
- $args['vpc_SecureHash'] = $vpc_SecureHash;
- $http_args = http_build_query( $args, '', '&' );
-
- // Log data
- $message_log = sprintf( 'get_pay_url - Order ID: %1$s - http_args: %2$s', $order->get_id(), print_r( $args, true ) );
- self::log( $message_log );
-
- if ( $this->testmode ) {
- // return 'https://mtf.onepay.vn/onecomm-pay/vpc.op?' . $http_args;
- // testing for int'l
- return 'https://mtf.onepay.vn/vpcpay/vpcpay.op?' . $http_args;
- } else {
- return 'https://onepay.vn/onecomm-pay/vpc.op?' . $http_args;
- }
-
- }
-
- /**
- * Set the cron job running queryDR in 20 mintues
- * Because the OnePay payment timeout is 15 minutes
- *
- * @param string $vpc_MerchTxnRef
- */
- public function set_onepay_querydr_cron( $vpc_MerchTxnRef ) {
-
- wp_schedule_single_event(
- time() + 20 * 60,
- 'wooviet_handle_onepay_querydr',
- array( $vpc_MerchTxnRef )
- );
-
- }
-
- /**
- * Create the vpc_SecureHash value.
- * @see https://mtf.onepay.vn/developer/?page=modul_noidia_php
- *
- * @param array $args
- *
- * @return string
- */
- public function create_vpc_SecureHash( $args ) {
- $stringHashData = "";
-
- // arrange array data a-z before make a hash
- ksort( $args );
-
- foreach ( $args as $key => $value ) {
-
- if ( strlen( $value ) > 0 ) {
- if ( ( strlen( $value ) > 0 ) && ( ( substr( $key, 0, 4 ) == "vpc_" ) || ( substr( $key, 0, 5 ) == "user_" ) ) ) {
- $stringHashData .= $key . "=" . $value . "&";
- }
- }
- }
- //Remove the last character "&"
- $stringHashData = rtrim( $stringHashData, "&" );
-
- return strtoupper( hash_hmac( 'SHA256', $stringHashData, pack( 'H*', $this->secure_secret ) ) );
- }
-
- /**
- * Handle the return URL - GET request from OnePay
- */
- public function handle_onepay_return_url() {
-
- if ( isset( $_GET['vpc_SecureHash'] ) ) {
-
- $this->process_onepay_response_data( $_GET, 'return' );
-
- }
- }
-
- /**
- * Handle the repsonse data from OnePay
- *
- * @param string $args the response data from OnePay
- * @param string $type
- */
- public function process_onepay_response_data( $args, $type ) {
- $types_accepted = array(
- 'return',
- 'ipn',
- 'querydr',
- );
-
- // Do nothing if the type is wrong
- if ( ! in_array( $type, $types_accepted ) ) {
- return;
- }
-
- $is_secure = false;
- $is_querydr_exists = false;
-
- if ( 'return' == $type OR 'ipn' == $type ) {
- $vpc_SecureHash = $args['vpc_SecureHash'];
-
- // Remove the parameter "vpc_SecureHash" for validating SecureHash
- unset( $args['vpc_SecureHash'] );
-
- $is_secure = $this->check_vpc_SecureHash( $args, $vpc_SecureHash );
-
- } elseif ( 'querydr' == $type ) {
- $is_querydr_exists = ( 'Y' == $args['vpc_DRExists'] );
-
- }
-
- // Process the data
- if ( $is_secure OR $is_querydr_exists ) {
- /**
- * $vpc_MerchTxnRef looks like this "139_20170418101843" or {order_id}_{date_time}
- * @see $this->get_pay_url();
- */
- $vpc_MerchTxnRef = $args['vpc_MerchTxnRef'];
- $vpc_TxnResponseCode = $args['vpc_TxnResponseCode'];
-
- // Get the order_id part only
- $order_id = substr( $vpc_MerchTxnRef, 0, strrpos( $vpc_MerchTxnRef, '_' ) );
-
- $order = wc_get_order( $order_id );
-
- // Add the order note for the reference
- $order_note = sprintf(
- __( 'OnePay Domestic Gateway Info | Code: %1$s | Message: %2$s | MerchantTxnRef: %3$s | Type: %4$s', 'woo-viet' ),
- $vpc_TxnResponseCode,
- $this->OnePay_getResponseDescription( $vpc_TxnResponseCode ),
- $vpc_MerchTxnRef,
- $type
- );
- $order->add_order_note( $order_note );
-
-
- // Do action for the order based on the response code from OnePay
- // This is an intentional DRY switch - refer to #DRY_vpc_TxnResponseCode below
- switch ( $vpc_TxnResponseCode ) {
- case '0':
- // If the payment is successful, update the order
- $order->payment_complete();
- break;
- case '99':
- // If the user cancels payment, cancel the order
- $order->cancel_order();
- break;
- default:
- // For other cases, do nothing. By default, the order status is still "Pending Payment"
- break;
- }
-
- // Log data
- $message_log = sprintf( 'process_onepay_response_data - Order ID: %1$s - Order Note: %2$s - http_args: %3$s', $order_id, $order_note, print_r( $args, true ) );
- self::log( $message_log );
-
- // Do the last actions based on $type
- switch ( $type ) {
-
- case 'return': // Add info from OnePay and redirect to the appropriate URLs
-
- wc_add_notice( __( 'OnePay info: ', 'woo-viet' ) . $this->OnePay_getResponseDescription( $vpc_TxnResponseCode ), 'notice' );
-
- // This is an intentional DRY switch - refer to #DRY_vpc_TxnResponseCode above
- // I need to make sure that `ipn` case below and message_log can be executed as well.
- switch ( $vpc_TxnResponseCode ) {
- case '0':
- // If the payment is successful, redirect to the order page
- wp_redirect( $this->get_return_url( $order ) );
- break;
- case '99':
- // If the user cancels payment, redirect to the canceled cart page
- wp_redirect( $order->get_cancel_order_url_raw() );
- break;
- default:
- // For other cases, redirect to the payment page
- wp_redirect( $order->get_checkout_payment_url() );
- break;
- }
-
- break;
-
- case 'ipn': // Output the data to the page content
- exit( 'responsecode=1&desc=confirm-success' );
- break;
-
- case 'querydr':
- // Do nothing
- break;
- }
-
- } else {
- if ( 'ipn' == $type ) {
- exit( 'responsecode=0&desc=confirm-success' );
- }
-
- }
- }
-
- /**
- * Whether or not the arguments and a provided $vpc_SecureHash are the same
- *
- * @see https://mtf.onepay.vn/developer/?page=modul_noidia_php
- *
- * @param $args
- * @param $vpc_SecureHash
- *
- * @return bool
- */
- public function check_vpc_SecureHash( $args, $vpc_SecureHash ) {
- // Generate the "vpc_SecureHash" value from $args
- $vpc_SecureHash_from_args = $this->create_vpc_SecureHash( $args );
-
- if ( $vpc_SecureHash_from_args == $vpc_SecureHash ) {
- return true;
- } else {
- return false;
- }
- }
-
- /**
- * Get the response description based on the response code
- * This is code is from OnePay
- *
- * @param string $responseCode
- *
- * @return string
- */
- public function OnePay_getResponseDescription( $responseCode ) {
-
- switch ( $responseCode ) {
- case "0" :
- $result = "Giao dịch thành công - Approved";
- break;
- case "1" :
- $result = "Ngân hàng từ chối giao dịch - Bank Declined";
- break;
- case "3" :
- $result = "Mã đơn vị không tồn tại - Merchant not exist";
- break;
- case "4" :
- $result = "Không đúng access code - Invalid access code";
- break;
- case "5" :
- $result = "Số tiền không hợp lệ - Invalid amount";
- break;
- case "6" :
- $result = "Mã tiền tệ không tồn tại - Invalid currency code";
- break;
- case "7" :
- $result = "Lỗi không xác định - Unspecified Failure ";
- break;
- case "8" :
- $result = "Số thẻ không đúng - Invalid card Number";
- break;
- case "9" :
- $result = "Tên chủ thẻ không đúng - Invalid card name";
- break;
- case "10" :
- $result = "Thẻ hết hạn/Thẻ bị khóa - Expired Card";
- break;
- case "11" :
- $result = "Thẻ chưa đăng ký sử dụng dịch vụ - Card Not Registed Service(internet banking)";
- break;
- case "12" :
- $result = "Ngày phát hành/Hết hạn không đúng - Invalid card date";
- break;
- case "13" :
- $result = "Vượt quá hạn mức thanh toán - Exist Amount";
- break;
- case "21" :
- $result = "Số tiền không đủ để thanh toán - Insufficient fund";
- break;
- case "99" :
- $result = "Người sủ dụng hủy giao dịch - User cancel";
- break;
- default :
- $result = "Giao dịch thất bại - Failured";
- }
-
- return $result;
- }
-
- /**
- * Handle the IPN POST request from OnePay
- */
- public function handle_onepay_ipn() {
-
- if ( isset( $_REQUEST['vpc_SecureHash'] ) ) {
-
- $this->process_onepay_response_data( $_REQUEST, 'ipn' );
-
- }
- }
-
- /**
- * Handle the queryDR request
- *
- * @param string $vpc_MerchTxnRef
- */
- public function handle_onepay_querydr( $vpc_MerchTxnRef ) {
- // Build the queryDR link
- $args = array(
- 'vpc_Command' => 'queryDR',
- 'vpc_Version' => '1',
- 'vpc_MerchTxnRef' => $vpc_MerchTxnRef,
- 'vpc_Merchant' => $this->merchant_id,
- 'vpc_AccessCode' => $this->access_code,
- 'vpc_User' => $this->user,
- 'vpc_Password' => $this->password,
- );
-
- $http_args = http_build_query( $args, '', '&' );
-
- if ( $this->testmode ) {
- // $http_link = 'https://mtf.onepay.vn/onecomm-pay/Vpcdps.op?' . $http_args;
- // Testing for int'l
- $http_link = 'https://mtf.onepay.vn/vpcpay/Vpcdps.op?' . $http_args;
- } else {
- $http_link = 'https://onepay.vn/onecomm-pay/Vpcdps.op?' . $http_args;
- }
-
- // Log data
- $message_log = sprintf( 'handle_onepay_querydr - http_link: %1$s - http_args: %2$s', $http_link, print_r( $args, true ) );
- self::log( $message_log );
-
- // Connect to OnePay to get the queryDR info
- $http_response = wp_remote_get( $http_link );
- parse_str( wp_remote_retrieve_body( $http_response ), $args_response );
-
- // Process the data
- $this->process_onepay_response_data( $args_response, 'querydr' );
-
- }
-
- /**
- * Logging method. - Copied from the WC_Gateway_Paypal Class
- *
- * @since 1.3.1
- *
- * @param string $message Log message.
- * @param string $level Optional. Default 'info'.
- * emergency|alert|critical|error|warning|notice|info|debug
- */
- public static function log( $message, $level = 'info' ) {
- if ( self::$log_enabled ) {
- if ( empty( self::$log ) ) {
- self::$log = wc_get_logger();
- }
- self::$log->log( $level, $message, array( 'source' => __CLASS__ ) );
- }
- }
-
-}
+}
\ No newline at end of file
diff --git a/inc/class-wooviet-onepay-international.php b/inc/class-wooviet-onepay-international.php
new file mode 100644
index 0000000..011ade4
--- /dev/null
+++ b/inc/class-wooviet-onepay-international.php
@@ -0,0 +1,27 @@
+method_title = __( 'OnePay International Gateway (by Woo Viet)', 'woo-viet' );
+ $this->method_description = __( 'OnePay supports all major international cards Visa, Master, JCB, Amex, etc.', 'woo-viet' );
+ }
+ /**
+ * Initialise Gateway Settings Form Fields.
+ */
+ public function init_form_fields() {
+ $this->form_fields = include( 'onepay/international-settings.php' );
+ }
+}
\ No newline at end of file
diff --git a/inc/onepay/abstract-payment.php b/inc/onepay/abstract-payment.php
new file mode 100644
index 0000000..306b874
--- /dev/null
+++ b/inc/onepay/abstract-payment.php
@@ -0,0 +1,478 @@
+id = strtolower( get_called_class() );
+ $this->has_fields = false;
+ $this->order_button_text = __( 'Proceed to OnePay', 'woo-viet' );
+ $this->configure_payment();
+ $this->supports = array(
+ 'products',
+ );
+
+ // Load the settings.
+ $this->init_form_fields();
+ $this->init_settings();
+
+ // Define user set variables.
+ $this->title = $this->get_option( 'title' );
+ $this->description = $this->get_option( 'description' ) . sprintf( '

', WOO_VIET_URL . 'assets/onepay_domestic.png' );
+
+ $this->testmode = 'yes' === $this->get_option( 'testmode', 'no' );
+ $this->merchant_id = $this->get_option( 'merchant_id' );
+ $this->access_code = $this->get_option( 'access_code' );
+ $this->secure_secret = $this->get_option( 'secure_secret' );
+ $this->user = $this->get_option( 'user' );
+ $this->password = $this->get_option( 'password' );
+ $this->debug = 'yes' === $this->get_option( 'debug', 'no' );
+
+ self::$log_enabled = $this->debug;
+
+ // Process the admin options
+ add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array(
+ $this,
+ 'process_admin_options'
+ ) );
+
+ add_action( 'woocommerce_thankyou_' . $this->id, array( $this, 'handle_onepay_return_url' ) );
+
+ add_action( 'woocommerce_api_' . strtolower( get_called_class() ), array( $this, 'handle_onepay_ipn' ) );
+
+ }
+
+ /**
+ * Initialise Gateway Settings Form Fields.
+ */
+ // abstract public function init_form_fields()
+
+ /**
+ * Get the IPN URL for OnePay
+ * Format: http://my-site.com/wc-api/WooViet_OnePay_Domestic/
+ */
+ static function get_onepay_ipn_url() {
+ return WC()->api_request_url( get_called_class() );
+ }
+
+ /**
+ * Process the payment
+ *
+ * @param int $order_id
+ *
+ * @return array
+ */
+ public function process_payment( $order_id ) {
+ $order = wc_get_order( $order_id );
+
+ return array(
+ 'result' => 'success',
+ 'redirect' => $this->get_pay_url( $order )
+ );
+ }
+
+ /**
+ * Get the OnePay pay URL for an order
+ * AND set the queryDR cron for this transaction
+ *
+ * @param WC_Order $order
+ *
+ * @return string
+ */
+ public function get_pay_url( $order ) {
+ $args = array(
+ 'Title' => __( 'OnePay Payment Title', 'woo-viet' ),
+ 'vpc_Merchant' => $this->merchant_id,
+ 'vpc_AccessCode' => $this->access_code,
+ 'vpc_MerchTxnRef' => sprintf( '%1$s_%2$s', $order->get_id(), date( 'YmdHis' ) ),
+ 'vpc_OrderInfo' => substr(
+ sprintf( 'Order #%1$s - %2$s', $order->get_id(), get_home_url() ),
+ 0,
+ 32 ), // Limit 32 characters
+ 'vpc_Amount' => $order->get_total() * 100, // Multiplying 100 is a requirement from OnePay
+ 'vpc_ReturnURL' => $this->get_return_url( $order ),
+ 'vpc_Version' => '2',
+ 'vpc_Command' => 'pay',
+ 'vpc_Locale' => ( 'vi' == get_locale() ) ? 'vn' : 'en',
+ 'vpc_Currency' => 'VND',
+ 'vpc_TicketNo' => $_SERVER['REMOTE_ADDR'],
+ 'AgainLink' => mb_strimwidth( wc_get_checkout_url(), 0, 64 ),
+ );
+
+ // Set the queryDR cron for this transaction
+ $this->set_onepay_querydr_cron( $args['vpc_MerchTxnRef'] );
+
+ // Get the secure hash
+ $vpc_SecureHash = $this->create_vpc_SecureHash( $args );
+
+ // Add the secure hash to the args
+ $args['vpc_SecureHash'] = $vpc_SecureHash;
+ $http_args = http_build_query( $args, '', '&' );
+
+ // Log data
+ $message_log = sprintf( 'get_pay_url - Order ID: %1$s - http_args: %2$s', $order->get_id(), print_r( $args, true ) );
+ self::log( $message_log );
+
+ // TODO - need to fix this issue for intl and domestic
+ if ( $this->testmode ) {
+ return 'https://mtf.onepay.vn/onecomm-pay/vpc.op?' . $http_args;
+ } else {
+ return 'https://onepay.vn/onecomm-pay/vpc.op?' . $http_args;
+ }
+
+ }
+
+ /**
+ * Set the cron job running queryDR in 20 mintues
+ * Because the OnePay payment timeout is 15 minutes
+ *
+ * @param string $vpc_MerchTxnRef
+ */
+ public function set_onepay_querydr_cron( $vpc_MerchTxnRef ) {
+
+ wp_schedule_single_event(
+ time() + 20 * 60,
+ 'wooviet_handle_onepay_querydr',
+ array( $vpc_MerchTxnRef )
+ );
+
+ }
+
+ /**
+ * Create the vpc_SecureHash value.
+ * @see https://mtf.onepay.vn/developer/?page=modul_noidia_php
+ *
+ * @param array $args
+ *
+ * @return string
+ */
+ public function create_vpc_SecureHash( $args ) {
+ $stringHashData = "";
+
+ // arrange array data a-z before make a hash
+ ksort( $args );
+
+ foreach ( $args as $key => $value ) {
+
+ if ( strlen( $value ) > 0 ) {
+ if ( ( strlen( $value ) > 0 ) && ( ( substr( $key, 0, 4 ) == "vpc_" ) || ( substr( $key, 0, 5 ) == "user_" ) ) ) {
+ $stringHashData .= $key . "=" . $value . "&";
+ }
+ }
+ }
+ //Remove the last character "&"
+ $stringHashData = rtrim( $stringHashData, "&" );
+
+ return strtoupper( hash_hmac( 'SHA256', $stringHashData, pack( 'H*', $this->secure_secret ) ) );
+ }
+
+ /**
+ * Handle the return URL - GET request from OnePay
+ */
+ public function handle_onepay_return_url() {
+
+ if ( isset( $_GET['vpc_SecureHash'] ) ) {
+
+ $this->process_onepay_response_data( $_GET, 'return' );
+
+ }
+ }
+
+ /**
+ * Handle the repsonse data from OnePay
+ *
+ * @param string $args the response data from OnePay
+ * @param string $type
+ */
+ public function process_onepay_response_data( $args, $type ) {
+ $types_accepted = array(
+ 'return',
+ 'ipn',
+ 'querydr',
+ );
+
+ // Do nothing if the type is wrong
+ if ( ! in_array( $type, $types_accepted ) ) {
+ return;
+ }
+
+ $is_secure = false;
+ $is_querydr_exists = false;
+
+ if ( 'return' == $type OR 'ipn' == $type ) {
+ $vpc_SecureHash = $args['vpc_SecureHash'];
+
+ // Remove the parameter "vpc_SecureHash" for validating SecureHash
+ unset( $args['vpc_SecureHash'] );
+
+ $is_secure = $this->check_vpc_SecureHash( $args, $vpc_SecureHash );
+
+ } elseif ( 'querydr' == $type ) {
+ $is_querydr_exists = ( 'Y' == $args['vpc_DRExists'] );
+
+ }
+
+ // Process the data
+ if ( $is_secure OR $is_querydr_exists ) {
+ /**
+ * $vpc_MerchTxnRef looks like this "139_20170418101843" or {order_id}_{date_time}
+ * @see $this->get_pay_url();
+ */
+ $vpc_MerchTxnRef = $args['vpc_MerchTxnRef'];
+ $vpc_TxnResponseCode = $args['vpc_TxnResponseCode'];
+
+ // Get the order_id part only
+ $order_id = substr( $vpc_MerchTxnRef, 0, strrpos( $vpc_MerchTxnRef, '_' ) );
+
+ $order = wc_get_order( $order_id );
+
+ // Add the order note for the reference
+ $order_note = sprintf(
+ __( 'OnePay Domestic Gateway Info | Code: %1$s | Message: %2$s | MerchantTxnRef: %3$s | Type: %4$s', 'woo-viet' ),
+ $vpc_TxnResponseCode,
+ $this->OnePay_getResponseDescription( $vpc_TxnResponseCode ),
+ $vpc_MerchTxnRef,
+ $type
+ );
+ $order->add_order_note( $order_note );
+
+
+ // Do action for the order based on the response code from OnePay
+ // This is an intentional DRY switch - refer to #DRY_vpc_TxnResponseCode below
+ switch ( $vpc_TxnResponseCode ) {
+ case '0':
+ // If the payment is successful, update the order
+ $order->payment_complete();
+ break;
+ case '99':
+ // If the user cancels payment, cancel the order
+ $order->cancel_order();
+ break;
+ default:
+ // For other cases, do nothing. By default, the order status is still "Pending Payment"
+ break;
+ }
+
+ // Log data
+ $message_log = sprintf( 'process_onepay_response_data - Order ID: %1$s - Order Note: %2$s - http_args: %3$s', $order_id, $order_note, print_r( $args, true ) );
+ self::log( $message_log );
+
+ // Do the last actions based on $type
+ switch ( $type ) {
+
+ case 'return': // Add info from OnePay and redirect to the appropriate URLs
+
+ wc_add_notice( __( 'OnePay info: ', 'woo-viet' ) . $this->OnePay_getResponseDescription( $vpc_TxnResponseCode ), 'notice' );
+
+ // This is an intentional DRY switch - refer to #DRY_vpc_TxnResponseCode above
+ // I need to make sure that `ipn` case below and message_log can be executed as well.
+ switch ( $vpc_TxnResponseCode ) {
+ case '0':
+ // If the payment is successful, redirect to the order page
+ wp_redirect( $this->get_return_url( $order ) );
+ break;
+ case '99':
+ // If the user cancels payment, redirect to the canceled cart page
+ wp_redirect( $order->get_cancel_order_url_raw() );
+ break;
+ default:
+ // For other cases, redirect to the payment page
+ wp_redirect( $order->get_checkout_payment_url() );
+ break;
+ }
+
+ break;
+
+ case 'ipn': // Output the data to the page content
+ exit( 'responsecode=1&desc=confirm-success' );
+ break;
+
+ case 'querydr':
+ // Do nothing
+ break;
+ }
+
+ } else {
+ if ( 'ipn' == $type ) {
+ exit( 'responsecode=0&desc=confirm-success' );
+ }
+
+ }
+ }
+
+ /**
+ * Whether or not the arguments and a provided $vpc_SecureHash are the same
+ *
+ * @see https://mtf.onepay.vn/developer/?page=modul_noidia_php
+ *
+ * @param $args
+ * @param $vpc_SecureHash
+ *
+ * @return bool
+ */
+ public function check_vpc_SecureHash( $args, $vpc_SecureHash ) {
+ // Generate the "vpc_SecureHash" value from $args
+ $vpc_SecureHash_from_args = $this->create_vpc_SecureHash( $args );
+
+ if ( $vpc_SecureHash_from_args == $vpc_SecureHash ) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Get the response description based on the response code
+ * This is code is from OnePay
+ *
+ * @param string $responseCode
+ *
+ * @return string
+ */
+ public function OnePay_getResponseDescription( $responseCode ) {
+
+ switch ( $responseCode ) {
+ case "0" :
+ $result = "Giao dịch thành công - Approved";
+ break;
+ case "1" :
+ $result = "Ngân hàng từ chối giao dịch - Bank Declined";
+ break;
+ case "3" :
+ $result = "Mã đơn vị không tồn tại - Merchant not exist";
+ break;
+ case "4" :
+ $result = "Không đúng access code - Invalid access code";
+ break;
+ case "5" :
+ $result = "Số tiền không hợp lệ - Invalid amount";
+ break;
+ case "6" :
+ $result = "Mã tiền tệ không tồn tại - Invalid currency code";
+ break;
+ case "7" :
+ $result = "Lỗi không xác định - Unspecified Failure ";
+ break;
+ case "8" :
+ $result = "Số thẻ không đúng - Invalid card Number";
+ break;
+ case "9" :
+ $result = "Tên chủ thẻ không đúng - Invalid card name";
+ break;
+ case "10" :
+ $result = "Thẻ hết hạn/Thẻ bị khóa - Expired Card";
+ break;
+ case "11" :
+ $result = "Thẻ chưa đăng ký sử dụng dịch vụ - Card Not Registed Service(internet banking)";
+ break;
+ case "12" :
+ $result = "Ngày phát hành/Hết hạn không đúng - Invalid card date";
+ break;
+ case "13" :
+ $result = "Vượt quá hạn mức thanh toán - Exist Amount";
+ break;
+ case "21" :
+ $result = "Số tiền không đủ để thanh toán - Insufficient fund";
+ break;
+ case "99" :
+ $result = "Người sủ dụng hủy giao dịch - User cancel";
+ break;
+ default :
+ $result = "Giao dịch thất bại - Failured";
+ }
+
+ return $result;
+ }
+
+ /**
+ * Handle the IPN POST request from OnePay
+ */
+ public function handle_onepay_ipn() {
+
+ if ( isset( $_REQUEST['vpc_SecureHash'] ) ) {
+
+ $this->process_onepay_response_data( $_REQUEST, 'ipn' );
+
+ }
+ }
+
+ /**
+ * Handle the queryDR request
+ *
+ * @param string $vpc_MerchTxnRef
+ */
+ public function handle_onepay_querydr( $vpc_MerchTxnRef ) {
+ // Build the queryDR link
+ $args = array(
+ 'vpc_Command' => 'queryDR',
+ 'vpc_Version' => '1',
+ 'vpc_MerchTxnRef' => $vpc_MerchTxnRef,
+ 'vpc_Merchant' => $this->merchant_id,
+ 'vpc_AccessCode' => $this->access_code,
+ 'vpc_User' => $this->user,
+ 'vpc_Password' => $this->password,
+ );
+
+ $http_args = http_build_query( $args, '', '&' );
+
+ // TODO - need to fix this issue for intl and domestic
+ if ( $this->testmode ) {
+ $http_link = 'https://mtf.onepay.vn/onecomm-pay/Vpcdps.op?' . $http_args;
+ } else {
+ $http_link = 'https://onepay.vn/onecomm-pay/Vpcdps.op?' . $http_args;
+ }
+
+ // Log data
+ $message_log = sprintf( 'handle_onepay_querydr - http_link: %1$s - http_args: %2$s', $http_link, print_r( $args, true ) );
+ self::log( $message_log );
+
+ // Connect to OnePay to get the queryDR info
+ $http_response = wp_remote_get( $http_link );
+ parse_str( wp_remote_retrieve_body( $http_response ), $args_response );
+
+ // Process the data
+ $this->process_onepay_response_data( $args_response, 'querydr' );
+
+ }
+
+ /**
+ * Logging method. - Copied from the WC_Gateway_Paypal Class
+ *
+ * @since 1.3.1
+ *
+ * @param string $message Log message.
+ * @param string $level Optional. Default 'info'.
+ * emergency|alert|critical|error|warning|notice|info|debug
+ */
+ public static function log( $message, $level = 'info' ) {
+ if ( self::$log_enabled ) {
+ if ( empty( self::$log ) ) {
+ self::$log = wc_get_logger();
+ }
+ self::$log->log( $level, $message, array( 'source' => get_called_class() ) );
+ }
+ }
+
+}
diff --git a/inc/onepay/domestic-settings.php b/inc/onepay/domestic-settings.php
index bf6f761..2c0667e 100644
--- a/inc/onepay/domestic-settings.php
+++ b/inc/onepay/domestic-settings.php
@@ -5,7 +5,7 @@ if ( ! defined( 'ABSPATH' ) ) {
}
/**
- * Settings for 1Pay Gateway.
+ * Settings for OnePay Domestic Gateway.
* @since 1.3
*/
return array(
diff --git a/inc/onepay/international-settings.php b/inc/onepay/international-settings.php
new file mode 100644
index 0000000..e7f1626
--- /dev/null
+++ b/inc/onepay/international-settings.php
@@ -0,0 +1,103 @@
+ array(
+ 'title' => __( 'Enable/Disable', 'woo-viet' ),
+ 'type' => 'checkbox',
+ 'label' => __( 'OnePay International Gateway (by Woo Viet)', 'woo-viet' ),
+ 'default' => 'no'
+ ),
+ 'testmode' => array(
+ 'title' => __( 'OnePay Sandbox', 'woocommerce' ),
+ 'type' => 'checkbox',
+ 'label' => __( 'Enable OnePay sandbox (testing)', 'woocommerce' ),
+ 'default' => 'no',
+ 'description' => sprintf( __( 'OnePay sandbox can be used to test payments. See the testing info.', 'woocommerce' ), 'https://mtf.onepay.vn/developer/?page=modul_noidia' ),
+ //@todo: add the logo https://mtf.onepay.vn/developer/?page=logo
+ ),
+ 'title' => array(
+ 'title' => __( 'Title', 'woo-viet' ),
+ 'type' => 'text',
+ 'description' => __( 'This controls the title which the user sees during checkout.', 'woo-viet' ),
+ 'default' => __( 'OnePay International Gateway', 'woo-viet' ),
+ 'desc_tip' => true,
+ ),
+ 'description' => array(
+ 'title' => __( 'Description', 'woo-viet' ),
+ 'type' => 'textarea',
+ 'desc_tip' => true,
+ 'description' => __( 'This controls the description which the user sees during checkout.', 'woo-viet' ),
+ 'default' => __( 'With OnePay, you can make payment by using any local Vietnam ATM card.', 'woo-viet' )
+ ),
+ 'api_details' => array(
+ 'title' => __( 'API Credentials', 'woo-viet' ),
+ 'type' => 'title',
+ 'description' => sprintf( __( 'Enter your OnePay API credentials. Contact OnePay to have your credentials %shere%s.', 'woo-viet' ), '', '' ),
+ ),
+ 'merchant_id' => array(
+ 'title' => __( 'Merchant ID', 'woo-viet' ),
+ 'type' => 'text',
+ 'description' => __( 'Get your Merchant ID from OnePay.', 'woo-viet' ),
+ 'default' => '',
+ 'desc_tip' => true,
+ 'placeholder' => __( 'Required. Provided by OnePay.', 'woo-viet' )
+ ),
+ 'access_code' => array(
+ 'title' => __( 'Access Code', 'woocommerce' ),
+ 'type' => 'text',
+ 'description' => __( 'Get your Access Code from OnePay.', 'woo-viet' ),
+ 'default' => '',
+ 'desc_tip' => true,
+ 'placeholder' => __( 'Required. Provided by OnePay.', 'woo-viet' )
+ ),
+ 'secure_secret' => array(
+ 'title' => __( 'Secure Secret', 'woocommerce' ),
+ 'type' => 'text',
+ 'description' => __( 'Get your Secure Secret from OnePay.', 'woo-viet' ),
+ 'default' => '',
+ 'desc_tip' => true,
+ 'placeholder' => __( 'Required. Provided by OnePay.', 'woo-viet' )
+ ),
+ 'user' => array(
+ 'title' => __( 'User for queryDR. Test value: op01', 'woocommerce' ),
+ 'type' => 'text',
+ 'description' => __( 'Get your user info from OnePay.', 'woo-viet' ),
+ 'default' => '',
+ 'desc_tip' => true,
+ 'placeholder' => __( 'Required. Provided by OnePay', 'woo-viet' )
+ ),
+ 'password' => array(
+ 'title' => __( 'Password for queryDR. Test value: op123456', 'woocommerce' ),
+ 'type' => 'text',
+ 'description' => __( 'Get your password info from OnePay.', 'woo-viet' ),
+ 'default' => '',
+ 'desc_tip' => true,
+ 'placeholder' => __( 'Required. Provided by OnePay.', 'woo-viet' )
+ ),
+ 'more_info' => array(
+ 'title' => __( 'Instant Payment Notification (IPN)', 'woo-viet' ),
+ 'type' => 'title',
+ 'description' =>
+ sprintf( 'URL: %s', WooViet_OnePay_International::get_onepay_ipn_url() ) . '' .
+ sprintf( __( '%sContact OnePay%s to configure this URL on its site. This is required based on its guidelines.', 'woo-viet' ), '', '' ),
+ ),
+ /**
+ * @since 1.3.1
+ */
+ 'debug' => array(
+ 'title' => __( 'Debug log', 'woo-viet' ),
+ 'type' => 'checkbox',
+ 'label' => __( 'Enable logging', 'woo-viet' ),
+ 'default' => 'no',
+ 'description' => sprintf( __( 'Log events, such as IPN requests, inside %s', 'woo-viet' ), '' . WC_Log_Handler_File::get_log_file_path( 'WooViet_OnePay_International' ) . '' ),
+ ),
+
+);
\ No newline at end of file