This guide describes how to integrate and embed a customizable, white-label reverse withdrawal form into your website using the Cashier JavaScript library, Rebilly JS SDK, and Express JS.
In this guide, you configure the form to retrieve a cashier token from a backend endpoint and use that token to mount the Cashier JavaScript library in the frontend.
Use the reverse withdrawal form to display a compact reverse withdrawal option when a customer has pending payout requests. When a customer completes a reverse withdrawal, pending payout requests are canceled and funds are returned to the customer's account balance. A payout request is a customer request to withdraw funds.
Prerequisites
To complete this guide, you must have a website ID, an organization ID, a secret API key, and a customer ID.
You must also have a payment gateway configured in your Rebilly account. For sandbox testing, the TestProcessor gateway is pre-configured.
If your website uses a Content Security Policy (CSP), configure it before you embed the reverse withdrawal form. For more information, see Configure content security policy.
If you already have your IDs and API keys, continue to Step 1: Set up the server. If you do not, view this guide to Create a customer and get your IDs and API key in Set up your environment.
The reverse withdrawal option is available only when the customer has a pending payout total that is greater than zero. Provide pendingPayoutTotal when you Create a cashier, or pass balances.pendingPayoutTotal to RebillyCashier.renderReverseWithdraw().
This section describes how to set up your server-side code. This guide uses an Express node app to authenticate the client.
Install and initialize dependencies
Install the required dependencies in your project directory:
npm install express rebilly-js-sdk --saveInitialize Express and the Rebilly SDK.
Provide credentials
Provide your secret key, website ID, and organization ID. For more information, see Prerequisites.
Store your secret key in a secrets manager, not in your code.
Initialize Rebilly JS SDK
Set up the Rebilly JS SDK and provide your secret API key. Set sandbox to true to test in the sandbox environment.
Define route for POST requests
Define a route for handling HTTP POST requests to the /create-cashier endpoint.
For more information, see the Create a cashier API operation and this Express example.
Provide currency
Provide the currency of the transaction.
Provide pending payout total
Provide the total value of all payout requests that are currently in a pending state. This value is the maximum possible reverse withdrawal amount.
This section describes the basic setup for mounting the reverse withdrawal form.
For this guide, index.html and reverse-withdraw.js must be placed in a public directory in the root of your project.
Install the library
Include the Cashier JavaScript library using a CDN:
https://cdn.rebilly.com/cashier/@latest/main.jsAdd custom styling (optional)
Optionally, use Cashier library CSS variables or classes to customize the appearance of the reverse withdrawal form.
For more information, see Customize.
Add a container element
Define an empty container element to hold the reverse withdrawal form. This element is provided to the Cashier library renderReverseWithdraw method to mount the form.
Any HTML element may be used to contain the reverse withdrawal form.
Render the reverse withdrawal form
Send a request to the /create-cashier server endpoint you created in Step 1: Set up a server, and use the returned cashierToken to mount the reverse withdrawal form on the page.
Handle reverse withdrawal completion (optional)
To handle reverse withdrawal completion, use RebillyCashier.on() to listen for the reverse-withdrawal-completed event. The reverse withdrawal form does not support completeAction.
When the customer has no pending payout requests, the reverse withdrawal form displays a default empty state message. To customize this message, add a child element with the no-pending-withdrawal slot to the mount element before you call RebillyCashier.renderReverseWithdraw():
<div id="reverse-withdraw">
<section slot="no-pending-withdrawal">
<h3>No pending withdrawals</h3>
<p>You do not have any pending payout requests.</p>
</section>
</div>This section describes how to view the reverse withdrawal form in a web browser.
Run the example
Run server.js. When the server is running, open a browser and visit http://localhost:8080.
For more information, see Prerequisites.
node server.jsThis is an interactive example of a reverse withdrawal form that uses the Cashier JavaScript library.
import express from "express";
import RebillyAPI from "rebilly-js-sdk";
const app = express();
const API_SECRET_KEY = "SECRET_KEY";
const ORGANIZATION_ID = "ORGANIZATION_ID";
const WEBSITE_ID = "WEBSITE_ID";
const rebilly = RebillyAPI({
organizationId: ORGANIZATION_ID,
sandbox: true,
apiKey: API_SECRET_KEY,
timeout: 5000,
});
app.use(express.static("public"));
app.post("/create-cashier", async (req, res) => {
try {
const response = await rebilly.cashiers.create({
data: {
websiteId: WEBSITE_ID,
customerId: "{{ CUSTOMER_ID }}",
currency: "{{ CURRENCY }}",
pendingPayoutTotal: 100.0,
},
});
const cashierToken = response.fields.cashierToken;
res.send({ cashierToken });
} catch (error) {
if (error?.response?.data) {
console.error(error.response.data);
} else {
console.error(error);
}
res.status(500).json({ error: "Failed to create cashier token" });
}
});
app.listen(8080, () => console.log("Running on port 8080"));