gpt4 book ai didi

rest - WooCommerce REST API v2 : How to process payment?

转载 作者:行者123 更新时间:2023-12-04 13:59:24 24 4
gpt4 key购买 nike

使用 WooCommerce REST API v2 ,我成功地创建了一个处于待处理、未付款状态的订单。

我可以看到我可以设置order.payment_details.paid字段到 true这将创建处于已完成状态的订单并发送已完成的订单电子邮件,但它实际上并不处理付款。

使用 REST API v2 创建订单并让 WooCommerce 使用支付网关处理支付的正确方法是什么?

还是我需要在服务器端的 API 中添加一个插件 Hook ? (我认同)

这是我尝试过的

curl -X POST https://example.com/wc-api/v2/orders \
-u consumer_key:consumer_secret \
-H "Content-Type: application/json" \
-d '{
"order": {
"customer_id": 2,
"payment_details": {
"method_id": "da_big_bank",
"method_title": "StackOverflow Money Laundering, Inc.",
"paid":true
},
"line_items": [
{
"product_id": 341,
"quantity": 1
}
]
}
}'

正如我所说,它会生成一个已完成状态的订单,但实际上并没有使用我的网关处理任何资金(这不是“StackOverflow Money Laundering, Inc.”,而是一个合法的网关,在使用我们的 WooCommerce 网站时可以正常工作)

最佳答案

helgatheviking同意,目前没有办法使用 WooCommerce REST API 处理订单付款。

我最终在 woocommerce_api_create_order 中写了一个钩子(Hook)。创建订单时立即处理付款订单的过滤器。如果处理失败,则将错误添加到 order->post->post_excerpt使其显示为 order->note 的字段在 JSON 响应中。

为此,我还必须扩展支付网关,使其 process_payment()方法将接受 $user_id作为输入。这是因为它是开箱即用的编码来对当前登录的用户进行操作,在我的情况下,可能在大多数情况下,是 REST 客户端登录的系统用户,而不是进行购买的实际用户。

扩展网关的另一个好处是现在可以返回错误而不是写入 wc_add_notice()。 .因为这是一个 REST 服务,所以什么都看不到 wc_add_notice() 的输出。

add_filter('woocommerce_api_create_order', 'acme_on_api_create_order', 10, 3);

/**
* When order is created in REST client, actually make them pay for it
* @param int $id order id
* @param array $data order data posted by client
* @param WC_API_Orders $api not used
* @return array the data passed back unaltered
*/
function acme_on_api_create_order($id, $data, $api) {
if($data['payment_details']['method_id'] == 'acme_rest_gateway') {
$order = wc_get_order($id);
$order->calculate_totals();
$acme_gateway = new WC_Acme_Gateway_For_Rest();
$payment = $acme_gateway->process_payment($id, $data['customer_id']);
if($payment["result"] == "success") {
$order->update_status('completed');
}
else {
$order->update_status("cancelled");
wp_update_post(array(
'ID' => $id,
'post_excerpt' => json_encode($payment)
));
}
}
return $data;
}

// Register the payment gateway
add_filter('woocommerce_payment_gateways', 'acme_add_payment_gateway_class');

function acme_add_payment_gateway_class($methods) {
$methods[] = 'WC_Acme_Gateway_For_Rest';
return $methods;
}

// Load the new payment gateway needed by REST client
add_action('after_setup_theme', 'acme_init_rest_gateway_class');

function acme_init_rest_gateway_class() {

/**
* Extend the payment gateway to work in the REST API context
*/
class WC_Acme_Gateway_For_Rest extends WC_Acme_Gateway {

/**
* Constructor for the gateway.
*/
public function __construct() {
parent::__construct();
$this->id = 'acme_rest_gateway';
}

/**
* Process Payment. This is the same as the parent::process_payment($order_id) except that we're also passing
* the user id rather than reading get_current_user_id().
* And we're returning errors rather than writing them as notices
* @param int $order_id the order id
* @param int $user_id user id
* @return array|null an array if success. otherwise returns nothing
*/
function process_payment($order_id, $user_id) {
$order = wc_get_order( $order_id );
/*
* todo: code sending da moneez to da bank
*/
return array(
'result' => 'success',
'redirect' => $this->get_return_url( $order )
);
}
}
}

关于rest - WooCommerce REST API v2 : How to process payment?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30922742/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com