id = 'innovext_allpay_aio'; $this->has_fields = false; $this->method_title = '歐付寶/綠界全方位金流'; $this->init_form_fields(); $this->init_settings(); // Define user set variables $this->title = $this->get_option( 'title' ); $this->pay_use = $this->get_option( 'pay_use', '1' ); $this->description = $this->get_option( 'description' ); $this->instruction_succ = $this->get_option( 'instruction_succ' ); $this->instruction_on_hold = $this->get_option( 'instruction_on_hold' ); $this->expire_date = $this->get_option( 'ExpireDate' ); $this->exclude_payments = $this->get_option( 'exclude_payments' ); $this->order_prefix = $this->get_option( 'order_prefix' ); $this->min_amount = $this->get_option( 'min_amount' ); $this->reduce_stock = $this->get_option( 'reduce_stock' ); $this->english = $this->get_option( 'english' ); $this->query_trade_info = $this->get_option( 'query_allpay_trade_info' ); $this->payment_method_label = $this->get_option( 'payment_method_label' ); $this->mer_id = $this->get_option( 'MerchantID' ); $this->hash_key = $this->get_option( 'hash_key' ); $this->hash_iv = $this->get_option( 'hash_iv' ); $this->testmode = $this->get_option( 'testmode' ); $this->admin_mode = $this->get_option( 'admin_mode' ); $this->debug = $this->get_option( 'debug' ); if( $this->pay_use !== '2' ) { $this->icon = apply_filters( 'inno_woocommerce_allpay_icon', plugins_url( '../icon/allpay-logo.png', __FILE__ ) ); } else { $this->icon = apply_filters( 'inno_woocommerce_ecpay_icon', plugins_url( '../icon/ecpay-logo.png', __FILE__ ) ); } $this->payment_type = 'aio'; $this->notify_url = WC()->api_request_url( 'WC_innovext_allpay_aio' ); $this->allpay_checkout_gateway = ( $this->testmode == 'yes' ) ? self::ALLPAY_CHECKOUT_TEST : self::ALLPAY_CHECKOUT_PRODUCTION; $this->ecpay_checkout_gateway = ( $this->testmode == 'yes' ) ? self::ECPAY_CHECKOUT_TEST : self::ECPAY_CHECKOUT_PRODUCTION; $this->allpay_inquery_url = ( $this->testmode == 'yes' ) ? self::ALLPAY_INQUERY_TEST : self::ALLPAY_INQUERY_PRODUCTION; $this->ecpay_inquery_url = ( $this->testmode == 'yes' ) ? self::ECPAY_INQUERY_TEST : self::ECPAY_INQUERY_PRODUCTION; self::$log_enabled = $this->debug; if( 'yes' == $this->testmode ) { $this->title .= '|測試'; } if( 'yes' == $this->admin_mode ) { $this->title .= '|管理員'; } // Actions add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array( $this, 'process_admin_options' ) ); add_action( 'woocommerce_receipt_'. $this->id, array( $this, 'receipt_page' ) ); add_action( 'woocommerce_api_wc_'. $this->id, array( $this, 'check_allpay_response' ) ); add_action( 'valid_allpay_ipn_request', array( $this, 'successful_request' ) ); add_action( 'woocommerce_admin_order_data_after_billing_address', array( $this, 'allpay_admin_order_data_after_billing_address' ) , 10, 1 ); //add_action( 'woocommerce_thankyou_'. $this->id, array( $this, 'thankyou_page' ) ); add_filter( 'woocommerce_thankyou_order_received_text', array( $this, 'thankyou_order_received_text' ), 10, 2 ); // add query order metabox add_action( 'woocommerce_admin_order_data_after_billing_address', array( $this, 'add_query_trade_info_meta_box' ) , 10, 1 ); // Customer Emails add_action('woocommerce_email_before_order_table', array($this, 'email_instructions'), 10, 2 ); } /** * Logging method. * @param string $message * @param array $array */ public static function log( $message, $array = '' ) { if ( self::$log_enabled ) { if ( empty( self::$log ) ) { self::$log = new WC_Logger(); } if( $array && is_array( $array ) ) { ob_start(); print_r( $array ); $stringify_array = ob_get_clean(); $message .= PHP_EOL . $stringify_array; } self::$log->add( 'allpay_aio', $message ); } } /** * Initialise Gateway Settings Form Fields * * @access public * @return void */ function init_form_fields() { $this->form_fields = require( 'allpay-ecpay-settings.php' ); } /** * Admin Panel Options * - Options for bits like 'title' and availability on a country-by-country basis * * @access public * @return void */ public function admin_options() { echo '

歐付寶/綠界全方位金流

'; $this->display_allpay_admin_notice(); echo ''; // Generate the HTML For the settings form. $this->generate_settings_html(); echo '
'; } /** * Display admin notice if option is set to admin mode or test mode * * @access public * @return void */ function display_allpay_admin_notice() { if( $this->testmode == 'yes' ) { echo '
'; echo '

現正開啟測試模式

'; echo '
'; } if( $this->admin_mode == 'yes' ) { echo '
'; echo '

現正開啟管理員模式

'; echo '
'; } } /** * Get allpay Args for passing to allpay * * @access public * @param mixed $order * @return array */ function get_allpay_args($order) { if( $this->order_prefix ) { $order_id = $this->order_prefix . $order->id; } else { $order_id = $order->id; } $this->log( 'Generating payment form for order #' . $order_id . '. Notify URL: ' . $this->notify_url ); $total_amount = round( $order->get_total() ); // Get order items if ( sizeof( $order->get_items() ) > 0 ) { $item_names = ''; foreach ( $order->get_items() as $item ) { if ( $item['qty'] ) { /** * because the product line will be splitted by # after submmited to allpay, * so we have to replace the hash '#' to muilti byte one if the product title * contains #. And also convert special characters to prevent any error. */ $item_name = self::convert_special_char_to_multibyte( $item['name'] ); $item_names .= $item_name . ' x ' . $item['qty'].'#'; } } $item_names = rtrim( $item_names, '#' ); } // get excluded payment methods $ignore_payment = ''; if ( $this->exclude_payments ) { foreach( $this->exclude_payments as $exclude_payment ) { $ignore_payment .= $exclude_payment . '#'; } $ignore_payment = rtrim( $ignore_payment, '#' ); } $expire_date = $this->expire_date; $this->log( 'Item Name : ' . $item_names ); $mer_id = $this->mer_id; $payment_type = $this->payment_type; $return_url = $this->get_return_url($order); $notify_url = $this->notify_url; $english = $this->english; $allpay_args = array( 'MerchantID' => $mer_id, 'MerchantTradeNo' => $order_id, 'MerchantTradeDate' => current_time('Y/m/d H:i:s'), 'PaymentType' => $payment_type, 'TotalAmount' => $total_amount, 'TradeDesc' => get_bloginfo('name'), 'ItemName' => $item_names, 'ChoosePayment' => 'ALL', 'ReturnURL' => $notify_url, // reply url 'PaymentInfoURL' => $notify_url, // CVS, Barcode reply url 'ClientBackURL' => $return_url, 'OrderResultURL' => $return_url, // return to store ); // set ignore payment if( $ignore_payment && $english == 'no' ) { $allpay_args['IgnorePayment'] = $ignore_payment; } // turn on english mode, will only diplay credit card payment if( $english == 'yes' ) { $allpay_args['Language'] = 'ENG'; $allpay_args['ChoosePayment'] = 'Credit'; } // set expire date if( $expire_date > 0 && $expire_date <= 60 ) { $allpay_args['ExpireDate'] = $this->expire_date; } $allpay_args = apply_filters( 'innovext_allpay_aio_args', $allpay_args ); return $allpay_args; } /** * Convert special character to multibyte * * @param $string the string contains any character include special character * @return string */ static function convert_special_char_to_multibyte( $string ) { $char = array( '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '=', '+' ); $mb_char = array( '~', '!', '@', '#', '$', '%', '︿', '&', '*', '(', ')', '—', '=', '+' ); return str_replace( $char, $mb_char, $string ); } /** * Output for the order received page. * * @access public * @param mixed $order_id * @return void */ function thankyou_page( $order_id ) { $return_code = get_post_meta( $order_id, '_RtnCode', true ); if( $return_code ) { if( $return_code === '1' ) { if( $this->instruction_succ ) { echo wpautop( wptexturize( $this->instruction_succ ) ); } } elseif( ( $return_code === '2' || $return_code === '10100073' ) ) { if( $this->instruction_on_hold ) { echo wpautop( wptexturize( $this->instruction_on_hold ) ); } } else { echo '

