Странное поведение в WordPress MySQL вставка данных в кодировке JSON

Я смотрю как на мой код, так и на свой результат, и не вижу явной ошибки, поэтому я подумал, что было бы полезно, чтобы несколько дополнительных глаз посмотрели на это.

У меня есть пользовательский приемник PayPal IPN, который обновляет таблицу транзакций в базе данных. Я развернул его в пятницу перед уходом с работы, а после возвращения сегодня, похоже, работает в основном правильно; но я хотел бы выяснить, почему одна вставка вела себя странно.

Вот захват вставок, которые произошли за выходные:
PayPal IPN log

Как видите, предполагаемое значение JSON для log столбец 4-й транзакции пуст. Я нахожу это странным, потому что ценность transaction_id столбец анализируется из того же массива.

Вот соответствующий БД insert код:

// Generate valid IPN log
private function generateIpnLog () {
global $wpdb;

// prepare log
$array_log = [];
$array_log['verified'] = true;
$array_log['ipn_response'] = (isset($this->PayPal_Response)) ? : 'Error reading from POST array';

// Parse transaction ID
$transaction_id = (isset($this->PayPal_Response['txn_id'])) ? $this->PayPal_Response['txn_id'] : null;

// Generate log
$log = json_encode($array_log);

// Update DB
$wpdb->insert(
'log_paypal',
[
'transaction_id'    => ($transaction_id) ? $transaction_id : 'Error getting transaction ID',
'log' => ($log) ? $log : 'Error generating transaction log'
],
[
'%s',
'%s'
]
);

// json log response
$this->json_return = $log;
}

Видя, что идентификатор транзакции хорошо анализируется из ответа PayPal, и потому что мы знаем $array_log['verified'] имеет явно объявленное значение, я думаю, должна быть проблема с json_encode($array_log),

Я также проверил данные из истории PayPal IPN рассматриваемой учетной записи PayPal и могу убедиться, что в формировании данных в нуле нет ничего другого log колонка против других.

У кого-нибудь есть представление о том, что может происходить в этом случае?

0

Решение

Как предположил @ishegg, это была проблема с кодировкой, поскольку PayPal IPN использует windows-1252 кодирование и поле БД было закодировано в UTF-8,

Это было легко исправить в этом случае, поскольку данные возврата PayPal не являются вложенными / многомерными (см. Ниже).

Вызывается в более ранней функции после криптографической проверки записи IPN PayPal цепочкой сертификатов:

// Process IPN response
$this->PayPal_Response = $this->processIpn();

Затем сама функция:

// Manipulate IPN response and prepare
// for database update and log
private function processIpn () {
// Response ref.
$response = $this->post_array;

if ( isset($response['charset']) ) {
if ($response['charset'] == "windows-1252") {
foreach ($response as $key => $ipn_value) {
$response[$key] = mb_convert_encoding($ipn_value, 'UTF-8', 'Windows-1252');
}
}
}
return $response;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector