How to get setting field values outside of Woocommerce WC_Payment_Gateway class?

I’ve created a payment gateway plugin with woocommerce successfully however I have a callback file and I need to retrieve the the PRIVATE_KEY from the checkout settings fields from the outside of WC_Payment_Gateway class.

I’m using session to make the callback but I’d like to get rid of session and use the settings field value (PRIVATE_KEY). I don’t know how to pull PRIVATE_KEY from WC setting fields.

Read More

what does callback do?

Callback gets the token and amount from the main checkout function by POST and make another request to server with the PRIVATE_KEY along with the amount to create the transaction.

the plugin is same as https://gist.github.com/John-Henrique/1617074 and I’m using https://docs.woothemes.com/document/settings-api/ to store the setting fields.

Here is part of my plugin _construct fucntion:

myplugin.php

session_start(); // I HAVE TO GET RID OF SESSION

add_action('plugins_loaded', 'woocommerce_myplugin', 0);

function woocommerce_myplugin(){
    if (!class_exists('WC_Payment_Gateway'))
        return; // if the WC payment gateway class is not available, do nothing

    class WC_Gateway_Myplugin extends WC_Payment_Gateway{

        // Logging
        public static $log_enabled = false;
        public static $log = false;

        public function __construct(){

            $plugin_dir = plugin_dir_url(__FILE__);

            global $woocommerce;

            $this->id = 'myplugin';
            $this->icon = apply_filters('woocommerce_myplugin_icon', ''.$plugin_dir.'myplugin.png');
            $this->has_fields = true;

            // Load the settings
            $this->init_form_fields();
            $this->init_settings();

            // Define user set variables
            $this->title = $this->get_option('title');
            $this->publishable_key = $this->get_option('publishable_key');
            $this->private_key = $this->get_option('private_key');

    unset($_SESSION['private_key']);
    if($this->sandbox == "no"){ 
        $_SESSION['private_key'] = $this->private_key;
        $_SESSION['url'] = 'https://www.xxxxx.io/api/v1/charge';

    } else { 
        $_SESSION['private_key'] = $this->sb_private_key; 
        $_SESSION['url'] = 'https://sandbox.xxxx.io/api/v1/charge';
    }
}

callback.php

$url = $_SESSION['url'];
$token=$_POST["token"]; 
$amount=$_POST["amount"]*100; 

$fields = array(
    'token' => $token,
    'amount' => $amount,
    'key' => $_SESSION['private_key'], //<==== INSTEAD OF SESSION I NEED TO USE WC FUNCT TO GET THE PRIVATE_KEY FROM CHECKOUT SETTINGS.
    );

//url-ify the data for the POST
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
rtrim($fields_string, '&');

//open connection
$ch = curl_init();

//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);

//execute post
$result = curl_exec($ch);
$http_code = curl_getinfo($ch)["http_code"];

enter image description here

any help would be gratefully appreciated.

Related posts

2 comments

  1. Add it under the
    add_action(‘plugins_loaded’, ‘woocommerce_myplugin_init’, 0);

    function woocommerce_myplugin_init(){
    
        if (!class_exists('WC_Payment_Gateway'))
            return; // if the WC payment gateway class is not available, do nothing
    
        class WC_Gateway_Myplugin extends WC_Payment_Gateway{
            public function __construct() {
    
            }
    
            public function init_form_fields() {
            $this->form_fields = array(
                'your_field_name'               => array(
                    'title'   => __('Enable', 'woocommerce_gateway_myplugin'),
                    'type'    => 'text',
                    'label'   => __('Some text that describes your plugin name', 'myplugin_gateway'),
                    'default' => ''
                )
            );
          }
        }
    
        // Do your code checking stuff here e.g. 
        $myPluginGateway = new WC_Gateway_Myplugin();
    
        $fieldNameVar = $myPluginGateway->get_option('your_field_name');
    
        if ($fieldNameVar == 'something') {
            // everything is okay so far
        } else {
            // OMG we are all going to die!
        }
    
    }
    
  2. You can get Woocommerces own instance of your gateway to get the setting field value.

    $your_gateway = WC()->payment_gateways->payment_gateways()['your_gateway->id'];
    $your_gateway->your_setting;
    

Comments are closed.