錯誤代碼 : '.$return_code.'

'; } } else { echo '

發生錯誤,無法取得訂單狀態,若您已付款,請通知商店管理員。

'; } } /** * Thank you order received text * * @param string $message the original message * @param object $order WC Order * @return mixed */ function thankyou_order_received_text( $text, $order ) { $order_id = $order->id; $return_code = get_post_meta( $order_id, '_RtnCode', true ); if ( $order->payment_method != 'innovext_allpay_aio' ) { return $text; } if( $return_code ) { if( $return_code === '1' && $this->instruction_succ ) { return wpautop( wptexturize( $this->instruction_succ ) ); } elseif( ( $return_code === '2' || $return_code === '10100073' ) ) { if( $this->instruction_on_hold ) { return wpautop( wptexturize( $this->instruction_on_hold ) ); } } else { return '

錯誤代碼 : '.$return_code.'

'; } } else { return '

發生錯誤,無法取得訂單狀態,若您已付款,請通知商店管理員。

'; } return $text; } /** * Get the check mac value. * * @param array $args * @return string */ function get_the_check_mac_value( $args ){ $hash_key = $this->hash_key; $hash_iv = $this->hash_iv; $check_mac_value = self::get_check_mac_value( $args, $hash_key, $hash_iv ); return $check_mac_value; } /** * Get check mac value. Check mac value is the validation mechanism of Allpay/ECpay * to check the post value from/to Allpay/ECpay to prevent the value been falsified. * * @param array $args * @param string $hash_key * @param string $hash_iv * @param string $hash_algo hash algorithm, md5|sha256...etc * @return string || boolean */ static function get_check_mac_value( $args, $hash_key, $hash_iv, $hash_algo = 'md5' ){ if( empty( $args ) || empty( $hash_key ) || empty( $hash_iv ) ) { return false; } ksort( $args, SORT_STRING | SORT_FLAG_CASE ); $args_hash_key = array_merge( array( 'HashKey'=> $hash_key ), $args, array( 'HashIV' => $hash_iv ) ); $args_string = ''; foreach( $args_hash_key as $v => $k ){ $args_string .= $v .'='. $k .'&'; } $args_string = rtrim( $args_string, "&" ); $args_urlencode = urlencode( $args_string ); $args_urlencode = self::inno_special_character_decode( $args_urlencode ); $args_to_lower = strtolower( $args_urlencode ); $check_mac_value = strtoupper( hash( $hash_algo, $args_to_lower ) ); return $check_mac_value; } /** * Special character decode, Allpay/ECpay uses .Net to encode the url, but some * of the speicial characters are not encoded. To make sure the check mac value * is correct, we need to transform them back. * * @param type $string * @return string */ static function inno_special_character_decode( $string ) { $char = array( '%28', '%29', '%5b', '%5d' ); $mb_char = array( '(', ')', '[', ']' ); return str_replace( $char, $mb_char, $string ); } /** * Generate the allpay button link (POST method) * * @access public * @param string $order_id * @return string */ function generate_allpay_form( $order_id ) { global $woocommerce; $order = new WC_Order( $order_id ); $allpay_args = $this->get_allpay_args( $order ); $check_mac_value = $this->get_the_check_mac_value( $allpay_args ); $allpay_args['CheckMacValue'] = $check_mac_value; $this->log( 'POST to Allpay Args : ', $allpay_args ); // save pay use type - 1:Allpay, 2:Ecpay $pay_use = $this->pay_use; update_post_meta( $order_id, '_PayUse', $pay_use ); if( $pay_use !== '2' ) { $gateway_url = $this->allpay_checkout_gateway; } else { $gateway_url = $this->ecpay_checkout_gateway; } wc_enqueue_js( ' $.blockUI({ message: "感謝您的訂購,接下來畫面將導向付款頁面", baseZ: 99999, overlayCSS: { background: "#fff", opacity: 0.6 }, css: { padding: "20px", zindex: "9999999", textAlign: "center", color: "#555", border: "3px solid #aaa", backgroundColor:"#fff", cursor: "wait", lineHeight: "24px", } }); jQuery("#allpay_payment_form").submit(); ' ); $output = '
'; foreach( $allpay_args as $k => $v ){ $output .= ''; } $output .= '
'; return $output; } /** * Output for the order received page. * * @access public * @return void */ function receipt_page( $order_id ) { global $woocommerce; echo '

