Комбо-баг от Apple
Хочу передать благодарность разработчикам платёжного API AppStore, за то, что в пятницу в 19 вечера мне пришла ужасная бага «не работают платежи».
Ошибка оказалась не страшной и заключалась в том, что эплы хитро сломали своё API (минимум второй раз за полгода!). Сломали очень «удачно» для нашей системы, нарушив сразу два своих же соглашения по формату данных.
Как работало раньше:
- При проверке платежа API возвращало информацию о нём, включая идентификатор приложения.
- Идентификатор приложения — строка.
- В случае оплаты через песочницу идентификатор приложения не устанавливается.
-
Для обработки этого случая мы получаем идентификатор так:
data.get(‘app_item_id’, ‘sandbox’)
-
При сохранении платежа в базу мы проверяем наличие идентификатора, если его нет — паникуем.
-
Проверка делается так:
if app_id: … # оно ж строка
Что сделали эплы:
- В песочнице начали возвращать идентификатор приложения.
- Установили его в 0.
- 0 — целым.
Как следствие, у нас сломались и получение идентификатора и проверка его наличия. И бедные тестовые платежи перестали корректно обрабатываться.
Каким образом оно пролезло в их прод я не понимаю. Достаточно было написать один из двух явно необходимых тестов (проверка наличия идентификатора и/или проверка типа идентификатора), чтобы такой фигни не случалось.