Last updated: September 16, 2026
Important: New integrations should use the JavaScript SDK v6.
This integration uses the JavaScript SDK v5. Use it only to troubleshoot existing integrations.
These are the integration instructions for the JavaScript SDK component CardFields. If your integration uses the HostedFields component, see Integrate PayPal buttons and Hosted Fields instead.
Integrate Card Fields with the JavaScript SDK v5 to accept credit and debit card payments directly on your site, using your own branding.
Set up your front end to integrate expanded checkout payments.
Your app shows the PayPal card fields and payment buttons. When a customer selects a button, your app calls server endpoints to create the order and capture the payment.
The /src/index.html and /src/app.js files handle the client-side logic and define how the PayPal front-end components connect with the back end. Use these files to set up the PayPal checkout using the JavaScript SDK and handle the payer's interactions with the PayPal checkout button.
You'll need to save the index.html and app.js files in a folder named /src.
Include the <script> tag on any page that shows the PayPal buttons. This script fetches all the necessary JavaScript to access the buttons on the window object.
Configure your script parameters:
client-id and specify which components you want to use. The SDK offers buttons, marks, card fields, and other components. This sample uses the buttons and card-fields components.currency you want to use for pricing. This example uses USD. buyer-country and currency are only for use in sandbox testing. Do not use these in production.Pass values in disable-funding and enable-funding to control which funding sources to offer or exclude. For example, if you want to offer Venmo as a payment method, add enable-funding=venmo to your script tag.
Add the containers for the PayPal buttons, the card fields hosted by PayPal, and a submit button to your index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link
rel="stylesheet"
type="text/css"
href="https://www.paypalobjects.com/webstatic/en_US/developer/docs/css/cardfields.css"
/>
<title>PayPal JS SDK Advanced Integration - Checkout Flow</title>
<script
src="https://www.paypal.com/sdk/js?client-id=test&buyer-country=US¤cy=USD&components=buttons,card-fields&enable-funding=venmo"
data-sdk-integration-source="developer-studio"
></script>
</head>
<body>
<div id="paypal-button-container" class="paypal-button-container"></div>
<!-- Containers for Card Fields hosted by PayPal -->
<div id="card-form" class="card_container">
<div id="card-name-field-container"></div>
<div id="card-number-field-container"></div>
<div id="card-expiry-field-container"></div>
<div id="card-cvv-field-container"></div>
<br /><br />
<button id="card-field-submit-button" type="button">
Pay now with Card
</button>
</div>
<p id="result-message"></p>
<script src="app.js"></script>
</body>
</html>After setting up the SDK for your website, you need to render the PayPal buttons and the card fields components.
The paypal namespace has a CardFields component to accept and save cards without handling card information. PayPal handles all security and compliance issues associated with processing cards. The CardFields function checks to see if a payment is eligible for card fields. If not, the card fields don't appear during the payment flow.
The paypal namespace also has a Buttons function that initiates the callbacks needed to set up a payment.
Both components use a shared createOrderCallback and onApproveCallback. The createOrder callback launches when the customer selects the payment button, starts the order, and returns an order ID. Completing the payment launches the onApprove callback. Use this callback to update business logic, show a confirmation page, or handle error responses.
To override the default style settings for the buttons, use a style object inside the Buttons component. You can lay out the buttons in a horizontal or vertical stack and customize them with different colors and shapes. Read more about how to customize your payment buttons in the style section of the JavaScript SDK v5 reference.
For the card fields, define styles for each field using the style object. You can also define the selector and placeholder values for the input fields. For more information about optional configurations, see Card fields in the JavaScript SDK v5 reference.
Pass the card field values, such as the cardholder's name and address, to the POST call through the cardField.submit() function. Anything you pass into the submit function is sent to the iframe that communicates with the Orders API. See the Orders v2 API for details about billing address fields and other parameters.
Set up your app to handle the payment capture response for three cases: a recoverable INSTRUMENT_DECLINED error, other non-recoverable errors, and a successful transaction.
// Render the button component
paypal
.Buttons({
// Sets up the transaction when a payment button is clicked
createOrder: createOrderCallback,
onApprove: onApproveCallback,
onError: function (error) {
// Do something with the error from the SDK
},
style: {
shape: "rect",
layout: "vertical",
color: "gold",
label: "paypal",
},
message: {
amount: 100,
},
})
.render("#paypal-button-container");
// Render each field after checking for eligibility
const cardField = window.paypal.CardFields({
createOrder: createOrderCallback,
onApprove: onApproveCallback,
style: {
input: {
"font-size": "16px",
"font-family": "courier, monospace",
"font-weight": "lighter",
color: "#ccc",
},
".invalid": { color: "purple" },
},
});
if (cardField.isEligible()) {
const nameField = cardField.NameField({
style: { input: { color: "blue" }, ".invalid": { color: "purple" } },
});
nameField.render("#card-name-field-container");
const numberField = cardField.NumberField({
style: { input: { color: "blue" } },
});
numberField.render("#card-number-field-container");
const cvvField = cardField.CVVField({
style: { input: { color: "blue" } },
});
cvvField.render("#card-cvv-field-container");
const expiryField = cardField.ExpiryField({
style: { input: { color: "blue" } },
});
expiryField.render("#card-expiry-field-container");
// Add click listener to submit button and call the submit function on the CardField component
document
.getElementById("card-field-submit-button")
.addEventListener("click", () => {
cardField.submit({}).then(() => {
// submit successful
});
});
}
async function createOrderCallback() {
resultMessage("");
try {
const response = await fetch("/api/orders", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
// use the "body" param to optionally pass additional order information
// like product ids and quantities
body: JSON.stringify({
cart: [
{
id: "YOUR_PRODUCT_ID",
quantity: "YOUR_PRODUCT_QUANTITY",
},
],
}),
});
const orderData = await response.json();
if (orderData.id) {
return orderData.id;
} else {
const errorDetail = orderData?.details?.[0];
const errorMessage = errorDetail
? `${errorDetail.issue} ${errorDetail.description} (${orderData.debug_id})`
: JSON.stringify(orderData);
throw new Error(errorMessage);
}
} catch (error) {
console.error(error);
resultMessage(`Could not initiate PayPal Checkout...<br><br>${error}`);
throw error;
}
}
async function onApproveCallback(data, actions) {
try {
const response = await fetch(`/api/orders/${data.orderID}/capture`, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
});
const orderData = await response.json();
// Three cases to handle:
// (1) Recoverable INSTRUMENT_DECLINED -> call actions.restart()
// (2) Other non-recoverable errors -> Show a failure message
// (3) Successful transaction -> Show confirmation or thank you message
const transaction =
orderData?.purchase_units?.[0]?.payments?.captures?.[0] ||
orderData?.purchase_units?.[0]?.payments?.authorizations?.[0];
const errorDetail = orderData?.details?.[0];
if (errorDetail || !transaction || transaction.status === "DECLINED") {
// (2) Other non-recoverable errors -> Show a failure message
let errorMessage;
if (transaction) {
errorMessage = `Transaction ${transaction.status}: ${transaction.id}`;
} else if (errorDetail) {
errorMessage = `${errorDetail.description} (${orderData.debug_id})`;
} else {
errorMessage = JSON.stringify(orderData);
}
throw new Error(errorMessage);
} else {
// (3) Successful transaction -> Show confirmation or thank you message
// Or go to another URL: actions.redirect('thank_you.html');
resultMessage(
`Transaction ${transaction.status}: ${transaction.id}<br><br>See console for all available details`
);
console.log(
"Capture result",
orderData,
JSON.stringify(orderData, null, 2)
);
}
} catch (error) {
console.error(error);
resultMessage(
`Sorry, your transaction could not be processed...<br><br>${error}`
);
}
}
// Example function to show a result to the user. Your site's UI library can be used instead.
function resultMessage(message) {
const container = document.querySelector("#result-message");
container.innerHTML = message;
}To trigger 3D Secure authentication, pass the verification method in the Create order payload. The verification method can be a contingencies parameter with SCA_ALWAYS or SCA_WHEN_REQUIRED:
SCA_ALWAYS to trigger an authentication for every transaction.SCA_WHEN_REQUIRED to trigger an authentication only when required by a regional compliance mandate such as PSD2. 3D Secure is supported only in countries with a PSD2 compliance mandate.These are the 3D Secure instructions for the JavaScript SDK component CardFields. If your integration uses the HostedFields component, see Integrate 3D Secure using Hosted Fields instead.
Set up your front end to integrate expanded checkout payments.
Your app shows the PayPal card fields and payment buttons. When a customer selects a button, your app calls server endpoints to create the order and capture the payment.
The App.jsx and main.jsx files handle the client-side logic and define how the PayPal front-end components connect with the back end. Use these files to set up payments using the JavaScript SDK and handle the payer's interactions with the PayPal Card Fields component.
You'll need to save the App.jsx and main.jsx files in a folder named /client/react/src.
Import PayPalScriptProvider from the @paypal/react-paypal-js library. This provider fetches the SDK so you can access the other child components.
Configure the SDK by passing the client-id and components parameters to PayPalScriptProvider as the options prop.
Pass values in disable-funding and enable-funding to control which funding sources to offer or exclude. For example, if you want to offer Venmo as a payment method, add enable-funding=venmo.
buyer-country and currency are only for use in sandbox testing. Do not use these in production.
After setting up the SDK for your website, you need to render the PayPal buttons and the card fields components.
Integrate card fields
Import PayPalCardFieldsProvider from @paypal/react-paypal-js. This is the parent component. It manages the state related to loading the JS SDK script and validates the request before rendering the card fields.
There are two ways to render the card fields:
PayPalCardFieldsForm React component, imported from @paypal/react-paypal-js. This renders the four card fields by default: Name, Number, Expiry, and CVV.| Component | Field | Required |
|---|---|---|
<PayPalNameField /> | Name for the card | No |
<PayPalNumberField /> | Card number | Yes |
<PayPalExpiryField /> | Card expiration date | Yes |
<PayPalCVVField /> | Card CVV or CID, a 3- or 4-digit code | Yes |
Integrate PayPal buttons
Import the PayPalButtons component from the PayPal React library. Place the PayPalButtons component inside the PayPalScriptProvider, or the system returns an error.
The createOrder callback launches when the buyer selects a payment button. The callback starts the order and returns an order ID. Completing the payment launches an onApprove callback. Use the onApprove response to update business logic, show a confirmation page, or handle error responses.
Set up your app to handle the payment capture response for three cases: a recoverable INSTRUMENT_DECLINED error, other non-recoverable errors, and a successful transaction.
import React, { useState } from "react";
import {
PayPalScriptProvider,
usePayPalCardFields,
PayPalCardFieldsProvider,
PayPalButtons,
PayPalNameField,
PayPalNumberField,
PayPalExpiryField,
PayPalCVVField,
} from "@paypal/react-paypal-js";
export default function App() {
const [isPaying, setIsPaying] = useState(false);
const initialOptions = {
"client-id": "YOUR_CLIENT_ID",
"enable-funding": "venmo",
"disable-funding": "",
"buyer-country": "US",
currency: "USD",
"data-page-type": "product-details",
components: "buttons,card-fields",
"data-sdk-integration-source": "developer-studio",
};
const [billingAddress, setBillingAddress] =
useState({
addressLine1: "",
addressLine2: "",
adminArea1: "",
adminArea2: "",
countryCode: "",
postalCode: "",
});
function handleBillingAddressChange(field, value) {
setBillingAddress((prev) => ({
...prev,
[field]: value,
}));
}
async function createOrder() {
try {
const response = await fetch("/api/orders", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
// use the "body" param to optionally pass additional order information
// like product ids and quantities
body: JSON.stringify({
cart: [
{
sku: "1blwyeo8",
quantity: 2,
},
],
}),
});
const orderData = await response.json();
if (orderData.id) {
return orderData.id;
} else {
const errorDetail = orderData?.details?.[0];
const errorMessage = errorDetail
? `${errorDetail.issue} ${errorDetail.description} (${orderData.debug_id})`
: JSON.stringify(orderData);
throw new Error(errorMessage);
}
} catch (error) {
console.error(error);
throw error;
}
}
async function onApprove(data, actions) {
try {
const response = await fetch(
`/api/orders/${data.orderID}/capture`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
}
);
const orderData = await response.json();
// Three cases to handle:
// (1) Recoverable INSTRUMENT_DECLINED -> call actions.restart()
// (2) Other non-recoverable errors -> Show a failure message
// (3) Successful transaction -> Show confirmation or thank you message
const transaction =
orderData?.purchase_units?.[0]?.payments?.captures?.[0] ||
orderData?.purchase_units?.[0]?.payments?.authorizations?.[0];
const errorDetail = orderData?.details?.[0];
if (
errorDetail ||
!transaction ||
transaction.status === "DECLINED"
) {
// (2) Other non-recoverable errors -> Show a failure message
let errorMessage;
if (transaction) {
errorMessage = `Transaction ${transaction.status}: ${transaction.id}`;
} else if (errorDetail) {
errorMessage = `${errorDetail.description} (${orderData.debug_id})`;
} else {
errorMessage = JSON.stringify(orderData);
}
throw new Error(errorMessage);
} else {
// (3) Successful transaction -> Show confirmation or thank you message
// Or go to another URL: actions.redirect('thank_you.html');
console.log(
"Capture result",
orderData,
JSON.stringify(orderData, null, 2)
);
return `Transaction ${transaction.status}: ${transaction.id}. See console for all available details`;
}
} catch (error) {
return `Sorry, your transaction could not be processed...${error}`;
}
}
function onError(error) {
// Do something with the error from the SDK
}
return (
<PayPalScriptProvider options={initialOptions}>
<PayPalButtons
createOrder={createOrder}
onApprove={onApprove}
onError={onError}
style={{
shape: "rect",
layout: "vertical",
color: "gold",
label: "paypal",
}}
/>
<PayPalCardFieldsProvider
createOrder={createOrder}
onApprove={onApprove}
style={{
input: {
"font-size": "16px",
"font-family": "courier, monospace",
"font-weight": "lighter",
color: "#ccc",
},
".invalid": { color: "purple" },
}}
>
<PayPalNameField
style={{
input: { color: "blue" },
".invalid": { color: "purple" },
}}
/>
<PayPalNumberField />
<PayPalExpiryField />
<PayPalCVVField />
<input
type="text"
id="card-billing-address-line-1"
name="card-billing-address-line-1"
placeholder="Address line 1"
onChange={(e) =>
handleBillingAddressChange(
"addressLine1",
e.target.value
)
}
/>
<input
type="text"
id="card-billing-address-line-2"
name="card-billing-address-line-2"
placeholder="Address line 2"
onChange={(e) =>
handleBillingAddressChange(
"addressLine2",
e.target.value
)
}
/>
<input
type="text"
id="card-billing-address-admin-area-line-1"
name="card-billing-address-admin-area-line-1"
placeholder="Admin area line 1"
onChange={(e) =>
handleBillingAddressChange("adminArea1", e.target.value)
}
/>
<input
type="text"
id="card-billing-address-admin-area-line-2"
name="card-billing-address-admin-area-line-2"
placeholder="Admin area line 2"
onChange={(e) =>
handleBillingAddressChange("adminArea2", e.target.value)
}
/>
<input
type="text"
id="card-billing-address-country-code"
name="card-billing-address-country-code"
placeholder="Country code"
onChange={(e) =>
handleBillingAddressChange(
"countryCode",
e.target.value
)
}
/>
<input
type="text"
id="card-billing-address-postal-code"
name="card-billing-address-postal-code"
placeholder="Postal/zip code"
onChange={(e) =>
handleBillingAddressChange("postalCode", e.target.value)
}
/>
{/* Custom client component to handle card fields submission */}
<SubmitPayment
isPaying={isPaying}
setIsPaying={setIsPaying}
billingAddress={
billingAddress
}
/>
</PayPalCardFieldsProvider>
</PayPalScriptProvider>
);
}
const SubmitPayment = ({ isPaying, setIsPaying, billingAddress }) => {
const { cardFieldsForm, fields } = usePayPalCardFields();
const handleClick = async () => {
if (!cardFieldsForm) {
const childErrorMessage =
"Unable to find any child components in the <PayPalCardFieldsProvider />";
throw new Error(childErrorMessage);
}
const formState = await cardFieldsForm.getState();
if (!formState.isFormValid) {
return alert("The payment form is invalid");
}
setIsPaying(true);
cardFieldsForm.submit({ billingAddress }).catch((err) => {
setIsPaying(false);
});
};
return (
<button
className={isPaying ? "btn" : "btn btn-primary"}
style={{ float: "right" }}
onClick={handleClick}
>
{isPaying ? <div className="spinner tiny" /> : "Pay"}
</button>
);
};Optional: To customize the card fields, define styles for each field using the style object inside PayPalCardFieldsProvider. You can also style individual fields by passing a style prop directly to each field component.
Pass card field values, such as the cardholder's name and billing address, through the cardFieldsForm.submit() function. Anything passed into the submit function is sent to the iframe that communicates with the Orders API. See the Orders v2 API for details about billing address fields and other parameters.
Optional: To override the default style settings for your page, use a style object inside the Buttons component. You can lay out the buttons in a horizontal or vertical stack and customize them with different colors and shapes. Read more about how to customize your payment buttons in the style section of the JavaScript SDK v5 reference.
To trigger 3D Secure authentication, pass the verification method in the Create order payload. The verification method can be a contingencies parameter with SCA_ALWAYS or SCA_WHEN_REQUIRED:
SCA_ALWAYS to trigger an authentication for every transaction.SCA_WHEN_REQUIRED to trigger an authentication only when required by a regional compliance mandate such as PSD2. 3D Secure is supported only in countries with a PSD2 compliance mandate.These are the 3D Secure instructions for the JavaScript SDK component CardFields. If your integration uses the HostedFields component, see Integrate 3D Secure using Hosted Fields instead.
The PayPal Server SDK provides integration access to the PayPal REST APIs. The API endpoints are divided into distinct controllers:
Your app creates an order on the backend by calling the ordersCreate method in the Orders Controller.
When the payer confirms the order, your app calls the ordersCapture method in the Orders Controller on the backend to move the money.
The sample integration uses the PayPal Server SDK to connect to the PayPal REST APIs. Use the server folder to set up the backend to integrate with the payments flow.
8080PAYPAL_CLIENT_ID and PAYPAL_CLIENT_SECRET as environment variables. The server side code is configured to fetch these values from the environment to authorize the calls to the PayPal REST APIs.Initialize the Server SDK client using OAuth 2.0 Client Credentials (PAYPAL_CLIENT_ID and PAYPAL_CLIENT_SECRET). The SDK automatically retrieves the OAuth token when you call an endpoint that requires OAuth 2.0 Client Credentials.
Endpoint: POST /v2/checkout/orders
You need a createOrder function to start a payment between a payer and a merchant.
Set up the createOrder function to make a request to the ordersCreate method in the Orders Controller and pass data from the cart object to calculate the purchase units for the order.
If you process payments that require Strong Customer Authentication, you need to provide additional context with payment indicators.
Endpoint: POST /v2/checkout/orders/{orderID}/capture
You need a captureOrder function to move money from the payer to the merchant.
Set up the captureOrder function to make a request to the ordersCapture method in the Orders Controller and pass the orderID generated from the Create Order step.
This server-side code sample shows how to set up your backend to generate an access token, create an order, and capture a payment using the PayPal Server SDK.
import express from "express";
import "dotenv/config";
import {
ApiError,
Client,
Environment,
LogLevel,
OrdersController,
PaymentsController,
} from "@paypal/paypal-server-sdk";
import bodyParser from "body-parser";
const app = express();
app.use(bodyParser.json());
const {
PAYPAL_CLIENT_ID,
PAYPAL_CLIENT_SECRET,
PORT = 8080,
} = process.env;
const client = new Client({
clientCredentialsAuthCredentials: {
oAuthClientId: PAYPAL_CLIENT_ID,
oAuthClientSecret: PAYPAL_CLIENT_SECRET,
},
timeout: 0,
environment: Environment.Sandbox,
logging: {
logLevel: LogLevel.Info,
logRequest: { logBody: true },
logResponse: { logHeaders: true },
},
});
const ordersController = new OrdersController(client);
const paymentsController = new PaymentsController(client);
/**
* Create an order to start the transaction.
* @see /api/orders/v2/orders-create
*/
const createOrder = async (cart) => {
const payload = {
body: {
intent: "CAPTURE",
purchaseUnits: [
{
amount: {
currencyCode: "USD",
value: "100",
},
},
],
},
prefer: "return=minimal",
};
try {
const { body, ...httpResponse } = await ordersController.createOrder(
payload
);
// Get more response info...
// const { statusCode, headers } = httpResponse;
return {
jsonResponse: JSON.parse(body),
httpStatusCode: httpResponse.statusCode,
};
} catch (error) {
if (error instanceof ApiError) {
// const { statusCode, headers } = error;
throw new Error(error.message);
}
throw error;
}
};
app.post("/api/orders", async (req, res) => {
try {
// use the cart information passed from the front-end to calculate the order amount details
const { cart } = req.body;
const { jsonResponse, httpStatusCode } = await createOrder(cart);
res.status(httpStatusCode).json(jsonResponse);
} catch (error) {
console.error("Failed to create order:", error);
res.status(500).json({ error: "Failed to create order." });
}
});
/**
* Capture payment for the created order to complete the transaction.
* @see /api/orders/v2/orders-capture
*/
const captureOrder = async (orderID) => {
const collect = {
id: orderID,
prefer: "return=minimal",
};
try {
const { body, ...httpResponse } = await ordersController.captureOrder(
collect
);
// Get more response info...
// const { statusCode, headers } = httpResponse;
return {
jsonResponse: JSON.parse(body),
httpStatusCode: httpResponse.statusCode,
};
} catch (error) {
if (error instanceof ApiError) {
// const { statusCode, headers } = error;
throw new Error(error.message);
}
throw error;
}
};
app.post("/api/orders/:orderID/capture", async (req, res) => {
try {
const { orderID } = req.params;
const { jsonResponse, httpStatusCode } = await captureOrder(orderID);
res.status(httpStatusCode).json(jsonResponse);
} catch (error) {
console.error("Failed to capture order:", error);
res.status(500).json({ error: "Failed to capture order." });
}
});
/**
* Authorize payment for the created order to complete the transaction.
* @see /api/orders/v2/orders-authorize
*/
const authorizeOrder = async (orderID) => {
const collect = {
id: orderID,
prefer: "return=minimal",
};
try {
const { body, ...httpResponse } = await ordersController.authorizeOrder(
collect
);
// Get more response info...
// const { statusCode, headers } = httpResponse;
return {
jsonResponse: JSON.parse(body),
httpStatusCode: httpResponse.statusCode,
};
} catch (error) {
if (error instanceof ApiError) {
// const { statusCode, headers } = error;
throw new Error(error.message);
}
throw error;
}
};
// authorizeOrder route
app.post("/api/orders/:orderID/authorize", async (req, res) => {
try {
const { orderID } = req.params;
const { jsonResponse, httpStatusCode } = await authorizeOrder(orderID);
res.status(httpStatusCode).json(jsonResponse);
} catch (error) {
console.error("Failed to authorize order:", error);
res.status(500).json({ error: "Failed to authorize order." });
}
});
/**
* Captures an authorized payment, by ID.
* @see /api/payments/v2/authorizations-capture
*/
const captureAuthorize = async (authorizationId) => {
const collect = {
authorizationId: authorizationId,
prefer: "return=minimal",
body: {
finalCapture: false,
},
};
try {
const { body, ...httpResponse } =
await paymentsController.captureAuthorize(collect);
// Get more response info...
// const { statusCode, headers } = httpResponse.statusCode,
return {
jsonResponse: JSON.parse(body),
httpStatusCode: httpResponse.statusCode,
};
} catch (error) {
if (error instanceof ApiError) {
// const { statusCode, headers } = error;
throw new Error(error.message);
}
throw error;
}
};
// captureAuthorize route
app.post("/orders/:authorizationId/captureAuthorize", async (req, res) => {
try {
const { authorizationId } = req.params;
const { jsonResponse, httpStatusCode } = await captureAuthorize(
authorizationId
);
res.status(httpStatusCode).json(jsonResponse);
} catch (error) {
console.error("Failed to capture authorize:", error);
res.status(500).json({ error: "Failed to capture authorize." });
}
});
app.listen(PORT, () => {
console.log(`Node server listening at http://localhost:${PORT}/`);
});Before going live, test your integration in the sandbox environment. Learn more about card testing.
Test the following use cases before going live:
Test a purchase as a payer:
Confirm the money reached the business account: