获取 Woocommerce 用户购物车的当前订单 ID
Get current Order ID for Woocommerce user cart
我正在向 WP Woocommerce 添加自定义支付网关。
我想为创建的购物车获取当前用户 order_id。
我可以得到购物车总数:
global $woocommerce;
$total= $woocommerce->cart->total ;
或与 :
WC()->cart->get_total() ;
如何调用函数:
process_payment($order_id)
当我还没有 $order_id 而我只有购物车时?
(错题:暂无order_id)
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下订单后
我有一个使用自定义文件 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;
}
?>
我收到付款后如何创建订单(case ACCORD in notification.php )???
如何创建自定义支付网关?
您是否创建了扩展 WC_Payment_Gateway
的 class,
您不需要直接调用 process_payment()
函数。
您只需要创建扩展 WC_Payment_Gateway
的 class 并将该功能添加到您的 class 上,它会在结帐过程中自动调用
参见 woocommerce/includes/class-wc-checkout.php
行 777
process_payment()
函数应该 return 一个包含键 results
和 redirect_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 ),
);
}
最初提出的问题的答案是:
您的购物车中还没有订单 ID。
只有结帐完成后订单 ID 才存在。
答案与问题不一致,可能需要重新提问或编辑。
如果您的用户尝试付款但失败了,您可能需要检查 $order_id = WC()->session->get( 'order_awaiting_payment' );
我正在向 WP Woocommerce 添加自定义支付网关。 我想为创建的购物车获取当前用户 order_id。
我可以得到购物车总数:
global $woocommerce;
$total= $woocommerce->cart->total ;
或与 :
WC()->cart->get_total() ;
如何调用函数:
process_payment($order_id)
当我还没有 $order_id 而我只有购物车时?
(错题:暂无order_id)
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下订单后
我有一个使用自定义文件 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;
}
?>
我收到付款后如何创建订单(case ACCORD in notification.php )???
如何创建自定义支付网关?
您是否创建了扩展 WC_Payment_Gateway
的 class,
您不需要直接调用 process_payment()
函数。
您只需要创建扩展 WC_Payment_Gateway
的 class 并将该功能添加到您的 class 上,它会在结帐过程中自动调用
参见 woocommerce/includes/class-wc-checkout.php
行 777
process_payment()
函数应该 return 一个包含键 results
和 redirect_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 ),
);
}
最初提出的问题的答案是:
您的购物车中还没有订单 ID。 只有结帐完成后订单 ID 才存在。
答案与问题不一致,可能需要重新提问或编辑。
如果您的用户尝试付款但失败了,您可能需要检查 $order_id = WC()->session->get( 'order_awaiting_payment' );