PayPal Preapproval Дата начала часовой пояс? - PullRequest
6 голосов
/ 12 ноября 2011

Я настраиваю приложение с помощью адаптивных платежей Paypal.

В настоящее время я выполняю вызов Preapproval, и в спецификации говорится, что StartDate не может быть до сегодняшнего дня.

Имея это в виду ... в каком часовом поясе они проверяют это?

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);

Однако эта дата может отличаться в зависимости от часового пояса сервера, отправляющего запрос.

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

Изменить с помощью Bounty:

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

Я использую приведенный выше код в следующем месте:

$preapprovalRequest->startingDate = $startDate;
$preapprovalRequest->endingDate = $endDate;

Что мне нужно, чтобы эта работа работала?

Редактировать 2:

Да, часовой пояс настроен как UTC, мы сделали это намеренно, чтобы вся информация о времени в нашей базе данных сохранялась без часового пояса.

По сути, я пытаюсь выяснить, как указать, что дата, которую я отправляю в Paypal, указана в UTC, а не в каком часовом поясе они находятся.

Редактировать 3:

https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_APPreapproval

Есть API, и он говорит следующее

Начальная дата и конечная дата могут быть в смещении eiter Zulu или GMT форматы. как в следующих соответствующих примерах: 2010-09-10Z 2010-09-10T17: 24: 03.874-07: 00

По сути, мне нужен приведенный выше код, чтобы вывести что-то подобное, указав, что я использую UTC ...

Ответы [ 2 ]

7 голосов
/ 16 декабря 2011

В документации api говорится, что для передачи используется время по Гринвичу или зулу, и ожидается, что для обозначения этого будет иметь конечный Z (в соответствии с ISO 8601).

Дополнительные примечания о работе API предварительного утверждения

  1. Ограничения предварительного утверждения являются аддитивными;таким образом, например, если вы укажете предварительное утверждение, разрешающее платежи только по пятницам и 13-го числам месяца, предварительное утверждение будет действительным только в пятницу, 13-е число месяцев в течение указанного периода времени.
  2. Начальная дата и конечная дата могут быть в форматах смещения eiter Zulu или GMT.как в следующих соответствующих примерах:

2010-09-10Z [ПРИМЕЧАНИЕ: ЭТО ЗУЛУ]

2010-09-10T17:24:03.874-07:00 [ПРИМЕЧАНИЕ: ЭТО ГринвичOFFSET]

Самое безопасное для использования, вероятно, это:

$startingDate = gmdate('Y-m-d\Z', $startingDateTimestamp);

Однако вы должны быть абсолютно уверены , что время вашего собственного серверазона (и время!) установлена ​​правильно. Вам также может понадобиться установить часовой пояс отдельно в вашем PHP-приложении , используя date_default_timezone_set().

Наконец, есть еще одна морщина - я делаюне знаю, какой SDK вы используете.Возможно, он пытается быть умным и меняет дату, которую вы передаете, на что-то другое.В этом случае вам необходимо выяснить, какую дату он выполняет и какую дату он ожидает.(Например, возможно, он ожидает дату по местному системному времени и меняет ее на время UTC.) Если предположить, что она не меняет то, что вы предоставляете, вы должны использовать приведенный выше код.

2 голосов
/ 16 декабря 2011

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

- Правка -

Исходя из ваших правок, похоже, что они ожидают время в зулу (добавление Z) или по Гринвичу со смещением (более сложное), попробуйте это

$preapprovalRequest->startingDate = $startDate . 'Z';
$preapprovalRequest->endingDate = $endDate . 'Z';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...