See also the Transaction response object.

You can refund transactions that have a status of settled or settling. If the transaction has not yet begun settlement, use Transaction.void() instead. If you do not specify an amount to refund, the entire transaction amount will be refunded.

Java
Result<Transaction> result = gateway.transaction().refund("the_transaction_id");

If the transaction can't be found, it will throw a NotFoundException.

If the refund fails, then the result will be unsuccessful and will include either validation errors indicating which parameters were invalid, or a processor settlement response code indicating the type of settlement failure.

Java
result.isSuccess();
// false

for (ValidationError error : result.getErrors().getAllDeepValidationErrors()) {
  System.out.println(error.getMessage());
}
Arguments
transactionId required, string

The unique transaction identifier.

Additional Parameters
.amount(…) BigDecimal

The amount to refund. This value must be greater than 0, and can't exceed the total amount of the transaction. If you do not specify an amount to refund, the entire transaction amount will be refunded. See partial refunds below for more details.

.lineItem(…)

The line items for this transaction. It can include up to 249 line items. Only available for Custom Actions transactions.

.commodityCode(…) string

Code used to classify items purchased and track the total amount spent across various categories of products and services. Different corporate purchasing organizations may use different standards, but the United Nations Standard Products and Services Code (UNSPSC) is frequently used. Maximum 12 characters. This Braintree line-item field is not used by PayPal.

.description(…) string

Item description. Maximum 127 characters.

.discountAmount(…) BigDecimal

Discount amount for the line item. Can include up to 2 decimal places. This value can't be negative. This Braintree line-item field is not used by PayPal.

.itemType(…) string

Optional type of the item, e.g. physical, digital, etc.

.kind(…) required, string

Indicates whether the line item is a debit (sale) or credit (refund) to the customer. Accepted values:

  • "debit"
  • "credit"
.name(…) required, string

Item name. Maximum 35 characters.

.productCode(…) string

Product or UPC code for the item. Maximum 12 characters.

.quantity(…) required, BigDecimal

Number of units of the item purchased. Can include up to 4 decimal places. This value can't be negative or zero.

.taxAmount(…) BigDecimal

Tax amount for the line item. Can include up to 2 decimal places. This value can't be negative.

.totalAmount(…) required, BigDecimal

Quantity x unit amount. Can include up to 2 decimal places.

.unitAmount(…) required, BigDecimal

Per-unit price of the item. Maximum 4 decimal places. This value can't be negative or zero.

.unitOfMeasure(…) string

The unit of measure or the unit of measure code. Maximum 12 characters. This Braintree line-item field is not used by PayPal.

.unitTaxAmount(…) BigDecimal

Per-unit tax price of the item. Can include up to 2 decimal places. This value can't be negative or zero.

.url(…) string

The URL to product information.

.orderId(…) string

Use this parameter if you would like to pass an getOrderId() different than that of the original transaction. Otherwise, the original transaction's orderId() value will be copied over to the refund. On PayPal transactions, this field maps to the PayPal invoice number. PayPal invoice numbers must be unique in your PayPal business account. Maximum 255 characters or 127 for PayPal transactions.

Requirements

  • Transaction status must be settled or settling.
  • Refund amount can't be greater than remaining non-refunded amount of the original transaction.
  • Transaction can't be refunded again after being completely refunded.
  • Transactions held in escrow can only be refunded in full. Attempts to partially refund an escrow transaction will throw a validation error.

Examples

Partial refunds

If you only want to refund a portion of the transaction, specify the amount to refund:

Java
Result<Transaction> result = gateway.transaction().refund(
  "a_transaction_id",
  new BigDecimal("50.00")
);

result.isSuccess();
// true
Transaction refund = result.getTarget();
refund.getType();
// Transaction.Type.CREDIT
refund.getAmount();
// 50.00

Result<Transaction> result = gateway.transaction().refund(
  "a_transaction_id",
  new BigDecimal("10.00")
);

result.isSuccess();
// true
Transaction refund = result.getTarget();
refund.getType();
// Transaction.Type.CREDIT
refund.getAmount();
// 10.00

We support single and multiple partial refunds on a given transaction. You can continue to refund a transaction as many times as you like, as long as the sum of the refund amounts is less than the amount of the initial transaction.

If you have already partially refunded a transaction and you perform another refund without specifying the balance, we will refund the remaining non-refunded amount of the transaction.

note

It's best practice to allow each partial refund call to complete successfully before creating any more for the same transaction. If a single transaction has too many simultaneous refund requests, some are likely to fail, returning an error from the gateway.

Refund processor declines

If using the most current SDK, and the processor declines the refund, the response will have the processorResponseCode available. See the transaction statuses page for additional information on the Processor Declined response. If using an older SDK version, and the processor declines the refund, you may receive a validation error in lieu of a processor response code.

Java
Transaction transaction = result.getTransaction();

transaction.getStatus();
// Transaction.Status.PROCESSOR_DECLINED

transaction.getProcessorResponseCode();
// e.g. "2005"

transaction.getProcessorResponseText();
// e.g. "Invalid Credit Card Number"
note

Real time decline responses are now available for testing in sandbox. We recommend testing in sandbox to ensure your integration supports the changes outlined above. This functionality will be released in production in Spring 2020.

Settlement failures

If the processor declines the capture for the refund transaction, the transaction object will have the processorSettlementResponseCode available. See the transaction statuses page for additional information on the Settlement Declined response.

Java
Transaction transaction = result.getTransaction();

transaction.getStatus();
// Transaction.Status.SETTLEMENT_DECLINED

transaction.getProcessorSettlementResponseCode();
// e.g. "4001"

transaction.getProcessorSettlementResponseText();
// e.g. "Settlement Declined"

Issuing a credit

important

Credit transactions are disabled by default. If an attacker gets your API keys, they could transfer money out of your merchant account and put it on any credit card. If you need credit transactions to be enabled, contact us.

You can use credit transactions to give a customer money. However, you should refund to an existing payment method whenever possible.

The only required parameters to create a credit transaction are the amount and the payment method token.

Java
TransactionRequest request = new TransactionRequest()
  .amount(new BigDecimal("100.00"))
  .paymentMethodToken("aToken")
  .done();

Result<Transaction> result = gateway.transaction().credit(request);