布伦特里订阅搜索
Braintree subscription search
我正在进行 Braintree 订阅搜索,以检索与这些 ID 相关联的客户 ID 和订阅价格。在我的代码中,我遵循了 .
的建议
这是我的代码的摘录:
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 (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
将您的查询分成小批次(5000 多个订阅成为 100 个订阅的 50 个调用),然后在您收到回复时汇总。许多 API 都有硬编码的速率限制和响应限制。
在出色的 BT 支持工程师的帮助下,我们终于找到了解决问题的方法。
解释:
当 BT return 的搜索结果时,它们会收集所有相关数据和 return 一个大的(序列化的)响应对象给客户端。在我们的例子中,一些订阅有大量的关联交易,这使得获取、序列化和 returning 它们到客户端的过程很慢。发出请求时,BT 网关 returns 页面以 50 个为一组,默认超时为 60 秒。任何具有多个大型响应对象的组都可能超时并产生 504 错误。
解决方法:
为了避免这种延迟,我们可以使用 ResourceCollections class 和 return 中的 id 方法来代替对象的 id 方法。使用个人订阅 ID,我们可以获取个人订阅和我们需要的属性,如下所示:
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)
希望这对其他人有所帮助!
我正在进行 Braintree 订阅搜索,以检索与这些 ID 相关联的客户 ID 和订阅价格。在我的代码中,我遵循了
这是我的代码的摘录:
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 (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
将您的查询分成小批次(5000 多个订阅成为 100 个订阅的 50 个调用),然后在您收到回复时汇总。许多 API 都有硬编码的速率限制和响应限制。
在出色的 BT 支持工程师的帮助下,我们终于找到了解决问题的方法。
解释:
当 BT return 的搜索结果时,它们会收集所有相关数据和 return 一个大的(序列化的)响应对象给客户端。在我们的例子中,一些订阅有大量的关联交易,这使得获取、序列化和 returning 它们到客户端的过程很慢。发出请求时,BT 网关 returns 页面以 50 个为一组,默认超时为 60 秒。任何具有多个大型响应对象的组都可能超时并产生 504 错误。
解决方法:
为了避免这种延迟,我们可以使用 ResourceCollections class 和 return 中的 id 方法来代替对象的 id 方法。使用个人订阅 ID,我们可以获取个人订阅和我们需要的属性,如下所示:
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)
希望这对其他人有所帮助!