如何保存一个对WooCommerce订单元数据的API响应

时间:2019-10-14 作者:StarLine

有一个自定义签出字段电子邮件类型,用于验证电子邮件是否存在于远程服务器中。我使用此字段将JSON数据发送到远程服务器。

如果电子邮件存在JSON响应,通常:

{
    "success": "ok",
    "responseCode": "200",
    "token": "I0b6uSNelqwGv+sCHpTV6LYI08hxcwoBIMVHh5mKVx+fkRFscUKbvUBF8+rl0vACgMImcffCzLsf571KLQVkSYcvdUfdwsu8mrBQ8mBw5J1LZtFs/7PwXerjNS2HjBAB0tc+RqZhYJ9Ne1efn7fq7Df4kAQ+QO7CjBKUwp8k7pFYslLMcWuxfb+KKsotZP82gkk5oKZEeh30a6K2I7dAxRj+B3RqyqND/uRO1uqQ1IA="
}
其中“token”值随请求而变化。

检查响应代码=200后,我想在订单中保存令牌元数据

使用$order->update_meta_data( \'received_token_key\', $token ); 不是独自工作,我知道我有一个大错误,但我找不到这个。

也许用另一个WooCommerce钩子?可能使用wc\\U会话?也许可以保存到另一个地方并回忆起来?

我需要在结帐前进行验证,来自自定义字段的电子邮件,如果没有,wc_add_notice($response_message, \'error\'); 将被触发。

         // start here
   add_action( \'woocommerce_checkout_process\', (custom_checkout_field_process_valid\' );

   function custom_checkout_field_process_valid($order_id) {

        $url = \'https://remoteserver.com/api/checking-email-registered-user.json\';
        $body = array("email"=>($_POST[\'email_pasajero\']),); //from custom field
        $response2 = wp_remote_post( $url, 
            array(
                \'headers\'   => array(\'Content-Type\' => \'application/json; charset=utf-8\'),
                \'method\'    => \'POST\',
                \'timeout\' => 75,                    
                \'body\'      => json_encode($body),));

         // check and use the response
$response_code       = wp_remote_retrieve_response_code( $response2 );
$response_message = wp_remote_retrieve_response_message( $response2 );
$bodyarray = json_decode( wp_remote_retrieve_body( $response2 ));
$token = $bodyarray["token"]; 

    if ($response_code == 200)  {
        // I want to save $token or its value, in this step, how metadata for later use
       // maybe directly from the response?
        // $order->update_meta_data( \'token_received_key\', $token ); not work
    }

            else {
         wc_add_notice($response_message, \'error\');
                return $response_code ;
        }
}

1 个回复
SO网友:Jacob Peattie

你很接近。

$order->update_meta_data() 将更新$order 对象,但它不会将更改存储在数据库中。将更改保存到WooCommerce CRUD object 您需要运行save() 方法:

if ( $response_code == 200 )  {
    $order->update_meta_data( \'token_received_key\', $token );
    $order->save();
}

相关推荐

JQuery/AJAX在使用rest API时是否发送cookie,或者我是否需要以某种方式添加它们?

我遇到了一个奇怪的情况user capabilities. 我在本地计算机上设置了一个rest端点,我是超级管理员。rest端点被调用,它所做的第一件事就是查看用户是否可以发表文章(因为这是调用的结果)。我使用了以下代码: if(!current_user_can(\'publish_posts\')){ return array(\'reply\'=>0,\'error\'=>\'Forbidden\',\'code\'=>\'403\');