Я разрабатываю мобильное приложение из моего существующего магазина WooCommerce. Я добавил пользовательские API для поддержки всего через пользовательский сеанс. Я не знаю, как сессия управляется в WooCommerce. Но когда я вызываю метод wp_get_session_token()
из мобильного приложения, он возвращает пустую строку, а из почтальона, когда я вызываю тот же API, он возвращает правильную строку сеанса.
Моя основная задача - добавить товар в корзину и получить его из корзины для определенного сеанса пользователя. Используя пользовательские API, я могу делать все в соответствии с пользовательским сеансом. Товар добавляется в текущую зарегистрированную корзину пользователя через зарегистрированную сессию. Но из мобильного приложения я не могу добавить товар в корзину для конкретного пользователя через его сеанс. Я получаю правильный ответ для пользовательского добавления в корзину API из мобильного приложения, но он не может определить, для какой пользовательской корзины добавлен этот продукт. Также после добавления товара в корзину я вызываю API get cart items, который также возвращает 0 товаров, что означает, что товар там не добавляется. Все эти API работают нормально от Почтальона.
Чтобы выяснить эту проблему, я попытался вызвать метод wp_get_session_token()
в API входа в систему. Этот метод возвращает правильный идентификатор сессии, когда он вызывается из Почтальона. Но когда я вызываю это из мобильного приложения, он возвращает только пустую строку.
Мне кажется, что проблема в сеансе из мобильного приложения, но я не знаю, как управлять им из мобильного приложения в магазин WooCommerce.
Вот мой API входа в систему, где я возвращаю идентификатор сеанса для отладки:
function register_api_hooks() {
register_rest_route(
'custom-plugin', '/login/',
array(
'methods' => ['GET'],
'callback' => 'login',
)
);
function login($request) {
$creds = array();
$creds['user_login'] = $request["username"];
$creds['user_password'] = $request["password"];
$creds['remember'] = true;
$user = wp_signon( $creds, false );
$session = (object) wp_get_session_token();
write_log($user);
write_log($session);
return $session;
// return $user;
}
}
В write_log также есть пустая запись для сеанса, когда он вызывается из мобильного приложения.
Код для добавления в корзину:
add_action( 'rest_api_init', 'register_cart_hooks' );
// API custom endpoints for WP-REST API
function register_cart_hooks() {
register_rest_route(
'custom-plugin', '/addToCart/',
array(
'methods' => ['GET'],
'callback' => 'addToCart',
)
);
function addToCart($request) {
global $woocommerce;
$woocommerce>cart>add_to_cart($request["product_id"],$request["quantity"]);
return "Success...";
}
}
Пожалуйста, дайте мне знать, где я ошибаюсь или какую другую реализацию я должен сделать.
EDIT
Вот код, который я использую в мобильном приложении React Native:
fetch(url1, {
method: methodName,
async: true,
crossDomain: true,
headers: new Headers({
"Content-Type": "application/json",
"cache-control": "no-cache",
}),
body:data1
}).then((response) => {
const statusCode = response.status;
console.log("fetchData StatusCode : "+statusCode);
console.log("fetchData response1 : " + JSON.stringify(response));
console.log("fetchData response2 : " + response);
return response.json();
}).then((responseJson) => {
// var firstResponse = responseJson.split(',');
// console.log("fetchData responseJson 111 : "+firstResponse);
console.log("fetchData responseJson : "+responseJson);
var response = JSON.stringify(responseJson);
console.log("fetchData responseJson stringify : " + response);
response = JSON.parse(response);
console.log("fetchData responseJson stringify 1 : " + response);
console.log("fetchData responseJson stringify 2 : " + JSON.stringify(response));
if (callBack != null) {
callBack("", response);
}
}).catch((error) => {
console.log("fetchData Api error : "+error);
if (callBack != null) {
console.log("fetchData Api error callBack != null 2");
callBack("Error", "");
}
});