Я смотрю как на мой код, так и на свой результат, и не вижу явной ошибки, поэтому я подумал, что было бы полезно, чтобы несколько дополнительных глаз посмотрели на это.
У меня есть пользовательский приемник PayPal IPN, который обновляет таблицу транзакций в базе данных. Я развернул его в пятницу перед уходом с работы, а после возвращения сегодня, похоже, работает в основном правильно; но я хотел бы выяснить, почему одна вставка вела себя странно.
Вот захват вставок, которые произошли за выходные:
Как видите, предполагаемое значение 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
колонка против других.
У кого-нибудь есть представление о том, что может происходить в этом случае?
Как предположил @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;
}
Других решений пока нет …