medusa-payment-upnance
Version:
Upnance Medusa payment plugin
131 lines (103 loc) โข 3.52 kB
Markdown
<p align="center">
<a href="https://www.medusajs.com">
<img src="https://user-images.githubusercontent.com/59018053/229103275-b5e482bb-4601-46e6-8142-244f531cebdb.svg" height="120" alt="Medusa logo" />
</a>
</p>
<h1 align="center">
medusa-payment-upnance
</h1>
<p align="center">
An official Medusa plugin to integrate <strong>Upnance</strong> payments for seamless checkout experiences.
</p>
<p align="center">
<a href="https://medusajs.com">
<img src="https://img.shields.io/badge/Medusa-^2.7.1-blue?logo=medusa" alt="Medusa Version" />
</a>
</p>
## ๐งพ Overview
`medusa-payment-upnance` is a Medusa payment plugin that connects your store to the Upnance payment gateway. It allows customers to complete secure checkouts via embedded iframes using Upnance's modern payment infrastructure.
## ๐ Features
- Embedded iframe checkout
- Full Medusa v2 compatibility
- Secure event-driven post-payment handling
- Simple configuration and setup
## ๐ฆ Installation
From the root of your Medusa project:
```bash
yarn add medusa-payment-upnance
# or
npm install medusa-payment-upnance
```
## โ๏ธ Configuration
Update your medusa-config.js to include the Upnance provider:
```ts
const { defineConfig } = require("@medusajs/medusa");
module.exports = defineConfig({
modules: [
{
resolve: "@medusajs/medusa/payment",
options: {
providers: [
{
resolve: "medusa-payment-upnance/providers/upnance",
id: "upnance",
options: {
apiKey: process.env.UPNANCE_API_KEY,
accountId: process.env.UPNANCE_ACCOUNT_ID,
environment: "staging | production",
/**
* Use this flag to capture payment immediately (default is false)
*/
autoCapture: false
},
},
],
},
},
],
});
```
Then add the required environment variables to your .env file:
```bash
UPNANCE_API_KEY=your_upnance_api_key
UPNANCE_ACCOUNT_ID=your_account_id
```
## ๐ Storefront Integration
Embed the Upnance checkout in your storefront using the following React example component:
```tsx
const UpnanceWindow = ({ transactionId }: { transactionId: string }) => {
const SANDBOX_PERMISSIONS =
"allow-same-origin allow-scripts allow-forms allow-popups allow-modals allow-top-navigation allow-popups-to-escape-sandbox allow-top-navigation-by-user-activation";
const ALLOW_PERMISSIONS =
"geolocation *;camera *;payment *;clipboard-read *;clipboard-write *;autoplay *;microphone *;fullscreen *;accelerometer *;magnetometer *;gyroscope *;picture-in-picture *;otp-credentials *;";
const onPaymentCompleted = async () => {
return placeOrder(); // Finalize order after payment
};
React.useEffect(() => {
const listener = async (ev: MessageEvent) => {
if (ev.data.type === "CHECKOUT_COMPLETE_EVENT") {
await onPaymentCompleted();
}
};
window.addEventListener("message", listener);
return () => {
window.removeEventListener("message", listener);
};
}, []);
return (
<div style={{ height: "700px", width: "100%" }}>
<iframe
sandbox={SANDBOX_PERMISSIONS}
allow={ALLOW_PERMISSIONS}
width="100%"
height="100%"
src={`https://checkout.staging.upnance.com/checkout/${transactionId}`}
/>
</div>
);
};
```
#### Replace checkout.staging.upnance.com with checkout.upnance.com when deploying live.