The code below
Everything works great, except the refund step, which errors with
Error Code: 54
Error message: The referenced transaction does not meet the criteria for issuing a credit.
Any idea what's wrong?
from authorizenet import apicontractsv1
from authorizenet.constants import constants
from authorizenet.apicontrollers import *
from decimal import *
import random
# create customer profile
merchantAuth = apicontractsv1.merchantAuthenticationType()
merchantAuth.name = <name>
merchantAuth.transactionKey = <key>
createCustomerProfile = apicontractsv1.createCustomerProfileRequest()
createCustomerProfile.merchantAuthentication = merchantAuth
createCustomerProfile.profile = apicontractsv1.customerProfileType('jdoe' + str(random.randint(0, 10000)), 'John2 Doe', 'jdoe@mail.com')
controller = createCustomerProfileController(createCustomerProfile)
controller.execute()
response = controller.getresponse()
if (response.messages.resultCode=="Ok"):
print("Successfully created a customer profile with id: %s" % response.customerProfileId)
customerProfileId = response.customerProfileId
creditCard = apicontractsv1.creditCardType()
creditCard.cardNumber = "4111111111111111"
creditCard.expirationDate = "2020-12"
payment = apicontractsv1.paymentType()
payment.creditCard = creditCard
billTo = apicontractsv1.customerAddressType()
billTo.firstName = "John"
billTo.lastName = "Snow"
profile = apicontractsv1.customerPaymentProfileType()
profile.payment = payment
profile.billTo = billTo
createCustomerPaymentProfile = apicontractsv1.createCustomerPaymentProfileRequest()
createCustomerPaymentProfile.merchantAuthentication = merchantAuth
createCustomerPaymentProfile.paymentProfile = profile
print("customerProfileId in create_customer_payment_profile. customerProfileId = %s" %customerProfileId)
createCustomerPaymentProfile.customerProfileId = str(customerProfileId)
controller = createCustomerPaymentProfileController(createCustomerPaymentProfile)
controller.execute()
response = controller.getresponse()
if (response.messages.resultCode=="Ok"):
print("Successfully created a customer payment profile with id: %s" % response.customerPaymentProfileId)
customerPaymentProfileId = response.customerPaymentProfileId
profileToCharge = apicontractsv1.customerProfilePaymentType()
profileToCharge.customerProfileId = str(customerProfileId)
profileToCharge.paymentProfile = apicontractsv1.paymentProfile()
profileToCharge.paymentProfile.paymentProfileId = str(customerPaymentProfileId)
transactionrequest = apicontractsv1.transactionRequestType()
transactionrequest.transactionType = "authCaptureTransaction"
transactionrequest.amount = Decimal ('35.00')
transactionrequest.profile = profileToCharge
createtransactionrequest = apicontractsv1.createTransactionRequest()
createtransactionrequest.merchantAuthentication = merchantAuth
createtransactionrequest.refId = "MerchantID-0001"
createtransactionrequest.transactionRequest = transactionrequest
createtransactioncontroller = createTransactionController(createtransactionrequest)
createtransactioncontroller.execute()
response = createtransactioncontroller.getresponse()
if response is not None:
if response.messages.resultCode == "Ok":
if hasattr(response.transactionResponse, 'messages') == True:
print ('Successfully created transaction with Transaction ID: %s' % response.transactionResponse.transId);
print ('Transaction Response Code: %s' % response.transactionResponse.responseCode);
print ('Message Code: %s' % response.transactionResponse.messages.message[0].code);
print ('Description: %s' % response.transactionResponse.messages.message[0].description);
transId = response.transactionResponse.transId
creditCard = apicontractsv1.creditCardType()
creditCard.cardNumber = "1111"
creditCard.expirationDate = "XXXX"
payment = apicontractsv1.paymentType()
payment.creditCard = creditCard
transactionrequest = apicontractsv1.transactionRequestType()
transactionrequest.transactionType = "refundTransaction"
transactionrequest.amount = Decimal ('15.00')
transactionrequest.refTransId = str(transId)
transactionrequest.payment = payment
createtransactionrequest = apicontractsv1.createTransactionRequest()
createtransactionrequest.merchantAuthentication = merchantAuth
createtransactionrequest.refId = "MerchantID-0001"
createtransactionrequest.transactionRequest = transactionrequest
createtransactioncontroller = createTransactionController(createtransactionrequest)
createtransactioncontroller.execute()
response = createtransactioncontroller.getresponse()
if response is not None:
if response.messages.resultCode == "Ok":
if hasattr(response.transactionResponse, 'messages') == True:
print ('Successfully created transaction with Transaction ID: %s' % response.transactionResponse.transId);
print ('Transaction Response Code: %s' % response.transactionResponse.responseCode);
print ('Message Code: %s' % response.transactionResponse.messages.message[0].code);
print ('Description: %s' % response.transactionResponse.messages.message[0].description);
else:
print ('Failed Transaction.');
if hasattr(response.transactionResponse, 'errors') == True:
print ('Error Code: %s' % str(response.transactionResponse.errors.error[0].errorCode));
print ('Error message: %s' % response.transactionResponse.errors.error[0].errorText);
else:
print ('Failed Transaction 2.');
if hasattr(response, 'transactionResponse') == True and hasattr(response.transactionResponse, 'errors') == True:
print ('Error Code: %s' % str(response.transactionResponse.errors.error[0].errorCode));
print ('Error message: %s' % response.transactionResponse.errors.error[0].errorText);
else:
print ('Error Code 2: %s' % response.messages.message[0]['code'].text);
print ('Error message 2: %s' % response.messages.message[0]['text'].text);
else:
print ('Null Response.');
else:
print ('Failed Transaction.');
if hasattr(response.transactionResponse, 'errors') == True:
print ('Error Code: %s' % str(response.transactionResponse.errors.error[0].errorCode));
print ('Error message: %s' % response.transactionResponse.errors.error[0].errorText);
else:
print ('Failed Transaction 2.');
if hasattr(response, 'transactionResponse') == True and hasattr(response.transactionResponse, 'errors') == True:
print ('Error Code: %s' % str(response.transactionResponse.errors.error[0].errorCode));
print ('Error message: %s' % response.transactionResponse.errors.error[0].errorText);
else:
print ('Error Code: %s' % response.messages.message[0]['code'].text);
print ('Error message: %s' % response.messages.message[0]['text'].text);
else:
print ('Null Response.');
else:
print("Failed to create customer payment profile %s" % response.messages.message[0]['text'].text)
else:
print("Failed to create customer payment profile %s" % response.messages.message[0]['text'].text)
02-17-2017 02:46 PM
Hello @superseed
Based on your description, you're attempting a refund before it settles which is not permitted. Instead, you must Void an unsettled transaction which cancels the entire request.
You can get more details in our response code lookup too:
https://developer.authorize.net/api/reference/responseCodes.html?code=54
Richard
02-17-2017 03:02 PM
Is this a timing issue, in that I need to wait until the transaction settles?
If so, how long does that typically take?
Thank you,
Josh
02-17-2017 03:08 PM
I should have included that in my response. In both the sandbox and production, transactions settle once a day after the transaction cut-off time specified in the merchant interface.
And, there isn't a way to speed that up in the sandbox.
Richard
02-17-2017 03:11 PM