感謝您的訂購,接下來將導向付款頁面,請稍後

'; // Clear cart $woocommerce->cart->empty_cart(); $order = new WC_Order( $order_id ); echo $this->generate_allpay_form( $order_id ); } /** * Add content to the WC emails. * * @access public * @param WC_Order $order * @param bool $sent_to_admin * @return void */ function email_instructions( $order, $sent_to_admin ) { if ( $order->payment_method !== $this->id ) { return; } $order_id = $order->id; $payment_type = get_post_meta( $order_id, '_PaymentType', true ); if( $payment_type ) { $payment_type_label = self::parse_payment_type( $payment_type ); } if ( $order->status == 'processing' ) { if( $sent_to_admin ) { echo "已收到付款,付款方式 - ".$payment_type_label; }else{ echo wpautop( wptexturize( $this->instruction_succ ) ). PHP_EOL; } } elseif( $order->status == 'on-hold' ) { if( $sent_to_admin ) { echo "尚未付款,付款方式 - ".$payment_type_label; } else { echo wpautop( wptexturize( $this->instruction_on_hold ) ). PHP_EOL; // vaccount detail, cvs detail $this->print_order_meta( $order ); } } } /** * Print order meta for webatm, atm, cvs in email notification * * @access public * @return void */ function print_order_meta( $order ) { if( $this->email_return_code ) { $email_return_code = $this->email_return_code; } else { $email_return_code = ''; } if( '2' == $email_return_code ) { ?>

付款資訊

