2017-05-12 112 views
1

我正在爲WP Woocommerce添加一個自定義支付網關。 我想獲取創建的購物車的當前用戶訂單號。獲取當前Woocommerce用戶購物車的訂單ID

我可以拿到車總:

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

或:

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

我如何調用該函數:

process_payment($order_id) 

時,我沒有$ order_id還沒有,我只有購物車?

請幫忙。

+0

那裏當你在購物車中是沒有訂單尚未..訂單ID只有在您訂購了一些東西后纔會出現。 – Reigel

+0

付款完成後,我如何獲得ID? –

回答

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

如何在收到付款後啓動創建訂單的過程? –

+0

@lheb Saad:我沒有明白你的意思 - 我的答案會在付款完成後幫助你獲得Id。此外,沒有訂單ID,直到上述功能被稱爲 –

+0

Thnx拉赫曼爲您解釋。我的問題是我怎樣才能調用這個函數:放哪裏以及如何在我沒有訂單ID時調用它。我使用單獨的文件(notification.php)與支付提供商聯繫 –

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>';*/ 
} 




?> 

支付提供商與文件notfication.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; 
} 
?> 

如何在收到付款後創建訂單(ACCESS中的情況在notification.php中)?

0

您如何創建自定義支付網關? 您是否創建了延伸WC_Payment_Gateway, 的類,您不需要直接調用process_payment()函數。

你只需要創建一個擴展WC_Payment_Gateway類,並添加你的類功能,它會自動從結帳過程稱爲 看到woocommerce/includes/class-wc-checkout.php777

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

是的,我創建了一個擴展'WC_Payment_Gateway'的類(查看包含code.it的答案插件的所有代碼)。問題是如何**在chekout頁面上提交表單後啓動訂單的創建**。付款完成後,我們將更改文件中的訂單狀態notification.php –

+0

@IhebSaad對不起,我不確定你想要什麼。 您的意思是您需要在處理訂單前與其他網站(支付提供商)進行溝通,並且如果您從支付提供商處獲得成功回覆,那麼訂單應該被創建/處理? –

+0

是的!我想在結賬頁面提交表單後創建訂單,並在付款完成後更改訂單狀態(已完成)。 –

相關問題