我有一个测试端点,可以像我们的应用一样将卡添加到客户资料中。创建配置文件,添加付款配置文件,其他所有操作都可以正常进行(我今天再次进行测试以确保),但是删除将不起作用。至少在Python SDK中,错误输出小于最佳数量,并且日志记录信息甚至更糟。我真的很茫然,我想补充什么。从根本上说,这只是sample code稍微重构了。
我尝试设置验证模式(添加卡所需),并将控制器环境显式设置为dev / sandbox网址(到目前为止,尚无此要求)。
调用以下方法的代码基本上只是从数据库中获取内容,以提供函数本身所需的参数,而这些参数也可以正常工作。
import logging
from authorizenet import apicontractsv1
from authorizenet import apicontrollers
from errors import PaymentGatewayError
class AuthDotNet(object):
def __init__(self):
super().__init__()
self.logger = logging.getLogger('authorizenet.sdk')
handler = logging.FileHandler('anetSdk.log')
formatter = logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s %(message)s')
handler.setFormatter(formatter)
self.logger.addHandler(handler)
self.logger.setLevel(logging.DEBUG)
self.logger.debug('Logger set up for Authorizenet Python SDK complete')
def init_app(self, flask_app):
self.merchantAuth = apicontractsv1.merchantAuthenticationType()
self.merchantAuth.name = flask_app.config['AUTHDOTNET_LOGIN_ID']
self.merchantAuth.transactionKey = flask_app.config['AUTHDOTNET_TRANSACTION_KEY']
self.validationMode = flask_app.config['AUTHDOTNET_VALIDATION_MODE'] # testMode
self.api = flask_app.config['AUTHDOTNET_API'] # https://apitest.authorize.net/xml/v1/request.api
def delete_payment_method(self, customer_profile_id, pm_gateway_id):
request = apicontractsv1.deleteCustomerPaymentProfileRequest()
request.merchantAuth = self.merchantAuth
request.customerProfileId = customer_profile_id
request.customerPaymentProfileId = pm_gateway_id
request.validationMode = self.validationMode # this was necessary in create_payment_profile
controller = apicontrollers.deleteCustomerPaymentProfileController(request)
# controller.setenvironment(self.api)
controller.execute() # this line breaks it
response = controller.getresponse()
if (response.messages.resultCode != 'Ok'):
# TODO Figure out some fail case codes
http_code = status.HTTP_500_INTERNAL_SERVER_ERROR
raise PaymentGatewayError(
http_code=http_code,
gateway_code=response.messages.message['code'].text,
gateway_message=response.messages.message['text'].text
)
return response
记录器输出:
2020-02-10 16:14:43,375 authorizenet.sdk DEBUG Logger set up for Authorizenet Python SDK complete
2020-02-10 16:14:50,475 authorizenet.sdk DEBUG performing custom validation..
2020-02-10 16:14:50,475 authorizenet.sdk DEBUG Executing http post to url: https://apitest.authorize.net/xml/v1/request.api
2020-02-10 16:14:50,476 authorizenet.sdk DEBUG building request..
2020-02-10 16:14:50,476 authorizenet.sdk DEBUG building request..
异常打印
(
<authorizenet.apicontractsv1.CTD_ANON_57 object at 0x04A76190>,
<pyxb.utils.fac.Configuration object at 0x057AF1A8>,
[], {
<pyxb.binding.content.ElementDeclaration object at 0x04E30160>: ['sdk-python-1.1.3'],
<pyxb.binding.content.ElementDeclaration object at 0x04E5EC88>: ['VALID_USER_ID'],
<pyxb.binding.content.ElementDeclaration object at 0x04E5ECD0>: ['VALID_PAYMENT_METHOD_ID']
}
)
堆栈跟踪:第1点
Traceback (most recent call last):
File "c:\users\jmbzy\documents\gophr\api-payments\venv\lib\site-packages\authorizenet\apicontrollersbase.py", line 134, in execute
xmlRequest = self.buildrequest()
File "c:\users\jmbzy\documents\gophr\api-payments\venv\lib\site-packages\authorizenet\apicontrollersbase.py", line 105, in buildrequest
xmlRequest = self._request.toxml(encoding=constants.xml_encoding, element_name=self.getrequesttype())
File "c:\users\jmbzy\documents\gophr\api-payments\venv\lib\site-packages\pyxb\binding\basis.py", line 555, in toxml
dom = self.toDOM(bds, element_name=element_name)
File "c:\users\jmbzy\documents\gophr\api-payments\venv\lib\site-packages\pyxb\binding\basis.py", line 527, in toDOM
self._toDOM_csc(bds, element)
File "c:\users\jmbzy\documents\gophr\api-payments\venv\lib\site-packages\pyxb\binding\basis.py", line 2661, in _toDOM_csc
order = self._validatedChildren()
File "c:\users\jmbzy\documents\gophr\api-payments\venv\lib\site-packages\pyxb\binding\basis.py", line 2188, in _validatedChildren
return self.__automatonConfiguration.sequencedChildren()
File "c:\users\jmbzy\documents\gophr\api-payments\venv\lib\site-packages\pyxb\binding\content.py", line 638, in sequencedChildren
cfg = self._diagnoseIncompleteContent(symbols, symbol_set)
File "c:\users\jmbzy\documents\gophr\api-payments\venv\lib\site-packages\pyxb\binding\content.py", line 493, in _diagnoseIncompleteContent
raise pyxb.IncompleteElementContentError(self.__instance, cfg, symbols, symbol_set)
pyxb.exceptions_.IncompleteElementContentError: (<authorizenet.apicontractsv1.CTD_ANON_57 object at 0x04A76190>, <pyxb.utils.fac.Configuration object at 0x05530778>, [], {<pyxb.binding.content.ElementDeclaration object at 0x04E30160>: ['sdk-python-1.1.3'], <pyxb.binding.content.ElementDeclaration object at 0x04E5EC88>: ['VALID_USER_ID'], <pyxb.binding.content.ElementDeclaration object at 0x04E5ECD0>: ['VALID_PAYMENT_METHOD_ID']})
堆栈跟踪:第2点
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\jmbzy\Documents\Gophr\api-payments\route_resources.py", line 473, in delete
pg_response = pg.provider.delete_payment_method(user_pg_id, pm_gateway_id)
File "C:\Users\jmbzy\Documents\Gophr\api-payments\gateway.py", line 325, in delete_payment_method
controller.execute()
File "c:\users\jmbzy\documents\gophr\api-payments\venv\lib\site-packages\authorizenet\apicontrollersbase.py", line 137, in execute
anetLogger.error( 'Error retrieving http response from: %s for request: %s', self.endpoint, self.getprettyxmlrequest())
File "c:\users\jmbzy\documents\gophr\api-payments\venv\lib\site-packages\authorizenet\apicontrollersbase.py", line 113, in getprettyxmlrequest
xmlRequest = self.buildrequest()
File "c:\users\jmbzy\documents\gophr\api-payments\venv\lib\site-packages\authorizenet\apicontrollersbase.py", line 105, in buildrequest
xmlRequest = self._request.toxml(encoding=constants.xml_encoding, element_name=self.getrequesttype())
File "c:\users\jmbzy\documents\gophr\api-payments\venv\lib\site-packages\pyxb\binding\basis.py", line 555, in toxml
dom = self.toDOM(bds, element_name=element_name)
File "c:\users\jmbzy\documents\gophr\api-payments\venv\lib\site-packages\pyxb\binding\basis.py", line 527, in toDOM
self._toDOM_csc(bds, element)
File "c:\users\jmbzy\documents\gophr\api-payments\venv\lib\site-packages\pyxb\binding\basis.py", line 2661, in _toDOM_csc
order = self._validatedChildren()
File "c:\users\jmbzy\documents\gophr\api-payments\venv\lib\site-packages\pyxb\binding\basis.py", line 2188, in _validatedChildren
return self.__automatonConfiguration.sequencedChildren()
File "c:\users\jmbzy\documents\gophr\api-payments\venv\lib\site-packages\pyxb\binding\content.py", line 638, in sequencedChildren
cfg = self._diagnoseIncompleteContent(symbols, symbol_set)
File "c:\users\jmbzy\documents\gophr\api-payments\venv\lib\site-packages\pyxb\binding\content.py", line 493, in _diagnoseIncompleteContent
raise pyxb.IncompleteElementContentError(self.__instance, cfg, symbols, symbol_set)
pyxb.exceptions_.IncompleteElementContentError: (<authorizenet.apicontractsv1.CTD_ANON_57 object at 0x04A76190>, <pyxb.utils.fac.Configuration object at 0x057AF1A8>, [], {<pyxb.binding.content.ElementDeclaration object at 0x04E30160>: ['sdk-python-1.1.3'], <pyxb.binding.content.ElementDeclaration object at 0x04E5EC88>: ['VALID_USER_ID'], <pyxb.binding.content.ElementDeclaration object at 0x04E5ECD0>: ['VALID_PAYMENT_METHOD_ID']})
注意:插入VALID_*
代替实际值,并且line 325, in delete_payment_method
指上面的controller.execute()
。