2013-06-13 3 views
3

Я хочу добавить новый способ оплаты в WooCommerce.Пользовательский способ оплаты в WooCommerce

Новый метод будет содержать 2 поля текстовой поля, которые должны быть заполнены Клиентом. Как это сделать?

Я приложил фотографию того, что хочу. Пожалуйста, помоги, если можешь. Заранее спасибо! :)

image

+0

Это на самом деле довольно длительный процесс. У WooThemes есть API, готовый для вашего использования: http://docs.woothemes.com/document/payment-gateway-api/ – BFTrick

ответ

6

Я знаю, что это старый поток, но, возможно, мой ответ может помочь кому-то. Я сделал создание пользовательского платежного шлюза woocommerce, поэтому, если кому-то нужен специальный платежный шлюз, как вопрос выше. вы можете использовать код ниже.

<?php 
/* 
Plugin Name: Custom Payment Gateway 
Description: Custom payment gateway example 
Author: Lafif Astahdziq 
Author URI: https://lafif.me 
*/ 

if (! defined('ABSPATH')) { 
    exit; // Exit if accessed directly 
} 

/** 
* Custom Payment Gateway. 
* 
* Provides a Custom Payment Gateway, mainly for testing purposes. 
*/ 
add_action('plugins_loaded', 'init_custom_gateway_class'); 
function init_custom_gateway_class(){ 

    class WC_Gateway_Custom extends WC_Payment_Gateway { 

     public $domain; 

     /** 
     * Constructor for the gateway. 
     */ 
     public function __construct() { 

      $this->domain = 'custom_payment'; 

      $this->id     = 'custom'; 
      $this->icon    = apply_filters('woocommerce_custom_gateway_icon', ''); 
      $this->has_fields   = false; 
      $this->method_title  = __('Custom', $this->domain); 
      $this->method_description = __('Allows payments with custom gateway.', $this->domain); 

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

      // Define user set variables 
      $this->title  = $this->get_option('title'); 
      $this->description = $this->get_option('description'); 
      $this->instructions = $this->get_option('instructions', $this->description); 
      $this->order_status = $this->get_option('order_status', 'completed'); 

      // Actions 
      add_action('woocommerce_update_options_payment_gateways_' . $this->id, array($this, 'process_admin_options')); 
      add_action('woocommerce_thankyou_custom', array($this, 'thankyou_page')); 

      // Customer Emails 
      add_action('woocommerce_email_before_order_table', array($this, 'email_instructions'), 10, 3); 
     } 

     /** 
     * Initialise Gateway Settings Form Fields. 
     */ 
     public function init_form_fields() { 

      $this->form_fields = array(
       'enabled' => array(
        'title' => __('Enable/Disable', $this->domain), 
        'type' => 'checkbox', 
        'label' => __('Enable Custom Payment', $this->domain), 
        'default' => 'yes' 
       ), 
       'title' => array(
        'title'  => __('Title', $this->domain), 
        'type'  => 'text', 
        'description' => __('This controls the title which the user sees during checkout.', $this->domain), 
        'default'  => __('Custom Payment', $this->domain), 
        'desc_tip' => true, 
       ), 
       'order_status' => array(
        'title'  => __('Order Status', $this->domain), 
        'type'  => 'select', 
        'class'  => 'wc-enhanced-select', 
        'description' => __('Choose whether status you wish after checkout.', $this->domain), 
        'default'  => 'wc-completed', 
        'desc_tip' => true, 
        'options'  => wc_get_order_statuses() 
       ), 
       'description' => array(
        'title'  => __('Description', $this->domain), 
        'type'  => 'textarea', 
        'description' => __('Payment method description that the customer will see on your checkout.', $this->domain), 
        'default'  => __('Payment Information', $this->domain), 
        'desc_tip' => true, 
       ), 
       'instructions' => array(
        'title'  => __('Instructions', $this->domain), 
        'type'  => 'textarea', 
        'description' => __('Instructions that will be added to the thank you page and emails.', $this->domain), 
        'default'  => '', 
        'desc_tip' => true, 
       ), 
      ); 
     } 

     /** 
     * Output for the order received page. 
     */ 
     public function thankyou_page() { 
      if ($this->instructions) 
       echo wpautop(wptexturize($this->instructions)); 
     } 

     /** 
     * Add content to the WC emails. 
     * 
     * @access public 
     * @param WC_Order $order 
     * @param bool $sent_to_admin 
     * @param bool $plain_text 
     */ 
     public function email_instructions($order, $sent_to_admin, $plain_text = false) { 
      if ($this->instructions && ! $sent_to_admin && 'custom' === $order->payment_method && $order->has_status('on-hold')) { 
       echo wpautop(wptexturize($this->instructions)) . PHP_EOL; 
      } 
     } 

     public function payment_fields(){ 

      if ($description = $this->get_description()) { 
       echo wpautop(wptexturize($description)); 
      } 

      ?> 
      <div id="custom_input"> 
       <p class="form-row form-row-wide"> 
        <label for="mobile" class=""><?php _e('Mobile Number', $this->domain); ?></label> 
        <input type="text" class="" name="mobile" id="mobile" placeholder="" value=""> 
       </p> 
       <p class="form-row form-row-wide"> 
        <label for="transaction" class=""><?php _e('Transaction ID', $this->domain); ?></label> 
        <input type="text" class="" name="transaction" id="transaction" placeholder="" value=""> 
       </p> 
      </div> 
      <?php 
     } 

     /** 
     * Process the payment and return the result. 
     * 
     * @param int $order_id 
     * @return array 
     */ 
     public function process_payment($order_id) { 

      $order = wc_get_order($order_id); 

      $status = 'wc-' === substr($this->order_status, 0, 3) ? substr($this->order_status, 3) : $this->order_status; 

      // Set order status 
      $order->update_status($status, __('Checkout with custom payment. ', $this->domain)); 

      // Reduce stock levels 
      $order->reduce_order_stock(); 

      // Remove cart 
      WC()->cart->empty_cart(); 

      // Return thankyou redirect 
      return array(
       'result' => 'success', 
       'redirect' => $this->get_return_url($order) 
      ); 
     } 
    } 
} 

