Поиск подписки Braintree - PullRequest
       10

Поиск подписки Braintree

0 голосов
/ 25 сентября 2018

Я работаю над поиском подписки Braintree, чтобы получить идентификаторы клиентов и цены подписки, связанные с этими идентификаторами.В моем коде я следую советам этого поста .

Вот выдержка из моего кода:

gateway = braintree.BraintreeGateway(
    braintree.Configuration(
        environment=braintree.Environment.Production,
        merchant_id= 'our_merchant_id',
        public_key='our_public_key',
        private_key='our_private_key'
    )
)
subscriptions = gateway.subscription.search(
    braintree.SubscriptionSearch.status.in_list(
        braintree.Subscription.Status.Active,
        braintree.Subscription.Status.PastDue,
        braintree.Subscription.Status.Pending
    )
)

result = {}

for subscription in subscriptions.items:
    payment_method = gateway.payment_method.find(subscription.payment_method_token)
    result[payment_method.customer_id] = subscription.price

"""do something with result """

Этот подход прекрасно работает в песочнице BT ина небольших запросах около 100 записей.Однако всякий раз, когда я пытаюсь запросить более 120 подписок, BT-сервер отвечает последовательно с ошибкой 504.Я хотел бы запросить около 5000 подписок за один раз в производстве.Какие-либо предложения?

Traceback:

Traceback (most recent call last):
File "BT_subscrAmount.py", line 22, in <module>
for subscription in subscriptions.items:
File "/home/karen/miniconda3/lib/python3.6/site- 
packages/braintree/resource_collection.py", line 38, in items
for item in self.__method(self.__query, batch):
File "/home/karen/miniconda3/lib/python3.6/site- 
packages/braintree/subscription_gateway.py", line 79, in __fetch
response = self.config.http().post(self.config.base_merchant_path() + 
"/subscriptions/advanced_search", {"search": criteria})
File "/home/karen/miniconda3/lib/python3.6/site- 
packages/braintree/util/http.py", line 56, in post
return self.__http_do("POST", path, Http.ContentType.Xml, params)
File "/home/karen/miniconda3/lib/python3.6/site- 
packages/braintree/util/http.py", line 86, in __http_do
Http.raise_exception_from_status(status)
File "/home/karen/miniconda3/lib/python3.6/site- 
packages/braintree/util/http.py", line 49, in raise_exception_from_status
raise UnexpectedError("Unexpected HTTP_RESPONSE " + str(status))
braintree.exceptions.unexpected_error.UnexpectedError: Unexpected 
HTTP_RESPONSE 504

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

С помощью замечательного инженера службы поддержки BT мы наконец смогли найти решение нашей проблемы.

Объяснение:

Когда BT возвращает результаты поиска, они собирают все связанные данные и возвращают большой (сериализованный) объект ответа клиенту.В нашем случае у некоторых подписок было большое количество связанных транзакций, что замедляет процесс извлечения, сериализации и возврата их клиенту.При отправке запроса шлюз BT возвращает страницы группами по 50 с временем ожидания по умолчанию 60 секунд.Любая группа с несколькими большими объектами ответа, скорее всего, истечет время ожидания и выдаст ошибку 504.

Решение:

Чтобы избежать этой задержки, вместо использования метода items мы можем использовать метод idиз класса ResourceCollections и возвращают только идентификаторы объектов.С индивидуальным идентификатором подписки мы можем получить индивидуальную подписку и только те атрибуты, которые нам нужны, например:

subscriptions = gateway.subscription.search(
    braintree.SubscriptionSearch.status.in_list(
    braintree.Subscription.Status.Active
    )
)

subscription_ids = subscriptions.ids

def find_customer_id(id):
    subscription = gateway.subscription.find(id)
    payment_method = gateway.payment_method.find(subscription.payment_method_token)
    return (payment_method.customer_id, subscription.price) 

Надеюсь, это поможет кому-то еще!

0 голосов
/ 25 сентября 2018

Разделите ваши запросы на небольшие партии (более 5000 подписок, чтобы они превратились в 50 вызовов из 100 подписок), а затем объединяйте их по мере получения ответов.Многие API имеют жестко заданные пределы скорости и ограничения отклика.

...