@moipayway/sdk 1.0.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/checkout.d.mts
CHANGED
|
@@ -139,7 +139,7 @@ interface MoiPayWayConfig {
|
|
|
139
139
|
onSuccess?: (data: any) => void;
|
|
140
140
|
onError?: (error: any) => void;
|
|
141
141
|
onClose?: () => void;
|
|
142
|
-
/** URL to redirect to when checkout is closed/cancelled
|
|
142
|
+
/** URL to redirect to when checkout is closed/cancelled */
|
|
143
143
|
closeRedirectUrl?: string;
|
|
144
144
|
/** White-label theme customization */
|
|
145
145
|
theme?: WhiteLabelTheme;
|
|
@@ -159,6 +159,7 @@ declare class MoiPayWay {
|
|
|
159
159
|
private config;
|
|
160
160
|
private api;
|
|
161
161
|
constructor(config: MoiPayWayConfig);
|
|
162
|
+
updateApiKey(apiKey: string): void;
|
|
162
163
|
initiate(meta: PaymentMeta, orderReferenceCode?: string): Promise<ApiResponse>;
|
|
163
164
|
getPaymentInfo(orderReferenceCode: string): Promise<ApiResponse<PaymentInfoResponse>>;
|
|
164
165
|
payWithCard(orderReferenceCode: string, cardDetails: CardDetails): Promise<ApiResponse<CardResponse>>;
|
|
@@ -195,6 +196,7 @@ declare class ApiClient {
|
|
|
195
196
|
private baseUrl;
|
|
196
197
|
private apiKey;
|
|
197
198
|
constructor(environment: MoiPayWayEnvironment, apiKey: string);
|
|
199
|
+
updateApiKey(apiKey: string): void;
|
|
198
200
|
private request;
|
|
199
201
|
initiatePayment(payload: any): Promise<unknown>;
|
|
200
202
|
getPaymentInfo(orderReferenceCode: string): Promise<unknown>;
|
|
@@ -230,5 +232,16 @@ declare function encryptCardDetails(cardDetails: {
|
|
|
230
232
|
}, salt?: string, ttlSeconds?: number): Promise<string>;
|
|
231
233
|
|
|
232
234
|
declare function generateOrderReference(length?: number): string;
|
|
235
|
+
declare function formatAmount(amount: string | number, currency?: string): string;
|
|
236
|
+
/**
|
|
237
|
+
* Parse allowed payment methods from API response.
|
|
238
|
+
* The API returns payment_method.allowed as a JSON string like '["MOBILE_MONEY"]'
|
|
239
|
+
* with uppercase values that need to be normalized to lowercase with underscores.
|
|
240
|
+
*/
|
|
241
|
+
declare function parseAllowedMethods(data: any): string[] | null;
|
|
242
|
+
declare const PAYMENT_METHOD_LABELS: Record<string, {
|
|
243
|
+
label: string;
|
|
244
|
+
icon: string;
|
|
245
|
+
}>;
|
|
233
246
|
|
|
234
|
-
export { ApiClient, type ApiResponse, type CardDetails, type CardResponse, type CheckoutStep, type DisplayMode, type InstitutionItem, MoiPayWay, type MoiPayWayConfig, type MoiPayWayEnvironment, type PaymentInfoResponse, type PaymentMeta, type PaymentMethod, type SplitConfig, type SplitWallet, type WhiteLabelContent, type WhiteLabelTheme, encryptCardDetails, generateOrderReference };
|
|
247
|
+
export { ApiClient, type ApiResponse, type CardDetails, type CardResponse, type CheckoutStep, type DisplayMode, type InstitutionItem, MoiPayWay, type MoiPayWayConfig, type MoiPayWayEnvironment, PAYMENT_METHOD_LABELS, type PaymentInfoResponse, type PaymentMeta, type PaymentMethod, type SplitConfig, type SplitWallet, type WhiteLabelContent, type WhiteLabelTheme, encryptCardDetails, formatAmount, generateOrderReference, parseAllowedMethods };
|
package/dist/checkout.esm.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var w={live:"https://api.moipayway.co",test:"https://dev.moipayway.co"},i=class{constructor(e,t){this.baseUrl=w[e],this.apiKey=t}async request(e,t){let r=`${this.baseUrl}/${e}`,o=await(await fetch(r,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify(t)})).json();if(o.status==="error"||o.status==="failed")throw new Error(o.message||"Request failed");return o}async initiatePayment(e){return this.request("wallet/collection/initiate",e)}async getPaymentInfo(e){return this.request("wallet/collection/info",{order_reference_code:e})}async createPaymentMethod(e){return this.request("wallet/collection/method/create",e)}async getSupportedInstitutions(e){return this.request("wallet/collection/method/supported-institutions",e)}async getSupportedCurrencies(e){return this.request("wallet/collection/method/supported-currencies",e)}async getSupportedCountries(e){return this.request("wallet/collection/method/supported-countries",e)}async getSupportedNetworks(e){return this.request("wallet/collection/method/supported-networks",e)}async resendOTP(e){return this.request("wallet/collection/method/resend-otp",e)}async authorizeOTP(e){return this.request("wallet/collection/method/authorize-otp",e)}async authorize3DS(e){return this.request("wallet/collection/method/authorize-3ds",e)}async confirmPaymentMethod(e){return this.request("wallet/collection/method/confirmation",e)}async simulatePayment(e){return this.request("simulation/collection-order",e)}};function y(n=10){let e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",t="";for(let r=0;r<n;r++)t+=e.charAt(Math.floor(Math.random()*e.length));return t}var
|
|
1
|
+
var w={live:"https://api.moipayway.co",test:"https://dev.moipayway.co"},i=class{constructor(e,t){this.baseUrl=w[e],this.apiKey=t}updateApiKey(e){this.apiKey=e}async request(e,t){let r=`${this.baseUrl}/${e}`,o=await(await fetch(r,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify(t)})).json();if(o.status==="error"||o.status==="failed")throw new Error(o.message||"Request failed");return o}async initiatePayment(e){return this.request("wallet/collection/initiate",e)}async getPaymentInfo(e){return this.request("wallet/collection/info",{order_reference_code:e})}async createPaymentMethod(e){return this.request("wallet/collection/method/create",e)}async getSupportedInstitutions(e){return this.request("wallet/collection/method/supported-institutions",e)}async getSupportedCurrencies(e){return this.request("wallet/collection/method/supported-currencies",e)}async getSupportedCountries(e){return this.request("wallet/collection/method/supported-countries",e)}async getSupportedNetworks(e){return this.request("wallet/collection/method/supported-networks",e)}async resendOTP(e){return this.request("wallet/collection/method/resend-otp",e)}async authorizeOTP(e){return this.request("wallet/collection/method/authorize-otp",e)}async authorize3DS(e){return this.request("wallet/collection/method/authorize-3ds",e)}async confirmPaymentMethod(e){return this.request("wallet/collection/method/confirmation",e)}async simulatePayment(e){return this.request("simulation/collection-order",e)}};function y(n=10){let e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",t="";for(let r=0;r<n;r++)t+=e.charAt(Math.floor(Math.random()*e.length));return t}function b(n,e="NGN"){let t=typeof n=="string"?parseFloat(n):n,r=e.toUpperCase(),s=t.toLocaleString("en",{minimumFractionDigits:2,maximumFractionDigits:2});return`${r} ${s}`}function M(n){try{let e=n?.payment_method?.allowed;if(!e)return null;let t=typeof e=="string"?JSON.parse(e):e;return!Array.isArray(t)||t.length===0?null:t.map(r=>r.toLowerCase())}catch{return null}}var S={card:{label:"Card Payment",icon:"\u{1F4B3}"},ussd:{label:"USSD",icon:"\u{1F4F1}"},dynamic_virtual_account:{label:"Pay with Transfer (One time)",icon:"\u{1F3E6}"},static_virtual_account:{label:"Static Account",icon:"\u{1F3DB}\uFE0F"},pay_with_crypto:{label:"Pay with Crypto",icon:"\u{1FA99}"},pay_by_bank:{label:"Pay by Bank",icon:"\u{1F517}"},mobile_money:{label:"Mobile Money",icon:"\u{1F4F2}"}};var E=`-----BEGIN PUBLIC KEY-----
|
|
2
2
|
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwl+N8sgsM2DPFLvBRwyx
|
|
3
3
|
55yNdSzZYucBzTwrRhE7qpc9i69hDhKAGukXvqm2R/HGHjKRPCojTDgEpZEPqE0d
|
|
4
4
|
d7oD2gq9pLKk5XmOGNSCIyL3HsHNhLKSSonrTeDkBfrVp0DJ/pw1pLQRz6bbWIYL
|
|
@@ -11,5 +11,5 @@ RTvqdMZkWfLH1EK7G+HgKdF08Dbuy+bguV/gRF09Hp16vEl2bKZL1Pk5mJc0JBM2
|
|
|
11
11
|
Qya765pNonNXC5AMJqgDm9uk9fmGBwc68UPALx8+PO4/GyHkM4u0ITtnvvNtdK5d
|
|
12
12
|
G62wC4dQhOCfr/eJoiplefGGuir3MMCqyOi+zWe+HlKQpVcpS285Y5aPE3WmDl09
|
|
13
13
|
9qYq6sb+UBuCIzag7FECy8MCAwEAAQ==
|
|
14
|
-
-----END PUBLIC KEY-----`;function
|
|
14
|
+
-----END PUBLIC KEY-----`;function I(n){let e=n.replace(/-----BEGIN PUBLIC KEY-----/,"").replace(/-----END PUBLIC KEY-----/,"").replace(/[\s\n\r]/g,""),t=atob(e),r=new Uint8Array(t.length);for(let s=0;s<t.length;s++)r[s]=t.charCodeAt(s);return r.buffer}function c(n){let e=new Uint8Array(n),t="";for(let r=0;r<e.length;r++)t+=String.fromCharCode(e[r]);return btoa(t)}function v(n){let e=crypto.getRandomValues(new Uint8Array(n));return Array.from(e).map(t=>t.toString(16).padStart(2,"0")).join("")}async function a(n,e="",t=300){try{let r=new TextEncoder,o={data:JSON.stringify({phone_number:n.phone_number||"",holder_name:n.holder_name||"",pan:n.pan,expire_month:n.expire_month,expire_year:n.expire_year,cvv:n.cvv,pin:n.pin,street:n.street||"",country_code:n.country_code||"",state:n.state||"",city:n.city||"",postal_code:n.postal_code||""}),ts:Math.floor(Date.now()/1e3),ttl:t<0?300:t,nonce:v(16)},g=JSON.stringify(o),u=crypto.getRandomValues(new Uint8Array(32)),d=crypto.getRandomValues(new Uint8Array(12)),h=await crypto.subtle.importKey("raw",u,{name:"AES-GCM"},!1,["encrypt"]),l={name:"AES-GCM",iv:d,tagLength:128};e&&(l.additionalData=r.encode(e));let f=await crypto.subtle.encrypt(l,h,r.encode(g)),p=new Uint8Array(f),P=p.slice(0,p.length-16),A=p.slice(p.length-16),R=await crypto.subtle.importKey("spki",I(E),{name:"RSA-OAEP",hash:"SHA-1"},!1,["encrypt"]),C=await crypto.subtle.encrypt({name:"RSA-OAEP"},R,u),_=JSON.stringify({alg:"RSA-OAEP(SHA1)+AES-256-GCM(tag16)+AAD=salt",ek:c(C),iv:c(d.buffer),ct:c(P.buffer),tag:c(A.buffer)});return btoa(_)}catch(r){throw console.error("Encryption error:",r),new Error("Card encryption failed. Please try again.")}}var m=class{constructor(e){this.config={displayMode:"popup",...e},this.api=new i(e.environment,e.apiKey)}updateApiKey(e){this.config.apiKey=e,this.api.updateApiKey(e)}async initiate(e,t){let r={order_reference_code:t||y(),meta:e};return this.api.initiatePayment(r)}async getPaymentInfo(e){return this.api.getPaymentInfo(e)}async payWithCard(e,t){let r=await a(t);return this.api.createPaymentMethod({type:"card",order_reference_code:e,meta:{card_details:r}})}async getSupportedInstitutions(e,t){return this.api.getSupportedInstitutions({type:e,meta:{currency_code:t}})}async getSupportedCurrencies(e){return this.api.getSupportedCurrencies({type:e,meta:{currency:""}})}async getSupportedCountries(e,t){return this.api.getSupportedCountries({type:e,meta:{currency:t,country:""}})}async getSupportedNetworks(e,t,r){return this.api.getSupportedNetworks({type:e,meta:{currency:t,country:r,network:""}})}async payWithUSSD(e,t){return this.api.createPaymentMethod({type:"ussd",order_reference_code:e,meta:{institution:t}})}async payWithTransfer(e,t,r,s){return this.api.createPaymentMethod({type:"dynamic_virtual_account",order_reference_code:e,meta:{prefix:t,firstname:r,lastname:s}})}async payByBank(e,t,r){return this.api.createPaymentMethod({type:"pay_by_bank",order_reference_code:e,meta:{phone_number:t,name:r}})}async payWithMobileMoney(e,t,r,s){return this.api.createPaymentMethod({type:"mobile_money",order_reference_code:e,meta:{network:t,phone_number:r,account_name:s}})}async payWithStaticAccount(e,t={}){return this.api.createPaymentMethod({type:"static_virtual_account",order_reference_code:e,meta:t})}async payWithCrypto(e,t){return this.api.createPaymentMethod({type:"pay_with_crypto",order_reference_code:e,meta:{from_address:t||""}})}async confirmCryptoPayment(e,t){return this.api.confirmPaymentMethod({type:"pay_with_crypto",order_reference_code:e,meta:{tx_hash:t}})}async resendOTP(e,t){let r=await a(t);return this.api.resendOTP({type:"card",order_reference_code:e,meta:{card_details:r}})}async authorizeOTP(e,t,r,s){let o=await a(t);return this.api.authorizeOTP({type:"card",order_reference_code:e,meta:{card_details:o,otp:r,paymentId:s}})}async authorize3DS(e){return this.api.authorize3DS({type:"card",order_reference_code:e})}async simulatePayment(e,t){return this.api.simulatePayment({order_reference_code:e,payment_status:t,order_status:t})}getConfig(){return this.config}getEnvironment(){return this.config.environment}getBaseUrl(){return this.config.environment==="live"?"https://api.moipayway.co":"https://dev.moipayway.co"}};export{i as ApiClient,m as MoiPayWay,S as PAYMENT_METHOD_LABELS,a as encryptCardDetails,b as formatAmount,y as generateOrderReference,M as parseAllowedMethods};
|
|
15
15
|
//# sourceMappingURL=checkout.esm.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api.ts","../src/utils.ts","../src/encryption.ts","../src/MoiPayWay.ts"],"sourcesContent":["import type { MoiPayWayEnvironment } from './types';\n\nconst BASE_URLS: Record<MoiPayWayEnvironment, string> = {\n live: 'https://api.moipayway.co',\n test: 'https://dev.moipayway.co',\n};\n\nexport class ApiClient {\n private baseUrl: string;\n private apiKey: string;\n\n constructor(environment: MoiPayWayEnvironment, apiKey: string) {\n this.baseUrl = BASE_URLS[environment];\n this.apiKey = apiKey;\n }\n\n private async request<T>(endpoint: string, body: any): Promise<T> {\n const url = `${this.baseUrl}/${endpoint}`;\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n const data = await response.json();\n if (data.status === 'error' || data.status === 'failed') {\n throw new Error(data.message || 'Request failed');\n }\n return data;\n }\n\n async initiatePayment(payload: any) {\n return this.request('wallet/collection/initiate', payload);\n }\n\n async getPaymentInfo(orderReferenceCode: string) {\n return this.request('wallet/collection/info', {\n order_reference_code: orderReferenceCode,\n });\n }\n\n async createPaymentMethod(payload: any) {\n return this.request('wallet/collection/method/create', payload);\n }\n\n async getSupportedInstitutions(payload: any) {\n return this.request('wallet/collection/method/supported-institutions', payload);\n }\n\n async getSupportedCurrencies(payload: any) {\n return this.request('wallet/collection/method/supported-currencies', payload);\n }\n\n async getSupportedCountries(payload: any) {\n return this.request('wallet/collection/method/supported-countries', payload);\n }\n\n async getSupportedNetworks(payload: any) {\n return this.request('wallet/collection/method/supported-networks', payload);\n }\n\n async resendOTP(payload: any) {\n return this.request('wallet/collection/method/resend-otp', payload);\n }\n\n async authorizeOTP(payload: any) {\n return this.request('wallet/collection/method/authorize-otp', payload);\n }\n\n async authorize3DS(payload: any) {\n return this.request('wallet/collection/method/authorize-3ds', payload);\n }\n\n async confirmPaymentMethod(payload: any) {\n return this.request('wallet/collection/method/confirmation', payload);\n }\n\n async simulatePayment(payload: any) {\n return this.request('simulation/collection-order', payload);\n }\n}\n","export function generateOrderReference(length = 10): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n}\n\nexport function formatAmount(amount: string | number, currency = 'NGN'): string {\n const num = typeof amount === 'string' ? parseFloat(amount) : amount;\n const code = currency.toUpperCase();\n const formatted = num.toLocaleString('en', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n return `${code} ${formatted}`;\n}\n\nexport const PAYMENT_METHOD_LABELS: Record<string, { label: string; icon: string }> = {\n card: { label: 'Card Payment', icon: '💳' },\n ussd: { label: 'USSD', icon: '📱' },\n dynamic_virtual_account: { label: 'Pay with Transfer (One time)', icon: '🏦' },\n static_virtual_account: { label: 'Static Account', icon: '🏛️' },\n pay_with_crypto: { label: 'Pay with Crypto', icon: '🪙' },\n pay_by_bank: { label: 'Pay by Bank', icon: '🔗' },\n mobile_money: { label: 'Mobile Money', icon: '📲' },\n};\n","const PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwl+N8sgsM2DPFLvBRwyx\n55yNdSzZYucBzTwrRhE7qpc9i69hDhKAGukXvqm2R/HGHjKRPCojTDgEpZEPqE0d\nd7oD2gq9pLKk5XmOGNSCIyL3HsHNhLKSSonrTeDkBfrVp0DJ/pw1pLQRz6bbWIYL\nILLaBJ35B5wlcwzlQz+m3INH/RkfTSsji/aToITdwmLeREJ3/c+eBxWkU5nTXLub\niUyoN47FMimXzfIUgIxAtrlOuilKY37Ft6T4JJvDcNU1EVdiv/YX7OMUFbwxeTOn\nRhkhNKWwsDUc1JHp/AuW5P6tGMA0XxDXIFGrkcBGIrgOgyvbydcOQTcLBCgB3+qt\n18R/Yup0LR7ut/rF98EOfu3JiKiBfCh2o89dmmaeHdgIi7CyepU31e0JQCCAKG2l\nRTvqdMZkWfLH1EK7G+HgKdF08Dbuy+bguV/gRF09Hp16vEl2bKZL1Pk5mJc0JBM2\n7eDqXorXmym6v9h6ugu4Anc85u6fORN3WabRcLMLbRBfr1j/B9cETlGNNQ8zlBmJ\nQya765pNonNXC5AMJqgDm9uk9fmGBwc68UPALx8+PO4/GyHkM4u0ITtnvvNtdK5d\nG62wC4dQhOCfr/eJoiplefGGuir3MMCqyOi+zWe+HlKQpVcpS285Y5aPE3WmDl09\n9qYq6sb+UBuCIzag7FECy8MCAwEAAQ==\n-----END PUBLIC KEY-----`;\n\nfunction pemToArrayBuffer(pem: string): ArrayBuffer {\n const b64 = pem\n .replace(/-----BEGIN PUBLIC KEY-----/, '')\n .replace(/-----END PUBLIC KEY-----/, '')\n .replace(/[\\s\\n\\r]/g, '');\n const bin = atob(b64);\n const bytes = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);\n return bytes.buffer;\n}\n\nfunction arrayBufferToBase64(buf: ArrayBuffer): string {\n const bytes = new Uint8Array(buf);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i]);\n return btoa(binary);\n}\n\nfunction randomHex(byteCount: number): string {\n const bytes = crypto.getRandomValues(new Uint8Array(byteCount));\n return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Matches PHP: encryptUsingMPW()\n * RSA-OAEP(SHA-1) + AES-256-GCM(tag16) + AAD=salt\n */\nexport async function encryptCardDetails(\n cardDetails: { pan: string; expire_month: string; expire_year: string; cvv: string; pin: string; phone_number?: string; holder_name?: string; street?: string; country_code?: string; state?: string; city?: string; postal_code?: string },\n salt: string = '',\n ttlSeconds: number = 300\n): Promise<string> {\n try {\n const encoder = new TextEncoder();\n\n // 1. Build payload (matches PHP structure — data is a STRING, not object)\n const cardString = JSON.stringify({\n phone_number: cardDetails.phone_number || '',\n holder_name: cardDetails.holder_name || '',\n pan: cardDetails.pan,\n expire_month: cardDetails.expire_month,\n expire_year: cardDetails.expire_year,\n cvv: cardDetails.cvv,\n pin: cardDetails.pin,\n street: cardDetails.street || '',\n country_code: cardDetails.country_code || '',\n state: cardDetails.state || '',\n city: cardDetails.city || '',\n postal_code: cardDetails.postal_code || '',\n });\n const payload = {\n data: cardString,\n ts: Math.floor(Date.now() / 1000),\n ttl: ttlSeconds < 0 ? 300 : ttlSeconds,\n nonce: randomHex(16),\n };\n const plain = JSON.stringify(payload);\n\n // 2. Generate AES-256 key (32 bytes) + GCM IV (12 bytes)\n const aesKeyRaw = crypto.getRandomValues(new Uint8Array(32));\n const iv = crypto.getRandomValues(new Uint8Array(12));\n\n // 3. Import AES key\n const aesKey = await crypto.subtle.importKey(\n 'raw', aesKeyRaw, { name: 'AES-GCM' }, false, ['encrypt']\n );\n\n // 4. AES-256-GCM encrypt with salt as AAD, 128-bit tag\n const aesParams: AesGcmParams = {\n name: 'AES-GCM',\n iv,\n tagLength: 128,\n };\n if (salt) {\n aesParams.additionalData = encoder.encode(salt);\n }\n\n const cipherAndTag = await crypto.subtle.encrypt(aesParams, aesKey, encoder.encode(plain));\n\n // Web Crypto appends tag to ciphertext; split them\n const cipherAndTagBytes = new Uint8Array(cipherAndTag);\n const ct = cipherAndTagBytes.slice(0, cipherAndTagBytes.length - 16);\n const tag = cipherAndTagBytes.slice(cipherAndTagBytes.length - 16);\n\n // 5. RSA-OAEP (SHA-1) wrap the AES key\n const rsaKey = await crypto.subtle.importKey(\n 'spki',\n pemToArrayBuffer(PUBLIC_KEY),\n { name: 'RSA-OAEP', hash: 'SHA-1' },\n false,\n ['encrypt']\n );\n const ek = await crypto.subtle.encrypt({ name: 'RSA-OAEP' }, rsaKey, aesKeyRaw);\n\n // 6. Build package (matches PHP output)\n const pkg = JSON.stringify({\n alg: 'RSA-OAEP(SHA1)+AES-256-GCM(tag16)+AAD=salt',\n ek: arrayBufferToBase64(ek),\n iv: arrayBufferToBase64(iv.buffer),\n ct: arrayBufferToBase64(ct.buffer),\n tag: arrayBufferToBase64(tag.buffer),\n });\n\n // 7. Base64 encode the entire package\n return btoa(pkg);\n } catch (err) {\n console.error('Encryption error:', err);\n throw new Error('Card encryption failed. Please try again.');\n }\n}\n","import { ApiClient } from './api';\nimport { generateOrderReference } from './utils';\nimport { encryptCardDetails } from './encryption';\nimport type {\n MoiPayWayConfig,\n InitiatePayload,\n PaymentMeta,\n CardDetails,\n ApiResponse,\n CardResponse,\n PaymentInfoResponse,\n InstitutionItem,\n} from './types';\n\nexport class MoiPayWay {\n private config: MoiPayWayConfig;\n private api: ApiClient;\n\n constructor(config: MoiPayWayConfig) {\n this.config = {\n displayMode: 'popup',\n ...config,\n };\n this.api = new ApiClient(config.environment, config.apiKey);\n }\n\n async initiate(meta: PaymentMeta, orderReferenceCode?: string): Promise<ApiResponse> {\n const payload: InitiatePayload = {\n order_reference_code: orderReferenceCode || generateOrderReference(),\n meta,\n };\n return this.api.initiatePayment(payload) as Promise<ApiResponse>;\n }\n\n async getPaymentInfo(orderReferenceCode: string): Promise<ApiResponse<PaymentInfoResponse>> {\n return this.api.getPaymentInfo(orderReferenceCode) as Promise<ApiResponse<PaymentInfoResponse>>;\n }\n\n async payWithCard(\n orderReferenceCode: string,\n cardDetails: CardDetails\n ): Promise<ApiResponse<CardResponse>> {\n const encrypted = await encryptCardDetails(cardDetails);\n return this.api.createPaymentMethod({\n type: 'card',\n order_reference_code: orderReferenceCode,\n meta: { card_details: encrypted },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async getSupportedInstitutions(type: string, currencyCode: string): Promise<ApiResponse<InstitutionItem[]>> {\n return this.api.getSupportedInstitutions({\n type,\n meta: { currency_code: currencyCode },\n }) as Promise<ApiResponse<InstitutionItem[]>>;\n }\n\n async getSupportedCurrencies(type: string): Promise<ApiResponse<{ currency: string }[]>> {\n return this.api.getSupportedCurrencies({\n type,\n meta: { currency: '' },\n }) as Promise<ApiResponse<{ currency: string }[]>>;\n }\n\n async getSupportedCountries(type: string, currency: string): Promise<ApiResponse<{ country: string; currency: string }[]>> {\n return this.api.getSupportedCountries({\n type,\n meta: { currency, country: '' },\n }) as Promise<ApiResponse<{ country: string; currency: string }[]>>;\n }\n\n async getSupportedNetworks(type: string, currency: string, country: string): Promise<ApiResponse<{ network: string; country: string; currency: string }[]>> {\n return this.api.getSupportedNetworks({\n type,\n meta: { currency, country, network: '' },\n }) as Promise<ApiResponse<{ network: string; country: string; currency: string }[]>>;\n }\n\n async payWithUSSD(\n orderReferenceCode: string,\n institution: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'ussd',\n order_reference_code: orderReferenceCode,\n meta: { institution },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payWithTransfer(\n orderReferenceCode: string,\n prefix: string,\n firstname: string,\n lastname: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'dynamic_virtual_account',\n order_reference_code: orderReferenceCode,\n meta: { prefix, firstname, lastname },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payByBank(\n orderReferenceCode: string,\n phoneNumber: string,\n name: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'pay_by_bank',\n order_reference_code: orderReferenceCode,\n meta: { phone_number: phoneNumber, name },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payWithMobileMoney(\n orderReferenceCode: string,\n network: string,\n phoneNumber: string,\n accountName: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'mobile_money',\n order_reference_code: orderReferenceCode,\n meta: { network, phone_number: phoneNumber, account_name: accountName },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payWithStaticAccount(\n orderReferenceCode: string,\n meta: Record<string, string> = {}\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'static_virtual_account',\n order_reference_code: orderReferenceCode,\n meta,\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payWithCrypto(\n orderReferenceCode: string,\n fromAddress?: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'pay_with_crypto',\n order_reference_code: orderReferenceCode,\n meta: { from_address: fromAddress || '' },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async confirmCryptoPayment(\n orderReferenceCode: string,\n txHash: string\n ): Promise<ApiResponse> {\n return this.api.confirmPaymentMethod({\n type: 'pay_with_crypto',\n order_reference_code: orderReferenceCode,\n meta: { tx_hash: txHash },\n }) as Promise<ApiResponse>;\n }\n\n async resendOTP(\n orderReferenceCode: string,\n cardDetails: CardDetails\n ): Promise<ApiResponse> {\n const encrypted = await encryptCardDetails(cardDetails);\n return this.api.resendOTP({\n type: 'card',\n order_reference_code: orderReferenceCode,\n meta: { card_details: encrypted },\n }) as Promise<ApiResponse>;\n }\n\n async authorizeOTP(\n orderReferenceCode: string,\n cardDetails: CardDetails,\n otp: string,\n paymentId: string\n ): Promise<ApiResponse<CardResponse>> {\n const encrypted = await encryptCardDetails(cardDetails);\n return this.api.authorizeOTP({\n type: 'card',\n order_reference_code: orderReferenceCode,\n meta: { card_details: encrypted, otp, paymentId },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async authorize3DS(orderReferenceCode: string): Promise<ApiResponse<CardResponse>> {\n return this.api.authorize3DS({\n type: 'card',\n order_reference_code: orderReferenceCode,\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async simulatePayment(\n orderReferenceCode: string,\n paymentStatus: 'Successful' | 'Failed'\n ): Promise<ApiResponse> {\n return this.api.simulatePayment({\n order_reference_code: orderReferenceCode,\n payment_status: paymentStatus,\n order_status: paymentStatus,\n }) as Promise<ApiResponse>;\n }\n\n getConfig() {\n return this.config;\n }\n\n getEnvironment() {\n return this.config.environment;\n }\n\n getBaseUrl() {\n return this.config.environment === 'live'\n ? 'https://api.moipayway.co'\n : 'https://dev.moipayway.co';\n }\n}\n\nexport type { MoiPayWayConfig, PaymentMeta, CardDetails, PaymentMethod, DisplayMode } from './types';\n"],"mappings":"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","names":["BASE_URLS","ApiClient","environment","apiKey","endpoint","body","url","data","payload","orderReferenceCode","generateOrderReference","length","chars","result","i","PUBLIC_KEY","pemToArrayBuffer","pem","b64","bin","bytes","i","arrayBufferToBase64","buf","binary","randomHex","byteCount","b","encryptCardDetails","cardDetails","salt","ttlSeconds","encoder","payload","plain","aesKeyRaw","iv","aesKey","aesParams","cipherAndTag","cipherAndTagBytes","ct","tag","rsaKey","ek","pkg","err","MoiPayWay","config","ApiClient","meta","orderReferenceCode","payload","generateOrderReference","cardDetails","encrypted","encryptCardDetails","type","currencyCode","currency","country","institution","prefix","firstname","lastname","phoneNumber","name","network","accountName","fromAddress","txHash","otp","paymentId","paymentStatus"]}
|
|
1
|
+
{"version":3,"sources":["../src/api.ts","../src/utils.ts","../src/encryption.ts","../src/MoiPayWay.ts"],"sourcesContent":["import type { MoiPayWayEnvironment } from './types';\n\nconst BASE_URLS: Record<MoiPayWayEnvironment, string> = {\n live: 'https://api.moipayway.co',\n test: 'https://dev.moipayway.co',\n};\n\nexport class ApiClient {\n private baseUrl: string;\n private apiKey: string;\n\n constructor(environment: MoiPayWayEnvironment, apiKey: string) {\n this.baseUrl = BASE_URLS[environment];\n this.apiKey = apiKey;\n }\n\n updateApiKey(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n private async request<T>(endpoint: string, body: any): Promise<T> {\n const url = `${this.baseUrl}/${endpoint}`;\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n const data = await response.json();\n if (data.status === 'error' || data.status === 'failed') {\n throw new Error(data.message || 'Request failed');\n }\n return data;\n }\n\n async initiatePayment(payload: any) {\n return this.request('wallet/collection/initiate', payload);\n }\n\n async getPaymentInfo(orderReferenceCode: string) {\n return this.request('wallet/collection/info', {\n order_reference_code: orderReferenceCode,\n });\n }\n\n async createPaymentMethod(payload: any) {\n return this.request('wallet/collection/method/create', payload);\n }\n\n async getSupportedInstitutions(payload: any) {\n return this.request('wallet/collection/method/supported-institutions', payload);\n }\n\n async getSupportedCurrencies(payload: any) {\n return this.request('wallet/collection/method/supported-currencies', payload);\n }\n\n async getSupportedCountries(payload: any) {\n return this.request('wallet/collection/method/supported-countries', payload);\n }\n\n async getSupportedNetworks(payload: any) {\n return this.request('wallet/collection/method/supported-networks', payload);\n }\n\n async resendOTP(payload: any) {\n return this.request('wallet/collection/method/resend-otp', payload);\n }\n\n async authorizeOTP(payload: any) {\n return this.request('wallet/collection/method/authorize-otp', payload);\n }\n\n async authorize3DS(payload: any) {\n return this.request('wallet/collection/method/authorize-3ds', payload);\n }\n\n async confirmPaymentMethod(payload: any) {\n return this.request('wallet/collection/method/confirmation', payload);\n }\n\n async simulatePayment(payload: any) {\n return this.request('simulation/collection-order', payload);\n }\n}\n","export function generateOrderReference(length = 10): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n}\n\nexport function formatAmount(amount: string | number, currency = 'NGN'): string {\n const num = typeof amount === 'string' ? parseFloat(amount) : amount;\n const code = currency.toUpperCase();\n const formatted = num.toLocaleString('en', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n return `${code} ${formatted}`;\n}\n\n/**\n * Parse allowed payment methods from API response.\n * The API returns payment_method.allowed as a JSON string like '[\"MOBILE_MONEY\"]'\n * with uppercase values that need to be normalized to lowercase with underscores.\n */\nexport function parseAllowedMethods(data: any): string[] | null {\n try {\n const raw = data?.payment_method?.allowed;\n if (!raw) return null;\n \n const parsed: string[] = typeof raw === 'string' ? JSON.parse(raw) : raw;\n if (!Array.isArray(parsed) || parsed.length === 0) return null;\n \n return parsed.map((m: string) => m.toLowerCase());\n } catch {\n return null;\n }\n}\n\nexport const PAYMENT_METHOD_LABELS: Record<string, { label: string; icon: string }> = {\n card: { label: 'Card Payment', icon: '💳' },\n ussd: { label: 'USSD', icon: '📱' },\n dynamic_virtual_account: { label: 'Pay with Transfer (One time)', icon: '🏦' },\n static_virtual_account: { label: 'Static Account', icon: '🏛️' },\n pay_with_crypto: { label: 'Pay with Crypto', icon: '🪙' },\n pay_by_bank: { label: 'Pay by Bank', icon: '🔗' },\n mobile_money: { label: 'Mobile Money', icon: '📲' },\n};\n","const PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwl+N8sgsM2DPFLvBRwyx\n55yNdSzZYucBzTwrRhE7qpc9i69hDhKAGukXvqm2R/HGHjKRPCojTDgEpZEPqE0d\nd7oD2gq9pLKk5XmOGNSCIyL3HsHNhLKSSonrTeDkBfrVp0DJ/pw1pLQRz6bbWIYL\nILLaBJ35B5wlcwzlQz+m3INH/RkfTSsji/aToITdwmLeREJ3/c+eBxWkU5nTXLub\niUyoN47FMimXzfIUgIxAtrlOuilKY37Ft6T4JJvDcNU1EVdiv/YX7OMUFbwxeTOn\nRhkhNKWwsDUc1JHp/AuW5P6tGMA0XxDXIFGrkcBGIrgOgyvbydcOQTcLBCgB3+qt\n18R/Yup0LR7ut/rF98EOfu3JiKiBfCh2o89dmmaeHdgIi7CyepU31e0JQCCAKG2l\nRTvqdMZkWfLH1EK7G+HgKdF08Dbuy+bguV/gRF09Hp16vEl2bKZL1Pk5mJc0JBM2\n7eDqXorXmym6v9h6ugu4Anc85u6fORN3WabRcLMLbRBfr1j/B9cETlGNNQ8zlBmJ\nQya765pNonNXC5AMJqgDm9uk9fmGBwc68UPALx8+PO4/GyHkM4u0ITtnvvNtdK5d\nG62wC4dQhOCfr/eJoiplefGGuir3MMCqyOi+zWe+HlKQpVcpS285Y5aPE3WmDl09\n9qYq6sb+UBuCIzag7FECy8MCAwEAAQ==\n-----END PUBLIC KEY-----`;\n\nfunction pemToArrayBuffer(pem: string): ArrayBuffer {\n const b64 = pem\n .replace(/-----BEGIN PUBLIC KEY-----/, '')\n .replace(/-----END PUBLIC KEY-----/, '')\n .replace(/[\\s\\n\\r]/g, '');\n const bin = atob(b64);\n const bytes = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);\n return bytes.buffer;\n}\n\nfunction arrayBufferToBase64(buf: ArrayBuffer): string {\n const bytes = new Uint8Array(buf);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i]);\n return btoa(binary);\n}\n\nfunction randomHex(byteCount: number): string {\n const bytes = crypto.getRandomValues(new Uint8Array(byteCount));\n return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Matches PHP: encryptUsingMPW()\n * RSA-OAEP(SHA-1) + AES-256-GCM(tag16) + AAD=salt\n */\nexport async function encryptCardDetails(\n cardDetails: { pan: string; expire_month: string; expire_year: string; cvv: string; pin: string; phone_number?: string; holder_name?: string; street?: string; country_code?: string; state?: string; city?: string; postal_code?: string },\n salt: string = '',\n ttlSeconds: number = 300\n): Promise<string> {\n try {\n const encoder = new TextEncoder();\n\n const cardString = JSON.stringify({\n phone_number: cardDetails.phone_number || '',\n holder_name: cardDetails.holder_name || '',\n pan: cardDetails.pan,\n expire_month: cardDetails.expire_month,\n expire_year: cardDetails.expire_year,\n cvv: cardDetails.cvv,\n pin: cardDetails.pin,\n street: cardDetails.street || '',\n country_code: cardDetails.country_code || '',\n state: cardDetails.state || '',\n city: cardDetails.city || '',\n postal_code: cardDetails.postal_code || '',\n });\n const payload = {\n data: cardString,\n ts: Math.floor(Date.now() / 1000),\n ttl: ttlSeconds < 0 ? 300 : ttlSeconds,\n nonce: randomHex(16),\n };\n const plain = JSON.stringify(payload);\n\n const aesKeyRaw = crypto.getRandomValues(new Uint8Array(32));\n const iv = crypto.getRandomValues(new Uint8Array(12));\n\n const aesKey = await crypto.subtle.importKey(\n 'raw', aesKeyRaw, { name: 'AES-GCM' }, false, ['encrypt']\n );\n\n const aesParams: AesGcmParams = {\n name: 'AES-GCM',\n iv,\n tagLength: 128,\n };\n if (salt) {\n aesParams.additionalData = encoder.encode(salt);\n }\n\n const cipherAndTag = await crypto.subtle.encrypt(aesParams, aesKey, encoder.encode(plain));\n\n const cipherAndTagBytes = new Uint8Array(cipherAndTag);\n const ct = cipherAndTagBytes.slice(0, cipherAndTagBytes.length - 16);\n const tag = cipherAndTagBytes.slice(cipherAndTagBytes.length - 16);\n\n const rsaKey = await crypto.subtle.importKey(\n 'spki',\n pemToArrayBuffer(PUBLIC_KEY),\n { name: 'RSA-OAEP', hash: 'SHA-1' },\n false,\n ['encrypt']\n );\n const ek = await crypto.subtle.encrypt({ name: 'RSA-OAEP' }, rsaKey, aesKeyRaw);\n\n const pkg = JSON.stringify({\n alg: 'RSA-OAEP(SHA1)+AES-256-GCM(tag16)+AAD=salt',\n ek: arrayBufferToBase64(ek),\n iv: arrayBufferToBase64(iv.buffer),\n ct: arrayBufferToBase64(ct.buffer),\n tag: arrayBufferToBase64(tag.buffer),\n });\n\n return btoa(pkg);\n } catch (err) {\n console.error('Encryption error:', err);\n throw new Error('Card encryption failed. Please try again.');\n }\n}\n","import { ApiClient } from './api';\nimport { generateOrderReference } from './utils';\nimport { encryptCardDetails } from './encryption';\nimport type {\n MoiPayWayConfig,\n InitiatePayload,\n PaymentMeta,\n CardDetails,\n ApiResponse,\n CardResponse,\n PaymentInfoResponse,\n InstitutionItem,\n} from './types';\n\nexport class MoiPayWay {\n private config: MoiPayWayConfig;\n private api: ApiClient;\n\n constructor(config: MoiPayWayConfig) {\n this.config = {\n displayMode: 'popup',\n ...config,\n };\n this.api = new ApiClient(config.environment, config.apiKey);\n }\n\n updateApiKey(apiKey: string) {\n this.config.apiKey = apiKey;\n this.api.updateApiKey(apiKey);\n }\n\n async initiate(meta: PaymentMeta, orderReferenceCode?: string): Promise<ApiResponse> {\n const payload: InitiatePayload = {\n order_reference_code: orderReferenceCode || generateOrderReference(),\n meta,\n };\n return this.api.initiatePayment(payload) as Promise<ApiResponse>;\n }\n\n async getPaymentInfo(orderReferenceCode: string): Promise<ApiResponse<PaymentInfoResponse>> {\n return this.api.getPaymentInfo(orderReferenceCode) as Promise<ApiResponse<PaymentInfoResponse>>;\n }\n\n async payWithCard(\n orderReferenceCode: string,\n cardDetails: CardDetails\n ): Promise<ApiResponse<CardResponse>> {\n const encrypted = await encryptCardDetails(cardDetails);\n return this.api.createPaymentMethod({\n type: 'card',\n order_reference_code: orderReferenceCode,\n meta: { card_details: encrypted },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async getSupportedInstitutions(type: string, currencyCode: string): Promise<ApiResponse<InstitutionItem[]>> {\n return this.api.getSupportedInstitutions({\n type,\n meta: { currency_code: currencyCode },\n }) as Promise<ApiResponse<InstitutionItem[]>>;\n }\n\n async getSupportedCurrencies(type: string): Promise<ApiResponse<{ currency: string }[]>> {\n return this.api.getSupportedCurrencies({\n type,\n meta: { currency: '' },\n }) as Promise<ApiResponse<{ currency: string }[]>>;\n }\n\n async getSupportedCountries(type: string, currency: string): Promise<ApiResponse<{ country: string; currency: string }[]>> {\n return this.api.getSupportedCountries({\n type,\n meta: { currency, country: '' },\n }) as Promise<ApiResponse<{ country: string; currency: string }[]>>;\n }\n\n async getSupportedNetworks(type: string, currency: string, country: string): Promise<ApiResponse<{ network: string; country: string; currency: string }[]>> {\n return this.api.getSupportedNetworks({\n type,\n meta: { currency, country, network: '' },\n }) as Promise<ApiResponse<{ network: string; country: string; currency: string }[]>>;\n }\n\n async payWithUSSD(\n orderReferenceCode: string,\n institution: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'ussd',\n order_reference_code: orderReferenceCode,\n meta: { institution },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payWithTransfer(\n orderReferenceCode: string,\n prefix: string,\n firstname: string,\n lastname: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'dynamic_virtual_account',\n order_reference_code: orderReferenceCode,\n meta: { prefix, firstname, lastname },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payByBank(\n orderReferenceCode: string,\n phoneNumber: string,\n name: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'pay_by_bank',\n order_reference_code: orderReferenceCode,\n meta: { phone_number: phoneNumber, name },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payWithMobileMoney(\n orderReferenceCode: string,\n network: string,\n phoneNumber: string,\n accountName: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'mobile_money',\n order_reference_code: orderReferenceCode,\n meta: { network, phone_number: phoneNumber, account_name: accountName },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payWithStaticAccount(\n orderReferenceCode: string,\n meta: Record<string, string> = {}\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'static_virtual_account',\n order_reference_code: orderReferenceCode,\n meta,\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payWithCrypto(\n orderReferenceCode: string,\n fromAddress?: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'pay_with_crypto',\n order_reference_code: orderReferenceCode,\n meta: { from_address: fromAddress || '' },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async confirmCryptoPayment(\n orderReferenceCode: string,\n txHash: string\n ): Promise<ApiResponse> {\n return this.api.confirmPaymentMethod({\n type: 'pay_with_crypto',\n order_reference_code: orderReferenceCode,\n meta: { tx_hash: txHash },\n }) as Promise<ApiResponse>;\n }\n\n async resendOTP(\n orderReferenceCode: string,\n cardDetails: CardDetails\n ): Promise<ApiResponse> {\n const encrypted = await encryptCardDetails(cardDetails);\n return this.api.resendOTP({\n type: 'card',\n order_reference_code: orderReferenceCode,\n meta: { card_details: encrypted },\n }) as Promise<ApiResponse>;\n }\n\n async authorizeOTP(\n orderReferenceCode: string,\n cardDetails: CardDetails,\n otp: string,\n paymentId: string\n ): Promise<ApiResponse<CardResponse>> {\n const encrypted = await encryptCardDetails(cardDetails);\n return this.api.authorizeOTP({\n type: 'card',\n order_reference_code: orderReferenceCode,\n meta: { card_details: encrypted, otp, paymentId },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async authorize3DS(orderReferenceCode: string): Promise<ApiResponse<CardResponse>> {\n return this.api.authorize3DS({\n type: 'card',\n order_reference_code: orderReferenceCode,\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async simulatePayment(\n orderReferenceCode: string,\n paymentStatus: 'Successful' | 'Failed'\n ): Promise<ApiResponse> {\n return this.api.simulatePayment({\n order_reference_code: orderReferenceCode,\n payment_status: paymentStatus,\n order_status: paymentStatus,\n }) as Promise<ApiResponse>;\n }\n\n getConfig() {\n return this.config;\n }\n\n getEnvironment() {\n return this.config.environment;\n }\n\n getBaseUrl() {\n return this.config.environment === 'live'\n ? 'https://api.moipayway.co'\n : 'https://dev.moipayway.co';\n }\n}\n\nexport type { MoiPayWayConfig, PaymentMeta, CardDetails, PaymentMethod, DisplayMode } from './types';\n"],"mappings":"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","names":["BASE_URLS","ApiClient","environment","apiKey","endpoint","body","url","data","payload","orderReferenceCode","generateOrderReference","length","chars","result","i","formatAmount","amount","currency","num","code","formatted","parseAllowedMethods","data","raw","parsed","m","PAYMENT_METHOD_LABELS","PUBLIC_KEY","pemToArrayBuffer","pem","b64","bin","bytes","i","arrayBufferToBase64","buf","binary","randomHex","byteCount","b","encryptCardDetails","cardDetails","salt","ttlSeconds","encoder","payload","plain","aesKeyRaw","iv","aesKey","aesParams","cipherAndTag","cipherAndTagBytes","ct","tag","rsaKey","ek","pkg","err","MoiPayWay","config","ApiClient","apiKey","meta","orderReferenceCode","payload","generateOrderReference","cardDetails","encrypted","encryptCardDetails","type","currencyCode","currency","country","institution","prefix","firstname","lastname","phoneNumber","name","network","accountName","fromAddress","txHash","otp","paymentId","paymentStatus"]}
|
package/dist/checkout.global.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var MoiPayWaySDK=(()=>{var u=Object.defineProperty;var
|
|
1
|
+
"use strict";var MoiPayWaySDK=(()=>{var u=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var I=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var B=(n,e)=>{for(var t in e)u(n,t,{get:e[t],enumerable:!0})},T=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of I(e))!v.call(n,s)&&s!==t&&u(n,s,{get:()=>e[s],enumerable:!(r=E(e,s))||r.enumerable});return n};var O=n=>T(u({},"__esModule",{value:!0}),n);var x={};B(x,{ApiClient:()=>i,MoiPayWay:()=>m,PAYMENT_METHOD_LABELS:()=>P,encryptCardDetails:()=>a,formatAmount:()=>h,generateOrderReference:()=>c,parseAllowedMethods:()=>f});var K={live:"https://api.moipayway.co",test:"https://dev.moipayway.co"},i=class{constructor(e,t){this.baseUrl=K[e],this.apiKey=t}updateApiKey(e){this.apiKey=e}async request(e,t){let r=`${this.baseUrl}/${e}`,o=await(await fetch(r,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify(t)})).json();if(o.status==="error"||o.status==="failed")throw new Error(o.message||"Request failed");return o}async initiatePayment(e){return this.request("wallet/collection/initiate",e)}async getPaymentInfo(e){return this.request("wallet/collection/info",{order_reference_code:e})}async createPaymentMethod(e){return this.request("wallet/collection/method/create",e)}async getSupportedInstitutions(e){return this.request("wallet/collection/method/supported-institutions",e)}async getSupportedCurrencies(e){return this.request("wallet/collection/method/supported-currencies",e)}async getSupportedCountries(e){return this.request("wallet/collection/method/supported-countries",e)}async getSupportedNetworks(e){return this.request("wallet/collection/method/supported-networks",e)}async resendOTP(e){return this.request("wallet/collection/method/resend-otp",e)}async authorizeOTP(e){return this.request("wallet/collection/method/authorize-otp",e)}async authorize3DS(e){return this.request("wallet/collection/method/authorize-3ds",e)}async confirmPaymentMethod(e){return this.request("wallet/collection/method/confirmation",e)}async simulatePayment(e){return this.request("simulation/collection-order",e)}};function c(n=10){let e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",t="";for(let r=0;r<n;r++)t+=e.charAt(Math.floor(Math.random()*e.length));return t}function h(n,e="NGN"){let t=typeof n=="string"?parseFloat(n):n,r=e.toUpperCase(),s=t.toLocaleString("en",{minimumFractionDigits:2,maximumFractionDigits:2});return`${r} ${s}`}function f(n){try{let e=n?.payment_method?.allowed;if(!e)return null;let t=typeof e=="string"?JSON.parse(e):e;return!Array.isArray(t)||t.length===0?null:t.map(r=>r.toLowerCase())}catch{return null}}var P={card:{label:"Card Payment",icon:"\u{1F4B3}"},ussd:{label:"USSD",icon:"\u{1F4F1}"},dynamic_virtual_account:{label:"Pay with Transfer (One time)",icon:"\u{1F3E6}"},static_virtual_account:{label:"Static Account",icon:"\u{1F3DB}\uFE0F"},pay_with_crypto:{label:"Pay with Crypto",icon:"\u{1FA99}"},pay_by_bank:{label:"Pay by Bank",icon:"\u{1F517}"},mobile_money:{label:"Mobile Money",icon:"\u{1F4F2}"}};var L=`-----BEGIN PUBLIC KEY-----
|
|
2
2
|
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwl+N8sgsM2DPFLvBRwyx
|
|
3
3
|
55yNdSzZYucBzTwrRhE7qpc9i69hDhKAGukXvqm2R/HGHjKRPCojTDgEpZEPqE0d
|
|
4
4
|
d7oD2gq9pLKk5XmOGNSCIyL3HsHNhLKSSonrTeDkBfrVp0DJ/pw1pLQRz6bbWIYL
|
|
@@ -11,5 +11,5 @@ RTvqdMZkWfLH1EK7G+HgKdF08Dbuy+bguV/gRF09Hp16vEl2bKZL1Pk5mJc0JBM2
|
|
|
11
11
|
Qya765pNonNXC5AMJqgDm9uk9fmGBwc68UPALx8+PO4/GyHkM4u0ITtnvvNtdK5d
|
|
12
12
|
G62wC4dQhOCfr/eJoiplefGGuir3MMCqyOi+zWe+HlKQpVcpS285Y5aPE3WmDl09
|
|
13
13
|
9qYq6sb+UBuCIzag7FECy8MCAwEAAQ==
|
|
14
|
-
-----END PUBLIC KEY-----`;function
|
|
14
|
+
-----END PUBLIC KEY-----`;function N(n){let e=n.replace(/-----BEGIN PUBLIC KEY-----/,"").replace(/-----END PUBLIC KEY-----/,"").replace(/[\s\n\r]/g,""),t=atob(e),r=new Uint8Array(t.length);for(let s=0;s<t.length;s++)r[s]=t.charCodeAt(s);return r.buffer}function y(n){let e=new Uint8Array(n),t="";for(let r=0;r<e.length;r++)t+=String.fromCharCode(e[r]);return btoa(t)}function k(n){let e=crypto.getRandomValues(new Uint8Array(n));return Array.from(e).map(t=>t.toString(16).padStart(2,"0")).join("")}async function a(n,e="",t=300){try{let r=new TextEncoder,o={data:JSON.stringify({phone_number:n.phone_number||"",holder_name:n.holder_name||"",pan:n.pan,expire_month:n.expire_month,expire_year:n.expire_year,cvv:n.cvv,pin:n.pin,street:n.street||"",country_code:n.country_code||"",state:n.state||"",city:n.city||"",postal_code:n.postal_code||""}),ts:Math.floor(Date.now()/1e3),ttl:t<0?300:t,nonce:k(16)},A=JSON.stringify(o),d=crypto.getRandomValues(new Uint8Array(32)),l=crypto.getRandomValues(new Uint8Array(12)),R=await crypto.subtle.importKey("raw",d,{name:"AES-GCM"},!1,["encrypt"]),g={name:"AES-GCM",iv:l,tagLength:128};e&&(g.additionalData=r.encode(e));let C=await crypto.subtle.encrypt(g,R,r.encode(A)),p=new Uint8Array(C),_=p.slice(0,p.length-16),w=p.slice(p.length-16),b=await crypto.subtle.importKey("spki",N(L),{name:"RSA-OAEP",hash:"SHA-1"},!1,["encrypt"]),M=await crypto.subtle.encrypt({name:"RSA-OAEP"},b,d),S=JSON.stringify({alg:"RSA-OAEP(SHA1)+AES-256-GCM(tag16)+AAD=salt",ek:y(M),iv:y(l.buffer),ct:y(_.buffer),tag:y(w.buffer)});return btoa(S)}catch(r){throw console.error("Encryption error:",r),new Error("Card encryption failed. Please try again.")}}var m=class{constructor(e){this.config={displayMode:"popup",...e},this.api=new i(e.environment,e.apiKey)}updateApiKey(e){this.config.apiKey=e,this.api.updateApiKey(e)}async initiate(e,t){let r={order_reference_code:t||c(),meta:e};return this.api.initiatePayment(r)}async getPaymentInfo(e){return this.api.getPaymentInfo(e)}async payWithCard(e,t){let r=await a(t);return this.api.createPaymentMethod({type:"card",order_reference_code:e,meta:{card_details:r}})}async getSupportedInstitutions(e,t){return this.api.getSupportedInstitutions({type:e,meta:{currency_code:t}})}async getSupportedCurrencies(e){return this.api.getSupportedCurrencies({type:e,meta:{currency:""}})}async getSupportedCountries(e,t){return this.api.getSupportedCountries({type:e,meta:{currency:t,country:""}})}async getSupportedNetworks(e,t,r){return this.api.getSupportedNetworks({type:e,meta:{currency:t,country:r,network:""}})}async payWithUSSD(e,t){return this.api.createPaymentMethod({type:"ussd",order_reference_code:e,meta:{institution:t}})}async payWithTransfer(e,t,r,s){return this.api.createPaymentMethod({type:"dynamic_virtual_account",order_reference_code:e,meta:{prefix:t,firstname:r,lastname:s}})}async payByBank(e,t,r){return this.api.createPaymentMethod({type:"pay_by_bank",order_reference_code:e,meta:{phone_number:t,name:r}})}async payWithMobileMoney(e,t,r,s){return this.api.createPaymentMethod({type:"mobile_money",order_reference_code:e,meta:{network:t,phone_number:r,account_name:s}})}async payWithStaticAccount(e,t={}){return this.api.createPaymentMethod({type:"static_virtual_account",order_reference_code:e,meta:t})}async payWithCrypto(e,t){return this.api.createPaymentMethod({type:"pay_with_crypto",order_reference_code:e,meta:{from_address:t||""}})}async confirmCryptoPayment(e,t){return this.api.confirmPaymentMethod({type:"pay_with_crypto",order_reference_code:e,meta:{tx_hash:t}})}async resendOTP(e,t){let r=await a(t);return this.api.resendOTP({type:"card",order_reference_code:e,meta:{card_details:r}})}async authorizeOTP(e,t,r,s){let o=await a(t);return this.api.authorizeOTP({type:"card",order_reference_code:e,meta:{card_details:o,otp:r,paymentId:s}})}async authorize3DS(e){return this.api.authorize3DS({type:"card",order_reference_code:e})}async simulatePayment(e,t){return this.api.simulatePayment({order_reference_code:e,payment_status:t,order_status:t})}getConfig(){return this.config}getEnvironment(){return this.config.environment}getBaseUrl(){return this.config.environment==="live"?"https://api.moipayway.co":"https://dev.moipayway.co"}};return O(x);})();
|
|
15
15
|
//# sourceMappingURL=checkout.global.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/api.ts","../src/utils.ts","../src/encryption.ts","../src/MoiPayWay.ts"],"sourcesContent":["export { MoiPayWay } from './MoiPayWay';\nexport { ApiClient } from './api';\nexport { encryptCardDetails } from './encryption';\nexport { generateOrderReference } from './utils';\n\nexport type {\n MoiPayWayConfig,\n MoiPayWayEnvironment,\n PaymentMeta,\n PaymentMethod,\n DisplayMode,\n CardDetails,\n ApiResponse,\n CardResponse,\n PaymentInfoResponse,\n InstitutionItem,\n WhiteLabelTheme,\n WhiteLabelContent,\n SplitConfig,\n SplitWallet,\n CheckoutStep,\n} from './types';\n","import type { MoiPayWayEnvironment } from './types';\n\nconst BASE_URLS: Record<MoiPayWayEnvironment, string> = {\n live: 'https://api.moipayway.co',\n test: 'https://dev.moipayway.co',\n};\n\nexport class ApiClient {\n private baseUrl: string;\n private apiKey: string;\n\n constructor(environment: MoiPayWayEnvironment, apiKey: string) {\n this.baseUrl = BASE_URLS[environment];\n this.apiKey = apiKey;\n }\n\n private async request<T>(endpoint: string, body: any): Promise<T> {\n const url = `${this.baseUrl}/${endpoint}`;\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n const data = await response.json();\n if (data.status === 'error' || data.status === 'failed') {\n throw new Error(data.message || 'Request failed');\n }\n return data;\n }\n\n async initiatePayment(payload: any) {\n return this.request('wallet/collection/initiate', payload);\n }\n\n async getPaymentInfo(orderReferenceCode: string) {\n return this.request('wallet/collection/info', {\n order_reference_code: orderReferenceCode,\n });\n }\n\n async createPaymentMethod(payload: any) {\n return this.request('wallet/collection/method/create', payload);\n }\n\n async getSupportedInstitutions(payload: any) {\n return this.request('wallet/collection/method/supported-institutions', payload);\n }\n\n async getSupportedCurrencies(payload: any) {\n return this.request('wallet/collection/method/supported-currencies', payload);\n }\n\n async getSupportedCountries(payload: any) {\n return this.request('wallet/collection/method/supported-countries', payload);\n }\n\n async getSupportedNetworks(payload: any) {\n return this.request('wallet/collection/method/supported-networks', payload);\n }\n\n async resendOTP(payload: any) {\n return this.request('wallet/collection/method/resend-otp', payload);\n }\n\n async authorizeOTP(payload: any) {\n return this.request('wallet/collection/method/authorize-otp', payload);\n }\n\n async authorize3DS(payload: any) {\n return this.request('wallet/collection/method/authorize-3ds', payload);\n }\n\n async confirmPaymentMethod(payload: any) {\n return this.request('wallet/collection/method/confirmation', payload);\n }\n\n async simulatePayment(payload: any) {\n return this.request('simulation/collection-order', payload);\n }\n}\n","export function generateOrderReference(length = 10): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n}\n\nexport function formatAmount(amount: string | number, currency = 'NGN'): string {\n const num = typeof amount === 'string' ? parseFloat(amount) : amount;\n const code = currency.toUpperCase();\n const formatted = num.toLocaleString('en', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n return `${code} ${formatted}`;\n}\n\nexport const PAYMENT_METHOD_LABELS: Record<string, { label: string; icon: string }> = {\n card: { label: 'Card Payment', icon: '💳' },\n ussd: { label: 'USSD', icon: '📱' },\n dynamic_virtual_account: { label: 'Pay with Transfer (One time)', icon: '🏦' },\n static_virtual_account: { label: 'Static Account', icon: '🏛️' },\n pay_with_crypto: { label: 'Pay with Crypto', icon: '🪙' },\n pay_by_bank: { label: 'Pay by Bank', icon: '🔗' },\n mobile_money: { label: 'Mobile Money', icon: '📲' },\n};\n","const PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwl+N8sgsM2DPFLvBRwyx\n55yNdSzZYucBzTwrRhE7qpc9i69hDhKAGukXvqm2R/HGHjKRPCojTDgEpZEPqE0d\nd7oD2gq9pLKk5XmOGNSCIyL3HsHNhLKSSonrTeDkBfrVp0DJ/pw1pLQRz6bbWIYL\nILLaBJ35B5wlcwzlQz+m3INH/RkfTSsji/aToITdwmLeREJ3/c+eBxWkU5nTXLub\niUyoN47FMimXzfIUgIxAtrlOuilKY37Ft6T4JJvDcNU1EVdiv/YX7OMUFbwxeTOn\nRhkhNKWwsDUc1JHp/AuW5P6tGMA0XxDXIFGrkcBGIrgOgyvbydcOQTcLBCgB3+qt\n18R/Yup0LR7ut/rF98EOfu3JiKiBfCh2o89dmmaeHdgIi7CyepU31e0JQCCAKG2l\nRTvqdMZkWfLH1EK7G+HgKdF08Dbuy+bguV/gRF09Hp16vEl2bKZL1Pk5mJc0JBM2\n7eDqXorXmym6v9h6ugu4Anc85u6fORN3WabRcLMLbRBfr1j/B9cETlGNNQ8zlBmJ\nQya765pNonNXC5AMJqgDm9uk9fmGBwc68UPALx8+PO4/GyHkM4u0ITtnvvNtdK5d\nG62wC4dQhOCfr/eJoiplefGGuir3MMCqyOi+zWe+HlKQpVcpS285Y5aPE3WmDl09\n9qYq6sb+UBuCIzag7FECy8MCAwEAAQ==\n-----END PUBLIC KEY-----`;\n\nfunction pemToArrayBuffer(pem: string): ArrayBuffer {\n const b64 = pem\n .replace(/-----BEGIN PUBLIC KEY-----/, '')\n .replace(/-----END PUBLIC KEY-----/, '')\n .replace(/[\\s\\n\\r]/g, '');\n const bin = atob(b64);\n const bytes = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);\n return bytes.buffer;\n}\n\nfunction arrayBufferToBase64(buf: ArrayBuffer): string {\n const bytes = new Uint8Array(buf);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i]);\n return btoa(binary);\n}\n\nfunction randomHex(byteCount: number): string {\n const bytes = crypto.getRandomValues(new Uint8Array(byteCount));\n return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Matches PHP: encryptUsingMPW()\n * RSA-OAEP(SHA-1) + AES-256-GCM(tag16) + AAD=salt\n */\nexport async function encryptCardDetails(\n cardDetails: { pan: string; expire_month: string; expire_year: string; cvv: string; pin: string; phone_number?: string; holder_name?: string; street?: string; country_code?: string; state?: string; city?: string; postal_code?: string },\n salt: string = '',\n ttlSeconds: number = 300\n): Promise<string> {\n try {\n const encoder = new TextEncoder();\n\n // 1. Build payload (matches PHP structure — data is a STRING, not object)\n const cardString = JSON.stringify({\n phone_number: cardDetails.phone_number || '',\n holder_name: cardDetails.holder_name || '',\n pan: cardDetails.pan,\n expire_month: cardDetails.expire_month,\n expire_year: cardDetails.expire_year,\n cvv: cardDetails.cvv,\n pin: cardDetails.pin,\n street: cardDetails.street || '',\n country_code: cardDetails.country_code || '',\n state: cardDetails.state || '',\n city: cardDetails.city || '',\n postal_code: cardDetails.postal_code || '',\n });\n const payload = {\n data: cardString,\n ts: Math.floor(Date.now() / 1000),\n ttl: ttlSeconds < 0 ? 300 : ttlSeconds,\n nonce: randomHex(16),\n };\n const plain = JSON.stringify(payload);\n\n // 2. Generate AES-256 key (32 bytes) + GCM IV (12 bytes)\n const aesKeyRaw = crypto.getRandomValues(new Uint8Array(32));\n const iv = crypto.getRandomValues(new Uint8Array(12));\n\n // 3. Import AES key\n const aesKey = await crypto.subtle.importKey(\n 'raw', aesKeyRaw, { name: 'AES-GCM' }, false, ['encrypt']\n );\n\n // 4. AES-256-GCM encrypt with salt as AAD, 128-bit tag\n const aesParams: AesGcmParams = {\n name: 'AES-GCM',\n iv,\n tagLength: 128,\n };\n if (salt) {\n aesParams.additionalData = encoder.encode(salt);\n }\n\n const cipherAndTag = await crypto.subtle.encrypt(aesParams, aesKey, encoder.encode(plain));\n\n // Web Crypto appends tag to ciphertext; split them\n const cipherAndTagBytes = new Uint8Array(cipherAndTag);\n const ct = cipherAndTagBytes.slice(0, cipherAndTagBytes.length - 16);\n const tag = cipherAndTagBytes.slice(cipherAndTagBytes.length - 16);\n\n // 5. RSA-OAEP (SHA-1) wrap the AES key\n const rsaKey = await crypto.subtle.importKey(\n 'spki',\n pemToArrayBuffer(PUBLIC_KEY),\n { name: 'RSA-OAEP', hash: 'SHA-1' },\n false,\n ['encrypt']\n );\n const ek = await crypto.subtle.encrypt({ name: 'RSA-OAEP' }, rsaKey, aesKeyRaw);\n\n // 6. Build package (matches PHP output)\n const pkg = JSON.stringify({\n alg: 'RSA-OAEP(SHA1)+AES-256-GCM(tag16)+AAD=salt',\n ek: arrayBufferToBase64(ek),\n iv: arrayBufferToBase64(iv.buffer),\n ct: arrayBufferToBase64(ct.buffer),\n tag: arrayBufferToBase64(tag.buffer),\n });\n\n // 7. Base64 encode the entire package\n return btoa(pkg);\n } catch (err) {\n console.error('Encryption error:', err);\n throw new Error('Card encryption failed. Please try again.');\n }\n}\n","import { ApiClient } from './api';\nimport { generateOrderReference } from './utils';\nimport { encryptCardDetails } from './encryption';\nimport type {\n MoiPayWayConfig,\n InitiatePayload,\n PaymentMeta,\n CardDetails,\n ApiResponse,\n CardResponse,\n PaymentInfoResponse,\n InstitutionItem,\n} from './types';\n\nexport class MoiPayWay {\n private config: MoiPayWayConfig;\n private api: ApiClient;\n\n constructor(config: MoiPayWayConfig) {\n this.config = {\n displayMode: 'popup',\n ...config,\n };\n this.api = new ApiClient(config.environment, config.apiKey);\n }\n\n async initiate(meta: PaymentMeta, orderReferenceCode?: string): Promise<ApiResponse> {\n const payload: InitiatePayload = {\n order_reference_code: orderReferenceCode || generateOrderReference(),\n meta,\n };\n return this.api.initiatePayment(payload) as Promise<ApiResponse>;\n }\n\n async getPaymentInfo(orderReferenceCode: string): Promise<ApiResponse<PaymentInfoResponse>> {\n return this.api.getPaymentInfo(orderReferenceCode) as Promise<ApiResponse<PaymentInfoResponse>>;\n }\n\n async payWithCard(\n orderReferenceCode: string,\n cardDetails: CardDetails\n ): Promise<ApiResponse<CardResponse>> {\n const encrypted = await encryptCardDetails(cardDetails);\n return this.api.createPaymentMethod({\n type: 'card',\n order_reference_code: orderReferenceCode,\n meta: { card_details: encrypted },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async getSupportedInstitutions(type: string, currencyCode: string): Promise<ApiResponse<InstitutionItem[]>> {\n return this.api.getSupportedInstitutions({\n type,\n meta: { currency_code: currencyCode },\n }) as Promise<ApiResponse<InstitutionItem[]>>;\n }\n\n async getSupportedCurrencies(type: string): Promise<ApiResponse<{ currency: string }[]>> {\n return this.api.getSupportedCurrencies({\n type,\n meta: { currency: '' },\n }) as Promise<ApiResponse<{ currency: string }[]>>;\n }\n\n async getSupportedCountries(type: string, currency: string): Promise<ApiResponse<{ country: string; currency: string }[]>> {\n return this.api.getSupportedCountries({\n type,\n meta: { currency, country: '' },\n }) as Promise<ApiResponse<{ country: string; currency: string }[]>>;\n }\n\n async getSupportedNetworks(type: string, currency: string, country: string): Promise<ApiResponse<{ network: string; country: string; currency: string }[]>> {\n return this.api.getSupportedNetworks({\n type,\n meta: { currency, country, network: '' },\n }) as Promise<ApiResponse<{ network: string; country: string; currency: string }[]>>;\n }\n\n async payWithUSSD(\n orderReferenceCode: string,\n institution: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'ussd',\n order_reference_code: orderReferenceCode,\n meta: { institution },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payWithTransfer(\n orderReferenceCode: string,\n prefix: string,\n firstname: string,\n lastname: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'dynamic_virtual_account',\n order_reference_code: orderReferenceCode,\n meta: { prefix, firstname, lastname },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payByBank(\n orderReferenceCode: string,\n phoneNumber: string,\n name: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'pay_by_bank',\n order_reference_code: orderReferenceCode,\n meta: { phone_number: phoneNumber, name },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payWithMobileMoney(\n orderReferenceCode: string,\n network: string,\n phoneNumber: string,\n accountName: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'mobile_money',\n order_reference_code: orderReferenceCode,\n meta: { network, phone_number: phoneNumber, account_name: accountName },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payWithStaticAccount(\n orderReferenceCode: string,\n meta: Record<string, string> = {}\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'static_virtual_account',\n order_reference_code: orderReferenceCode,\n meta,\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payWithCrypto(\n orderReferenceCode: string,\n fromAddress?: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'pay_with_crypto',\n order_reference_code: orderReferenceCode,\n meta: { from_address: fromAddress || '' },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async confirmCryptoPayment(\n orderReferenceCode: string,\n txHash: string\n ): Promise<ApiResponse> {\n return this.api.confirmPaymentMethod({\n type: 'pay_with_crypto',\n order_reference_code: orderReferenceCode,\n meta: { tx_hash: txHash },\n }) as Promise<ApiResponse>;\n }\n\n async resendOTP(\n orderReferenceCode: string,\n cardDetails: CardDetails\n ): Promise<ApiResponse> {\n const encrypted = await encryptCardDetails(cardDetails);\n return this.api.resendOTP({\n type: 'card',\n order_reference_code: orderReferenceCode,\n meta: { card_details: encrypted },\n }) as Promise<ApiResponse>;\n }\n\n async authorizeOTP(\n orderReferenceCode: string,\n cardDetails: CardDetails,\n otp: string,\n paymentId: string\n ): Promise<ApiResponse<CardResponse>> {\n const encrypted = await encryptCardDetails(cardDetails);\n return this.api.authorizeOTP({\n type: 'card',\n order_reference_code: orderReferenceCode,\n meta: { card_details: encrypted, otp, paymentId },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async authorize3DS(orderReferenceCode: string): Promise<ApiResponse<CardResponse>> {\n return this.api.authorize3DS({\n type: 'card',\n order_reference_code: orderReferenceCode,\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async simulatePayment(\n orderReferenceCode: string,\n paymentStatus: 'Successful' | 'Failed'\n ): Promise<ApiResponse> {\n return this.api.simulatePayment({\n order_reference_code: orderReferenceCode,\n payment_status: paymentStatus,\n order_status: paymentStatus,\n }) as Promise<ApiResponse>;\n }\n\n getConfig() {\n return this.config;\n }\n\n getEnvironment() {\n return this.config.environment;\n }\n\n getBaseUrl() {\n return this.config.environment === 'live'\n ? 'https://api.moipayway.co'\n : 'https://dev.moipayway.co';\n }\n}\n\nexport type { MoiPayWayConfig, PaymentMeta, CardDetails, PaymentMethod, DisplayMode } from './types';\n"],"mappings":"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","names":["src_exports","__export","ApiClient","MoiPayWay","encryptCardDetails","generateOrderReference","BASE_URLS","ApiClient","environment","apiKey","endpoint","body","url","data","payload","orderReferenceCode","generateOrderReference","length","chars","result","i","PUBLIC_KEY","pemToArrayBuffer","pem","b64","bin","bytes","i","arrayBufferToBase64","buf","binary","randomHex","byteCount","b","encryptCardDetails","cardDetails","salt","ttlSeconds","encoder","payload","plain","aesKeyRaw","iv","aesKey","aesParams","cipherAndTag","cipherAndTagBytes","ct","tag","rsaKey","ek","pkg","err","MoiPayWay","config","ApiClient","meta","orderReferenceCode","payload","generateOrderReference","cardDetails","encrypted","encryptCardDetails","type","currencyCode","currency","country","institution","prefix","firstname","lastname","phoneNumber","name","network","accountName","fromAddress","txHash","otp","paymentId","paymentStatus"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/api.ts","../src/utils.ts","../src/encryption.ts","../src/MoiPayWay.ts"],"sourcesContent":["export { MoiPayWay } from './MoiPayWay';\nexport { ApiClient } from './api';\nexport { encryptCardDetails } from './encryption';\nexport { generateOrderReference, parseAllowedMethods, formatAmount, PAYMENT_METHOD_LABELS } from './utils';\n\nexport type {\n MoiPayWayConfig,\n MoiPayWayEnvironment,\n PaymentMeta,\n PaymentMethod,\n DisplayMode,\n CardDetails,\n ApiResponse,\n CardResponse,\n PaymentInfoResponse,\n InstitutionItem,\n WhiteLabelTheme,\n WhiteLabelContent,\n SplitConfig,\n SplitWallet,\n CheckoutStep,\n} from './types';\n","import type { MoiPayWayEnvironment } from './types';\n\nconst BASE_URLS: Record<MoiPayWayEnvironment, string> = {\n live: 'https://api.moipayway.co',\n test: 'https://dev.moipayway.co',\n};\n\nexport class ApiClient {\n private baseUrl: string;\n private apiKey: string;\n\n constructor(environment: MoiPayWayEnvironment, apiKey: string) {\n this.baseUrl = BASE_URLS[environment];\n this.apiKey = apiKey;\n }\n\n updateApiKey(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n private async request<T>(endpoint: string, body: any): Promise<T> {\n const url = `${this.baseUrl}/${endpoint}`;\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n const data = await response.json();\n if (data.status === 'error' || data.status === 'failed') {\n throw new Error(data.message || 'Request failed');\n }\n return data;\n }\n\n async initiatePayment(payload: any) {\n return this.request('wallet/collection/initiate', payload);\n }\n\n async getPaymentInfo(orderReferenceCode: string) {\n return this.request('wallet/collection/info', {\n order_reference_code: orderReferenceCode,\n });\n }\n\n async createPaymentMethod(payload: any) {\n return this.request('wallet/collection/method/create', payload);\n }\n\n async getSupportedInstitutions(payload: any) {\n return this.request('wallet/collection/method/supported-institutions', payload);\n }\n\n async getSupportedCurrencies(payload: any) {\n return this.request('wallet/collection/method/supported-currencies', payload);\n }\n\n async getSupportedCountries(payload: any) {\n return this.request('wallet/collection/method/supported-countries', payload);\n }\n\n async getSupportedNetworks(payload: any) {\n return this.request('wallet/collection/method/supported-networks', payload);\n }\n\n async resendOTP(payload: any) {\n return this.request('wallet/collection/method/resend-otp', payload);\n }\n\n async authorizeOTP(payload: any) {\n return this.request('wallet/collection/method/authorize-otp', payload);\n }\n\n async authorize3DS(payload: any) {\n return this.request('wallet/collection/method/authorize-3ds', payload);\n }\n\n async confirmPaymentMethod(payload: any) {\n return this.request('wallet/collection/method/confirmation', payload);\n }\n\n async simulatePayment(payload: any) {\n return this.request('simulation/collection-order', payload);\n }\n}\n","export function generateOrderReference(length = 10): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n}\n\nexport function formatAmount(amount: string | number, currency = 'NGN'): string {\n const num = typeof amount === 'string' ? parseFloat(amount) : amount;\n const code = currency.toUpperCase();\n const formatted = num.toLocaleString('en', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n return `${code} ${formatted}`;\n}\n\n/**\n * Parse allowed payment methods from API response.\n * The API returns payment_method.allowed as a JSON string like '[\"MOBILE_MONEY\"]'\n * with uppercase values that need to be normalized to lowercase with underscores.\n */\nexport function parseAllowedMethods(data: any): string[] | null {\n try {\n const raw = data?.payment_method?.allowed;\n if (!raw) return null;\n \n const parsed: string[] = typeof raw === 'string' ? JSON.parse(raw) : raw;\n if (!Array.isArray(parsed) || parsed.length === 0) return null;\n \n return parsed.map((m: string) => m.toLowerCase());\n } catch {\n return null;\n }\n}\n\nexport const PAYMENT_METHOD_LABELS: Record<string, { label: string; icon: string }> = {\n card: { label: 'Card Payment', icon: '💳' },\n ussd: { label: 'USSD', icon: '📱' },\n dynamic_virtual_account: { label: 'Pay with Transfer (One time)', icon: '🏦' },\n static_virtual_account: { label: 'Static Account', icon: '🏛️' },\n pay_with_crypto: { label: 'Pay with Crypto', icon: '🪙' },\n pay_by_bank: { label: 'Pay by Bank', icon: '🔗' },\n mobile_money: { label: 'Mobile Money', icon: '📲' },\n};\n","const PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwl+N8sgsM2DPFLvBRwyx\n55yNdSzZYucBzTwrRhE7qpc9i69hDhKAGukXvqm2R/HGHjKRPCojTDgEpZEPqE0d\nd7oD2gq9pLKk5XmOGNSCIyL3HsHNhLKSSonrTeDkBfrVp0DJ/pw1pLQRz6bbWIYL\nILLaBJ35B5wlcwzlQz+m3INH/RkfTSsji/aToITdwmLeREJ3/c+eBxWkU5nTXLub\niUyoN47FMimXzfIUgIxAtrlOuilKY37Ft6T4JJvDcNU1EVdiv/YX7OMUFbwxeTOn\nRhkhNKWwsDUc1JHp/AuW5P6tGMA0XxDXIFGrkcBGIrgOgyvbydcOQTcLBCgB3+qt\n18R/Yup0LR7ut/rF98EOfu3JiKiBfCh2o89dmmaeHdgIi7CyepU31e0JQCCAKG2l\nRTvqdMZkWfLH1EK7G+HgKdF08Dbuy+bguV/gRF09Hp16vEl2bKZL1Pk5mJc0JBM2\n7eDqXorXmym6v9h6ugu4Anc85u6fORN3WabRcLMLbRBfr1j/B9cETlGNNQ8zlBmJ\nQya765pNonNXC5AMJqgDm9uk9fmGBwc68UPALx8+PO4/GyHkM4u0ITtnvvNtdK5d\nG62wC4dQhOCfr/eJoiplefGGuir3MMCqyOi+zWe+HlKQpVcpS285Y5aPE3WmDl09\n9qYq6sb+UBuCIzag7FECy8MCAwEAAQ==\n-----END PUBLIC KEY-----`;\n\nfunction pemToArrayBuffer(pem: string): ArrayBuffer {\n const b64 = pem\n .replace(/-----BEGIN PUBLIC KEY-----/, '')\n .replace(/-----END PUBLIC KEY-----/, '')\n .replace(/[\\s\\n\\r]/g, '');\n const bin = atob(b64);\n const bytes = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);\n return bytes.buffer;\n}\n\nfunction arrayBufferToBase64(buf: ArrayBuffer): string {\n const bytes = new Uint8Array(buf);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i]);\n return btoa(binary);\n}\n\nfunction randomHex(byteCount: number): string {\n const bytes = crypto.getRandomValues(new Uint8Array(byteCount));\n return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Matches PHP: encryptUsingMPW()\n * RSA-OAEP(SHA-1) + AES-256-GCM(tag16) + AAD=salt\n */\nexport async function encryptCardDetails(\n cardDetails: { pan: string; expire_month: string; expire_year: string; cvv: string; pin: string; phone_number?: string; holder_name?: string; street?: string; country_code?: string; state?: string; city?: string; postal_code?: string },\n salt: string = '',\n ttlSeconds: number = 300\n): Promise<string> {\n try {\n const encoder = new TextEncoder();\n\n const cardString = JSON.stringify({\n phone_number: cardDetails.phone_number || '',\n holder_name: cardDetails.holder_name || '',\n pan: cardDetails.pan,\n expire_month: cardDetails.expire_month,\n expire_year: cardDetails.expire_year,\n cvv: cardDetails.cvv,\n pin: cardDetails.pin,\n street: cardDetails.street || '',\n country_code: cardDetails.country_code || '',\n state: cardDetails.state || '',\n city: cardDetails.city || '',\n postal_code: cardDetails.postal_code || '',\n });\n const payload = {\n data: cardString,\n ts: Math.floor(Date.now() / 1000),\n ttl: ttlSeconds < 0 ? 300 : ttlSeconds,\n nonce: randomHex(16),\n };\n const plain = JSON.stringify(payload);\n\n const aesKeyRaw = crypto.getRandomValues(new Uint8Array(32));\n const iv = crypto.getRandomValues(new Uint8Array(12));\n\n const aesKey = await crypto.subtle.importKey(\n 'raw', aesKeyRaw, { name: 'AES-GCM' }, false, ['encrypt']\n );\n\n const aesParams: AesGcmParams = {\n name: 'AES-GCM',\n iv,\n tagLength: 128,\n };\n if (salt) {\n aesParams.additionalData = encoder.encode(salt);\n }\n\n const cipherAndTag = await crypto.subtle.encrypt(aesParams, aesKey, encoder.encode(plain));\n\n const cipherAndTagBytes = new Uint8Array(cipherAndTag);\n const ct = cipherAndTagBytes.slice(0, cipherAndTagBytes.length - 16);\n const tag = cipherAndTagBytes.slice(cipherAndTagBytes.length - 16);\n\n const rsaKey = await crypto.subtle.importKey(\n 'spki',\n pemToArrayBuffer(PUBLIC_KEY),\n { name: 'RSA-OAEP', hash: 'SHA-1' },\n false,\n ['encrypt']\n );\n const ek = await crypto.subtle.encrypt({ name: 'RSA-OAEP' }, rsaKey, aesKeyRaw);\n\n const pkg = JSON.stringify({\n alg: 'RSA-OAEP(SHA1)+AES-256-GCM(tag16)+AAD=salt',\n ek: arrayBufferToBase64(ek),\n iv: arrayBufferToBase64(iv.buffer),\n ct: arrayBufferToBase64(ct.buffer),\n tag: arrayBufferToBase64(tag.buffer),\n });\n\n return btoa(pkg);\n } catch (err) {\n console.error('Encryption error:', err);\n throw new Error('Card encryption failed. Please try again.');\n }\n}\n","import { ApiClient } from './api';\nimport { generateOrderReference } from './utils';\nimport { encryptCardDetails } from './encryption';\nimport type {\n MoiPayWayConfig,\n InitiatePayload,\n PaymentMeta,\n CardDetails,\n ApiResponse,\n CardResponse,\n PaymentInfoResponse,\n InstitutionItem,\n} from './types';\n\nexport class MoiPayWay {\n private config: MoiPayWayConfig;\n private api: ApiClient;\n\n constructor(config: MoiPayWayConfig) {\n this.config = {\n displayMode: 'popup',\n ...config,\n };\n this.api = new ApiClient(config.environment, config.apiKey);\n }\n\n updateApiKey(apiKey: string) {\n this.config.apiKey = apiKey;\n this.api.updateApiKey(apiKey);\n }\n\n async initiate(meta: PaymentMeta, orderReferenceCode?: string): Promise<ApiResponse> {\n const payload: InitiatePayload = {\n order_reference_code: orderReferenceCode || generateOrderReference(),\n meta,\n };\n return this.api.initiatePayment(payload) as Promise<ApiResponse>;\n }\n\n async getPaymentInfo(orderReferenceCode: string): Promise<ApiResponse<PaymentInfoResponse>> {\n return this.api.getPaymentInfo(orderReferenceCode) as Promise<ApiResponse<PaymentInfoResponse>>;\n }\n\n async payWithCard(\n orderReferenceCode: string,\n cardDetails: CardDetails\n ): Promise<ApiResponse<CardResponse>> {\n const encrypted = await encryptCardDetails(cardDetails);\n return this.api.createPaymentMethod({\n type: 'card',\n order_reference_code: orderReferenceCode,\n meta: { card_details: encrypted },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async getSupportedInstitutions(type: string, currencyCode: string): Promise<ApiResponse<InstitutionItem[]>> {\n return this.api.getSupportedInstitutions({\n type,\n meta: { currency_code: currencyCode },\n }) as Promise<ApiResponse<InstitutionItem[]>>;\n }\n\n async getSupportedCurrencies(type: string): Promise<ApiResponse<{ currency: string }[]>> {\n return this.api.getSupportedCurrencies({\n type,\n meta: { currency: '' },\n }) as Promise<ApiResponse<{ currency: string }[]>>;\n }\n\n async getSupportedCountries(type: string, currency: string): Promise<ApiResponse<{ country: string; currency: string }[]>> {\n return this.api.getSupportedCountries({\n type,\n meta: { currency, country: '' },\n }) as Promise<ApiResponse<{ country: string; currency: string }[]>>;\n }\n\n async getSupportedNetworks(type: string, currency: string, country: string): Promise<ApiResponse<{ network: string; country: string; currency: string }[]>> {\n return this.api.getSupportedNetworks({\n type,\n meta: { currency, country, network: '' },\n }) as Promise<ApiResponse<{ network: string; country: string; currency: string }[]>>;\n }\n\n async payWithUSSD(\n orderReferenceCode: string,\n institution: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'ussd',\n order_reference_code: orderReferenceCode,\n meta: { institution },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payWithTransfer(\n orderReferenceCode: string,\n prefix: string,\n firstname: string,\n lastname: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'dynamic_virtual_account',\n order_reference_code: orderReferenceCode,\n meta: { prefix, firstname, lastname },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payByBank(\n orderReferenceCode: string,\n phoneNumber: string,\n name: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'pay_by_bank',\n order_reference_code: orderReferenceCode,\n meta: { phone_number: phoneNumber, name },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payWithMobileMoney(\n orderReferenceCode: string,\n network: string,\n phoneNumber: string,\n accountName: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'mobile_money',\n order_reference_code: orderReferenceCode,\n meta: { network, phone_number: phoneNumber, account_name: accountName },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payWithStaticAccount(\n orderReferenceCode: string,\n meta: Record<string, string> = {}\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'static_virtual_account',\n order_reference_code: orderReferenceCode,\n meta,\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payWithCrypto(\n orderReferenceCode: string,\n fromAddress?: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'pay_with_crypto',\n order_reference_code: orderReferenceCode,\n meta: { from_address: fromAddress || '' },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async confirmCryptoPayment(\n orderReferenceCode: string,\n txHash: string\n ): Promise<ApiResponse> {\n return this.api.confirmPaymentMethod({\n type: 'pay_with_crypto',\n order_reference_code: orderReferenceCode,\n meta: { tx_hash: txHash },\n }) as Promise<ApiResponse>;\n }\n\n async resendOTP(\n orderReferenceCode: string,\n cardDetails: CardDetails\n ): Promise<ApiResponse> {\n const encrypted = await encryptCardDetails(cardDetails);\n return this.api.resendOTP({\n type: 'card',\n order_reference_code: orderReferenceCode,\n meta: { card_details: encrypted },\n }) as Promise<ApiResponse>;\n }\n\n async authorizeOTP(\n orderReferenceCode: string,\n cardDetails: CardDetails,\n otp: string,\n paymentId: string\n ): Promise<ApiResponse<CardResponse>> {\n const encrypted = await encryptCardDetails(cardDetails);\n return this.api.authorizeOTP({\n type: 'card',\n order_reference_code: orderReferenceCode,\n meta: { card_details: encrypted, otp, paymentId },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async authorize3DS(orderReferenceCode: string): Promise<ApiResponse<CardResponse>> {\n return this.api.authorize3DS({\n type: 'card',\n order_reference_code: orderReferenceCode,\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async simulatePayment(\n orderReferenceCode: string,\n paymentStatus: 'Successful' | 'Failed'\n ): Promise<ApiResponse> {\n return this.api.simulatePayment({\n order_reference_code: orderReferenceCode,\n payment_status: paymentStatus,\n order_status: paymentStatus,\n }) as Promise<ApiResponse>;\n }\n\n getConfig() {\n return this.config;\n }\n\n getEnvironment() {\n return this.config.environment;\n }\n\n getBaseUrl() {\n return this.config.environment === 'live'\n ? 'https://api.moipayway.co'\n : 'https://dev.moipayway.co';\n }\n}\n\nexport type { MoiPayWayConfig, PaymentMeta, CardDetails, PaymentMethod, DisplayMode } from './types';\n"],"mappings":"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","names":["src_exports","__export","ApiClient","MoiPayWay","PAYMENT_METHOD_LABELS","encryptCardDetails","formatAmount","generateOrderReference","parseAllowedMethods","BASE_URLS","ApiClient","environment","apiKey","endpoint","body","url","data","payload","orderReferenceCode","generateOrderReference","length","chars","result","i","formatAmount","amount","currency","num","code","formatted","parseAllowedMethods","data","raw","parsed","m","PAYMENT_METHOD_LABELS","PUBLIC_KEY","pemToArrayBuffer","pem","b64","bin","bytes","i","arrayBufferToBase64","buf","binary","randomHex","byteCount","b","encryptCardDetails","cardDetails","salt","ttlSeconds","encoder","payload","plain","aesKeyRaw","iv","aesKey","aesParams","cipherAndTag","cipherAndTagBytes","ct","tag","rsaKey","ek","pkg","err","MoiPayWay","config","ApiClient","apiKey","meta","orderReferenceCode","payload","generateOrderReference","cardDetails","encrypted","encryptCardDetails","type","currencyCode","currency","country","institution","prefix","firstname","lastname","phoneNumber","name","network","accountName","fromAddress","txHash","otp","paymentId","paymentStatus"]}
|
package/dist/checkout.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var u=Object.defineProperty;var
|
|
1
|
+
"use strict";var u=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var I=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var B=(n,e)=>{for(var t in e)u(n,t,{get:e[t],enumerable:!0})},T=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of I(e))!v.call(n,s)&&s!==t&&u(n,s,{get:()=>e[s],enumerable:!(r=E(e,s))||r.enumerable});return n};var O=n=>T(u({},"__esModule",{value:!0}),n);var x={};B(x,{ApiClient:()=>i,MoiPayWay:()=>m,PAYMENT_METHOD_LABELS:()=>P,encryptCardDetails:()=>a,formatAmount:()=>h,generateOrderReference:()=>c,parseAllowedMethods:()=>f});module.exports=O(x);var K={live:"https://api.moipayway.co",test:"https://dev.moipayway.co"},i=class{constructor(e,t){this.baseUrl=K[e],this.apiKey=t}updateApiKey(e){this.apiKey=e}async request(e,t){let r=`${this.baseUrl}/${e}`,o=await(await fetch(r,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify(t)})).json();if(o.status==="error"||o.status==="failed")throw new Error(o.message||"Request failed");return o}async initiatePayment(e){return this.request("wallet/collection/initiate",e)}async getPaymentInfo(e){return this.request("wallet/collection/info",{order_reference_code:e})}async createPaymentMethod(e){return this.request("wallet/collection/method/create",e)}async getSupportedInstitutions(e){return this.request("wallet/collection/method/supported-institutions",e)}async getSupportedCurrencies(e){return this.request("wallet/collection/method/supported-currencies",e)}async getSupportedCountries(e){return this.request("wallet/collection/method/supported-countries",e)}async getSupportedNetworks(e){return this.request("wallet/collection/method/supported-networks",e)}async resendOTP(e){return this.request("wallet/collection/method/resend-otp",e)}async authorizeOTP(e){return this.request("wallet/collection/method/authorize-otp",e)}async authorize3DS(e){return this.request("wallet/collection/method/authorize-3ds",e)}async confirmPaymentMethod(e){return this.request("wallet/collection/method/confirmation",e)}async simulatePayment(e){return this.request("simulation/collection-order",e)}};function c(n=10){let e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",t="";for(let r=0;r<n;r++)t+=e.charAt(Math.floor(Math.random()*e.length));return t}function h(n,e="NGN"){let t=typeof n=="string"?parseFloat(n):n,r=e.toUpperCase(),s=t.toLocaleString("en",{minimumFractionDigits:2,maximumFractionDigits:2});return`${r} ${s}`}function f(n){try{let e=n?.payment_method?.allowed;if(!e)return null;let t=typeof e=="string"?JSON.parse(e):e;return!Array.isArray(t)||t.length===0?null:t.map(r=>r.toLowerCase())}catch{return null}}var P={card:{label:"Card Payment",icon:"\u{1F4B3}"},ussd:{label:"USSD",icon:"\u{1F4F1}"},dynamic_virtual_account:{label:"Pay with Transfer (One time)",icon:"\u{1F3E6}"},static_virtual_account:{label:"Static Account",icon:"\u{1F3DB}\uFE0F"},pay_with_crypto:{label:"Pay with Crypto",icon:"\u{1FA99}"},pay_by_bank:{label:"Pay by Bank",icon:"\u{1F517}"},mobile_money:{label:"Mobile Money",icon:"\u{1F4F2}"}};var L=`-----BEGIN PUBLIC KEY-----
|
|
2
2
|
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwl+N8sgsM2DPFLvBRwyx
|
|
3
3
|
55yNdSzZYucBzTwrRhE7qpc9i69hDhKAGukXvqm2R/HGHjKRPCojTDgEpZEPqE0d
|
|
4
4
|
d7oD2gq9pLKk5XmOGNSCIyL3HsHNhLKSSonrTeDkBfrVp0DJ/pw1pLQRz6bbWIYL
|
|
@@ -11,5 +11,5 @@ RTvqdMZkWfLH1EK7G+HgKdF08Dbuy+bguV/gRF09Hp16vEl2bKZL1Pk5mJc0JBM2
|
|
|
11
11
|
Qya765pNonNXC5AMJqgDm9uk9fmGBwc68UPALx8+PO4/GyHkM4u0ITtnvvNtdK5d
|
|
12
12
|
G62wC4dQhOCfr/eJoiplefGGuir3MMCqyOi+zWe+HlKQpVcpS285Y5aPE3WmDl09
|
|
13
13
|
9qYq6sb+UBuCIzag7FECy8MCAwEAAQ==
|
|
14
|
-
-----END PUBLIC KEY-----`;function
|
|
14
|
+
-----END PUBLIC KEY-----`;function N(n){let e=n.replace(/-----BEGIN PUBLIC KEY-----/,"").replace(/-----END PUBLIC KEY-----/,"").replace(/[\s\n\r]/g,""),t=atob(e),r=new Uint8Array(t.length);for(let s=0;s<t.length;s++)r[s]=t.charCodeAt(s);return r.buffer}function y(n){let e=new Uint8Array(n),t="";for(let r=0;r<e.length;r++)t+=String.fromCharCode(e[r]);return btoa(t)}function k(n){let e=crypto.getRandomValues(new Uint8Array(n));return Array.from(e).map(t=>t.toString(16).padStart(2,"0")).join("")}async function a(n,e="",t=300){try{let r=new TextEncoder,o={data:JSON.stringify({phone_number:n.phone_number||"",holder_name:n.holder_name||"",pan:n.pan,expire_month:n.expire_month,expire_year:n.expire_year,cvv:n.cvv,pin:n.pin,street:n.street||"",country_code:n.country_code||"",state:n.state||"",city:n.city||"",postal_code:n.postal_code||""}),ts:Math.floor(Date.now()/1e3),ttl:t<0?300:t,nonce:k(16)},A=JSON.stringify(o),d=crypto.getRandomValues(new Uint8Array(32)),l=crypto.getRandomValues(new Uint8Array(12)),R=await crypto.subtle.importKey("raw",d,{name:"AES-GCM"},!1,["encrypt"]),g={name:"AES-GCM",iv:l,tagLength:128};e&&(g.additionalData=r.encode(e));let C=await crypto.subtle.encrypt(g,R,r.encode(A)),p=new Uint8Array(C),_=p.slice(0,p.length-16),w=p.slice(p.length-16),b=await crypto.subtle.importKey("spki",N(L),{name:"RSA-OAEP",hash:"SHA-1"},!1,["encrypt"]),M=await crypto.subtle.encrypt({name:"RSA-OAEP"},b,d),S=JSON.stringify({alg:"RSA-OAEP(SHA1)+AES-256-GCM(tag16)+AAD=salt",ek:y(M),iv:y(l.buffer),ct:y(_.buffer),tag:y(w.buffer)});return btoa(S)}catch(r){throw console.error("Encryption error:",r),new Error("Card encryption failed. Please try again.")}}var m=class{constructor(e){this.config={displayMode:"popup",...e},this.api=new i(e.environment,e.apiKey)}updateApiKey(e){this.config.apiKey=e,this.api.updateApiKey(e)}async initiate(e,t){let r={order_reference_code:t||c(),meta:e};return this.api.initiatePayment(r)}async getPaymentInfo(e){return this.api.getPaymentInfo(e)}async payWithCard(e,t){let r=await a(t);return this.api.createPaymentMethod({type:"card",order_reference_code:e,meta:{card_details:r}})}async getSupportedInstitutions(e,t){return this.api.getSupportedInstitutions({type:e,meta:{currency_code:t}})}async getSupportedCurrencies(e){return this.api.getSupportedCurrencies({type:e,meta:{currency:""}})}async getSupportedCountries(e,t){return this.api.getSupportedCountries({type:e,meta:{currency:t,country:""}})}async getSupportedNetworks(e,t,r){return this.api.getSupportedNetworks({type:e,meta:{currency:t,country:r,network:""}})}async payWithUSSD(e,t){return this.api.createPaymentMethod({type:"ussd",order_reference_code:e,meta:{institution:t}})}async payWithTransfer(e,t,r,s){return this.api.createPaymentMethod({type:"dynamic_virtual_account",order_reference_code:e,meta:{prefix:t,firstname:r,lastname:s}})}async payByBank(e,t,r){return this.api.createPaymentMethod({type:"pay_by_bank",order_reference_code:e,meta:{phone_number:t,name:r}})}async payWithMobileMoney(e,t,r,s){return this.api.createPaymentMethod({type:"mobile_money",order_reference_code:e,meta:{network:t,phone_number:r,account_name:s}})}async payWithStaticAccount(e,t={}){return this.api.createPaymentMethod({type:"static_virtual_account",order_reference_code:e,meta:t})}async payWithCrypto(e,t){return this.api.createPaymentMethod({type:"pay_with_crypto",order_reference_code:e,meta:{from_address:t||""}})}async confirmCryptoPayment(e,t){return this.api.confirmPaymentMethod({type:"pay_with_crypto",order_reference_code:e,meta:{tx_hash:t}})}async resendOTP(e,t){let r=await a(t);return this.api.resendOTP({type:"card",order_reference_code:e,meta:{card_details:r}})}async authorizeOTP(e,t,r,s){let o=await a(t);return this.api.authorizeOTP({type:"card",order_reference_code:e,meta:{card_details:o,otp:r,paymentId:s}})}async authorize3DS(e){return this.api.authorize3DS({type:"card",order_reference_code:e})}async simulatePayment(e,t){return this.api.simulatePayment({order_reference_code:e,payment_status:t,order_status:t})}getConfig(){return this.config}getEnvironment(){return this.config.environment}getBaseUrl(){return this.config.environment==="live"?"https://api.moipayway.co":"https://dev.moipayway.co"}};0&&(module.exports={ApiClient,MoiPayWay,PAYMENT_METHOD_LABELS,encryptCardDetails,formatAmount,generateOrderReference,parseAllowedMethods});
|
|
15
15
|
//# sourceMappingURL=checkout.js.map
|
package/dist/checkout.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/api.ts","../src/utils.ts","../src/encryption.ts","../src/MoiPayWay.ts"],"sourcesContent":["export { MoiPayWay } from './MoiPayWay';\nexport { ApiClient } from './api';\nexport { encryptCardDetails } from './encryption';\nexport { generateOrderReference } from './utils';\n\nexport type {\n MoiPayWayConfig,\n MoiPayWayEnvironment,\n PaymentMeta,\n PaymentMethod,\n DisplayMode,\n CardDetails,\n ApiResponse,\n CardResponse,\n PaymentInfoResponse,\n InstitutionItem,\n WhiteLabelTheme,\n WhiteLabelContent,\n SplitConfig,\n SplitWallet,\n CheckoutStep,\n} from './types';\n","import type { MoiPayWayEnvironment } from './types';\n\nconst BASE_URLS: Record<MoiPayWayEnvironment, string> = {\n live: 'https://api.moipayway.co',\n test: 'https://dev.moipayway.co',\n};\n\nexport class ApiClient {\n private baseUrl: string;\n private apiKey: string;\n\n constructor(environment: MoiPayWayEnvironment, apiKey: string) {\n this.baseUrl = BASE_URLS[environment];\n this.apiKey = apiKey;\n }\n\n private async request<T>(endpoint: string, body: any): Promise<T> {\n const url = `${this.baseUrl}/${endpoint}`;\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n const data = await response.json();\n if (data.status === 'error' || data.status === 'failed') {\n throw new Error(data.message || 'Request failed');\n }\n return data;\n }\n\n async initiatePayment(payload: any) {\n return this.request('wallet/collection/initiate', payload);\n }\n\n async getPaymentInfo(orderReferenceCode: string) {\n return this.request('wallet/collection/info', {\n order_reference_code: orderReferenceCode,\n });\n }\n\n async createPaymentMethod(payload: any) {\n return this.request('wallet/collection/method/create', payload);\n }\n\n async getSupportedInstitutions(payload: any) {\n return this.request('wallet/collection/method/supported-institutions', payload);\n }\n\n async getSupportedCurrencies(payload: any) {\n return this.request('wallet/collection/method/supported-currencies', payload);\n }\n\n async getSupportedCountries(payload: any) {\n return this.request('wallet/collection/method/supported-countries', payload);\n }\n\n async getSupportedNetworks(payload: any) {\n return this.request('wallet/collection/method/supported-networks', payload);\n }\n\n async resendOTP(payload: any) {\n return this.request('wallet/collection/method/resend-otp', payload);\n }\n\n async authorizeOTP(payload: any) {\n return this.request('wallet/collection/method/authorize-otp', payload);\n }\n\n async authorize3DS(payload: any) {\n return this.request('wallet/collection/method/authorize-3ds', payload);\n }\n\n async confirmPaymentMethod(payload: any) {\n return this.request('wallet/collection/method/confirmation', payload);\n }\n\n async simulatePayment(payload: any) {\n return this.request('simulation/collection-order', payload);\n }\n}\n","export function generateOrderReference(length = 10): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n}\n\nexport function formatAmount(amount: string | number, currency = 'NGN'): string {\n const num = typeof amount === 'string' ? parseFloat(amount) : amount;\n const code = currency.toUpperCase();\n const formatted = num.toLocaleString('en', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n return `${code} ${formatted}`;\n}\n\nexport const PAYMENT_METHOD_LABELS: Record<string, { label: string; icon: string }> = {\n card: { label: 'Card Payment', icon: '💳' },\n ussd: { label: 'USSD', icon: '📱' },\n dynamic_virtual_account: { label: 'Pay with Transfer (One time)', icon: '🏦' },\n static_virtual_account: { label: 'Static Account', icon: '🏛️' },\n pay_with_crypto: { label: 'Pay with Crypto', icon: '🪙' },\n pay_by_bank: { label: 'Pay by Bank', icon: '🔗' },\n mobile_money: { label: 'Mobile Money', icon: '📲' },\n};\n","const PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwl+N8sgsM2DPFLvBRwyx\n55yNdSzZYucBzTwrRhE7qpc9i69hDhKAGukXvqm2R/HGHjKRPCojTDgEpZEPqE0d\nd7oD2gq9pLKk5XmOGNSCIyL3HsHNhLKSSonrTeDkBfrVp0DJ/pw1pLQRz6bbWIYL\nILLaBJ35B5wlcwzlQz+m3INH/RkfTSsji/aToITdwmLeREJ3/c+eBxWkU5nTXLub\niUyoN47FMimXzfIUgIxAtrlOuilKY37Ft6T4JJvDcNU1EVdiv/YX7OMUFbwxeTOn\nRhkhNKWwsDUc1JHp/AuW5P6tGMA0XxDXIFGrkcBGIrgOgyvbydcOQTcLBCgB3+qt\n18R/Yup0LR7ut/rF98EOfu3JiKiBfCh2o89dmmaeHdgIi7CyepU31e0JQCCAKG2l\nRTvqdMZkWfLH1EK7G+HgKdF08Dbuy+bguV/gRF09Hp16vEl2bKZL1Pk5mJc0JBM2\n7eDqXorXmym6v9h6ugu4Anc85u6fORN3WabRcLMLbRBfr1j/B9cETlGNNQ8zlBmJ\nQya765pNonNXC5AMJqgDm9uk9fmGBwc68UPALx8+PO4/GyHkM4u0ITtnvvNtdK5d\nG62wC4dQhOCfr/eJoiplefGGuir3MMCqyOi+zWe+HlKQpVcpS285Y5aPE3WmDl09\n9qYq6sb+UBuCIzag7FECy8MCAwEAAQ==\n-----END PUBLIC KEY-----`;\n\nfunction pemToArrayBuffer(pem: string): ArrayBuffer {\n const b64 = pem\n .replace(/-----BEGIN PUBLIC KEY-----/, '')\n .replace(/-----END PUBLIC KEY-----/, '')\n .replace(/[\\s\\n\\r]/g, '');\n const bin = atob(b64);\n const bytes = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);\n return bytes.buffer;\n}\n\nfunction arrayBufferToBase64(buf: ArrayBuffer): string {\n const bytes = new Uint8Array(buf);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i]);\n return btoa(binary);\n}\n\nfunction randomHex(byteCount: number): string {\n const bytes = crypto.getRandomValues(new Uint8Array(byteCount));\n return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Matches PHP: encryptUsingMPW()\n * RSA-OAEP(SHA-1) + AES-256-GCM(tag16) + AAD=salt\n */\nexport async function encryptCardDetails(\n cardDetails: { pan: string; expire_month: string; expire_year: string; cvv: string; pin: string; phone_number?: string; holder_name?: string; street?: string; country_code?: string; state?: string; city?: string; postal_code?: string },\n salt: string = '',\n ttlSeconds: number = 300\n): Promise<string> {\n try {\n const encoder = new TextEncoder();\n\n // 1. Build payload (matches PHP structure — data is a STRING, not object)\n const cardString = JSON.stringify({\n phone_number: cardDetails.phone_number || '',\n holder_name: cardDetails.holder_name || '',\n pan: cardDetails.pan,\n expire_month: cardDetails.expire_month,\n expire_year: cardDetails.expire_year,\n cvv: cardDetails.cvv,\n pin: cardDetails.pin,\n street: cardDetails.street || '',\n country_code: cardDetails.country_code || '',\n state: cardDetails.state || '',\n city: cardDetails.city || '',\n postal_code: cardDetails.postal_code || '',\n });\n const payload = {\n data: cardString,\n ts: Math.floor(Date.now() / 1000),\n ttl: ttlSeconds < 0 ? 300 : ttlSeconds,\n nonce: randomHex(16),\n };\n const plain = JSON.stringify(payload);\n\n // 2. Generate AES-256 key (32 bytes) + GCM IV (12 bytes)\n const aesKeyRaw = crypto.getRandomValues(new Uint8Array(32));\n const iv = crypto.getRandomValues(new Uint8Array(12));\n\n // 3. Import AES key\n const aesKey = await crypto.subtle.importKey(\n 'raw', aesKeyRaw, { name: 'AES-GCM' }, false, ['encrypt']\n );\n\n // 4. AES-256-GCM encrypt with salt as AAD, 128-bit tag\n const aesParams: AesGcmParams = {\n name: 'AES-GCM',\n iv,\n tagLength: 128,\n };\n if (salt) {\n aesParams.additionalData = encoder.encode(salt);\n }\n\n const cipherAndTag = await crypto.subtle.encrypt(aesParams, aesKey, encoder.encode(plain));\n\n // Web Crypto appends tag to ciphertext; split them\n const cipherAndTagBytes = new Uint8Array(cipherAndTag);\n const ct = cipherAndTagBytes.slice(0, cipherAndTagBytes.length - 16);\n const tag = cipherAndTagBytes.slice(cipherAndTagBytes.length - 16);\n\n // 5. RSA-OAEP (SHA-1) wrap the AES key\n const rsaKey = await crypto.subtle.importKey(\n 'spki',\n pemToArrayBuffer(PUBLIC_KEY),\n { name: 'RSA-OAEP', hash: 'SHA-1' },\n false,\n ['encrypt']\n );\n const ek = await crypto.subtle.encrypt({ name: 'RSA-OAEP' }, rsaKey, aesKeyRaw);\n\n // 6. Build package (matches PHP output)\n const pkg = JSON.stringify({\n alg: 'RSA-OAEP(SHA1)+AES-256-GCM(tag16)+AAD=salt',\n ek: arrayBufferToBase64(ek),\n iv: arrayBufferToBase64(iv.buffer),\n ct: arrayBufferToBase64(ct.buffer),\n tag: arrayBufferToBase64(tag.buffer),\n });\n\n // 7. Base64 encode the entire package\n return btoa(pkg);\n } catch (err) {\n console.error('Encryption error:', err);\n throw new Error('Card encryption failed. Please try again.');\n }\n}\n","import { ApiClient } from './api';\nimport { generateOrderReference } from './utils';\nimport { encryptCardDetails } from './encryption';\nimport type {\n MoiPayWayConfig,\n InitiatePayload,\n PaymentMeta,\n CardDetails,\n ApiResponse,\n CardResponse,\n PaymentInfoResponse,\n InstitutionItem,\n} from './types';\n\nexport class MoiPayWay {\n private config: MoiPayWayConfig;\n private api: ApiClient;\n\n constructor(config: MoiPayWayConfig) {\n this.config = {\n displayMode: 'popup',\n ...config,\n };\n this.api = new ApiClient(config.environment, config.apiKey);\n }\n\n async initiate(meta: PaymentMeta, orderReferenceCode?: string): Promise<ApiResponse> {\n const payload: InitiatePayload = {\n order_reference_code: orderReferenceCode || generateOrderReference(),\n meta,\n };\n return this.api.initiatePayment(payload) as Promise<ApiResponse>;\n }\n\n async getPaymentInfo(orderReferenceCode: string): Promise<ApiResponse<PaymentInfoResponse>> {\n return this.api.getPaymentInfo(orderReferenceCode) as Promise<ApiResponse<PaymentInfoResponse>>;\n }\n\n async payWithCard(\n orderReferenceCode: string,\n cardDetails: CardDetails\n ): Promise<ApiResponse<CardResponse>> {\n const encrypted = await encryptCardDetails(cardDetails);\n return this.api.createPaymentMethod({\n type: 'card',\n order_reference_code: orderReferenceCode,\n meta: { card_details: encrypted },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async getSupportedInstitutions(type: string, currencyCode: string): Promise<ApiResponse<InstitutionItem[]>> {\n return this.api.getSupportedInstitutions({\n type,\n meta: { currency_code: currencyCode },\n }) as Promise<ApiResponse<InstitutionItem[]>>;\n }\n\n async getSupportedCurrencies(type: string): Promise<ApiResponse<{ currency: string }[]>> {\n return this.api.getSupportedCurrencies({\n type,\n meta: { currency: '' },\n }) as Promise<ApiResponse<{ currency: string }[]>>;\n }\n\n async getSupportedCountries(type: string, currency: string): Promise<ApiResponse<{ country: string; currency: string }[]>> {\n return this.api.getSupportedCountries({\n type,\n meta: { currency, country: '' },\n }) as Promise<ApiResponse<{ country: string; currency: string }[]>>;\n }\n\n async getSupportedNetworks(type: string, currency: string, country: string): Promise<ApiResponse<{ network: string; country: string; currency: string }[]>> {\n return this.api.getSupportedNetworks({\n type,\n meta: { currency, country, network: '' },\n }) as Promise<ApiResponse<{ network: string; country: string; currency: string }[]>>;\n }\n\n async payWithUSSD(\n orderReferenceCode: string,\n institution: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'ussd',\n order_reference_code: orderReferenceCode,\n meta: { institution },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payWithTransfer(\n orderReferenceCode: string,\n prefix: string,\n firstname: string,\n lastname: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'dynamic_virtual_account',\n order_reference_code: orderReferenceCode,\n meta: { prefix, firstname, lastname },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payByBank(\n orderReferenceCode: string,\n phoneNumber: string,\n name: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'pay_by_bank',\n order_reference_code: orderReferenceCode,\n meta: { phone_number: phoneNumber, name },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payWithMobileMoney(\n orderReferenceCode: string,\n network: string,\n phoneNumber: string,\n accountName: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'mobile_money',\n order_reference_code: orderReferenceCode,\n meta: { network, phone_number: phoneNumber, account_name: accountName },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payWithStaticAccount(\n orderReferenceCode: string,\n meta: Record<string, string> = {}\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'static_virtual_account',\n order_reference_code: orderReferenceCode,\n meta,\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payWithCrypto(\n orderReferenceCode: string,\n fromAddress?: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'pay_with_crypto',\n order_reference_code: orderReferenceCode,\n meta: { from_address: fromAddress || '' },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async confirmCryptoPayment(\n orderReferenceCode: string,\n txHash: string\n ): Promise<ApiResponse> {\n return this.api.confirmPaymentMethod({\n type: 'pay_with_crypto',\n order_reference_code: orderReferenceCode,\n meta: { tx_hash: txHash },\n }) as Promise<ApiResponse>;\n }\n\n async resendOTP(\n orderReferenceCode: string,\n cardDetails: CardDetails\n ): Promise<ApiResponse> {\n const encrypted = await encryptCardDetails(cardDetails);\n return this.api.resendOTP({\n type: 'card',\n order_reference_code: orderReferenceCode,\n meta: { card_details: encrypted },\n }) as Promise<ApiResponse>;\n }\n\n async authorizeOTP(\n orderReferenceCode: string,\n cardDetails: CardDetails,\n otp: string,\n paymentId: string\n ): Promise<ApiResponse<CardResponse>> {\n const encrypted = await encryptCardDetails(cardDetails);\n return this.api.authorizeOTP({\n type: 'card',\n order_reference_code: orderReferenceCode,\n meta: { card_details: encrypted, otp, paymentId },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async authorize3DS(orderReferenceCode: string): Promise<ApiResponse<CardResponse>> {\n return this.api.authorize3DS({\n type: 'card',\n order_reference_code: orderReferenceCode,\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async simulatePayment(\n orderReferenceCode: string,\n paymentStatus: 'Successful' | 'Failed'\n ): Promise<ApiResponse> {\n return this.api.simulatePayment({\n order_reference_code: orderReferenceCode,\n payment_status: paymentStatus,\n order_status: paymentStatus,\n }) as Promise<ApiResponse>;\n }\n\n getConfig() {\n return this.config;\n }\n\n getEnvironment() {\n return this.config.environment;\n }\n\n getBaseUrl() {\n return this.config.environment === 'live'\n ? 'https://api.moipayway.co'\n : 'https://dev.moipayway.co';\n }\n}\n\nexport type { MoiPayWayConfig, PaymentMeta, CardDetails, PaymentMethod, DisplayMode } from './types';\n"],"mappings":"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","names":["src_exports","__export","ApiClient","MoiPayWay","encryptCardDetails","generateOrderReference","__toCommonJS","BASE_URLS","ApiClient","environment","apiKey","endpoint","body","url","data","payload","orderReferenceCode","generateOrderReference","length","chars","result","i","PUBLIC_KEY","pemToArrayBuffer","pem","b64","bin","bytes","i","arrayBufferToBase64","buf","binary","randomHex","byteCount","b","encryptCardDetails","cardDetails","salt","ttlSeconds","encoder","payload","plain","aesKeyRaw","iv","aesKey","aesParams","cipherAndTag","cipherAndTagBytes","ct","tag","rsaKey","ek","pkg","err","MoiPayWay","config","ApiClient","meta","orderReferenceCode","payload","generateOrderReference","cardDetails","encrypted","encryptCardDetails","type","currencyCode","currency","country","institution","prefix","firstname","lastname","phoneNumber","name","network","accountName","fromAddress","txHash","otp","paymentId","paymentStatus"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/api.ts","../src/utils.ts","../src/encryption.ts","../src/MoiPayWay.ts"],"sourcesContent":["export { MoiPayWay } from './MoiPayWay';\nexport { ApiClient } from './api';\nexport { encryptCardDetails } from './encryption';\nexport { generateOrderReference, parseAllowedMethods, formatAmount, PAYMENT_METHOD_LABELS } from './utils';\n\nexport type {\n MoiPayWayConfig,\n MoiPayWayEnvironment,\n PaymentMeta,\n PaymentMethod,\n DisplayMode,\n CardDetails,\n ApiResponse,\n CardResponse,\n PaymentInfoResponse,\n InstitutionItem,\n WhiteLabelTheme,\n WhiteLabelContent,\n SplitConfig,\n SplitWallet,\n CheckoutStep,\n} from './types';\n","import type { MoiPayWayEnvironment } from './types';\n\nconst BASE_URLS: Record<MoiPayWayEnvironment, string> = {\n live: 'https://api.moipayway.co',\n test: 'https://dev.moipayway.co',\n};\n\nexport class ApiClient {\n private baseUrl: string;\n private apiKey: string;\n\n constructor(environment: MoiPayWayEnvironment, apiKey: string) {\n this.baseUrl = BASE_URLS[environment];\n this.apiKey = apiKey;\n }\n\n updateApiKey(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n private async request<T>(endpoint: string, body: any): Promise<T> {\n const url = `${this.baseUrl}/${endpoint}`;\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(body),\n });\n\n const data = await response.json();\n if (data.status === 'error' || data.status === 'failed') {\n throw new Error(data.message || 'Request failed');\n }\n return data;\n }\n\n async initiatePayment(payload: any) {\n return this.request('wallet/collection/initiate', payload);\n }\n\n async getPaymentInfo(orderReferenceCode: string) {\n return this.request('wallet/collection/info', {\n order_reference_code: orderReferenceCode,\n });\n }\n\n async createPaymentMethod(payload: any) {\n return this.request('wallet/collection/method/create', payload);\n }\n\n async getSupportedInstitutions(payload: any) {\n return this.request('wallet/collection/method/supported-institutions', payload);\n }\n\n async getSupportedCurrencies(payload: any) {\n return this.request('wallet/collection/method/supported-currencies', payload);\n }\n\n async getSupportedCountries(payload: any) {\n return this.request('wallet/collection/method/supported-countries', payload);\n }\n\n async getSupportedNetworks(payload: any) {\n return this.request('wallet/collection/method/supported-networks', payload);\n }\n\n async resendOTP(payload: any) {\n return this.request('wallet/collection/method/resend-otp', payload);\n }\n\n async authorizeOTP(payload: any) {\n return this.request('wallet/collection/method/authorize-otp', payload);\n }\n\n async authorize3DS(payload: any) {\n return this.request('wallet/collection/method/authorize-3ds', payload);\n }\n\n async confirmPaymentMethod(payload: any) {\n return this.request('wallet/collection/method/confirmation', payload);\n }\n\n async simulatePayment(payload: any) {\n return this.request('simulation/collection-order', payload);\n }\n}\n","export function generateOrderReference(length = 10): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n}\n\nexport function formatAmount(amount: string | number, currency = 'NGN'): string {\n const num = typeof amount === 'string' ? parseFloat(amount) : amount;\n const code = currency.toUpperCase();\n const formatted = num.toLocaleString('en', { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n return `${code} ${formatted}`;\n}\n\n/**\n * Parse allowed payment methods from API response.\n * The API returns payment_method.allowed as a JSON string like '[\"MOBILE_MONEY\"]'\n * with uppercase values that need to be normalized to lowercase with underscores.\n */\nexport function parseAllowedMethods(data: any): string[] | null {\n try {\n const raw = data?.payment_method?.allowed;\n if (!raw) return null;\n \n const parsed: string[] = typeof raw === 'string' ? JSON.parse(raw) : raw;\n if (!Array.isArray(parsed) || parsed.length === 0) return null;\n \n return parsed.map((m: string) => m.toLowerCase());\n } catch {\n return null;\n }\n}\n\nexport const PAYMENT_METHOD_LABELS: Record<string, { label: string; icon: string }> = {\n card: { label: 'Card Payment', icon: '💳' },\n ussd: { label: 'USSD', icon: '📱' },\n dynamic_virtual_account: { label: 'Pay with Transfer (One time)', icon: '🏦' },\n static_virtual_account: { label: 'Static Account', icon: '🏛️' },\n pay_with_crypto: { label: 'Pay with Crypto', icon: '🪙' },\n pay_by_bank: { label: 'Pay by Bank', icon: '🔗' },\n mobile_money: { label: 'Mobile Money', icon: '📲' },\n};\n","const PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwl+N8sgsM2DPFLvBRwyx\n55yNdSzZYucBzTwrRhE7qpc9i69hDhKAGukXvqm2R/HGHjKRPCojTDgEpZEPqE0d\nd7oD2gq9pLKk5XmOGNSCIyL3HsHNhLKSSonrTeDkBfrVp0DJ/pw1pLQRz6bbWIYL\nILLaBJ35B5wlcwzlQz+m3INH/RkfTSsji/aToITdwmLeREJ3/c+eBxWkU5nTXLub\niUyoN47FMimXzfIUgIxAtrlOuilKY37Ft6T4JJvDcNU1EVdiv/YX7OMUFbwxeTOn\nRhkhNKWwsDUc1JHp/AuW5P6tGMA0XxDXIFGrkcBGIrgOgyvbydcOQTcLBCgB3+qt\n18R/Yup0LR7ut/rF98EOfu3JiKiBfCh2o89dmmaeHdgIi7CyepU31e0JQCCAKG2l\nRTvqdMZkWfLH1EK7G+HgKdF08Dbuy+bguV/gRF09Hp16vEl2bKZL1Pk5mJc0JBM2\n7eDqXorXmym6v9h6ugu4Anc85u6fORN3WabRcLMLbRBfr1j/B9cETlGNNQ8zlBmJ\nQya765pNonNXC5AMJqgDm9uk9fmGBwc68UPALx8+PO4/GyHkM4u0ITtnvvNtdK5d\nG62wC4dQhOCfr/eJoiplefGGuir3MMCqyOi+zWe+HlKQpVcpS285Y5aPE3WmDl09\n9qYq6sb+UBuCIzag7FECy8MCAwEAAQ==\n-----END PUBLIC KEY-----`;\n\nfunction pemToArrayBuffer(pem: string): ArrayBuffer {\n const b64 = pem\n .replace(/-----BEGIN PUBLIC KEY-----/, '')\n .replace(/-----END PUBLIC KEY-----/, '')\n .replace(/[\\s\\n\\r]/g, '');\n const bin = atob(b64);\n const bytes = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);\n return bytes.buffer;\n}\n\nfunction arrayBufferToBase64(buf: ArrayBuffer): string {\n const bytes = new Uint8Array(buf);\n let binary = '';\n for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i]);\n return btoa(binary);\n}\n\nfunction randomHex(byteCount: number): string {\n const bytes = crypto.getRandomValues(new Uint8Array(byteCount));\n return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Matches PHP: encryptUsingMPW()\n * RSA-OAEP(SHA-1) + AES-256-GCM(tag16) + AAD=salt\n */\nexport async function encryptCardDetails(\n cardDetails: { pan: string; expire_month: string; expire_year: string; cvv: string; pin: string; phone_number?: string; holder_name?: string; street?: string; country_code?: string; state?: string; city?: string; postal_code?: string },\n salt: string = '',\n ttlSeconds: number = 300\n): Promise<string> {\n try {\n const encoder = new TextEncoder();\n\n const cardString = JSON.stringify({\n phone_number: cardDetails.phone_number || '',\n holder_name: cardDetails.holder_name || '',\n pan: cardDetails.pan,\n expire_month: cardDetails.expire_month,\n expire_year: cardDetails.expire_year,\n cvv: cardDetails.cvv,\n pin: cardDetails.pin,\n street: cardDetails.street || '',\n country_code: cardDetails.country_code || '',\n state: cardDetails.state || '',\n city: cardDetails.city || '',\n postal_code: cardDetails.postal_code || '',\n });\n const payload = {\n data: cardString,\n ts: Math.floor(Date.now() / 1000),\n ttl: ttlSeconds < 0 ? 300 : ttlSeconds,\n nonce: randomHex(16),\n };\n const plain = JSON.stringify(payload);\n\n const aesKeyRaw = crypto.getRandomValues(new Uint8Array(32));\n const iv = crypto.getRandomValues(new Uint8Array(12));\n\n const aesKey = await crypto.subtle.importKey(\n 'raw', aesKeyRaw, { name: 'AES-GCM' }, false, ['encrypt']\n );\n\n const aesParams: AesGcmParams = {\n name: 'AES-GCM',\n iv,\n tagLength: 128,\n };\n if (salt) {\n aesParams.additionalData = encoder.encode(salt);\n }\n\n const cipherAndTag = await crypto.subtle.encrypt(aesParams, aesKey, encoder.encode(plain));\n\n const cipherAndTagBytes = new Uint8Array(cipherAndTag);\n const ct = cipherAndTagBytes.slice(0, cipherAndTagBytes.length - 16);\n const tag = cipherAndTagBytes.slice(cipherAndTagBytes.length - 16);\n\n const rsaKey = await crypto.subtle.importKey(\n 'spki',\n pemToArrayBuffer(PUBLIC_KEY),\n { name: 'RSA-OAEP', hash: 'SHA-1' },\n false,\n ['encrypt']\n );\n const ek = await crypto.subtle.encrypt({ name: 'RSA-OAEP' }, rsaKey, aesKeyRaw);\n\n const pkg = JSON.stringify({\n alg: 'RSA-OAEP(SHA1)+AES-256-GCM(tag16)+AAD=salt',\n ek: arrayBufferToBase64(ek),\n iv: arrayBufferToBase64(iv.buffer),\n ct: arrayBufferToBase64(ct.buffer),\n tag: arrayBufferToBase64(tag.buffer),\n });\n\n return btoa(pkg);\n } catch (err) {\n console.error('Encryption error:', err);\n throw new Error('Card encryption failed. Please try again.');\n }\n}\n","import { ApiClient } from './api';\nimport { generateOrderReference } from './utils';\nimport { encryptCardDetails } from './encryption';\nimport type {\n MoiPayWayConfig,\n InitiatePayload,\n PaymentMeta,\n CardDetails,\n ApiResponse,\n CardResponse,\n PaymentInfoResponse,\n InstitutionItem,\n} from './types';\n\nexport class MoiPayWay {\n private config: MoiPayWayConfig;\n private api: ApiClient;\n\n constructor(config: MoiPayWayConfig) {\n this.config = {\n displayMode: 'popup',\n ...config,\n };\n this.api = new ApiClient(config.environment, config.apiKey);\n }\n\n updateApiKey(apiKey: string) {\n this.config.apiKey = apiKey;\n this.api.updateApiKey(apiKey);\n }\n\n async initiate(meta: PaymentMeta, orderReferenceCode?: string): Promise<ApiResponse> {\n const payload: InitiatePayload = {\n order_reference_code: orderReferenceCode || generateOrderReference(),\n meta,\n };\n return this.api.initiatePayment(payload) as Promise<ApiResponse>;\n }\n\n async getPaymentInfo(orderReferenceCode: string): Promise<ApiResponse<PaymentInfoResponse>> {\n return this.api.getPaymentInfo(orderReferenceCode) as Promise<ApiResponse<PaymentInfoResponse>>;\n }\n\n async payWithCard(\n orderReferenceCode: string,\n cardDetails: CardDetails\n ): Promise<ApiResponse<CardResponse>> {\n const encrypted = await encryptCardDetails(cardDetails);\n return this.api.createPaymentMethod({\n type: 'card',\n order_reference_code: orderReferenceCode,\n meta: { card_details: encrypted },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async getSupportedInstitutions(type: string, currencyCode: string): Promise<ApiResponse<InstitutionItem[]>> {\n return this.api.getSupportedInstitutions({\n type,\n meta: { currency_code: currencyCode },\n }) as Promise<ApiResponse<InstitutionItem[]>>;\n }\n\n async getSupportedCurrencies(type: string): Promise<ApiResponse<{ currency: string }[]>> {\n return this.api.getSupportedCurrencies({\n type,\n meta: { currency: '' },\n }) as Promise<ApiResponse<{ currency: string }[]>>;\n }\n\n async getSupportedCountries(type: string, currency: string): Promise<ApiResponse<{ country: string; currency: string }[]>> {\n return this.api.getSupportedCountries({\n type,\n meta: { currency, country: '' },\n }) as Promise<ApiResponse<{ country: string; currency: string }[]>>;\n }\n\n async getSupportedNetworks(type: string, currency: string, country: string): Promise<ApiResponse<{ network: string; country: string; currency: string }[]>> {\n return this.api.getSupportedNetworks({\n type,\n meta: { currency, country, network: '' },\n }) as Promise<ApiResponse<{ network: string; country: string; currency: string }[]>>;\n }\n\n async payWithUSSD(\n orderReferenceCode: string,\n institution: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'ussd',\n order_reference_code: orderReferenceCode,\n meta: { institution },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payWithTransfer(\n orderReferenceCode: string,\n prefix: string,\n firstname: string,\n lastname: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'dynamic_virtual_account',\n order_reference_code: orderReferenceCode,\n meta: { prefix, firstname, lastname },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payByBank(\n orderReferenceCode: string,\n phoneNumber: string,\n name: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'pay_by_bank',\n order_reference_code: orderReferenceCode,\n meta: { phone_number: phoneNumber, name },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payWithMobileMoney(\n orderReferenceCode: string,\n network: string,\n phoneNumber: string,\n accountName: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'mobile_money',\n order_reference_code: orderReferenceCode,\n meta: { network, phone_number: phoneNumber, account_name: accountName },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payWithStaticAccount(\n orderReferenceCode: string,\n meta: Record<string, string> = {}\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'static_virtual_account',\n order_reference_code: orderReferenceCode,\n meta,\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async payWithCrypto(\n orderReferenceCode: string,\n fromAddress?: string\n ): Promise<ApiResponse<CardResponse>> {\n return this.api.createPaymentMethod({\n type: 'pay_with_crypto',\n order_reference_code: orderReferenceCode,\n meta: { from_address: fromAddress || '' },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async confirmCryptoPayment(\n orderReferenceCode: string,\n txHash: string\n ): Promise<ApiResponse> {\n return this.api.confirmPaymentMethod({\n type: 'pay_with_crypto',\n order_reference_code: orderReferenceCode,\n meta: { tx_hash: txHash },\n }) as Promise<ApiResponse>;\n }\n\n async resendOTP(\n orderReferenceCode: string,\n cardDetails: CardDetails\n ): Promise<ApiResponse> {\n const encrypted = await encryptCardDetails(cardDetails);\n return this.api.resendOTP({\n type: 'card',\n order_reference_code: orderReferenceCode,\n meta: { card_details: encrypted },\n }) as Promise<ApiResponse>;\n }\n\n async authorizeOTP(\n orderReferenceCode: string,\n cardDetails: CardDetails,\n otp: string,\n paymentId: string\n ): Promise<ApiResponse<CardResponse>> {\n const encrypted = await encryptCardDetails(cardDetails);\n return this.api.authorizeOTP({\n type: 'card',\n order_reference_code: orderReferenceCode,\n meta: { card_details: encrypted, otp, paymentId },\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async authorize3DS(orderReferenceCode: string): Promise<ApiResponse<CardResponse>> {\n return this.api.authorize3DS({\n type: 'card',\n order_reference_code: orderReferenceCode,\n }) as Promise<ApiResponse<CardResponse>>;\n }\n\n async simulatePayment(\n orderReferenceCode: string,\n paymentStatus: 'Successful' | 'Failed'\n ): Promise<ApiResponse> {\n return this.api.simulatePayment({\n order_reference_code: orderReferenceCode,\n payment_status: paymentStatus,\n order_status: paymentStatus,\n }) as Promise<ApiResponse>;\n }\n\n getConfig() {\n return this.config;\n }\n\n getEnvironment() {\n return this.config.environment;\n }\n\n getBaseUrl() {\n return this.config.environment === 'live'\n ? 'https://api.moipayway.co'\n : 'https://dev.moipayway.co';\n }\n}\n\nexport type { MoiPayWayConfig, PaymentMeta, CardDetails, PaymentMethod, DisplayMode } from './types';\n"],"mappings":"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","names":["src_exports","__export","ApiClient","MoiPayWay","PAYMENT_METHOD_LABELS","encryptCardDetails","formatAmount","generateOrderReference","parseAllowedMethods","__toCommonJS","BASE_URLS","ApiClient","environment","apiKey","endpoint","body","url","data","payload","orderReferenceCode","generateOrderReference","length","chars","result","i","formatAmount","amount","currency","num","code","formatted","parseAllowedMethods","data","raw","parsed","m","PAYMENT_METHOD_LABELS","PUBLIC_KEY","pemToArrayBuffer","pem","b64","bin","bytes","i","arrayBufferToBase64","buf","binary","randomHex","byteCount","b","encryptCardDetails","cardDetails","salt","ttlSeconds","encoder","payload","plain","aesKeyRaw","iv","aesKey","aesParams","cipherAndTag","cipherAndTagBytes","ct","tag","rsaKey","ek","pkg","err","MoiPayWay","config","ApiClient","apiKey","meta","orderReferenceCode","payload","generateOrderReference","cardDetails","encrypted","encryptCardDetails","type","currencyCode","currency","country","institution","prefix","firstname","lastname","phoneNumber","name","network","accountName","fromAddress","txHash","otp","paymentId","paymentStatus"]}
|
package/package.json
CHANGED