Documentation

Refunds

Ecart Pay provides an efficient and seamless way to process refunds directly to the payment method initially used by the customer.

What Are Refunds?

A refund is the process of returning money to a customer for a specific transaction. Refunds may be initiated due to various reasons, such as customer dissatisfaction, duplicate payments, or suspected fraudulent activity. Ecart Pay ensures that refunds are processed securely and accurately, supporting both partial and total refunds.

Creating a Refund

This API allows you to initiate a refund for a completed order. The refund amount and the reason for the refund must be specified in the request.

Endpoint

POST {{baseURL}}/api/orders/{{order_id}}/refund

Headers

  • Authorization: {token}

Request Payload

  1. amount: Specify the amount to be refunded.
  2. reason: Provide the reason for the refund using one of the following predefined values:
    • requested: Customer requested a refund.
    • duplicate: Duplicate payment detected.
    • fraudulent: Payment identified as potentially fraudulent.

Example Request

curl --location 'https://sandbox.ecartpay.com/api/orders/60a43fe9ffd1ec212bab3902/refund' \
--header 'Authorization: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q' \
--header 'Content-Type: application/json' \
--header 'Cookie: lang=en' \
--data '{
    "amount": 403.33,
    "reason": "fraudulent"
}'
package main

import (
  "fmt"
  "strings"
  "net/http"
  "io"
)

func main() {

  url := "https://sandbox.ecartpay.com/api/orders/60a43fe9ffd1ec212bab3902/refund"
  method := "POST"

  payload := strings.NewReader(`{
    "amount": 403.33,
    "reason": "fraudulent"
}`)

  client := &http.Client {
  }
  req, err := http.NewRequest(method, url, payload)

  if err != nil {
    fmt.Println(err)
    return
  }
  req.Header.Add("Authorization", "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q")
  req.Header.Add("Content-Type", "application/json")
  req.Header.Add("Cookie", "lang=en")

  res, err := client.Do(req)
  if err != nil {
    fmt.Println(err)
    return
  }
  defer res.Body.Close()

  body, err := io.ReadAll(res.Body)
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(string(body))
}
POST /api/orders/60a43fe9ffd1ec212bab3902/refund HTTP/1.1
Host: sandbox.ecartpay.com
Authorization: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q
Content-Type: application/json
Cookie: lang=en
Content-Length: 52

{
    "amount": 403.33,
    "reason": "fraudulent"
}
// OkHttp

OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n    \"amount\": 403.33,\n    \"reason\": \"fraudulent\"\n}");
Request request = new Request.Builder()
  .url("https://sandbox.ecartpay.com/api/orders/60a43fe9ffd1ec212bab3902/refund")
  .method("POST", body)
  .addHeader("Authorization", "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q")
  .addHeader("Content-Type", "application/json")
  .addHeader("Cookie", "lang=en")
  .build();
Response response = client.newCall(request).execute();

// -------------------------------------------------------------

// Unirest

Unirest.setTimeouts(0, 0);
HttpResponse<String> response = Unirest.post("https://sandbox.ecartpay.com/api/orders/60a43fe9ffd1ec212bab3902/refund")
  .header("Authorization", "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q")
  .header("Content-Type", "application/json")
  .header("Cookie", "lang=en")
  .body("{\n    \"amount\": 403.33,\n    \"reason\": \"fraudulent\"\n}")
  .asString();
// Fetch

const myHeaders = new Headers();
myHeaders.append("Authorization", "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q");
myHeaders.append("Content-Type", "application/json");
myHeaders.append("Cookie", "lang=en");

const raw = JSON.stringify({
  "amount": 403.33,
  "reason": "fraudulent"
});

const requestOptions = {
  method: "POST",
  headers: myHeaders,
  body: raw,
  redirect: "follow"
};

fetch("https://sandbox.ecartpay.com/api/orders/60a43fe9ffd1ec212bab3902/refund", requestOptions)
  .then((response) => response.text())
  .then((result) => console.log(result))
  .catch((error) => console.error(error));

// -------------------------------------------------------------

// jQuery

