White Label Card Processing

Wyre offers our partners the benefit of implementing the functionality of our card processing API while maintaining their own UX/UI. This is available to partners that fulfill the specific requirements in the box below. The following is a guide on how to implement white label card processing if those requirements are met.

Key Requirements

🚧

Card Processing Requirements

PCI Compliance
If you choose this option you must demonstrate your PCI compliance to Wyre. This typically means you use a third party to handle card data securely. See our integration to Spreedly guide in the resource section for an easy solution.

User Agreement Disclosure
Your application should allow end users the ability to accept Wyre's User Agreement during the checkout process. This can function as a checkbox with a link to the agreement, see our example from Wyre Checkout at the bottom of this guide.

Basic example:
☑️I accept Wyre's User Agreement.

👍

3D Secure Now Required

Wyre now requires 3D Secure authentication on each card payment (wallet order). Use 'trigger3ds' in Create Order to initiate 3D Secure. This improves user experience and helps us prevent fraud.

Create Reservation

After getting all set up, you'll need to create a Wallet Order Reservation ID for a wallet order. This allows you to lock in the details for the order in an immutable way from your server before taking in payment details.

The generated reservation wallet order ID may only be used once. If the order fails, the ID will become unusable. Any callbacks issued on behalf of the order will use the same order ID, so it can be useful for correlating Wyre orders to data in your own database. Reservations are good for one hour. Learn more about Wallet Order Reservations.

For the best user experience, use the autoRedirect parameter in Create Wallet Order Reservation to ensure the user returns immediately to your site or app after authentication is completed.

{
    "referrerAccountId": "AC_JVPFPWYQH4B",
    "destCurrency": "ETH",
    "sourceCurrency": "USD",
    "redirectUrl": "https://www.sendwyre.com",
    "autoRedirect": true,
    "amount": "25",
    "country": "US",
    "dest": "ethereum:0xDf9f41c57f12b591671E0f02F41121CecE079e2E"
}

Create Order

Process the payment with the Card Processing API by using the Create Wallet Order endpoint.

Use the returned reservation from step #1 as the reservationId param for card processing.

{
    "debitCard": {
        "number": 4111111111111111,
        "year": 2023,
        "month": 10,
        "cvv": 123
    },
    "amount": 100,
    "sourceCurrency": "USD",
    "amountIncludeFees": true,
    "trigger3ds": true,
    "destCurrency": "USD",
    "dest": "account:AC_JVPFPWYQH4B",
    "referrerAccountId": "AC_JVPFPWYQH4B",
    "givenName": "tim",
    "familyName": "cook",
    "email": "[email protected]",
    "phone": "+14152887111",
    "reservationId": "9FPC2E9M96U7VPXRYG7G",
    "address": {
        "country": "US",
        "state": "WA",
        "city": "Kingston",
        "postalCode": "98346",
        "street1": "9053 NE Leprechaun Ln",
        "street2": ""
    }
}

After you've created the order, you will receive the id of the order in the response an initial status of Running_Checks.

{
   "id":"WO_PQAG8JHTA2F",
   "createdAt":1595539060000,
   "owner":"account:AC_RW4FHEJPCHW",
   "status":"RUNNING_CHECKS",
   "orderType":"INTERNATIONAL",
   "sourceAmount":10.0,
   "purchaseAmount":9.31,
   "sourceCurrency":"USD",
   "destCurrency":"BTC",
   "transferId":null,
   "dest":"bitcoin:tb1q6yn0ajs733xsk25vefrhwjey4629qt9c67y6ma",
   "email":"[email protected]",
   "authCodesRequested":false,
   "paymentMethodName":"Visa ending 1111",
   "accountId":"AC_RW4FHEJPCHW"
}

Authentication

Retrieve the 3D Secure authentication Url by calling Get Authorization.

So long as the order status = RUNNING_CHECKS and authCodesRequested is true, continue polling the Get Authorization endpoint for the authentication Url.

Use the Url parameter /with-redirect in combination with the autoRedirect parameter in Create Wallet Order Reservation to complete the flow.

curl --location --request GET 'https://api.testwyre.com/v3/debitcard/authorization/WO_7ZJDUEBQNC/with-redirection' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer SK-......' \
--data-raw '{}'

Open authentication Url