付款方式email_payment_type_label ?>
銀行代碼email_bank_code ?>
繳費帳號email_vaccount ?>
繳費期限email_expire_date ?>
email_payment_method ) { ?>

付款資訊

付款方式email_payment_type_label ?>
繳費代碼email_payment_no ?>
繳費期限email_expire_date ?>
check_ipn_response_is_valid( $ipn_response ); if ( $is_valid_request ) { header( 'HTTP/1.1 200 OK' ); do_action( "valid_allpay_ipn_request", $ipn_response ); } else { die( "0|ErrorMessage" ); } } /** * Receive ipn response from allpay, update order status if succeeded. * * @param string $ipn_response , encrypted string * @return void */ function successful_request( $ipn_response ) { $MerchantTradeNo = $ipn_response['MerchantTradeNo']; $order_id = $this->parse_merchant_trade_no( $MerchantTradeNo ); // save the woocommerce transacetion id, same as MerchantTradeNo update_post_meta( $order_id, '_transaction_id', $MerchantTradeNo ); update_post_meta( $order_id, '_MerchantTradeNo', $MerchantTradeNo ); $order = new WC_Order( $order_id ); $return_code = $ipn_response['RtnCode']; //$old_return_code = get_post_meta( $order_id, '_RtnCode', true ); // if previous is 2 or 10100073 $payment_type = $ipn_response['PaymentType']; $payment_method = explode( '_', $ipn_response['PaymentType'] ); if( $payment_type ) { update_post_meta( $order_id, '_PaymentType', $payment_type ); } if( $return_code ) { update_post_meta( $order_id, '_RtnCode', $return_code ); } $this->log( 'successful-request : ', $ipn_response ); // parse allpay ipn payment type label $payment_type_label = self::parse_payment_type( $payment_type ); $payment_method_title = get_post_meta( $order_id, '_payment_method_title', true ); // change payment method label if( $this->payment_method_label == 'main_label' ) { $change_payment_type_label = self::parse_payment_type( $payment_type, true ); } else if( $this->payment_method_label == 'detailed_label' ) { $change_payment_type_label = self::parse_payment_type( $payment_type ); } else { $change_payment_type_label = $this->title; // default method title } if( $this->payment_method_label != 'default' && $payment_method_title != $change_payment_type_label ) { if ( 'yes' == $this->testmode ) { $change_payment_type_label .= '|測試'; } if ( 'yes' == $this->admin_mode ) { $change_payment_type_label .= '|管理員'; } update_post_meta( $order_id, '_payment_method_title', $change_payment_type_label ); } do_action( 'innovext_allpay_before_process_rtn_code', $ipn_response, $order_id ); $pay_use = get_post_meta( $order_id, '_PayUse', true ); // if( empty( $pay_use ) ) { // get the payment gateway type, 1:Allpay 2:ECpay $query_trade_info_args = $this->get_query_trade_info_args( $order_id ); $this->log( 'Get query trade info args :', $query_trade_info_args ); // } if( isset( $query_trade_info_args['PayUse'] ) && $query_trade_info_args['PayUse'] ) { $pay_use = $query_trade_info_args['PayUse']; update_post_meta( $order_id, '_PayUse', $pay_use ); } // return code === 1 means the payment has been completed if( $return_code === '1' ) { $order->payment_complete(); $order->add_order_note( '已收到顧客付款,付款方式 "'.$payment_type_label.'"' ); die("1|OK"); } elseif( $return_code === '2' || $return_code === '10100073' ) { /** * return code '2' means the customer choosed the ATM, '10100073' * means convenient store. the orders will be waiting for the payment. * If the customer completed the payment, the allpay system will * send the post value containing return code '1' to notify the WC API. */ // save the ExpireDate to let admin know when will the order be expired update_post_meta( $order_id, '_ExpireDate', $ipn_response['ExpireDate'] ); if( $return_code === '2' ) { $this->email_return_code = '2'; $this->email_payment_type_label = $payment_type_label; $this->email_bank_code = $ipn_response['BankCode']; $this->email_vaccount = $ipn_response['vAccount']; $this->email_expire_date = $ipn_response['ExpireDate']; } else if( $return_code === '10100073' && $payment_method[0] === 'CVS' ) { $this->email_return_code = '10100073'; $this->email_payment_method = $payment_method[0]; $this->email_payment_type_label = $payment_type_label; $this->email_payment_no = $ipn_response['PaymentNo']; $this->email_expire_date = $ipn_response['ExpireDate']; } else if( $return_code === '10100073' && $payment_method[0] === 'APPBARCODE' ) { $this->email_return_code = '10100073'; $this->email_payment_method = $payment_method[0]; $this->email_payment_type_label = $payment_type_label; $this->email_expire_date = $ipn_response['ExpireDate']; } $order->update_status('on-hold', '已選擇付款方式 "' .$payment_type_label. '" ,等待顧客付款。' ); die("1|OK"); } else { $return_message = $ipn_response['RtnMsg']; $return_code_msg = $return_code . ' - ' . $return_message; $return_code_msg = apply_filters( 'innovext_allpay_cancel_order_message', $return_code_msg, $ipn_response ); $this->log( 'error, return code: '. $return_code ); $order->update_status( 'cancelled', '取消訂單,錯誤代碼 : ' . $return_code_msg ); die("0|ErrorMessage"); } } /** * Parse Allpay merchant trade number to WooCommerce order id * * @param string $mer_trade_no * @return string */ function parse_merchant_trade_no( $mer_trade_no ) { // check if order_prefix exists $order_prefix = $this->order_prefix; $length = strlen($order_prefix); if( !empty( $order_prefix ) && substr($mer_trade_no, 0, $length) === $order_prefix ) { $order_id_arr = explode( $order_prefix, $mer_trade_no ); $order_id = $order_id_arr[1]; } else { $order_id = intval( $mer_trade_no ); } return $order_id; } /** * Compare the returned allpay CheckMacValue with local CheckMacValue * * @param array $ipn_response * @return bool */ function check_ipn_response_is_valid( $ipn_response ) { $ipn_check_mac_value = $ipn_response['CheckMacValue']; unset( $ipn_response['CheckMacValue'] ); $my_check_mac_value = $this->get_the_check_mac_value( $ipn_response ); $this->log( 'ipn check mac:'.$ipn_check_mac_value.' my_check_mac_value:'.$my_check_mac_value ); if( $ipn_check_mac_value == $my_check_mac_value ) { return true; } else { return false; } } /** * Display allpay info in admin order detail * * @param object $order * @return void */ function allpay_admin_order_data_after_billing_address( $order ) { if ( $order->payment_method != 'innovext_allpay_aio' || $order->status == 'cancelled' ) { return; } $order_id = $order->id; $pay_use = get_post_meta( $order_id, '_PayUse', true ); $payment_type_label = self::parse_payment_type( $payment_type ); $return_code = get_post_meta( $order_id, '_RtnCode', true ); $merchant_trade_no = get_post_meta( $order_id, '_MerchantTradeNo', true ); $expire_date = get_post_meta( $order_id, '_ExpireDate', true ); echo '

金流資訊

'; echo ''; if( $pay_use ) { $pay_use_label = '歐付寶'; if( $pay_use == '2' ) { $pay_use_label = '綠界'; } echo ''; } if( $merchant_trade_no ) { echo ''; } if( $payment_type ) { echo ''; } if( $return_code ) { echo ''; } if( $expire_date ){ echo ''; } echo '
金流'. $pay_use_label . '
訂單編號'. $merchant_trade_no . '
付款方式'. $payment_type_label . '
付款狀態'; if( $return_code === '1' ) { echo '已付款'; }elseif( $return_code === '2' || $return_code === '10100073' ){ echo '尚未付款'; } echo '
繳費期限'. $expire_date . '
'; } /** * Add meta box for allpay query info * * @param object $order * @return void */ function add_query_trade_info_meta_box( $order ) { if ( $order->payment_method != 'innovext_allpay_aio' ) { return; } if( $this->query_trade_info != 'yes' ){ return; } add_meta_box( 'allpay-queried-order-info', '訂單資訊', array( &$this, 'display_query_trade_info' ), 'shop_order', 'advanced', 'high', $order ); } /** * Display allpay trade info callback * * @param object $order * @return void */ function display_query_trade_info( $order ){ $order_id = $order->ID; $queried_args = $this->get_query_trade_info_args( $order_id ); if( ! $queried_args ) { echo '無交易資訊'; return; } // ignore check mac value which is unnecessary to display if( isset( $queried_args['CheckMacValue'] ) ){ unset( $queried_args['CheckMacValue'] ); } // parse the payment type to Chinese if( isset( $queried_args['PaymentType'] ) ){ $payment_type = $queried_args['PaymentType']; $queried_args['PaymentType'] = self::parse_payment_type( $payment_type ); } echo ''; foreach( $queried_args as $k => $v ){ $label = self::parse_query_trade_info_args_label( $k ); echo ''; } echo ''; echo '
'.$label.''.$v.'
備註交易狀態代碼請由歐付寶/綠界廠商後台查尋。
'; } /** * Get allpay query trade info args label, translate english args label to chinese * @param string $label * @return mixed */ static function parse_query_trade_info_args_label( $label ) { $args = array( 'HandlingCharge' => '手續費合計', 'ItemName' => '商品名稱', 'MerchantID' => '商店代號', 'MerchantTradeNo' => '訂單編號', 'PaymentDate' => '交易日期', 'PaymentType' => '付款方式', 'PaymentTypeChargeFee' => '通路費', 'TradeAmt' => '交易金額', 'TradeDate' => '訂單成立時間', 'TradeNo' => '交易編號', 'TradeStatus' => '交易狀態', 'CheckMacValue' => '檢查碼', ); if( $label ) { if( isset( $args[$label] ) ) { return $args[$label]; } else { return $label; } } else { return $args; } } /** * Get allpay query trade info wrapper * * @param string $order_id * @return mixed */ function get_query_trade_info_args( $order_id ) { $mer_id = $this->mer_id; $mer_trade_no = get_post_meta( $order_id, '_MerchantTradeNo', true ); if( empty( $mer_trade_no ) ) { return false; } $time_stamp = time(); $args = array( 'MerchantID' => $mer_id, 'MerchantTradeNo' => $mer_trade_no, 'TimeStamp' => $time_stamp ); $check_mac_value = $this->get_the_check_mac_value( $args ); $args = array_merge( $args, array( 'CheckMacValue' => $check_mac_value ) ); $pay_use = get_post_meta( $order_id, '_PayUse', true ); if( $pay_use === '2' ) { $form_action = $this->ecpay_inquery_url; } else { $form_action = $this->allpay_inquery_url; } $result = self::post_get_data( $args, $form_action ); $result_args = wp_parse_args( $result ); return $result_args; } /** * Get POST data * * @param type $args * @param type $form_action * @return boolean */ static function post_get_data( $args, $form_action ) { $ch = curl_init(); $post_data = http_build_query( $args ); curl_setopt( $ch, CURLOPT_URL, $form_action ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, TRUE ); curl_setopt( $ch, CURLOPT_POST, TRUE ); curl_setopt( $ch, CURLOPT_POSTFIELDS, $post_data ); $output = curl_exec( $ch ); curl_close( $ch ); if( empty( $output ) ) { return false; } return $output; } /** * Get Allpay or Ecpay label * * @param string $order_id */ static function get_allpay_ecpay_label( $order_id ) { $pay_use = get_post_meta( $order_id, '_PayUse', true ); if( $pay_use === '2' ) { $label = '綠界'; } else { $label = '歐付寶'; } return $label; } /** * Get main payment type args * * @param string $method * @return string||array */ static function get_main_payment_type_args( $method = '' ) { $methods = array( 'Credit' => '信用卡', 'WebATM' => '網路ATM', 'ATM' => 'ATM自動櫃員機', 'CVS' => '超商代碼', 'BARCODE' => '超商條碼', 'Alipay' => '支付寶', 'Tenpay' => '財付通', 'TopUpUsed' => '儲值消費', 'APPBARCODE' => '全家條碼立即儲', ); if( $method ) { if( array_key_exists( $method, $methods ) ) { return $methods[$method]; } else { return $method; } } else { return $methods; } } /** * Get payment type args * * @param string $method choose method * @return array */ static function get_payment_type_args( $method = '' ) { $payment_type_args = require( 'payment-type-args.php' ); if( $method ) { if( array_key_exists( $method, $payment_type_args ) ) { return $payment_type_args[$method]; } else { return $method; } } else { return $payment_type_args; } } /** * Parse allpay payment type string to chinese eg: WebATM_TAISHIN to 台新WebATM * If specified $main_payment_type, will return the main payment type args * * @param string $payment_type Payment type * @param bool $main_payment_type Main payment type * @return string */ static function parse_payment_type( $payment_type, $main_payment_type = false ) { $payment_type_arr = explode( '_', $payment_type, 2 ); if( !isset( $payment_type_arr[0] ) || !isset( $payment_type_arr[1] ) ) { return $payment_type; } $method = $payment_type_arr[0]; $agent = $payment_type_arr[1]; if( $main_payment_type ) { return self::get_main_payment_type_args( $method ); } $payment_type_args = apply_filters( 'inno_allpay_get_payment_type_args', self::get_payment_type_args() ); if( isset( $payment_type_args[$method][$agent] ) ) { return $payment_type_args[$method][$agent]; } return $payment_type; } /** * Process the payment and redirect to pay page * * @access public * @param int $order_id * @return array */ function process_payment( $order_id ) { $order = new WC_Order( $order_id ); if( $this->reduce_stock == 'default' ) { // Reduce stock levels $order->reduce_order_stock(); } return array( 'result' => 'success', 'redirect' => $order->get_checkout_payment_url( true ) ); } /** * Payment form on checkout page * * @access public * @return void */ function payment_fields() { if ( $this->description ){ echo wpautop( wptexturize( $this->description ) ); } } /** * Is available. Put some condition here to turn on or off the availability on checkout. * * @access public * @return bool */ function is_available() { global $woocommerce; // admin mode if( $this->admin_mode == 'yes' && !current_user_can( 'manage_woocommerce' ) ) { return false; } $subtotal = $woocommerce->cart->subtotal ; $min_amount = $this->min_amount; $shop_page_url = get_permalink( wc_get_page_id( 'shop' ) ); $return_to = apply_filters( 'woocommerce_continue_shopping_redirect', $shop_page_url ); // amount condition if ( $min_amount > 0 && $min_amount > $subtotal ) { wc_print_notice( sprintf( '購物滿 %s 元,即可使用 %s 付款!繼續購物»', $min_amount, $this->title, $return_to ), 'notice' ); return false; } return parent::is_available(); } }