如何在 Woocommerce WC_Payment_Gateway 类之外设置字段值?

Posted

技术标签:

【中文标题】如何在 Woocommerce WC_Payment_Gateway 类之外设置字段值?【英文标题】:How to get setting field values outside of Woocommerce WC_Payment_Gateway class? 【发布时间】:2016-09-12 19:51:55 【问题描述】:

我已经成功创建了一个带有 woocommerce 的支付网关插件,但是我有一个回调文件,我需要从 WC_Payment_Gateway 类外部的结帐设置字段中检索 PRIVATE_KEY。

我正在使用会话进行回调,但我想摆脱会话并使用设置字段值 (PRIVATE_KEY)。我不知道如何从 WC 设置字段中提取 PRIVATE_KEY。

回调有什么作用?

回调通过 POST 从主结账功能获取令牌和金额,并使用 PRIVATE_KEY 以及创建交易的金额向服务器发出另一个请求。

插件与https://gist.github.com/John-Henrique/1617074 相同,我使用https://docs.woothemes.com/document/settings-api/ 来存储设置字段。

这是我的插件 _construct 功能的一部分:

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';
    

回调.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"];

任何帮助将不胜感激。

【问题讨论】:

Session 是一个临时解决方案,用来展示它是如何工作的。有回调请求的重要原因之一是关于安全性。我们不能通过帖子或会话传递来自 myplugin.php 的私钥。我只需要从支付网关类之外的 WC 中检索设置字段值。 【参考方案1】:

将其添加到 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】:

您可以获取 Woocommerces 自己的网关实例来获取设置字段值。

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

【讨论】:

以上是关于如何在 Woocommerce WC_Payment_Gateway 类之外设置字段值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WooCommerce 中查找任何国家/地区的州/城市

如何在woocommerce中获得免费送货的最低订单金额

如何在 WooCommerce 中获取订单日期?

如何在 Woocommerce 的结帐字段之间添加标题

如何在 WooCommerce 上设置 Paypal?

如何在 Woocommerce 购物车页面中添加订单备注字段?