from decimal import Decimal
from authorizenet import apicontractsv1, apicontrollers
from authorizenet.apicontrollersbase import APIOperationBase
from lxml.objectify import ObjectifiedElement
__all__ = [
"charge_credit_card",
"authorize_credit_card",
"capture_authorized_amount",
"refund_credit_card",
]
def build_transaction(
amount: Decimal, **kwargs
) -> apicontractsv1.transactionRequestType:
"""Returns a transaction element for a transaction request."""
transaction_request = apicontractsv1.transactionRequestType()
transaction_request.amount = amount
if payment := kwargs.get("payment"):
transaction_request.payment = payment
if address := kwargs.get("address"):
transaction_request.billTo = address
if order := kwargs.get("order"):
transaction_request.order = order
if customer_data := kwargs.get("customer_data"):
transaction_request.customerData = customer_data
if settings := kwargs.get("settings"):
transaction_request.transactionSettings = settings
if line_items := kwargs.get("line_items"):
transaction_request.lineItems = line_items
return transaction_request
[docs]
def charge_credit_card(
amount: Decimal,
credit_card: apicontractsv1.creditCardType,
address: apicontractsv1.customerAddressType,
order: apicontractsv1.orderType | None = None,
customer_data: apicontractsv1.customerDataType | None = None,
settings: apicontractsv1.ArrayOfSetting | None = None,
line_items: apicontractsv1.ArrayOfLineItem | None = None,
) -> tuple[ObjectifiedElement, type[APIOperationBase]]:
"""
`Charges a credit card <https://developer.authorize.net/api/reference/index.html#payment-transactions-charge-a-credit-card>`_.
:param amount: Dollar amount to charge.
:type amount: ~decimal.Decimal
:param credit_card: A credit card.
:type credit_card: ~authorizenet.apicontractsv1.creditCardType
:param address: A customer address.
:type address: ~authorizenet.apicontractsv1.customerAddressType
:param order: Order information. Default is :py:obj:`None`.
:type order: ~authorizenet.apicontractsv1.orderType | None
:param customer_data: Customer data. Default is :py:obj:`None`.
:type customer_data: ~authorizenet.apicontractsv1.customerDataType | None
:param settings: Transaction settings. Default is :py:obj:`None`.
:type settings: ~authorizenet.apicontractsv1.ArrayOfSetting | None
:param line_items: An array of line items. Default is :py:obj:`None`.
:type line_items: ~authorizenet.apicontractsv1.ArrayOfLineItem | None
:returns: A tuple containing an Authorizenet API request element and controller class.
:rtype: tuple[~lxml.objectify.ObjectifiedElement, type[~authorizenet.apicontrollersbase.APIOperationBase]]
"""
request = apicontractsv1.createTransactionRequest()
payment = apicontractsv1.paymentType()
payment.creditCard = credit_card
request.transactionRequest = build_transaction(
amount=amount,
payment=payment,
address=address,
order=order,
customer_data=customer_data,
settings=settings,
line_items=line_items,
)
request.transactionRequest.transactionType = (
apicontractsv1.transactionTypeEnum.authCaptureTransaction
)
return request, apicontrollers.createTransactionController
[docs]
def authorize_credit_card(
amount: Decimal,
credit_card: apicontractsv1.creditCardType,
address: apicontractsv1.customerAddressType,
order: apicontractsv1.orderType | None = None,
customer_data: apicontractsv1.customerDataType | None = None,
settings: apicontractsv1.ArrayOfSetting | None = None,
line_items: apicontractsv1.ArrayOfLineItem | None = None,
) -> tuple[ObjectifiedElement, type[APIOperationBase]]:
"""
`Authorizes a credit card <https://developer.authorize.net/api/reference/index.html#payment-transactions-authorize-a-credit-card>`_.
:param amount: Dollar amount to authorize.
:type amount: ~decimal.Decimal
:param credit_card: A credit card.
:type credit_card: ~authorizenet.apicontractsv1.creditCardType
:param address: A customer address.
:type address: ~authorizenet.apicontractsv1.customerAddressType
:param order: Additional order information. Default is :py:obj:`None`.
:type order: ~authorizenet.apicontractsv1.orderType | None
:param customer_data: Additional customer data. Default is :py:obj:`None`.
:type customer_data: ~authorizenet.apicontractsv1.customerDataType | None
:param settings: Transaction settings. Default is :py:obj:`None`.
:type settings: ~authorizenet.apicontractsv1.ArrayOfSetting | None
:param line_items: An array of line items. Default is :py:obj:`None`.
:type line_items: ~authorizenet.apicontractsv1.ArrayOfLineItem | None
:returns: A tuple containing an Authorizenet API request element and controller class.
:rtype: tuple[~lxml.objectify.ObjectifiedElement, type[~authorizenet.apicontrollersbase.APIOperationBase]]
"""
request = apicontractsv1.createTransactionRequest()
payment = apicontractsv1.paymentType()
payment.creditCard = credit_card
request.transactionRequest = build_transaction(
amount=amount,
payment=payment,
address=address,
order=order,
customer_data=customer_data,
settings=settings,
line_items=line_items,
)
request.transactionRequest.transactionType = (
apicontractsv1.transactionTypeEnum.authOnlyTransaction
)
return request, apicontrollers.createTransactionController
[docs]
def capture_authorized_amount(
amount: Decimal,
) -> tuple[ObjectifiedElement, type[APIOperationBase]]:
"""
`Captures a previously authorized amount <https://developer.authorize.net/api/reference/index.html#payment-transactions-capture-a-previously-authorized-amount>`_.
:param amount: Dollar amount to capture.
:type amount: ~decimal.Decimal
:returns: A tuple containing an Authorizenet API request element and controller class.
:rtype: tuple[~lxml.objectify.ObjectifiedElement, type[~authorizenet.apicontrollersbase.APIOperationBase]]
"""
request = apicontractsv1.createTransactionRequest()
request.transactionRequest = build_transaction(amount)
request.transactionRequest.transactionType = (
apicontractsv1.transactionTypeEnum.priorAuthCaptureTransaction
)
return request, apicontrollers.createTransactionController
[docs]
def refund_credit_card(
amount: Decimal, credit_card: apicontractsv1.creditCardType
) -> tuple[ObjectifiedElement, type[APIOperationBase]]:
"""
`Refunds a credit card <https://developer.authorize.net/api/reference/index.html#payment-transactions-refund-a-transaction>`_.
:param amount: Dollar amount to refund.
:type amount: ~decimal.Decimal
:param credit_card: Destination credit card.
:type credit_card: ~authorizenet.apicontractsv1.creditCardType
:returns: A tuple containing an Authorizenet API request element and controller class.
:rtype: tuple[~lxml.objectify.ObjectifiedElement, type[~authorizenet.apicontrollersbase.APIOperationBase]]
"""
request = apicontractsv1.createTransactionRequest()
payment = apicontractsv1.paymentType()
payment.creditCard = credit_card
request.transactionRequest = build_transaction(
amount=amount, payment=payment
)
request.transactionRequest.transactionType = (
apicontractsv1.transactionTypeEnum.refundTransaction
)
return request, apicontrollers.createTransactionController
def void_transaction(
reference_id: str,
) -> tuple[ObjectifiedElement, type[APIOperationBase]]:
"""
`Voids a transaction <https://developer.authorize.net/api/reference/index.html#payment-transactions-void-a-transaction>`_.
:param reference_id: Transaction reference id.
:type reference_id: str
:returns: A tuple containing an Authorizenet API request element and controller class.
:rtype: tuple[~lxml.objectify.ObjectifiedElement, type[~authorizenet.apicontrollersbase.APIOperationBase]]
"""
request = apicontractsv1.createTransactionRequest()
request.transactionRequest = apicontractsv1.transactionRequestType()
request.transactionRequest.refTransId = reference_id
request.transactionRequest.transactionType = (
apicontractsv1.transactionTypeEnum.voidTransaction
)
return request, apicontrollers.createTransactionController