query($sql); $iconurl = plugin_dir_url( __FILE__ ) . 'assets/img/zgo-icon-full_6pct.png'; $this->siteURL = get_site_url(); $this->domain = 'zgopmtgwy'; $this->id = "zgo_payment"; $this->icon = $iconurl; $this->has_fields = false; $this->method_title = __('ZGo Payment', $this->domain); $this->method_description = __('ZGo Payment - Accept payments using Zcash.', $this->domain); // Load the settings. $this->init_form_fields(); $this->init_settings(); $this->title = $this->get_option('title'); $this->description = $this->get_option('description'); $this->instructions = $this->get_option('instructions', $this->description ); $this->zgoownerid = $this->get_option('zgoownerid'); $this->zgotoken = $this->get_option('zgotoken'); // Actions add_action('woocommerce_update_options_payment_gateways_' . $this->id, array( $this, 'process_admin_options' ) ); add_action( 'woocommerce_thankyou_' . $this->id, array( $this, 'thankyou_page' ) ); if ( ! $this->is_valid_for_use() ) $this->enabled = false; /** * Add the webhook for payment confirmation from ZGo */ //add_action( 'woocommerce_api_zpmtcallback', array($this,'zconfirm')); } public function register_routes() { register_rest_route( 'wc/v3', 'zgocallback', array( 'methods' => 'GET', 'callback' => array($this,'zgoapicallback'))); } public function init_form_fields() { $this->form_fields = apply_filters( 'woo_zgopmtsrv_fields', array( 'enabled' => array( 'title' => __('Enable/Disable', $this->domain ), 'type' => 'checkbox', 'label' => __('Enable payments with Zcash', $this->domain ), 'default' => 'yes' ), 'title' => array( 'title' => __( 'ZGo Payment Service title', $this->domain ), 'type' => 'text', 'default' => __( 'ZGo Payment Gateway', $this->domain ), 'desc_tip' => true, 'description' => __( 'Add a new title for the ZGo Payment Service that your customers will see when they are in the checkout page', $this->domain ), ), 'description' => array( 'title' => __( 'ZGo Payment Service Confirmation', $this->domain ), 'type' => 'textarea', 'default' => __( 'Pay with Zcash, ZGo will report your payment as soon as it gets confirmed. Normally it takes about 5 minutes.
Read more...', $this->domain ), 'desc_tip' => true, 'description' => __('Payment confirmation description that the customer will see on your checkout.', $this->domain ), ), 'instructions' => array( 'title' => __('Instructions', $this->domain ), 'type' => 'textarea', 'default' => __('Default instrctions', $this->domain ), 'desc_tip' => true, 'description' => __('Instruction that will be added to the Thank You page and order email', $this->domain ), ), 'zgoownerid' => array( 'title' => __( 'ZGo OwnerId', $this->domain ), 'type' => 'text', 'default' => __( 'Replace this text with your ZGo Owner ID ', $this->domain ), 'desc_tip' => true, 'description' => __( 'Type or paste your ZGo Account Owner Id (Found in your ZGo Shop Settings)', $this->domain ), ), 'zgotoken' => array( 'title' => __( 'ZGo Token', $this->domain ), 'type' => 'text', 'default' => __( 'Replace this text with your ZGo Token', $this->domain ), 'desc_tip' => true, 'description' => __( 'Type or paste your ZGo Token (Found in your ZGo Shop Settings)', $this->domain ), ), ) ); } /* * Check if configuration is valid */ public function is_valid_for_use() { $isvalid = false; if ( isset($this->zgoownerid) && ($this->zgoownerid !== '') ) { $url = 'https://api.zgo.cash/auth?ownerid=' . $this->zgoownerid . '&token=' . $this->zgotoken . '&siteurl=' . $this->base64url_encode($this->siteURL); $response = wp_remote_get($url); $httpcode = wp_remote_retrieve_response_code( $response ); switch ( $httpcode ) { case 200: $body = wp_remote_retrieve_body( $response ); $oid = json_decode($body); $isvalid = $oid->{'authorized'}; break; case 202: $body = wp_remote_retrieve_body($response ); $oid = json_decode($body); break; default: break; } } return $isvalid; } /* * Process Payment */ public function process_payment( $order_id ) { global $wpdb; $order = wc_get_order( $order_id ); // $wc_order = wc_get_product($order_id); $wc_order_key = $order->get_order_key(); $url = 'https://api.zgo.cash/woopayment' . '?ownerid=' . $this->zgoownerid . '&token=' . $this->zgotoken . '&order_id=' . $order_id . '¤cy=' . strtolower($order->get_currency()) . '&amount=' . $order->get_total() . '&date=' . date_format($order->get_date_created(),'Y-m-d') . '&siteurl=' . $this->base64url_encode($this->siteURL) . '&orderkey=' . $wc_order_key; //'&orderkey=' . ; $response = wp_remote_get($url); $httpcode = wp_remote_retrieve_response_code( $response ); switch ( $httpcode ) { case 200: wc_add_notice( 'Order on hold, please wait for confirmation'); $order->update_status('on_hold',__('Awaiting payment confirmation','woocommerce')); $body = wp_remote_retrieve_body( $response ); $oid = json_decode($body); $zgoOrderid = $oid->{'order'}; $zgoOrderToken = $oid->{'token'}; // // Save ZGo Order ID and Cart order // $sql3 = $wpdb->prepare('replace into zgo_payments (pmt_orderid, pmt_wc_order, pmt_wc_custname, pmt_accepted, pmt_confirmed, pmt_amount, pmt_rate, pmt_zec, pmt_wc_paid) values (%s, %s, %s, %s, %s, %f, 0, 0, 0);', $zgoOrderid, $order_id, $order->get_billing_first_name() . ' ' . $order->get_billing_last_name(), date('Y-m-d H:i:s'), '', $order->get_total()); //$sql = "replace into zgo_payments (" . //"pmt_orderid," . //"pmt_wc_order," . //"pmt_wc_custname," . //"pmt_accepted," . //"pmt_confirmed," . //"pmt_amount," . //"pmt_rate," . //"pmt_zec," . //"pmt_wc_paid) values ('" . //$zgoOrderid . "','" . //$order_id . "','" . //$order->get_billing_first_name() . " " . //$order->get_billing_last_name() . "','" . //date('Y-m-d H:i:s') . "','',". //$order->get_total() . //",0,0,0)"; $wpdb->query($sql3); // Remove cart. WC()->cart->empty_cart(); return array( 'result' => 'success', 'redirect' => 'https://app.zgo.cash/invoice/' . $zgoOrderid . '?token=' . $zgoOrderToken, ); break; case 202: $body = wp_remote_retrieve_body( $response ); $msg = json_decode($body); $order->update_status('failed',__('Order ' . $order_id . ' -> ZGo Order Generation Error : ' . $msg->{'message'},'woocommerce')); break; default: return; } } /** * Confirm payment and complete order */ //public function zconfirm() { //global $wpdb; //$token = $_GET['token']; //$zgoOrderid = $_GET['orderid']; //$orderid = $_GET['wc_orderid']; //$totalzec = $_GET['totalzec']; //$rate = $_GET['rate']; //$order = wc_get_order( $orderid ); //$sql = $wpdb->prepare('select * from zgo_payments where pmt_wc_order = %s ;', $orderid); ////$sql = "select * from zgo_payments where pmt_wc_order = '" . $orderid . "';"; //$result = $wpdb->get_row($sql,OBJECT); //if ( ! is_null($result) ) { //if ( ($token == $this->zgotoken ) //&& ( $result->pmt_orderid == $zgoOrderid ) //&& ( $result->pmt_wc_paid == '0' ) ) { //switch ( $order->get_status() ) { //case 'pending': //case 'failed': //$order->payment_complete(); //$order->reduce_order_stock(); //// //// Mark order as completed in ZGo DB //// ////$sql = "update zgo_payments set " . ////"pmt_confirmed='" . date('Y-m-d H:i:s') . ////"', pmt_rate=" . $rate . ////", pmt_zec=" . $totalzec . ////", pmt_wc_paid=1 " . ////" where pmt_wc_order='" . $orderid . "';"; //$sql2 = $wpdb->prepare('update zgo_payments set pmt_confirmed = %s, pmt_rate = %f, pmt_zec = %f, pmt_wc_paid = 1 where pmt_wc_order = %s;', date('Y-m-d H:i:s'), $rate, $totalzec, $orderid ); //$wpdb->query($sql2); //update_option('webhook_debug', $_GET); //break; //default: ////$this->console_log('Order ' . $orderid . ' already paid or cancelled...'); //return array("message" => 'Order ' . $orderid . ' already paid or cancelled...'); //break; //} //} else { ////$this->console_log('Invalid parameters...'); //return array("message" => 'Invalid parameters...'); //} //} else { ////$this->console_log('Database error...'); //return array("message" => 'Database error...'); //} //} public function thankyou_page () { if ( $description = $this->get_description() ) { echo wpautop( wptexturize( $description ) ); } } public function console_log($data) { $file = plugin_dir_path( __DIR__ ) . '/zgopmtgwy/assets/log/console.log'; file_put_contents($file, $data . chr(0x0D) . chr(0x0A), FILE_TEXT | FILE_APPEND | LOCK_EX ); } public function base64url_encode($data) { $edata = str_replace('=','',strtr(base64_encode($data), '+/', '-_')); return $edata; } public function zgoapicallback($request) { global $wpdb; //$token = $_GET['token']; //$zgoOrderid = $_GET['orderid']; //$orderid = $_GET['wc_orderid']; //$totalzec = $_GET['totalzec']; //$rate = $_GET['rate']; $token = $request->get_param('token'); $zgoOrderid = $request->get_param('orderid'); $orderid = $request->get_param('wc_orderid'); $totalzec = $request->get_param('totalzec'); $rate = $request->get_param('rate'); $order = wc_get_order( $orderid ); $sql = $wpdb->prepare('select * from zgo_payments where pmt_wc_order = %s ;', $orderid); //$sql = "select * from zgo_payments where pmt_wc_order = '" . $orderid . "';"; $result = $wpdb->get_row($sql,OBJECT); if ( ! is_null($result) ) { if ( (hash('sha256',$token) == hash('sha256',$this->zgotoken) ) && ( $result->pmt_orderid == $zgoOrderid ) && ( $result->pmt_wc_paid == '0' ) ) { switch ( $order->get_status() ) { case 'pending': case 'failed': $order->payment_complete(); $order->reduce_order_stock(); // // Mark order as completed in ZGo DB // //$sql = "update zgo_payments set " . //"pmt_confirmed='" . date('Y-m-d H:i:s') . //"', pmt_rate=" . $rate . //", pmt_zec=" . $totalzec . //", pmt_wc_paid=1 " . //" where pmt_wc_order='" . $orderid . "';"; $sql2 = $wpdb->prepare('update zgo_payments set pmt_confirmed = %s, pmt_rate = %f, pmt_zec = %f, pmt_wc_paid = 1 where pmt_wc_order = %s;', date('Y-m-d H:i:s'), $rate, $totalzec, $orderid ); $wpdb->query($sql2); //update_option('webhook_debug', $_GET); return array('message' => 'Order '. $orderid . ' mark as paid correctly.'); break; default: //$this->console_log('Order ' . $orderid . ' already paid or cancelled...'); return array("message" => 'Order ' . $orderid . ' already paid or cancelled...'); break; } } else { //$this->console_log('Invalid parameters...'); return array("message" => 'Invalid parameters...'); } } else { //$this->console_log('Database error...'); return array("message" => 'Database error...'); } //return array( 'custom' => 'Data', "request" => $data->get_params() ); } } add_filter( 'woocommerce_payment_gateways', 'add_custom_gateway_class' ); function add_custom_gateway_class( $methods ) { if ( ! in_array('WC_ZGopmt_Gateway', $methods) ) { $methods[] = 'WC_ZGopmt_Gateway'; } return $methods; } } // Include the dependencies needed to instantiate the plugin. foreach ( glob( plugin_dir_path( __FILE__ ) . 'assets/php/*.php' ) as $file ) { include_once $file; } add_action( 'plugins_loaded', 'zgopmtlist_plugin' ); function zgopmtlist_plugin() { $path = plugin_dir_path( __FILE__ ); $plugin = new zpmt_stats( new zpmt_stats_page($path) ); $plugin->init(); } function get_custom($data) { global $wpdb; //$token = $_GET['token']; //$zgoOrderid = $_GET['orderid']; //$orderid = $_GET['wc_orderid']; //$totalzec = $_GET['totalzec']; //$rate = $_GET['rate']; $token = $data->get_param('token'); $zgoOrderid = $data->get_param('orderid'); $orderid = $data->get_param('wc_orderid'); $totalzec = $data->get_param('totalzec'); $rate = $data->get_param('rate'); $order = wc_get_order( $orderid ); $sql = $wpdb->prepare('select * from zgo_payments where pmt_wc_order = %s ;', $orderid); //$sql = "select * from zgo_payments where pmt_wc_order = '" . $orderid . "';"; $result = $wpdb->get_row($sql,OBJECT); if ( ! is_null($result) ) { if ( ($token == $this->zgotoken ) && ( $result->pmt_orderid == $zgoOrderid ) && ( $result->pmt_wc_paid == '0' ) ) { switch ( $order->get_status() ) { case 'pending': case 'failed': $order->payment_complete(); $order->reduce_order_stock(); // // Mark order as completed in ZGo DB // //$sql = "update zgo_payments set " . //"pmt_confirmed='" . date('Y-m-d H:i:s') . //"', pmt_rate=" . $rate . //", pmt_zec=" . $totalzec . //", pmt_wc_paid=1 " . //" where pmt_wc_order='" . $orderid . "';"; $sql2 = $wpdb->prepare('update zgo_payments set pmt_confirmed = %s, pmt_rate = %f, pmt_zec = %f, pmt_wc_paid = 1 where pmt_wc_order = %s;', date('Y-m-d H:i:s'), $rate, $totalzec, $orderid ); $wpdb->query($sql2); //update_option('webhook_debug', $_GET); break; default: //$this->console_log('Order ' . $orderid . ' already paid or cancelled...'); return array("message" => 'Order ' . $orderid . ' already paid or cancelled...'); break; } } else { //$this->console_log('Invalid parameters...'); return array("message" => 'Invalid parameters...'); } } else { //$this->console_log('Database error...'); return array("message" => 'Database error...'); } //return array( 'custom' => 'Data', "request" => $data->get_params() ); } function plugin_register_rest_apis() { $zgoPlugin = new WC_ZGopmt_Gateway(); $zgoPlugin->register_routes(); } add_action( 'rest_api_init', 'plugin_register_rest_apis');