#php #timezone #paypal
#php #Часовой пояс #paypal
Вопрос:
Я настраиваю приложение с использованием адаптивных платежей Paypal.
В настоящее время я реализую вызов предварительного утверждения, и в спецификации указано, что дата начала не может быть раньше сегодняшнего дня.
Имея это в виду … в соответствии с каким часовым поясом они проверяют это?
API SDK имеет это в примере:
$currDate = getdate();
$startDate = $currDate['year'].'-'.$currDate['mon'].'-'.$currDate['mday'];
$startDate = strtotime($startDate);
$startDate = date('Y-m-d', mktime(0,0,0,date('m',$startDate),date('d',$startDate),date('Y',$startDate)));
$endDate = add_date($startDate, 1);
Однако эта дата может отличаться в зависимости от часового пояса сервера, отправляющего запрос.
У кого-нибудь есть идеи о том, как гарантировать отсутствие проблем?
Редактировать без вознаграждения:
По состоянию на 15 декабря мы столкнулись с этим как с ошибкой. Мы используем время UTC, и как только наступает новый день по UTC, платежи начинают сбиваться.
Я использую приведенный выше код в следующем месте:
$preapprovalRequest->startingDate = $startDate;
$preapprovalRequest->endingDate = $endDate;
Что мне нужно, чтобы это заработало?
Правка 2:
Да, часовой пояс настроен как UTC, мы сделали это намеренно, чтобы вся информация о времени в нашей базе данных хранилась без часового пояса.
По сути, я пытаюсь выяснить, как указать, что дата, которую я отправляю Paypal, находится в UTC, а не в каком бы часовом поясе они ни находились.
Правка 3:
Существует API, и в нем говорится следующее
Дата начала и дата окончания могут быть в форматах смещения eiter Zulu или GMT. как в следующих соответствующих примерах: 2010-09-10Z 2010-09-10T17:24:03.874-07:00
По сути, мне нужен приведенный выше код, чтобы вывести что-то подобное, указав, что я использую UTC…
Ответ №1:
В документации api говорится, что для передачи данных используется GMT или время Зулу, и ожидается, что для обозначения этого в нем будет конечная буква «Z» (соответствует ISO 8601).
Дополнительные примечания о работе API предварительного утверждения
- Ограничения на предварительное одобрение являются аддитивными; таким образом, например, если вы укажете предварительное одобрение, которое разрешает платежи только по пятницам и 13-му числу месяца, предварительное одобрение будет действительным только в пятницу, 13-е число месяца в пределах указанного периода времени.
- Дата начала и дата окончания могут быть в форматах смещения eiter Zulu или GMT. как в следующих соответствующих примерах:
2010-09-10Z
[ПРИМЕЧАНИЕ: ЭТО ZULU]
2010-09-10T17:24:03.874-07:00
[ПРИМЕЧАНИЕ: ЭТО смещение по ГРИНВИЧУ]
Вероятно, самая безопасная вещь для использования — это:
$startingDate = gmdate('Y-m-dZ', $startingDateTimestamp);
Однако вы должны быть абсолютно уверены, что часовой пояс вашего собственного сервера (и время!) установлен правильно. Вам также может потребоваться установить часовой пояс отдельно в вашем PHP-приложении, используя date_default_timezone_set()
.
Наконец, есть еще одна проблема — я не знаю, какой SDK вы используете. Возможно, он пытается быть умным и изменяет дату, которую вы передаете, на что-то другое. В этом случае вам нужно выяснить, какой перевод даты он выполняет и какую дату он ожидает. (Например, возможно, он ожидает дату в системном локальном времени и изменяет ее на время UTC.) Предполагая, что это не изменит то, что вы предоставляете, однако, вы должны иметь возможность использовать приведенный выше код.
Комментарии:
1. Спасибо за подробную информацию, использовал другое решение, поэтому пометил его как принятое решение, но это, вероятно, будет лучшим ответом для пользователей, которые находят этот вопрос таким, что вы получаете вознаграждение!
2. @AequitarumCustos: Какого черта? Тогда просто отметьте это как решение. Не имеет смысла присуждать вознаграждение одному, а решение — другому.
Ответ №2:
Функции времени PHP основаны на системном времени (http://us.php.net/manual/en/intro.datetime.php ). Вы уверены, что ваша система настроена на использование времени UTC? Вы можете проверить с помощью следующего:
mpurcell@service1 ~/projects/config $ -> date
Thu Dec 15 23:29:09 UTC 2011
Обратите внимание на UTC в ответе. Если ваша система настроена на какой-либо другой часовой пояс, то это может быть вашей проблемой, если вам нужно установить свой часовой пояс на UTC, попробуйте:
$ rm -f /etc/localtime
$ ln -s /usr/share/zoneinfo/UTC /etc/localtime
Также убедитесь, что ваше системное время исправлено с использованием протокола сетевого времени:
$ ntpdate -b pool.ntp.org
— Редактировать —
Судя по вашим правкам, похоже, что они ожидают время либо в Zulu (добавьте Z), либо по Гринвичу со смещением (более сложным), попробуйте это:
$preapprovalRequest->startingDate = $startDate . 'Z';
$preapprovalRequest->endingDate = $endDate . 'Z';
Комментарии:
1. Да, наша система настроена на использование времени UTC, чтобы помочь всем пользователям правильно отображать время.
2. @AequitarumCustos: Вы проверили документы API, чтобы узнать, есть ли
$preapprovalRequest->timezone
вызов?3. Добавлена ссылка на API и информация о часовом поясе из документа API. Я не понимаю, как использовать то, что они туда поместили.