获取Woocommerce用户购物车的当前订单ID

问题描述 投票:1回答:3

我正在为WP Woocommerce添加自定义支付网关。我想获取创建的购物车的当前用户order_id。

我可以得到购物车总数:

global $woocommerce;
$total= $woocommerce->cart->total ;

或者:

WC()->cart->get_total() ;

我该如何调用该函数:

process_payment($order_id)

当我还没有$ order_id而且我只有购物车?

请帮忙。

wordpress woocommerce payment-gateway
3个回答
0
投票
add_action('woocommerce_payment_complete', 'custom_process_order', 10, 1);
function custom_process_order($order_id) {
    $order = new WC_Order( $order_id );
    $myuser_id = (int)$order->user_id;
    $user_info = get_userdata($myuser_id);
    $items = $order->get_items();
    foreach ($items as $item) {
        if ($item['product_id']==24) {
          // Do something clever
        }
    }
    return $order_id;
}

在下订单后,这将挂钩到WooCommerce以触发custom_process_order


0
投票

你如何创建自定义支付网关?你创建了扩展WC_Payment_Gateway的类,你不需要直接调用process_payment()函数。

你只需要创建扩展WC_Payment_Gateway的类并在你的类上添加该函数,它将自动从checkout进程调用,参见woocommerce/includes/class-wc-checkout.php line 777

process_payment()函数应返回一个包含密钥resultsredirect_url的数组

例如:

public function process_payment( $order_id ) {
    $order = wc_get_order( $order_id );

    // Set order status
    $order->update_status( 'processing', __( 'Payment created from custom gateway' ) );

    // Reduce stock levels
    wc_reduce_stock_levels( $order_id );

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

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

0
投票

我有一个使用文件自定义payment.php创建的插件,其中包含与付款提供商连接的表单:

/*
Plugin Name: Clic To Pay Payment Gateway
Description: Custom payment gateway example
Author:  
Author URI: 
*/

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                 = 'ClictoPay';
            $this->icon               = apply_filters('woocommerce_custom_gateway_icon', '');
            $this->has_fields         = false;
            $this->method_title       = __( 'ClictoPay', $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 Clic To Pay 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'     => __( 'Clic to pay Payment', $this->domain ),
                    'desc_tip'    => false,
                ),
                '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 ) );
            }


           ?>

 <form action="https://clictopay.monetiquetunisie.com/clicktopay/" method="post" name="form">

<?php $loguserid = session_id();
 /***/
global $woocommerce,$amount ,$connectdb ;

// se connecter  la base
 $connectdb=mysqli_connect(DB_HOST,DB_USER,DB_PASSWORD,DB_DATABASE)or die("error 01");
$amount =number_format (  $woocommerce->cart->total, 3 , ',' ,'');
/**/
/*  $order = wc_get_order( $order_id );       ,  etat='".$order_id."'    */

$querye=mysqli_query($connectdb," Update nauto  set amount='".$amount."',  session='".$loguserid ."'  ")or die(mysqli_error .' erreur');



/***/           
$refc='cd'.date('ymdHis');

//$amount =number_format (  $woocommerce->cart->total, 3 , ',' ,'');

 echo      '<input type="hidden" name="sid" value="'.$loguserid.'">   
            <input name="Reference" type="hidden" value="'.$refc.'"> 
            <input name="Montant" type="hidden" value='.$amount.' >     '; ?>
                        <input name="Devise" type="hidden" value="TND" />
                        <input type="hidden" name="affilie" value="0870172012">
            <input type="hidden" name="lg" value="en">

            <table border="0">
            <tr><td  ><input style="margin-right:105px;  border: none;
  background: no-repeat url('https://saharagift.com/wp-content/uploads/2017/05/payyy.png') 0 0;width:250px;height:46px;


" name="Submit"   type="submit" value=""  id="clictop"  onmouseover='if ( (document.getElementById("billing_first_name").value.length <2) || (document.getElementById("billing_last_name_field").value.length <2) || (document.getElementById("billing_email").value.length <5) || (document.getElementById("billing_address_1").value.length <5) || (document.getElementById("billing_city").value.length <2) || (document.getElementById("billing_postcode").value.length <2) || ( ! document.getElementById("billing_email").value.includes("@")) || ( ! document.getElementById("billing_email").value.includes(".")) )
{alert("Please check billing details !");
document.getElementById("clictop").disabled = true;
}
else{
document.getElementById("clictop").disabled = false;
}'  /></td></tr>
            <tr><td><img style="float:left;margin-left:10px;" src="https://saharagift.com/wp-content/uploads/2017/05/pmm.png"  /></td></tr>
</table>
            </form>
             <?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>';*/
}




?>

支付提供商与文件notification.php进行通信(如果成功付款,则回答详细信息,而不是回答协议):

<?
$ref = $_GET['Reference'];
$act = $_GET['Action'];
$par = $_GET['Param'];
define("DB_HOST", "****");
define("DB_USER", "****");
define("DB_PASSWORD", "****");
define("DB_DATABASE", "****");
// se connecter  la base
include '/wp-content/plugins/woocommerce/woocommerce.php';
include '/wp-content/plugins/CustomPayment.php';
global $connectdb, $woocommerce,$amount;
$connectdb=mysqli_connect(DB_HOST,DB_USER,DB_PASSWORD,DB_DATABASE)or die("error 01");
$loguserid = session_id();
/* */
$query=mysqli_query ($connectdb,"SELECT * FROM nauto  ;");

/** recupertaion  amount*/
while($col = mysqli_fetch_object($query)){ 
  $amount=$col->amount ;
} 

$querye=mysqli_query($connectdb," Update nauto  set amount='".$amount."' , ref='".$ref."'   ")or die(mysqli_error .' erreur');


switch ($act) {
case "DETAIL":
// accéder à la base et récuperer le montant
echo "Reference=".$ref. "&Action=".$act."&Reponse=".$amount;
break;
case "ERREUR":
// accéder à la base et mettre à jour l’état de la transaction
$queryerr=mysqli_query($connectdb," Update nauto  set num=".$par.", etat=".$act." ")or die(mysqli_error .' erreur');
echo "Reference=".$ref. "&Action=".$act. "&Reponse=OK";
break;
case "ACCORD":
// accéder à la base, enregistrer le numéro d’autorisation (dans param)
$query=mysqli_query($connectdb," INSERT INTO nauto  (num,ref,session,etat,amount) values (".$par.",".$ref.",".$loguserid.",".$etat.",".$amount.")" )or die(mysqli_error .' here');

echo "Reference=".$ref. "&Action=".$act. "&Reponse=OK";
///echo "Reference=".$ref. "Action=".$act. "Reponse=ANNULATION"."Param=".$par;

break;
case "REFUS":
// accéder à la base et mettre à jour l’état de la transaction
$queryref=mysqli_query($connectdb," Update nauto  set num=".$par.", etat=".$act." ")or die(mysqli_error .' refus');
echo "Reference=".$ref. "&Action=".$act. "&Reponse=OK";
break;
case "ANNULATION":
// accéder à la base et mettre à jour l’état de la transaction
$queryann=mysqli_query($connectdb," Update nauto  set num=".$par.", etat=".$act." ")or die(mysqli_error .' annulation');
echo "Reference=".$ref. "&Action=".$act. "&Reponse=OK";
break;
}
?>

收到付款后如何创建订单(在notification.php中为ACCORD)???

© www.soinside.com 2019 - 2024. All rights reserved.