If you're looking to enable crypto payments in your online or in-person business, check out WalletConnect Pay, our all-in-one payments solution. Learn more in the WalletConnect Pay docs →
Pay with Self-Custodial Wallets lets users pay with their self-custodial wallets like MetaMask, Trust, Ledger, and more directly in-app.
Quickstart#
Here you can find a simplified process to integrate AppKit Pay:
Projects first need to install and set up Reown AppKit before integrating AppKit Pay. If you haven't done so, please refer to the Reown AppKit docs.
Code Example#
Check the React example
Install the library#
Projects currently using Reown AppKit, or planning to use it to build custom payment flows with self-custodial wallets, should use AppKit Pay for a streamlined integration and significantly improved user experience out of the box. AppKit Pay can be found in @reown/appkit-pay npm package.
There are two main ways to handle payments:
pay - Full Payment Flow#
This function handles the complete payment flow — it opens the payment UI and waits for the result (success, failure, cancel, timeout).
In order to run the payment, use the function pay. This function receives three values: recipient, amount, and paymentAsset.
openPay - Open Payment UI Only#
This function opens or triggers the payment UI modal but doesn't return the result of the payment. Use the hook to handle the payment result.
Call the hook to open the payment modal.
Open the payment modal, but onSuccess/onError handles the actual payment result:
Handle the payment result in the onSuccess/onError callbacks:
Or handle the payment result in the UI by displaying the payment status:
Supported Networks and Assets#
For a complete list of supported networks and assets, please refer to the Networks and Assets Supported section in our Pay with Self-Custodial Wallets documentation.
Assets Configuration#
For the moment, AppKit Pay has pre-configured these assets:
- baseETH, baseSepoliaETH, and baseUSDC
- ethereumUSDC, optimismUSDC, arbitrumUSDC, polygonUSDC and solanaUSDC
- ethereumUSDT, optimismUSDT, arbitrumUSDT, polygonUSDT and solanaUSDT
For custom assets, you can create a paymentAsset object with all the information:
Prerequisites#
Enable Payments Feature in Dashboard#
The "Payments" feature must be enabled in the Reown Dashboard before you can use AppKit Pay, even for local testing.
- Go to your project in the Reown Dashboard
- Navigate to the Payments section
- Enable the Payments feature for your projectId
Test locally#
In order to test locally use localhost and port 3000. This is the only port available for local testing.
Add the following to your package.json file in order to run the development server on port 3000:
Hooks#
All the hooks must be imported from @reown/appkit-pay/react. For example:
useAvailableExchanges#
The Pay with Exchange feature has been deprecated. The following exchange-related hooks are retained for backward compatibility only. For more details, see the Payments FAQs.
Fetches and manages the state for available exchanges.
useAvailableExchanges(options?: { isFetchOnInit?: boolean } & GetExchangesParams): UseAvailableExchangesReturn
options: Control initial fetch behavior.returns:{ data, isLoading, error, fetch }
type GetExchangesParams= { page?: number asset?: string amount?: number | string network?: CaipNetworkId }
usePayUrlActions#
The Pay with Exchange feature has been deprecated. This hook is retained for backward compatibility only. For more details, see the Payments FAQs.
Provides functions (getUrl, openUrl) to interact with specific exchange URLs, returning the sessionId needed for status tracking.
usePayUrlActions(): { getUrl, openUrl }
getUrl(exchangeId, params): Promise<PayUrlResponse>openUrl(exchangeId, params, openInNewTab?): Promise<PayUrlResponse>(Returns{ url, sessionId })
useExchangeBuyStatus#
The Pay with Exchange feature has been deprecated. This hook is retained for backward compatibility only. For more details, see the Payments FAQs.
Fetches and polls for the status of a headless payment transaction using exchangeId and sessionId.
useExchangeBuyStatus(params: UseExchangeBuyStatusParameters): UseExchangeBuyStatusReturn
params:{ exchangeId, sessionId, pollingInterval?, isEnabled?, onSuccess?, onError? }returns:{ data, isLoading, error, refetch }