Hi,
We are developing a product for hotel online check-in and checkout. After checkout, sometimes we need to charge more fee for broken item.
Do you have any API related to the pre-authorization of a payment when the final amount is unknown?
Thank you,
Hao Vo
Hey @7640,
Yes, the Visa Developer Platform provides APIs that can handle pre-authorization use cases, such as the scenario you described for hotel online check-in and checkout. The Visa Direct and Visa Payment Control APIs can be used for such purposes where the final amount may be unknown at the time of pre-authorization.
Here's a general approach you can take:
Steps for Pre-authorization
1. Initiate a Pre-authorization: You can use the `pre-authorization` feature to place a hold on a certain amount on the card.
2. Capture the Final Amount: Once the final amount is known (e.g., after checkout when additional charges are determined), you can capture the final amount.
3. Release the Hold: If the final charge is less than the pre-authorized amount, the remaining hold can be released.
Visa Direct API Overview
Visa Direct APIs can be used for funds transfers and managing pre-authorizations. Below is an example of how you might initiate a pre-authorization using Visa Direct:
```csharp
// START
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
public class VisaPreAuthorization
{
private static readonly HttpClient client = new HttpClient();
public static async Task Main(string[] args)
{
var baseUrl = "https://sandbox.api.visa.com/visadirect/preauthorize/v1/preauth";
var apiKey = "YOUR_API_KEY";
var sharedSecret = "YOUR_SHARED_SECRET";
var requestBody = new
{
amount = "50.00", // Pre-authorized amount
currency = "USD",
cardNumber = "4111111111111111",
expiryMonth = "12",
expiryYear = "2023",
cvv2 = "123",
cardHolderName = "John Doe",
merchantCategoryCode = "3501", // Hotel/Motel
merchantReference = "REF123456789"
};
var jsonString = JsonConvert.SerializeObject(requestBody);
var content = new StringContent(jsonString, Encoding.UTF8, "application/json");
client.DefaultRequestHeaders.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes($"{apiKey}:{sharedSecret}")));
var response = await client.PostAsync(baseUrl, content);
var responseString = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseString);
}
}
// END
```
Steps to Follow:
1. Replace `YOUR_API_KEY` and `YOUR_SHARED_SECRET` with your actual API Key and Shared Secret.
2. Pre-authorization Amount: Set an appropriate pre-authorization amount that you expect to cover potential charges.
3. Endpoint URL: Ensure the `baseUrl` points to the correct Visa Direct pre-authorization endpoint.
Capturing the Final Amount
Once the final amount is determined, you can capture the pre-authorized amount using the `capture` endpoint provided by Visa.
Releasing the Hold
If the final charge is less than the pre-authorized amount, you can use the `reverse` endpoint to release the remaining hold.
For more detailed guidance and specific API endpoints, refer to the Visa Developer Portal at https://developer.visa.com/. Additionally, consult the Visa Developer documentation for more comprehensive information on handling pre-authorizations, captures, and reversals.