有什么方法可以让 WooCommerce REST API 对客户友好吗?

Is there any way to make WooCommerce REST API be friendly to customers?

我正在 WordPress + WooCommerceAndroid 应用程序上构建一个电子商店,从 WooCommerce REST API 检索数据。我正在使用 WooCommerce 的 REST API 和 JWT 来获取有关产品、类别等的信息。还可以下订单、添加到购物车等。

如果您有管理员的 OAuth 1.0a 凭据,那很好,但是,我使用的是客户的 JWT。我让 WordPress 接受这个身份验证方法(通过我的插件)。

如果我向 http://SERVER/wp-json/wc/v3/products/categories 发出请求,我将收到此错误:

{
    "code": "woocommerce_rest_cannot_view",
    "message": "Вы не можете просматривать список ресурсов.",
    "data": {
        "status": 403
    }
}

我通过了 Authentification: Bearer "JWT" 并且 WordPress 接受了,但是 WooCommerce 没有给我任何信息。

我如何让 WordPress 接受我的 JWT:

function test_rest_user($result, $th, $request){
    $secret_key = defined('JWT_AUTH_SECRET_KEY') ? JWT_AUTH_SECRET_KEY : false;

    $auth = $request->get_header_as_array("Authorization");
    if ($auth){
        $token = explode(" ", $auth[0])[1];

        $user = api::exchange_token_to_wp_user($token, $secret_key);
        if ($user){
            set_current_user($user->data->ID);
        }
    }
}
add_filter("rest_pre_dispatch", "test_rest_user", 10, 3);

这个问题的主题是WooCommerce不接受JWT。这是 WordPress REST API 对客户 JWT (http://SERVER/wp-json/wp/v2/users/me) 的响应:

{
    "id": 7,
    "name": "test",
    "url": "",
    "description": "",
    "link": "http://SERVER/author/test/",
    "slug": "test",
    "avatar_urls": {},
    "meta": [],
    "_links": {
        "self": [
            {
                "href": "http://SERVER/wp-json/wp/v2/users/7"
            }
        ],
        "collection": [
            {
                "href": "http://SERVER/wp-json/wp/v2/users"
            }
        ]
    }
}

所以,我会暂时解决。我做了一个函数,它挂钩了 WooCommerce REST API 权限,你可以 Google 如何做到这一点。它挂钩 woocommerce_rest_check_permissions 过滤器。只需检查用户是否登录并提供对方法的访问。就是这么简单!