add_filter('woocommerce_payment_gateways', 'add_custom_gateway_class'); 
function add_custom_gateway_class($methods) { 
    $methods[] = 'WC_Gateway_Custom'; 
    return $methods; 
} 

add_action('woocommerce_checkout_process', 'process_custom_payment'); 
function process_custom_payment(){ 

    if($_POST['payment_method'] != 'custom') 
     return; 

    if(!isset($_POST['mobile']) || empty($_POST['mobile'])) 
     wc_add_notice(__('Please add your mobile number', $this->domain), 'error'); 


    if(!isset($_POST['transaction']) || empty($_POST['transaction'])) 
     wc_add_notice(__('Please add your transaction ID', $this->domain), 'error'); 

} 

/** 
* Update the order meta with field value 
*/ 
add_action('woocommerce_checkout_update_order_meta', 'custom_payment_update_order_meta'); 
function custom_payment_update_order_meta($order_id) { 

    if($_POST['payment_method'] != 'custom') 
     return; 

    // echo "<pre>"; 
    // print_r($_POST); 
    // echo "</pre>"; 
    // exit(); 

    update_post_meta($order_id, 'mobile', $_POST['mobile']); 
    update_post_meta($order_id, 'transaction', $_POST['transaction']); 
} 

/** 
* Display field value on the order edit page 
*/ 
add_action('woocommerce_admin_order_data_after_billing_address', 'custom_checkout_field_display_admin_order_meta', 10, 1); 
function custom_checkout_field_display_admin_order_meta($order){ 
    $method = get_post_meta($order->id, '_payment_method', true); 
    if($method != 'custom') 
     return; 

    $mobile = get_post_meta($order->id, 'mobile', true); 
    $transaction = get_post_meta($order->id, 'transaction', true); 

    echo '<p><strong>'.__('Mobile Number').':</strong> ' . $mobile . '</p>'; 
    echo '<p><strong>'.__('Transaction ID').':</strong> ' . $transaction . '</p>'; 
} 

вы можете сохранить этот код как файл и место под wp-content/plugins/ или wp-content/mu-plugins

+0

Я прочесываю интернет в течение нескольких дней, чтобы узнать, как сохранить pay_fields в БД! Все, что мне было нужно, было конечной частью. Спасибо!! : O –

Смежные вопросы