WooCommerce REST API v2: How to process payment? -
using woocommerce rest api v2, i'm creating order in pending, unpaid state.
i can see can set order.payment_details.paid
field true
create order in completed state , send out completed order email, doesn't process payment.
what proper way using rest api v2 create order , have woocommerce process payment using payment gateway?
or need add plugin hook api on server side? (i think so)
here's i've tried
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 } ] } }'
which, said, generates order in completed state, doesn't process money gateway (which not "stackoverflow money laundering, inc." , legitimate gateway work when using our woocommerce site)
as helgatheviking concurred, there isn't way process payment of order woocommerce rest api.
i ended writing hook woocommerce_api_create_order
filter processes order payment when order created. if processing fails, errors added order->post->post_excerpt
field makes appear order->note
in json response.
for work, had extend payment gateway process_payment()
method accept $user_id
input. because it's coded out of box operate on logged in user, which, in case, , cases, system user rest client logs in as, not actual user making purchase.
the other benefit of extending gateway turned out errors can returned rather written wc_add_notice()
. since rest service, nothing ever sees output of wc_add_notice()
add_filter('woocommerce_api_create_order', 'acme_on_api_create_order', 10, 3); /** * when order created in rest client, make them pay * @param int $id order id * @param array $data order data posted client * @param wc_api_orders $api not used * @return array data passed 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 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 new payment gateway needed rest client add_action('after_setup_theme', 'acme_init_rest_gateway_class'); function acme_init_rest_gateway_class() { /** * extend payment gateway work in rest api context */ class wc_acme_gateway_for_rest extends wc_acme_gateway { /** * constructor gateway. */ public function __construct() { parent::__construct(); $this->id = 'acme_rest_gateway'; } /** * process payment. same parent::process_payment($order_id) except we're passing * user id rather reading get_current_user_id(). * , we're returning errors rather writing them notices * @param int $order_id order id * @param int $user_id user id * @return array|null array if success. otherwise returns nothing */ function process_payment($order_id, $user_id) { $order = wc_get_order( $order_id ); /* * todo: code sending da moneez da bank */ return array( 'result' => 'success', 'redirect' => $this->get_return_url( $order ) ); } } }
Looking for woocommerce Rest API Integration for your online store? Hire our developers & programmers for your custom API and extensions ... +91-9806724185 or Contact@expresstechsoftwares.com
ReplyDelete