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 )                 );         }     } } 

Comments

  1. 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

Post a Comment

Popular posts from this blog

swift - How to change text of a button with a segmented controller? -

python - How to create jsonb index using GIN on SQLAlchemy? -

PHP DOM loadHTML() method unusual warning -