WooCommerce 中的自定义付款方式

Posted

技术标签:

【中文标题】WooCommerce 中的自定义付款方式【英文标题】:Custom Payment Method in WooCommerce 【发布时间】:2013-06-09 12:12:51 【问题描述】:

我想在 WooCommerce 中添加新的付款方式。

新方法将包含 2 个文本框字段,必须由客户填写。该怎么做?

我附上了一张我想要的照片。如果可以的话请帮忙。提前致谢! :)

【问题讨论】:

这其实是一个相当漫长的过程。 WooThemes 确实有一个可供您使用的 API:docs.woothemes.com/document/payment-gateway-api 【参考方案1】:

我知道这是旧线程,但我的回答可能对某人有所帮助。 我已经创建了 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_' . $this->id, 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 ) );

            // or call the Payment complete
            // $order->payment_complete();

            // 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

【讨论】:

我已经在互联网上搜索了几天,寻找如何将 payment_fields 保存到数据库中!我所需要的只是结束部分。谢谢!! :O 为什么使用 process_admin_options 操作,没有定义。 @JasbirRana 查看继承类上的方法WC_Payment_Gateway 我们可以在函数外声明类“WC_Gateway_Custom”吗,因为我有一个致命错误:致命错误:类声明可能没有嵌套 是的,你可以。只需在函数中加载/包含类

以上是关于WooCommerce 中的自定义付款方式的主要内容,如果未能解决你的问题,请参考以下文章

在Woocommerce管理员,订单和电子邮件中显示自定义付款字段

Woocommerce 3中的自定义结帐字段和运输方式ajax交互

在 WooCommerce 中禁用基于自定义运输方式的付款方式

根据所选付款方式显示隐藏自定义 Woocommerce 结帐字段

结帐页面中的 Woocommerce 付款方式检测

wordpress中的付款方式