Menu

Telephone Orders

This guide explains how to make a telephone order, also known as “Virtual Terminal” or “MOTO Orders” (Mail Order Telephone Order).


For information about which payment types you can combine with a telephone payment, please checkhere.

There are two ways of making a telephone payment:

  1. Via the Worldpay website
  2. Via your own website

Coming soon

Taking telephone orders via the Worldpay website (one-off, card-on-file, and recurring)

On ourOrderspage, click the button "Create telephone order".

Note: For live orders, this button is only visible if you have first enabled telephone orders on theOrders Settingspage, it will take 24 hours for this to be successfully activated. Any telephone orders made during this initial 24 hour period will not be successful.

It is also possible to remember your customer's card details so you do not have to re-type them the next time you create a telephone order. To do so, follow these steps:

  • Create your first telephone order in the normal way
  • On the 'Order Created' popup, you will see the 'Token' identifier. Copy this value and store it safely in your own customer records
  • The next time your customer wants to make a telephone order, retrieve the token value from your own customer records
  • When creating a new telephone order, tick the box beside 'Retrieve stored card details'
  • Copy the token into the form and click 'Get Token'
  • Alternatively, access the first order's details, and select "Create new order" in the bottom right section
  • The form will be pre-filled with your customer details. You will still need to complete additional fields such as amount, description, and CVC

Taking telephone orders via your own systems

When using your own systems for telephone orders, youtake card detailsin the same way as for regular orders. The process tomake a paymentonly differs in one respect: you must set "orderType":"MOTO".

The code example below shows you how to do this:

Copied!
curl https://api.worldpay.com/v1/orders 
-H "Authorization: your-test-service-key" 
-H "Content-type: application/json" 
-X POST 
-d '{ 
    "token": "your-order-token", 
    "orderType": "MOTO", 
    "orderDescription": "your-order-description", 
    "amount": 500, 
    "currencyCode": "GBP",
    "authorizeOnly":false
    }' 

The response to this call will include the following JSON object:

{ 
    "orderCode": "worldpay-generated-order-code", 
    "token": "your-order-token", 
    "orderDescription": "your-order-description", 
    "amount": 500, 
    "currencyCode": "GBP", 
    "paymentStatus": "SUCCESS", 
    "paymentResponse":
    { 
        "type": "ObfuscatedCard", 
        "name": "name-of-shopper", 
        "expiryMonth": "7", 
        "expiryYear": "2018",
        "cardType": "VISA", 
        "maskedCardNumber": "**** **** **** 1111" }, 
        "environment": "TEST" 
}
$worldpay = new Worldpay('your-test-service-key');

try {
    $response = $worldpay->createOrder(array(
        'token' => 'your-order-token',
        'amount-in-cents' => 500,
        'currencyCode' => 'GBP',
        'name' => 'test name',
        'orderType' => 'MOTO',
        'orderDescription' => 'your-order-description',
        'customerOrderCode' => 'your-order-code',
        'authorizeOnly' => false
    ));
    if ($response['paymentStatus'] === 'SUCCESS') {
        $worldpayOrderCode = $response['id'];
    } else {
        throw new WorldpayException(print_r($response, true));
    }
} catch (WorldpayException $e) {
    echo 'Error code: ' .$e->getCustomCode() .'

    HTTP status code:' . $e->getHttpStatusCode() . '

    Error description: ' . $e->getDescription()  . ' 

    Error message: ' . $e->getMessage();
} catch (Exception $e) {
    echo 'Error message: '. $e->getMessage();
}
worldpay = Worldpay.new('your-test-service-key')

begin

    response = worldpay.createOrder({
        'token' => 'your-order-token',
        'amount' => 500,
        'currencyCode' => 'GBP',
        'name' => 'test name',
        'orderType' => 'MOTO',
        'orderDescription' => 'Order description',
        'customerOrderCode' => 'Order code',
        'authorizeOnly' => false
    })

    if (response['body']['paymentStatus'] === 'SUCCESS')
        @_worldpayOrderCode = response['body']['orderCode']
    else
        raise response.to_s
    end
rescue Exception => e
    print e.to_s
end
WorldpayRestClient restClient = new WorldpayRestClient("https://api.worldpay.com/v1", "your-test-service-key");

var orderRequest = new OrderRequest()
{
    token = "your-order-token",
    amount = 500,
    currencyCode = CurrencyCode.GBP,
    name = "test name",
    orderDescription = "Order description",
    orderType = "MOTO",
    customerOrderCode = "Order code",
    authorizeOnly = false
};

var address = new Address()
{
    address1 = "123 House Road",
    address2 = "A village",
    city = "London",
    countryCode = CountryCode.GB,
    postalCode = "EC1 1AA"
};

orderRequest.billingAddress = address;

try {
    OrderResponse orderResponse = restClient.GetOrderService().Create(orderRequest);
    Console.WriteLine("Order code: " + orderResponse.orderCode);
} catch (WorldpayException e) {
    Console.WriteLine("Error code:" + e.apiError.customCode);
    Console.WriteLine("Error description: " + e.apiError.description);
    Console.WriteLine("Error message: " + e.apiError.message);
}
WorldpayRestClient restClient = new WorldpayRestClient("your-test-service-key");

OrderRequest orderRequest = new OrderRequest();
orderRequest.setToken("your-order-token");
orderRequest.setAmount(500);
orderRequest.setCurrencyCode(CurrencyCode.GBP);
orderRequest.setName("test name");
orderRequest.setOrderDescription("Order description");
orderRequest.setOrderType("MOTO");
orderRequest.setCustomerOrderCode("Order code");
orderRequest.setAuthorizeOnly(Boolean.FALSE);

Address address = new Address();
address.setAddress1("123 House Road");
address.setAddress2("A village");
address.setCity("London");
address.setCountryCode(CountryCode.GB);
address.setPostalCode("EC1 1AA");
orderRequest.setBillingAddress(address);

try {
    OrderResponse orderResponse = restClient.getOrderService().create(orderRequest);
    System.out.println("Order code: " + orderResponse.getOrderCode());
} catch (WorldpayException e) {
    System.out.println("Error code: " + e.getApiError().getCustomCode());
    System.out.println("Error description: " + e.getApiError().getDescription());
    System.out.println("Error message: " + e.getApiError().getMessage());
}

Specifying the "reusable":"true" flag allows you to remember your customer's card details and makerecurringorcard-on-filepayments from your own systems. Please see ourAPI referenceon how to do this.

Important: taking telephone orders via the API cannot be combined with 3D Secure as this is against Card Scheme rules. For a full list of payment types that can be combined seehere.

Watch a video tutorial oncard on file/recurring telephone orders (MOTO)

Suggested next steps: