Я установил новый док-контейнер с Wordpress 5.0.3 и последним плагином WC и WC Eway (WooCommerce eWAY Gateway).
Создал магазин с некоторыми продуктами, подключил свою среду песочницы Eway, включилСохраните карты (что позволит активировать токен) и создайте заказ.После проверки post_meta в моей БД для заказа я не увидел поле _eway_token_customer_id
.Когда я вошел в систему как клиент, я попробовал еще раз, и с новым заказом я все еще не получил токен.
Причина этих тестов заключается в том, что я получил это странное поведение на моем реальном, новом веб-сайте, гдепервый заказ с НОВЫМ клиентом не приводит к получению токена.Однако, когда я создаю второй заказ во время входа в систему, я получаю _eway_token_customer_id
значение в пределах order_meta
.
. Мне необходимо получить этот токен с первым заказом, потому что после этогоЯ автоматически обновлю продукт, используя опцию tokenp ayment.
Отладка этой проблемы - ад, и меня это очень смущает, что при новой установке WP я вообще не получаю токен.
Isесть кто-нибудь, у кого есть блестящая идея?
** update После некоторого поиска в плагине Eway я обнаружил, что в первый раз, когда я делаю заказ, функция request_access_code()
из класса WC_Gateway_EWAY
проверка наличия токена в базе данных для этого пользователя.
Тело функции:
protected function request_access_code( $order ) {
$token_payment = $this->get_token_customer_id( $order );
if ( $token_payment && 'new' === $token_payment ) {
$result = json_decode( $this->get_api()->request_access_code( $order, 'TokenPayment', 'Recurring' ) );
} elseif ( 0 === $order->get_total() && 'shop_subscription' === ( version_compare( WC_VERSION, '3.0', '<' ) ? $order->order_type : $order->get_type() ) ) {
$result = json_decode( $this->get_api()->request_access_code( $order, 'CreateTokenCustomer', 'Recurring' ) );
} else {
$result = json_decode( $this->get_api()->request_access_code( $order ) );
}
if ( isset( $result->Errors ) && ! is_null( $result->Errors ) ) {
throw new Exception( $this->response_message_lookup( $result->Errors ) );
}
return $result;
}
Функция обрабатывает три возможных результата:
1) new customer: results in calling `$this->get_api()->request_access_code( $order, 'TokenPayment', 'Recurring' )` <-- this is the one we are after!
2) shop_subscription: calls `$this->get_api()->request_access_code( $order, 'CreateTokenCustomer', 'Recurring' )`
3) else..: calls `$this->get_api()->request_access_code( $order )`
То, что происходит во время отладки, заключается в том, что переменная $token_payment
имеетзначение пустой строки для нового клиента вместо new
.Поэтому я попытаюсь исправить это, либо через фильтр / ловушку действия, либо выяснить, почему это происходит.
Когда я принудительно использовал функцию, всегда использующую первый блок if
, я получил свой токен.:)
** Обновление 2: я протестировал существующую учетную запись пользователя, создал новый заказ.Когда я смотрю в таблицу post_meta
: Вуаля, присутствует значение new
.
Однако, когда я не вошел в систему и создал учетную запись,Значение new
не добавляется, и именно здесь оно идет не так.
Временным исправлением было бы использование ловушки и добавление значения new
к порядку, чтобы при вызове get_token_customer_id
он получалnew
значение, а не пустая строка.
Я думаю, что это ошибка, так как это значение должно быть добавлено.Это объясняет, почему вторые транзакции получают токен, а не первую.
Если бы только плагин Woocommerce Eway имел git-репо .... Я мог бы отметить проблему или разветвлять ее.
*** Решение без взлома Добавил это в мой плагин (или functions.php, если хотите):
add_action( 'woocommerce_checkout_order_processed', function( $order_id, $posted_data, $order ) {
update_post_meta( $order_id, '_eway_token_customer_id', 'new' );
}, 10, 3);
Это добавит новое значение, когда вы оформляете заказ с несуществующим пользователем.Токен был добавлен после добавления данных моей кредитной карты.
Дело в том, что в плагине все еще есть ошибка, которую вы можете обойти.