{
    "walletOrderId": "WO_7ZJDUEBQNC",
    "smsNeeded": false,
    "card2faNeeded": false,
    "authorization3dsUrl": "https://pay.testwyre.com/bank-authorization/WO_7ZJDUEBQNC?redirectUrl=https%3A%2F%2Fwww.sendwyre.com&autoRedirect=true"
}
{
    "walletOrderId": "WO_Q9VCBECYBQ",
    "smsNeeded": false,
    "card2faNeeded": false,
    "authorization3dsUrl": "https://pay.testwyre.com/bank-authorization/WO_Q9VCBECYBQ"
}

Example with SMS and Card 2-Factor Authentication (legacy implementations only)

{
   "walletOrderId":"WO_9PUXWLZD888",
   "smsNeeded":true,
   "card2faNeeded":true
}

For legacy implementations not using 3D Secure:

Wyre requires two authentication codes if authCodesRequested is true:

  • CARD2FA - A 6 digit code that's added immediately to the end user's bank account. This code is usually displayed under Temporary Authorizations in the user's bank or credit card account online.
  • SMS - A 6 digit code sent to the user's mobile device.

You will need to confirm the codes that are requested. If the Authentication codes are not provided, the order will expire - the current expiration time is 10 minutes. When building your UI, you need to make it a real-time experience.

The GET request is only available until codes are still valid. After that, if you try to get authorization information in this endpoint we throw an error - check Card Exceptions. The current limit of attempts to specify the code is 5 times. After this, you will receive back an error and the order will expire.

You must provide the codes back in the following Submit Authorization endpoint:

{
   "type":"SMS", 
   "walletOrderId":"WO_Y74E8FXVWJ2",
   "reservation":"NHEA3UYXEXCUX4Y2HG78",
   "sms":"000000",
   "card2fa":"000000"
}

The node type must be either SMS, CARD2FA or ALL. When SMS the node sms is mandatory, when CARD2FA the node card2fa is mandatory, when ALL both sms and card2fa are mandatory.

Response:

{
  "walletOrderId":"WO_DX6B3UAVN8B",
  "success":true
}

When any code failed due to any reason (max attempts, time expiration, etc.) the order will also fail and card refunded. Failed orders cannot be resumed. These codes' needs might change at any time and based on the buyer's info.

Verify Order Status

Refer to Card Processing Overview for the Order Status diagram.

Once an order reaches 'PROCESSING' it means the card payment was successful, and a transferId will be created. This transfer represents the delivery of crypto and indicates that process is underway.

Order status updated to 'COMPLETE' means the crypto has been delivered successfully. Settlement times depend on network activity and are subject to change. For purely fiat payments the order will move immediately from Processing to Complete.

Keep polling Get Wallet Order and/or listen to Webhooks until the order's status is PROCESSING or COMPLETE.

You can also track its progress here: Track Wallet Order.

For manual look up we provide a publicly accessible endpoint:

https://api.sendwyre.com/v3/orders/:orderId
{
    "referenceId": null,
    "accountId": "AC_JVPFPWYQH4B",
    "orderId": "WO_DU46EN96PM",
    "orderStatus": "COMPLETE",
    "transferId": "TF_NMNN38VVYAT",
    "failedReason": null,
    "error": null,
    "reservation": "QLYWHUEJBQWMWCNJ26LY",
    "email": "[email protected]"
}

If you supplied a redirectUrl Wyre will append information to that Url allowing you to query the order for useful information, including order status, amounts and network transaction Ids.

https://www.sendwyre.com/?accountId=AC_VMHJX9GBLEW&authCodesRequested=true&authenticationUrl&blockchainNetworkTx&createdAt=1660335812000&dest=account%25253AAC_JVPFPWYQH4B&destCurrency=USD&id=WO_TGHNFDQ23Z&ok=true&orderType=DOMESTIC&owner=account%25253AAC_VMHJX9GBLEW&paymentMethodName=Visa%252520ending%2525201111&purchaseAmount=100&sourceAmount=110&sourceCurrency=USD&status=PROCESSING&transferId=TF_X7WBTN2ZEGQ

Sample User Agreement Disclosure

Your app must allow users to agree to Wyre terms and conditions at point of sale, as shown in the example here presented by Wyre Checkout.

410410