2016-05-16 8 views
2

woocommerceで支払いゲートウェイプラグインを作成しましたが、コールバックファイルがあり、WC_Payment_Gatewayクラスの外部からチェックアウト設定フィールドからPRIVATE_KEYを取得する必要があります。Woocommerce WC_Payment_Gatewayクラスの外部でフィールド値を設定するにはどうすればよいですか?

私はセッションをコールバックに使用していますが、セッションを取り除き、設定フィールド値(PRIVATE_KEY)を使用したいと思います。私はWC設定フィールドからPRIVATE_KEYを引き出す方法を知らない。

コールバックは何ですか?

コールバックは、POSTによってメインのチェックアウト機能からトークンと金額を取得し、トランザクションを作成する金額とともにPRIVATE_KEYとともにサーバーに別の要求を行います。

プラグインはhttps://gist.github.com/John-Henrique/1617074と同じですが、設定フィールドを保存するのにhttps://docs.woothemes.com/document/settings-api/を使用しています。ここで

は私のプラグイン_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

すべてのヘルプは感謝していただければ幸いです。

+0

セッションは、どのように動作するかを示す一時的なソリューションでした。コールバック要求を持つ大きな理由の1つは、セキュリティに関することです。 postまたは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! 
    } 

} 
関連する問題