var settings = {
  "url": "https://sandbox.ecartpay.com/api/orders/60a43fe9ffd1ec212bab3902/refund",
  "method": "POST",
  "timeout": 0,
  "headers": {
    "Authorization": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q",
    "Content-Type": "application/json",
    "Cookie": "lang=en"
  },
  "data": JSON.stringify({
    "amount": 403.33,
    "reason": "fraudulent"
  }),
};

$.ajax(settings).done(function (response) {
  console.log(response);
});

// -------------------------------------------------------------

// XHR

// WARNING: For POST requests, body is set to null by browsers.
var data = JSON.stringify({
  "amount": 403.33,
  "reason": "fraudulent"
});

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function() {
  if(this.readyState === 4) {
    console.log(this.responseText);
  }
});

xhr.open("POST", "https://sandbox.ecartpay.com/api/orders/60a43fe9ffd1ec212bab3902/refund");
xhr.setRequestHeader("Authorization", "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q");
xhr.setRequestHeader("Content-Type", "application/json");
// WARNING: Cookies will be stripped away by the browser before sending the request.
xhr.setRequestHeader("Cookie", "lang=en");

xhr.send(data);
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
  curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST");
  curl_easy_setopt(curl, CURLOPT_URL, "https://sandbox.ecartpay.com/api/orders/60a43fe9ffd1ec212bab3902/refund");
  curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
  curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https");
  struct curl_slist *headers = NULL;
  headers = curl_slist_append(headers, "Authorization: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q");
  headers = curl_slist_append(headers, "Content-Type: application/json");
  headers = curl_slist_append(headers, "Cookie: lang=en");
  curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
  const char *data = "{\n    \"amount\": 403.33,\n    \"reason\": \"fraudulent\"\n}";
  curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);
  res = curl_easy_perform(curl);
  curl_slist_free_all(headers);
}
curl_easy_cleanup(curl);
// Axios

const axios = require('axios');
let data = JSON.stringify({
  "amount": 403.33,
  "reason": "fraudulent"
});

let config = {
  method: 'post',
  maxBodyLength: Infinity,
  url: 'https://sandbox.ecartpay.com/api/orders/60a43fe9ffd1ec212bab3902/refund',
  headers: { 
    'Authorization': 'eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q', 
    'Content-Type': 'application/json', 
    'Cookie': 'lang=en'
  },
  data : data
};

axios.request(config)
.then((response) => {
  console.log(JSON.stringify(response.data));
})
.catch((error) => {
  console.log(error);
});

// -------------------------------------------------------------

// Native

var https = require('follow-redirects').https;
var fs = require('fs');

var options = {
  'method': 'POST',
  'hostname': 'sandbox.ecartpay.com',
  'path': '/api/orders/60a43fe9ffd1ec212bab3902/refund',
  'headers': {
    'Authorization': 'eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q',
    'Content-Type': 'application/json',
    'Cookie': 'lang=en'
  },
  'maxRedirects': 20
};

var req = https.request(options, function (res) {
  var chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function (chunk) {
    var body = Buffer.concat(chunks);
    console.log(body.toString());
  });

  res.on("error", function (error) {
    console.error(error);
  });
});

var postData = JSON.stringify({
  "amount": 403.33,
  "reason": "fraudulent"
});

req.write(postData);

req.end();

// -------------------------------------------------------------

// Request

var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://sandbox.ecartpay.com/api/orders/60a43fe9ffd1ec212bab3902/refund',
  'headers': {
    'Authorization': 'eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q',
    'Content-Type': 'application/json',
    'Cookie': 'lang=en'
  },
  body: JSON.stringify({
    "amount": 403.33,
    "reason": "fraudulent"
  })

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});

// -------------------------------------------------------------

// Unirest

var unirest = require('unirest');
var req = unirest('POST', 'https://sandbox.ecartpay.com/api/orders/60a43fe9ffd1ec212bab3902/refund')
  .headers({
    'Authorization': 'eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q',
    'Content-Type': 'application/json',
    'Cookie': 'lang=en'
  })
  .send(JSON.stringify({
    "amount": 403.33,
    "reason": "fraudulent"
  }))
  .end(function (res) { 
    if (res.error) throw new Error(res.error); 
    console.log(res.raw_body);
  });
