Perform Refunds

Refunds allow your merchants to transfer the amount of a previous charge transaction back to the shopper.

Linked Refunds

Refunds are implemented as Linked Refunds, meaning you need to provide the transactionIdentifier of the previous charge transaction in order to perform the refund. For Linked Refunds it is not required for the shopper to present his card again and the refund will be paid out on the exact same card as used for the charge.

To perform a refund, you need to create new MPTransactionParameters with the transactionIdentifier of the previous charge transaction. For partial refunds, you need to specify the amount that should be refunded.

MPTransactionParameters *parameters =
[MPTransactionParameters refundForTransactionIdentifier:@"<transactionIdentifier>"
											  optionals:
 ^(id<MPTransactionParametersRefundOptionals>  _Nonnull optionals)
 {
	 optionals.subject = @"Refund for Bouquet of Flowers";
	 optionals.customIdentifier = @"yourReferenceForTheTransaction";

	 // For partial refunds, specify the amount to be refunded
	 // and the currency from the original transaction
	 // [optionals setAmount:[NSDecimalNumber decimalNumberWithString:@"1.00"] currency:MPCurrencyEUR];
 }];

Since this is a modification to an existing transaction, you now need to pass the parameters to [MPTransactionProvider amendTransactionWithParameters:].

As a result, you will receive one of the following:

  • The original transaction that now contains information about the refund in the transaction.refundDetails
  • An error indicating why refunding the charge failed

To check if a transaction can be refunded in general, have a look at transaction.refundDetails.status.

Standalone Refunds

There might be the rare occasion when the transactionIdentifier of the previous charge is not available, e.g. should your POS system not allow the merchant to retrieve the original invoice containing the transactionIdentifier.

In this scenario Standalone Refunds allow the merchant to perform a refund without reference to the previous charge transaction and the shopper needs to present his card again.

Standalone Refunds have a high risk profile, i.e. merchant money can be paid out without limitations. Only consider offering them after you are absolutly sure that Linked Refunds are not possible in your setup.

Should your merchants require Standalone Refunds, please talk to your account manager beforehand to ensure all prerequisites are met. Specifically you need to ensure that:

  • Each merchant provides you with a written confirmation that they understand that Standalone Refunds potentially allow to pay out merchant money without limitations and that only authorised store personal must be allowed to use them.
  • Your POS system protects usage of the Standalone Refund feature, i.e. your POS system make sures that only authorised store personal (like store owner or supervisor) can use it and that usage is protected by a password or PIN. Note that before allowing you to go LIVE with Standalone Refunds, we will verify this requirements as part of our Testing.

Once enabled, Standalone Refunds are run exactly like charge transactions, but using refundWithAmount instead of chargeWithAmount when building the MPTransactionParameters:

MPTransactionParameters *parameters =
[MPTransactionParameters refundWithAmount:[NSDecimalNumber decimalNumberWithString:@"1.00"]
								 currency:MPCurrencyGBP
								optionals:
 ^(id<MPTransactionParametersStandaloneRefundOptionals>  _Nonnull optionals)
 {
	 optionals.subject = @"Refund for Bouquet of Flowers";
	 optionals.customIdentifier = @"yourReferenceForTheTransaction";
 }];

Refunds allow your merchants to transfer the amount of a previous charge transaction back to the shopper.

Linked Refunds

Refunds are implemented as Linked Refunds, meaning you need to provide the transactionIdentifier of the previous charge transaction in order to perform the refund. For Linked Refunds it is not required for the shopper to present his card again and the refund will be paid out on the exact same card as used for the charge.

To perform a refund, you need to create new TransactionParameters with the transactionIdentifier of the previous charge transaction. For partial refunds, you need to specify the amount that should be refunded:

TransactionParameters parameters = new TransactionParameters.Builder()
        .refund("<transactionIdentifer>")
        // For partial refunds, specify the amount to be refunded
        // and the currency from the original transaction
        //.amountAndCurrency(new BigDecimal("1.00"), io.mpos.transactions.Currency.EUR)
        .build();

Since this is a modification to an existing transaction, you are now passing the parameters to TransactionProvider.amendTransaction().

As a result, you will receive one of the following:

  • The original transaction that now contains information about the refund in the transaction.refundDetails
  • An error indicating why refunding the charge failed

To check if a transaction can be refunded in general, have a look at transaction.refundDetails.status.

Standalone Refunds

There might be the rare occasion when the transactionIdentifier of the previous charge is not available, e.g. should your POS system not allow the merchant to retrieve the original invoice containing the transactionIdentifier.

In this scenario Standalone Refunds allow the merchant to perform a refund without reference to the previous charge transaction and the shopper needs to present his card again.

Standalone Refunds have a high risk profile, i.e. merchant money can be paid out without limitations. Only consider offering them after you are absolutly sure that Linked Refunds are not possible in your setup.

Should your merchants require Standalone Refunds, please talk to your account manager beforehand to ensure all prerequisites are met. Specifically you need to ensure that:

  • Each merchant provides you with a written confirmation that they understand that Standalone Refunds potentially allow to pay out merchant money without limitations and that only authorised store personal must be allowed to use them.
  • Your POS system protects usage of the Standalone Refund feature, i.e. your POS system make sures that only authorised store personal (like store owner or supervisor) can use it and that usage is protected by a password or PIN. Note that before allowing you to go LIVE with Standalone Refunds, we will verify this requirements as part of our Testing.

Once enabled, Standalone Refunds are run exactly like charge transactions, but using refund() instead of charge() when building the TransactionParameters:

TransactionParameters transactionParameters = new TransactionParameters.Builder()
                                                         .refund(new BigDecimal("5.00"), io.mpos.transactions.Currency.EUR)
                                                         .subject("Refund for Bouquet of Flowers")
                                                         .customIdentifier("yourReferenceForTheTransaction")
                                                         .build();
                                                         
                                                         
TransactionProcess paymentProcess = transactionProvider.startTransaction(...);
// ....

Can we help you?

If you cannot find your answer, contact us and we'll get in touch with you soon.

© Copyright 2017 Payworks GmbH. Legal.