#import <Foundation/Foundation.h>

dispatch_semaphore_t sema = dispatch_semaphore_create(0);

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://sandbox.ecartpay.com/api/orders/60a43fe9ffd1ec212bab3902/refund"]
  cachePolicy:NSURLRequestUseProtocolCachePolicy
  timeoutInterval:10.0];
NSDictionary *headers = @{
  @"Authorization": @"eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q",
  @"Content-Type": @"application/json",
  @"Cookie": @"lang=en"
};

[request setAllHTTPHeaderFields:headers];
NSData *postData = [[NSData alloc] initWithData:[@"{\n    \"amount\": 403.33,\n    \"reason\": \"fraudulent\"\n}" dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:postData];

[request setHTTPMethod:@"POST"];

NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
  if (error) {
    NSLog(@"%@", error);
    dispatch_semaphore_signal(sema);
  } else {
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
    NSError *parseError = nil;
    NSDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError];
    NSLog(@"%@",responseDictionary);
    dispatch_semaphore_signal(sema);
  }
}];
[dataTask resume];
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
open Lwt
open Cohttp
open Cohttp_lwt_unix

let postData = ref "{\n    \"amount\": 403.33,\n    \"reason\": \"fraudulent\"\n}";;

let reqBody = 
  let uri = Uri.of_string "https://sandbox.ecartpay.com/api/orders/60a43fe9ffd1ec212bab3902/refund" in
  let headers = Header.init ()
    |> fun h -> Header.add h "Authorization" "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q"
    |> fun h -> Header.add h "Content-Type" "application/json"
    |> fun h -> Header.add h "Cookie" "lang=en"
  in
  let body = Cohttp_lwt.Body.of_string !postData in

  Client.call ~headers ~body `POST uri >>= fun (_resp, body) ->
  body |> Cohttp_lwt.Body.to_string >|= fun body -> body

let () =
  let respBody = Lwt_main.run reqBody in
  print_endline (respBody)
// cURL

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://sandbox.ecartpay.com/api/orders/60a43fe9ffd1ec212bab3902/refund',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS =>'{
    "amount": 403.33,
    "reason": "fraudulent"
}',
  CURLOPT_HTTPHEADER => array(
    'Authorization: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q',
    'Content-Type: application/json',
    'Cookie: lang=en'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

// -------------------------------------------------------------

// Guzzle

<?php
$client = new Client();
$headers = [
  'Authorization' => 'eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q',
  'Content-Type' => 'application/json',
  'Cookie' => 'lang=en'
];
$body = '{
  "amount": 403.33,
  "reason": "fraudulent"
}';
$request = new Request('POST', 'https://sandbox.ecartpay.com/api/orders/60a43fe9ffd1ec212bab3902/refund', $headers, $body);
$res = $client->sendAsync($request)->wait();
echo $res->getBody();

// -------------------------------------------------------------

// HTTP_Request2

<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('https://sandbox.ecartpay.com/api/orders/60a43fe9ffd1ec212bab3902/refund');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Authorization' => 'eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q',
  'Content-Type' => 'application/json',
  'Cookie' => 'lang=en'
));
$request->setBody('{\n    "amount": 403.33,\n    "reason": "fraudulent"\n}');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}

// -------------------------------------------------------------

// pecl_http

<?php
$client = new http\Client;
$request = new http\Client\Request;
$request->setRequestUrl('https://sandbox.ecartpay.com/api/orders/60a43fe9ffd1ec212bab3902/refund');
$request->setRequestMethod('POST');
$body = new http\Message\Body;
$body->append('{
    "amount": 403.33,
    "reason": "fraudulent"
}');
$request->setBody($body);
$request->setOptions(array());
$request->setHeaders(array(
  'Authorization' => 'eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q',
  'Content-Type' => 'application/json',
  'Cookie' => 'lang=en'
));
$client->enqueue($request)->send();
$response = $client->getResponse();
echo $response->getBody();
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Authorization", "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q")
$headers.Add("Content-Type", "application/json")
$headers.Add("Cookie", "lang=en")

$body = @"
{
    `"amount`": 403.33,
    `"reason`": `"fraudulent`"
}
"@

$response = Invoke-RestMethod 'https://sandbox.ecartpay.com/api/orders/60a43fe9ffd1ec212bab3902/refund' -Method 'POST' -Headers $headers -Body $body
$response | ConvertTo-Json
# http.client

import http.client
import json

conn = http.client.HTTPSConnection("sandbox.ecartpay.com")
payload = json.dumps({
  "amount": 403.33,
  "reason": "fraudulent"
})
headers = {
  'Authorization': 'eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q',
  'Content-Type': 'application/json',
  'Cookie': 'lang=en'
}
conn.request("POST", "/api/orders/60a43fe9ffd1ec212bab3902/refund", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))

// -------------------------------------------------------------

# Requests

import requests
import json

url = "https://sandbox.ecartpay.com/api/orders/60a43fe9ffd1ec212bab3902/refund"

payload = json.dumps({
  "amount": 403.33,
  "reason": "fraudulent"
})
headers = {
  'Authorization': 'eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q',
  'Content-Type': 'application/json',
  'Cookie': 'lang=en'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
# httr

library(httr)

headers = c(
  'Authorization' = 'eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q',
  'Content-Type' = 'application/json',
  'Cookie' = 'lang=en'
)

body = '{
  "amount": 403.33,
  "reason": "fraudulent"
}';

res <- VERB("POST", url = "https://sandbox.ecartpay.com/api/orders/60a43fe9ffd1ec212bab3902/refund", body = body, add_headers(headers))

cat(content(res, 'text'))

// -------------------------------------------------------------

# RCurl

library(RCurl)
headers = c(
  "Authorization" = "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q",
  "Content-Type" = "application/json",
  "Cookie" = "lang=en"
)
params = "{
  \"amount\": 403.33,
  \"reason\": \"fraudulent\"
}"
res <- postForm("https://sandbox.ecartpay.com/api/orders/60a43fe9ffd1ec212bab3902/refund", .opts=list(postfields = params, httpheader = headers, followlocation = TRUE), style = "httppost")
cat(res)
require "uri"
require "json"
require "net/http"

url = URI("https://sandbox.ecartpay.com/api/orders/60a43fe9ffd1ec212bab3902/refund")

https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q"
request["Content-Type"] = "application/json"
request["Cookie"] = "lang=en"
request.body = JSON.dump({
  "amount": 403.33,
  "reason": "fraudulent"
})

response = https.request(request)
puts response.read_body
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = reqwest::Client::builder()
        .build()?;

    let mut headers = reqwest::header::HeaderMap::new();
    headers.insert("Authorization", "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q".parse()?);
    headers.insert("Content-Type", "application/json".parse()?);
    headers.insert("Cookie", "lang=en".parse()?);

    let data = r#"{
    "amount": 403.33,
    "reason": "fraudulent"
}"#;

    let json: serde_json::Value = serde_json::from_str(&data)?;

    let request = client.request(reqwest::Method::POST, "https://sandbox.ecartpay.com/api/orders/60a43fe9ffd1ec212bab3902/refund")
        .headers(headers)
        .json(&json);

    let response = request.send().await?;
    let body = response.text().await?;

    println!("{}", body);

    Ok(())
}
# Httpie

printf '{
    "amount": 403.33,
    "reason": "fraudulent"
}'| http  --follow --timeout 3600 POST 'https://sandbox.ecartpay.com/api/orders/60a43fe9ffd1ec212bab3902/refund' \
 Authorization:'eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q' \
 Content-Type:'application/json' \
 Cookie:'lang=en'

// -------------------------------------------------------------

# wget

wget --no-check-certificate --quiet \
  --method POST \
  --timeout=0 \
  --header 'Authorization: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q' \
  --header 'Content-Type: application/json' \
  --header 'Cookie: lang=en' \
  --body-data '{
    "amount": 403.33,
    "reason": "fraudulent"
}' \
   'https://sandbox.ecartpay.com/api/orders/60a43fe9ffd1ec212bab3902/refund'
let parameters = "{\n    \"amount\": 403.33,\n    \"reason\": \"fraudulent\"\n}"
let postData = parameters.data(using: .utf8)

var request = URLRequest(url: URL(string: "https://sandbox.ecartpay.com/api/orders/60a43fe9ffd1ec212bab3902/refund")!,timeoutInterval: Double.infinity)
request.addValue("eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY3MmE4NTAzNzFiZTBlY2Y1NTRkMDUxNiIsImFjY291bnRfaWQiOiI2NzJhODUwMzcxYmUwZWNmNTU0ZDA1MGMiLCJpYXQiOjE3MzgwODE0NjAsImV4cCI6MTczODA4NTA2MH0.nbg0d9HM3OMYplMvk_qwYU07V2rnpmBaum4zqWdfzrzjpSbqtzk2DT9w33t2j52o3PFaND9JsRKzz2gtEDBI7Q", forHTTPHeaderField: "Authorization")
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("lang=en", forHTTPHeaderField: "Cookie")

request.httpMethod = "POST"
request.httpBody = postData

let task = URLSession.shared.dataTask(with: request) { data, response, error in 
  guard let data = data else {
    print(String(describing: error))
    return
  }
  print(String(data: data, encoding: .utf8)!)
}

task.resume()

Example Response

{
    "id": "625c9ac88541531b525069e6",
    "account_id": "5d2d436e3199ae000449065b",
    "authorization_id": "6189be80df291598221a5e95",
    "number": "OR56742841",
    "status": "refunded",
    "email": "[email protected]",
    "first_name": "Moises",
    "last_name": "Garcia",
    "phone": "9341000062",
    "currency": "MXN",
    "shipping_address": {
        "first_name": "Moises",
        "last_name": "Garcia",
        "address1": "Beliario Dominguez",
        "address2": "Semillero",
        "country": {
            "code": "MX",
            "name": "Mexico"
        },
        "state": {
            "code": "TB"
        },
        "city": "Monterrey",
        "postal_code": "64000",
        "phone": "9341024062"
    },
    "items": [
        {
            "name": "Brazalete religioso plateado BR3017",
            "quantity": 1,
            "price": 243.33,
            "discount": 0,
            "total": 243.33,
            "tax": 0
        }
    ],
    "shipping_items": [
        {
            "name": "Express Shipping",
            "amount": 160,
            "carrier": "OWN"
        }
    ],
    "discounts": [],
    "totals": {
        "subtotal": 243.33,
        "total": 403.33,
        "tax": 0,
        "discount": 0,
        "shipping": 160
    },
    "risk_score": 0,
    "risk_notes": [],
    "fee": 20.97,
    "confirmed": false,
    "notify_url": "https://example.com/customer/290",
    "redirect_url": "https://example.com/order/10",
    "created_at": "2022-04-17T22:55:04.838Z",
    "updated_at": "2022-04-17T22:56:03.666Z",
    "custom_keys": false,
    "gateway_method_id": "5ee3cfb4717ce5733fba1ffe",
    "keys_id": "614cfa2265305a39ea242707",
    "payments": {
        "gateway": "conekta",
        "payment_order_id": "ord_2rfABLyeUTLuuRWjW",
        "paid_at": "2022-04-17T22:55:20.000Z",
        "data": [
            {
                "id": "625c9ad70211a6085c17e2fa",
                "livemode": false,
                "created_at": 1650236119,
                "currency": "MXN",
                "device_fingerprint": "hwvbkj1guqvmg42b8dv8w84xfsp5tlqf",
                "payment_method": {
                    "name": "Marcelo Gomez",
                    "exp_month": "12",
                    "exp_year": "23",
                    "auth_code": "116211",
                    "object": "card_payment",
                    "type": "credit",
                    "last4": "4242",
                    "brand": "visa",
                    "issuer": "banamex",
                    "account_type": "BANAMEX",
                    "country": "MX",
                    "fraud_indicators": []
                },
                "object": "charge",
                "description": "Payment from order",
                "status": "paid",
                "amount": 40333,
                "paid_at": 1650236120,
                "fee": 1647,
                "customer_id": "",
                "order_id": "ord_2rfABLyeUTLuuRWjW"
            }
        ]
    },
    "risk": "lower",
    "refund_id": "625c9b028541531b52506a87"
}
{
    "id": "625c9a5c8541531b525068fd",
    "account_id": "5d2d436e3199ae000449065b",
    "authorization_id": "6189be80df291598221a5e95",
    "number": "OR36880231",
    "status": "partially_refunded",
    "email": "[email protected]",
    "first_name": "Moises",
    "last_name": "Garcia",
    "phone": "9341000062",
    "currency": "MXN",
    "shipping_address": {
        "first_name": "Moises",
        "last_name": "Garcia",
        "address1": "Beliario Dominguez",
        "address2": "Semillero",
        "country": {
            "code": "MX",
            "name": "Mexico"
        },
        "state": {
            "code": "TB"
        },
        "city": "Monterrey",
        "postal_code": "64000",
        "phone": "9341024062"
    },
    "items": [
        {
            "name": "Brazalete religioso plateado BR3017",
            "quantity": 1,
            "price": 243.33,
            "discount": 0,
            "total": 243.33,
            "tax": 0
        }
    ],
    "shipping_items": [
        {
            "name": "Express Shipping",
            "amount": 160,
            "carrier": "OWN"
        }
    ],
    "discounts": [],
    "totals": {
        "subtotal": 243.33,
        "total": 403.33,
        "tax": 0,
        "discount": 0,
        "shipping": 160
    },
    "risk_score": 0,
    "risk_notes": [],
    "fee": 20.97,
    "confirmed": false,
    "notify_url": "https://example.com/customer/290",
    "redirect_url": "https://example.com/order/10",
    "created_at": "2022-04-17T22:53:16.613Z",
    "updated_at": "2022-04-17T22:54:34.329Z",
    "billing_address": {
        "first_name": "Moises",
        "last_name": "Garcia",
        "address1": "Beliario Dominguez",
        "address2": "Semillero",
        "country": {
            "code": "MX",
            "name": "Mexico"
        },
        "state": {
            "code": "TB",
            "name": "NULL"
        },
        "city": "Monterrey",
        "postal_code": "64000",
        "phone": "9341024062"
    },
    "custom_keys": false,
    "gateway_method_id": "5ee3cfb4717ce5733fba1ffe",
    "keys_id": "614cfa2265305a39ea242707",
    "payments": {
        "gateway": "conekta",
        "payment_order_id": "ord_2rfAA8piCw6mVycrN",
        "paid_at": "2022-04-17T22:53:44.000Z",
        "data": [
            {
                "id": "625c9a77fb7dfd40df944460",
                "livemode": false,
                "created_at": 1650236023,
                "currency": "MXN",
                "device_fingerprint": "hwvbkj1guqvmg42b8dv8w84xfsp5tlqf",
                "payment_method": {
                    "name": "Marcelo Gomez",
                    "exp_month": "12",
                    "exp_year": "23",
                    "auth_code": "216418",
                    "object": "card_payment",
                    "type": "credit",
                    "last4": "4242",
                    "brand": "visa",
                    "issuer": "banamex",
                    "account_type": "BANAMEX",
                    "country": "MX",
                    "fraud_indicators": []
                },
                "object": "charge",
                "description": "Payment from order",
                "status": "paid",
                "amount": 40333,
                "paid_at": 1650236024,
                "fee": 1647,
                "customer_id": "",
                "order_id": "ord_2rfAA8piCw6mVycrN"
            }
        ]
    },
    "risk": "lower",
    "refund_id": "625c9aa98541531b5250699d"
}

Important Notes

  • Not all payment methods support refunds. For instance, cash payments and very old payments are not eligible for refunds.
  • The refund amount determines whether it is classified as a partial or total refund. Ecart Pay automatically handles the classification based on the amount provided.
  • Refunds are deducted from the merchant's account balance and processed securely.
🤝

BENEFITS

Handling refunds in Ecart Pay provides security, efficiency and versatility at all times, offering every merchant the opportunity to provide a better customer experience by ensuring secure and accurate payment reversals.