{"_id":"@waffo/payment-sdk","_rev":"11-0261086273bb6f0126cbd6bf2f6d78b5","name":"@waffo/payment-sdk","dist-tags":{"latest":"1.1.3"},"versions":{"1.0.3":{"name":"@waffo/payment-sdk","version":"1.0.3","keywords":["waffo","payment","sdk","tokenization","card","security"],"author":{"name":"Waffo"},"license":"MIT","_id":"@waffo/payment-sdk@1.0.3","maintainers":[{"name":"tangjiaj","email":"jj@waffo.com"},{"name":"fronzenvista","email":"wuze.wang@waffo.co"}],"dist":{"shasum":"e7c84c71f0a603ef6b242dd73ca0dde35f169566","tarball":"https://registry.npmjs.org/@waffo/payment-sdk/-/payment-sdk-1.0.3.tgz","fileCount":7,"integrity":"sha512-tN9+sBSNhPCCFvzyOSA3TKRBzpySrVmxvqFHzPpbyknwAAG+n1AakadZs6eEMfMLEOPXcxxMx0zX3aCJCA4/jA==","signatures":[{"sig":"MEUCIDLbXkmiJa4gNa1MMmzUg48d9GgiRYOXxE3ma0Wb6eJFAiEA/IlLFHkp3ZlM9et96FLFWM+7X9TPPnPNTqigzJh3mEo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":87354},"main":"./dist/index.js","type":"module","_from":"file:waffo-payment-sdk-1.0.3.tgz","types":"./dist/index.d.ts","unpkg":"./dist/index.min.js","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"build":"pnpm clean && rollup -c","clean":"rm -rf dist","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fronzenvista","email":"wuze.wang@waffo.co"},"jsdelivr":"./dist/index.min.js","_resolved":"/private/var/folders/_t/wkcqpbqx0vxgcrcf9z7zrlv00000gq/T/5870e8495e907c323642a6f16ba49ad2/waffo-payment-sdk-1.0.3.tgz","_integrity":"sha512-tN9+sBSNhPCCFvzyOSA3TKRBzpySrVmxvqFHzPpbyknwAAG+n1AakadZs6eEMfMLEOPXcxxMx0zX3aCJCA4/jA==","_npmVersion":"10.9.0","description":"Waffo Payment SDK for secure card tokenization","directories":{},"sideEffects":false,"_nodeVersion":"23.1.0","dependencies":{"penpal":"^7.0.4"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.8.1","rollup":"^4.30.1","typescript":"~5.9.2","rollup-plugin-dts":"^6.2.3","@rollup/plugin-terser":"^0.4.4","@rollup/plugin-commonjs":"^28.0.2","@rollup/plugin-typescript":"^12.1.2","@rollup/plugin-node-resolve":"^15.3.0"},"_npmOperationalInternal":{"tmp":"tmp/payment-sdk_1.0.3_1761134392659_0.13294176944602754","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@waffo/payment-sdk","version":"1.0.4","keywords":["waffo","payment","sdk","tokenization","card","security"],"author":{"name":"Waffo"},"license":"MIT","_id":"@waffo/payment-sdk@1.0.4","maintainers":[{"name":"tangjiaj","email":"jj@waffo.com"},{"name":"fronzenvista","email":"wuze.wang@waffo.co"}],"dist":{"shasum":"3c032e6de7c8140efc21bcb2c8e64ef91f62884f","tarball":"https://registry.npmjs.org/@waffo/payment-sdk/-/payment-sdk-1.0.4.tgz","fileCount":7,"integrity":"sha512-yEHAsIM5Xa1YH7clooV3rRj1if4FgaWilqrJ6LH3Cqjaru2X0y3erHE6mJbr9OpPsOTD8q+o0VCuIkQGBECIOw==","signatures":[{"sig":"MEUCIHeLC+nXnH91UGEBcMSfZlnG7S5tJplzw3e6LRjtsrajAiEAm+SAV9wkeYYuTvu99CyCGt2Kk/8gm1FcKFpzWBWsKC0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86157},"main":"./dist/index.js","type":"module","_from":"file:waffo-payment-sdk-1.0.4.tgz","types":"./dist/index.d.ts","unpkg":"./dist/index.min.js","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"build":"pnpm clean && rollup -c","clean":"rm -rf dist","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fronzenvista","email":"wuze.wang@waffo.co"},"jsdelivr":"./dist/index.min.js","_resolved":"/private/var/folders/_t/wkcqpbqx0vxgcrcf9z7zrlv00000gq/T/90c74a979b6acd8f7573b5bfe594059d/waffo-payment-sdk-1.0.4.tgz","_integrity":"sha512-yEHAsIM5Xa1YH7clooV3rRj1if4FgaWilqrJ6LH3Cqjaru2X0y3erHE6mJbr9OpPsOTD8q+o0VCuIkQGBECIOw==","_npmVersion":"10.9.0","description":"Waffo Payment SDK for secure card tokenization","directories":{},"sideEffects":false,"_nodeVersion":"23.1.0","dependencies":{"penpal":"^7.0.4"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.8.1","rollup":"^4.30.1","typescript":"~5.9.2","rollup-plugin-dts":"^6.2.3","@rollup/plugin-terser":"^0.4.4","@rollup/plugin-commonjs":"^28.0.2","@rollup/plugin-typescript":"^12.1.2","@rollup/plugin-node-resolve":"^15.3.0"},"_npmOperationalInternal":{"tmp":"tmp/payment-sdk_1.0.4_1761292268252_0.4826901186756203","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@waffo/payment-sdk","version":"1.0.5","keywords":["waffo","payment","sdk","tokenization","card","security"],"author":{"name":"Waffo"},"license":"MIT","_id":"@waffo/payment-sdk@1.0.5","maintainers":[{"name":"tangjiaj","email":"jj@waffo.com"},{"name":"fronzenvista","email":"wuze.wang@waffo.co"}],"dist":{"shasum":"eaf774a90022dae6815820312378b16c1f8f2847","tarball":"https://registry.npmjs.org/@waffo/payment-sdk/-/payment-sdk-1.0.5.tgz","fileCount":7,"integrity":"sha512-L4bm+Umz4XjewgKYH2NKIaImfa0mVpmFVa3IwmIgymM/6UkMay3srXEYbJuqAxHXP8EzwolFHXfaJWq0dms73Q==","signatures":[{"sig":"MEYCIQDMDRqufRwF5GvBtCKYMtTB3naazQn9Os1SUx1WbyOh3gIhAId1QrRFZctgxGkdSl4P1wqKzoc7TtVW0VC9AbhfDHwf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86743},"main":"./dist/index.js","type":"module","_from":"file:waffo-payment-sdk-1.0.5.tgz","types":"./dist/index.d.ts","unpkg":"./dist/index.min.js","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"build":"pnpm clean && rollup -c","clean":"rm -rf dist","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fronzenvista","email":"wuze.wang@waffo.co"},"jsdelivr":"./dist/index.min.js","_resolved":"/private/var/folders/_t/wkcqpbqx0vxgcrcf9z7zrlv00000gq/T/8c711b88788f8934ff06ced9af3af0a8/waffo-payment-sdk-1.0.5.tgz","_integrity":"sha512-L4bm+Umz4XjewgKYH2NKIaImfa0mVpmFVa3IwmIgymM/6UkMay3srXEYbJuqAxHXP8EzwolFHXfaJWq0dms73Q==","_npmVersion":"10.9.0","description":"Waffo Payment SDK for secure card tokenization","directories":{},"sideEffects":false,"_nodeVersion":"23.1.0","dependencies":{"penpal":"^7.0.4"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.8.1","rollup":"^4.30.1","typescript":"~5.9.2","rollup-plugin-dts":"^6.2.3","@rollup/plugin-terser":"^0.4.4","@rollup/plugin-commonjs":"^28.0.2","@rollup/plugin-typescript":"^12.1.2","@rollup/plugin-node-resolve":"^15.3.0"},"_npmOperationalInternal":{"tmp":"tmp/payment-sdk_1.0.5_1761645220898_0.8340354222071791","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@waffo/payment-sdk","version":"1.1.0","keywords":["waffo","payment","sdk","tokenization","card","security"],"author":{"name":"Waffo"},"license":"MIT","_id":"@waffo/payment-sdk@1.1.0","maintainers":[{"name":"tangjiaj","email":"jj@waffo.com"},{"name":"fronzenvista","email":"wuze.wang@waffo.co"}],"dist":{"shasum":"e145878f827af1df121b95052686379e7cc4497f","tarball":"https://registry.npmjs.org/@waffo/payment-sdk/-/payment-sdk-1.1.0.tgz","fileCount":7,"integrity":"sha512-6KQ+8dhFNTrByigh4PLKpbAnpoiPrVaIFnCAlG+pUT7bKoS4jt8vlk7Mc0FZHNKlEorUT8KA75tiTvcslaEG5A==","signatures":[{"sig":"MEYCIQCMKS8wGJuTNZQxZVhMVpwP9Av0Jgm8lyIApjPEFie5/wIhAMox5staqM3qNIcMz6aQoom9AzWuX8fZKYD8Y/HCGzri","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":167186},"main":"./dist/index.js","type":"module","_from":"file:waffo-payment-sdk-1.1.0.tgz","types":"./dist/index.d.ts","unpkg":"./dist/index.min.js","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"build":"pnpm clean && rollup -c","clean":"rm -rf dist","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fronzenvista","email":"wuze.wang@waffo.co"},"jsdelivr":"./dist/index.min.js","_resolved":"/private/var/folders/_t/wkcqpbqx0vxgcrcf9z7zrlv00000gq/T/f5aa06bb65ac937f515e3a5b48e87dc8/waffo-payment-sdk-1.1.0.tgz","_integrity":"sha512-6KQ+8dhFNTrByigh4PLKpbAnpoiPrVaIFnCAlG+pUT7bKoS4jt8vlk7Mc0FZHNKlEorUT8KA75tiTvcslaEG5A==","_npmVersion":"10.9.0","description":"Waffo Payment SDK for secure card tokenization and iframe rendering","directories":{},"sideEffects":false,"_nodeVersion":"23.1.0","dependencies":{"penpal":"^7.0.4"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.8.1","rollup":"^4.30.1","typescript":"~5.9.2","rollup-plugin-dts":"^6.2.3","@rollup/plugin-terser":"^0.4.4","@rollup/plugin-commonjs":"^28.0.2","@rollup/plugin-typescript":"^12.1.2","@rollup/plugin-node-resolve":"^15.3.0"},"_npmOperationalInternal":{"tmp":"tmp/payment-sdk_1.1.0_1766569232865_0.6183782843795707","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@waffo/payment-sdk","version":"1.1.1","keywords":["waffo","payment","sdk","tokenization","card","security"],"author":{"name":"Waffo"},"license":"MIT","_id":"@waffo/payment-sdk@1.1.1","maintainers":[{"name":"tangjiaj","email":"jj@waffo.com"},{"name":"fronzenvista","email":"wuze.wang@waffo.co"}],"dist":{"shasum":"6458c3ce239348e55654ab25df2aa570fb40cb35","tarball":"https://registry.npmjs.org/@waffo/payment-sdk/-/payment-sdk-1.1.1.tgz","fileCount":7,"integrity":"sha512-HiZkqFRTyPnLsLb3QDdltPqtRkhKuAxBaroKE9v7sRztfZV26bcQXFZeETNNyN4XxY5AVwyn4Vm7lPRnhdhTNA==","signatures":[{"sig":"MEYCIQCzQoMHDDoEjK2INHpDPJAS4WN5SZ+U67VkOWF8+ZBSgQIhAK/9+YEgPGqCXx1sp9i34FdUSk5kOXblUFP6RSJAJEFy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":168357},"main":"./dist/index.js","type":"module","_from":"file:waffo-payment-sdk-1.1.1.tgz","types":"./dist/index.d.ts","unpkg":"./dist/index.min.js","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"build":"pnpm clean && rollup -c","clean":"rm -rf dist","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fronzenvista","email":"wuze.wang@waffo.co"},"jsdelivr":"./dist/index.min.js","_resolved":"/private/var/folders/_t/wkcqpbqx0vxgcrcf9z7zrlv00000gq/T/345f8cb67726fdcfcc4d4db3525ce5f5/waffo-payment-sdk-1.1.1.tgz","_integrity":"sha512-HiZkqFRTyPnLsLb3QDdltPqtRkhKuAxBaroKE9v7sRztfZV26bcQXFZeETNNyN4XxY5AVwyn4Vm7lPRnhdhTNA==","_npmVersion":"10.9.0","description":"Waffo Payment SDK for secure card tokenization and iframe rendering","directories":{},"sideEffects":false,"_nodeVersion":"23.1.0","dependencies":{"penpal":"^7.0.4"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.8.1","rollup":"^4.30.1","typescript":"~5.9.2","rollup-plugin-dts":"^6.2.3","@rollup/plugin-terser":"^0.4.4","@rollup/plugin-commonjs":"^28.0.2","@rollup/plugin-typescript":"^12.1.2","@rollup/plugin-node-resolve":"^15.3.0"},"_npmOperationalInternal":{"tmp":"tmp/payment-sdk_1.1.1_1766570240712_0.12274775544711725","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@waffo/payment-sdk","version":"1.1.2","keywords":["waffo","payment","sdk","tokenization","card","security"],"author":{"name":"Waffo"},"license":"MIT","_id":"@waffo/payment-sdk@1.1.2","maintainers":[{"name":"waffo-js","email":"js@waffo.com"},{"name":"hill-waffo","email":"zhaoxuan.hong@waffo.com"},{"name":"tangjiaj","email":"jj@waffo.com"},{"name":"fronzenvista","email":"wuze.wang@waffo.co"}],"dist":{"shasum":"14388a05d9b800ca0be881d1b388a9127b4766bc","tarball":"https://registry.npmjs.org/@waffo/payment-sdk/-/payment-sdk-1.1.2.tgz","fileCount":7,"integrity":"sha512-j8BmkqUIDS84RcLXJyC6NJ3pSfVM0rhUeYtYjd3HZvec+tPIYHeGXoZMMBVQLOEUq20T+3+xkvtIiF4MV7Emag==","signatures":[{"sig":"MEUCIQCpz4O5Xpdv3NqqXl0Z1bzg/B0EKptPxEkuV5VkQdbSeAIgZ5e9d/JD+j1HLoe+5xfh5BAsa0SAIjD/zihBcaG59eU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":168943},"main":"./dist/index.js","type":"module","_from":"file:waffo-payment-sdk-1.1.2.tgz","types":"./dist/index.d.ts","unpkg":"./dist/index.min.js","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"build":"pnpm clean && rollup -c","clean":"rm -rf dist","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fronzenvista","email":"wuze.wang@waffo.co"},"jsdelivr":"./dist/index.min.js","_resolved":"/private/var/folders/_t/wkcqpbqx0vxgcrcf9z7zrlv00000gq/T/ecdaa46438afedfeb81732c0b4b27a82/waffo-payment-sdk-1.1.2.tgz","_integrity":"sha512-j8BmkqUIDS84RcLXJyC6NJ3pSfVM0rhUeYtYjd3HZvec+tPIYHeGXoZMMBVQLOEUq20T+3+xkvtIiF4MV7Emag==","_npmVersion":"11.9.0","description":"Waffo Payment SDK for secure card tokenization and iframe rendering","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","dependencies":{"penpal":"^7.0.4"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.8.1","rollup":"^4.30.1","typescript":"~5.9.2","rollup-plugin-dts":"^6.2.3","@rollup/plugin-terser":"^0.4.4","@rollup/plugin-commonjs":"^28.0.2","@rollup/plugin-typescript":"^12.1.2","@rollup/plugin-node-resolve":"^15.3.0"},"_npmOperationalInternal":{"tmp":"tmp/payment-sdk_1.1.2_1773298639019_0.6140072939209753","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@waffo/payment-sdk","version":"1.1.3","keywords":["waffo","payment","sdk","tokenization","card","security"],"author":{"name":"Waffo"},"license":"MIT","_id":"@waffo/payment-sdk@1.1.3","maintainers":[{"name":"waffo-js","email":"js@waffo.com"},{"name":"hill-waffo","email":"zhaoxuan.hong@waffo.com"},{"name":"tangjiaj","email":"jj@waffo.com"},{"name":"fronzenvista","email":"wuze.wang@waffo.co"}],"dist":{"shasum":"94d469bb43450cfb6a8c3db830d89f0e9e495ead","tarball":"https://registry.npmjs.org/@waffo/payment-sdk/-/payment-sdk-1.1.3.tgz","fileCount":5,"integrity":"sha512-+DBFekYm5u9BxXhB2FZ5KZalS8M3l+Tx3XI5dq2zA3p2h419L442tHv8/PF31FZ4kMN7lA65e0TSazEJTNryRA==","signatures":[{"sig":"MEQCIFdprJHjLG2pvdxJ3w9gekwJ9seej2+7BEo0SlpU0Z03AiAHbLuaDAVX0WWc59fGI5jqMivw4dOPgUZei+1PAfSczg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":58526},"main":"./dist/index.js","type":"module","_from":"file:waffo-payment-sdk-1.1.3.tgz","types":"./dist/index.d.ts","unpkg":"./dist/index.min.js","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"build":"pnpm clean && rollup -c","clean":"rm -rf dist","typecheck":"tsc --noEmit"},"_npmUser":{"name":"fronzenvista","email":"wuze.wang@waffo.co"},"jsdelivr":"./dist/index.min.js","_resolved":"/private/var/folders/_t/wkcqpbqx0vxgcrcf9z7zrlv00000gq/T/37e112615bbc1e568f5a2323e7297799/waffo-payment-sdk-1.1.3.tgz","_integrity":"sha512-+DBFekYm5u9BxXhB2FZ5KZalS8M3l+Tx3XI5dq2zA3p2h419L442tHv8/PF31FZ4kMN7lA65e0TSazEJTNryRA==","_npmVersion":"11.9.0","description":"Waffo Payment SDK for secure card tokenization and iframe rendering","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","dependencies":{"penpal":"^7.0.4"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.8.1","rollup":"^4.30.1","typescript":"~5.9.2","rollup-plugin-dts":"^6.2.3","@rollup/plugin-terser":"^0.4.4","@rollup/plugin-commonjs":"^28.0.2","@rollup/plugin-typescript":"^12.1.2","@rollup/plugin-node-resolve":"^15.3.0"},"_npmOperationalInternal":{"tmp":"tmp/payment-sdk_1.1.3_1775009183854_0.36631660251659826","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2025-10-22T11:59:52.586Z","modified":"2026-06-04T10:12:16.227Z","1.0.3":"2025-10-22T11:59:52.854Z","1.0.4":"2025-10-24T07:51:08.445Z","1.0.5":"2025-10-28T09:53:41.066Z","1.1.0":"2025-12-24T09:40:33.044Z","1.1.1":"2025-12-24T09:57:20.917Z","1.1.2":"2026-03-12T06:57:19.170Z","1.1.3":"2026-04-01T02:06:24.013Z"},"author":{"name":"Waffo"},"license":"MIT","keywords":["waffo","payment","sdk","tokenization","card","security"],"description":"Waffo Payment SDK for secure card tokenization and iframe rendering","maintainers":[{"email":"xichen.wu@waffo.com","name":"zephyr-waffo"},{"email":"huiling.mo@waffo.com","name":"mohuiling"},{"email":"js@waffo.com","name":"waffo-js"},{"email":"zhongyuan.zhao@waffo.com","name":"zhongyuan.zhao"},{"email":"zhaoxuan.hong@waffo.com","name":"hill-waffo"},{"email":"jj@waffo.com","name":"tangjiaj"},{"email":"wuze.wang@waffo.co","name":"fronzenvista"}],"readme":"# Waffo Payment SDK\n\n[![npm version](https://badge.fury.io/js/@waffo%2Fpayment-sdk.svg)](https://www.npmjs.com/package/@waffo/payment-sdk)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nA comprehensive payment SDK for web applications, featuring:\n- 🔐 **Card Tokenization** - Secure card data tokenization with 3DS verification support\n- 🖼️ **Iframe Embedding** - Embed customizable payment checkout pages with real-time theme updates\n- 🍎 **Apple Pay Support** - Seamless Apple Pay integration within iframe\n- 🎨 **Theme Customization** - Dynamic theme switching with merchant logo support\n\n## 📦 Installation\n\n```bash\nnpm install @waffo/payment-sdk\n# or\npnpm add @waffo/payment-sdk\n```\n\n## 🚀 Usage\n\n### 1. Tokenization (Card Tokenization)\n\n```javascript\nimport WaffoSDK from '@waffo/payment-sdk';\n\n// Initialize SDK\nconst sdk = new WaffoSDK('your-client-api-key', {\n  env: 'prod',        // 'prod' | 'testing' | 'sandbox'\n  locale: 'en'        // Optional, default 'en'\n});\n\n// Submit tokenization request\nconst result = await sdk.tokenizationSubmit('token-session-id', {\n  tokenDataVerification: false,  // Optional, validate card data, default false\n  tokenData: {\n    pan: '4111111111111111',     // Card number\n    name: 'John Doe',             // Cardholder name\n    expiry: '12/2025',            // Expiry date MM/YYYY\n    cvv: '123'                    // CVV (optional)\n  },\n  billingAddress: {               // Optional\n    countryCode: 'USA',\n    region: 'CA',\n    city: 'San Francisco',\n    postalCode: '94102',\n    address: '123 Main St'\n  }\n});\n\n// Handle result\nif (result.success) {\n  console.log('Token Request ID:', result.data.tokenRequestId);\n  if (result.data.validateUrl) {\n    // 3DS verification required\n    window.location.href = result.data.validateUrl;\n  }\n} else {\n  console.error('Error:', result.error.code, result.error.message);\n}\n\n// Destroy SDK (cleanup resources)\nsdk.destroy();\n```\n\n### 2. RenderIframe (Embed Payment Checkout)\n\nThe `renderIframe` function allows you to embed the Waffo payment checkout page in your merchant page, similar to Stripe SDK's iframe embedding functionality.\n\n#### Basic Usage\n\n```javascript\nimport WaffoSDK from '@waffo/payment-sdk';\n\n// Render payment iframe\nconst payment = WaffoSDK.renderIframe({\n  // Required parameters\n  url: 'https://cashier.waffo.com/orderKey',  // Payment page URL\n  container: '#payment-container',              // Container selector or DOM element\n  \n  // Optional: Theme customization\n  appearance: {\n    // Merchant logo URL (optional)\n    logoUrl: 'https://example.com/logo.png',\n    \n    // Theme variables (optional)\n    variables: {\n      colorPrimary: '#0570de',        // Primary color\n      colorBackground: '#ffffff',     // Background color\n      colorCard: '#f8f9fa',           // Card background color\n      colorText: '#30313d',           // Text color\n      colorTextSecondary: '#6b7280',  // Secondary text color\n      colorTextTertiary: '#9ca3af',   // Tertiary text color\n      colorBorder: '#E2E8F0',         // Border color\n      colorDanger: '#d93025',         // Error/danger color\n      colorInfo: '#e3f2fd',           // Info background color\n      fontSizeBase: '16px',           // Base font size\n      borderRadius: '8px',            // Border radius\n      buttonRadius: '9999px',         // Button border radius\n    },\n  },\n  \n  // Optional: iframe styles\n  style: {\n    width: '100%',\n    height: '600px',\n    border: 'none',\n    borderRadius: '8px',\n  },\n});\n\n// Unmount iframe\npayment.unmount();\n```\n\n#### Dynamic Theme Update\n\nYou can dynamically update the theme and logo after the iframe is rendered, without reloading the iframe:\n\n```javascript\nimport WaffoSDK from '@waffo/payment-sdk';\n\n// Render iframe with initial theme\nconst payment = WaffoSDK.renderIframe({\n  url: 'https://cashier.waffo.com/orderKey',\n  container: '#payment-container',\n  appearance: {\n    logoUrl: 'https://example.com/logo.png',\n    variables: {\n      colorPrimary: '#0570de',\n      colorBackground: '#ffffff',\n    },\n  },\n});\n\n// Later, update theme dynamically (e.g., user switches to dark mode)\n// Note: Always include logoUrl when updating theme to preserve the logo\nawait payment.updateAppearance({\n  logoUrl: 'https://example.com/logo.png',  // Keep the logo\n  variables: {\n    colorPrimary: '#5b8ef3',\n    colorBackground: '#1a1a1a',\n    colorCard: '#2a2a2a',\n    colorText: '#ffffff',\n    colorTextSecondary: '#b0b0b0',\n  },\n});\n\n// The iframe theme will update in real-time without page refresh!\n```\n\n#### Real-time Theme Preview Example\n\n```javascript\n// Example: Color picker with real-time preview\nconst colorInput = document.getElementById('primary-color');\nlet updateTimeout;\n\ncolorInput.addEventListener('input', (e) => {\n  // Debounce updates\n  clearTimeout(updateTimeout);\n  updateTimeout = setTimeout(async () => {\n    await payment.updateAppearance({\n      variables: {\n        colorPrimary: e.target.value,\n      },\n    });\n  }, 300);\n});\n```\n\n#### Key Features\n\n✅ **Theme Customization**: Customize payment page styles via `appearance` parameter  \n✅ **Merchant Logo**: Display custom merchant logo via `logoUrl`  \n✅ **Dynamic Updates**: Update theme and logo in real-time without reloading iframe  \n✅ **Apple Pay Support**: Automatically handles Apple Pay communication in iframe  \n✅ **On-Demand Loading**: Apple Pay SDK loads only when needed, no performance impact  \n✅ **Secure Sandbox**: iframe uses secure sandbox and allow attributes  \n✅ **Flexible Styling**: Support custom iframe width, height, border, etc.\n\n#### Complete Example\n\n```html\n<!DOCTYPE html>\n<html>\n<head>\n  <title>Waffo Payment</title>\n  <style>\n    #payment-container {\n      max-width: 600px;\n      margin: 50px auto;\n      padding: 20px;\n    }\n    .theme-selector {\n      margin-bottom: 20px;\n      display: flex;\n      gap: 10px;\n    }\n    .theme-btn {\n      padding: 10px 20px;\n      border: none;\n      border-radius: 8px;\n      cursor: pointer;\n      font-weight: 500;\n    }\n  </style>\n</head>\n<body>\n  <!-- Theme selector buttons -->\n  <div class=\"theme-selector\">\n    <button class=\"theme-btn\" id=\"light-theme\">Light Theme</button>\n    <button class=\"theme-btn\" id=\"dark-theme\">Dark Theme</button>\n  </div>\n\n  <div id=\"payment-container\"></div>\n  \n  <script type=\"module\">\n    import WaffoSDK from '@waffo/payment-sdk';\n    \n    // Render iframe\n    const payment = WaffoSDK.renderIframe({\n      url: 'https://cashier.waffo.com/order123',\n      container: '#payment-container',\n      appearance: {\n        variables: {\n          colorPrimary: '#0570de',\n          colorBackground: '#ffffff',\n        },\n      },\n    });\n    \n    // Light theme switch\n    document.getElementById('light-theme').addEventListener('click', async () => {\n      await payment.updateAppearance({\n        variables: {\n          colorPrimary: '#0570de',\n          colorBackground: '#ffffff',\n          colorCard: '#f8f9fa',\n          colorText: '#30313d',\n        },\n      });\n    });\n    \n    // Dark theme switch\n    document.getElementById('dark-theme').addEventListener('click', async () => {\n      await payment.updateAppearance({\n        variables: {\n          colorPrimary: '#5b8ef3',\n          colorBackground: '#1a1a1a',\n          colorCard: '#2a2a2a',\n          colorText: '#ffffff',\n        },\n      });\n    });\n  </script>\n</body>\n</html>\n```\n\n\n## 📖 API Reference\n\n### `new WaffoSDK(clientApiKey, options)`\n\nCreate an SDK instance.\n\n**Parameters:**\n- `clientApiKey` (string): Client API key\n- `options` (object):\n  - `env` (string): Environment, values: `'prod'` | `'testing'` | `'sandbox'`\n  - `locale` (string): Language code, e.g. `'en'`, `'ja'`, `'zh'` (optional, default `'en'`)\n\n**Returns:** `WaffoSDK` instance\n\n---\n\n### `sdk.tokenizationSubmit(tokenSessionId, request)`\n\nSubmit card tokenization request.\n\n**Parameters:**\n- `tokenSessionId` (string): Token session ID\n- `request` (object):\n  - `tokenDataVerification` (boolean): Validate card data (optional, default `false`)\n  - `tokenData` (object): Card data\n    - `pan` (string): Card number\n    - `name` (string): Cardholder name\n    - `expiry` (string): Expiry date, format `MM/YYYY`\n    - `cvv` (string): CVV security code (optional)\n  - `billingAddress` (object): Billing address (optional)\n    - `countryCode` (string): Country code (ISO 3166-1 alpha-3)\n    - `region` (string): State/Province/Region\n    - `city` (string): City\n    - `postalCode` (string): Postal code\n    - `address` (string): Street address\n\n**Returns:** `Promise<TokenizationResult>`\n\n**Success Response:**\n```typescript\n{\n  success: true,\n  data: {\n    tokenRequestId: string,\n    validateUrl?: string  // If 3DS verification is required\n  }\n}\n```\n\n**Error Response:**\n```typescript\n{\n  success: false,\n  data: null,\n  error: {\n    code: string,\n    message: string\n  }\n}\n```\n\n**Error Codes:**\n\n| Error Code | Description |\n|------------|-------------|\n| `011001P001` | Wrong parameters. |\n| `011001P002` | Idempotent param mismatch error. |\n| `011001B004` | Invalid expiry date format. |\n| `011001B005` | The card has been expired. |\n| `011001B006` | The card's BIN has been denied. |\n| `011001B024` | The token session has expired. |\n| `011001B025` | Card information is invalid. - pan, name, expiry are required |\n| `011001B027` | The token session is invalid. |\n| `011001B031` | The merchant contract not matched. |\n| `011001S001` | System process failed. |\n\n---\n\n### `sdk.destroy()`\n\nDestroy SDK instance and cleanup resources.\n\n**Parameters:** None\n\n**Returns:** `void`\n\n---\n\n### `WaffoSDK.renderIframe(options)`\n\nRender payment checkout page in an iframe.\n\n**Parameters:**\n- `options` (object): RenderIframe configuration\n  - `url` (string, required): Payment page URL\n  - `container` (string | HTMLElement, required): Container selector or DOM element\n  - `appearance` (object, optional): Theme customization\n    - `logoUrl` (string, optional): Merchant logo URL\n    - `variables` (object, optional): Theme variables\n      - `colorPrimary` (string): Primary color\n      - `colorBackground` (string): Background color\n      - `colorCard` (string): Card background color\n      - `colorText` (string): Text color\n      - `colorTextSecondary` (string): Secondary text color\n      - `colorTextTertiary` (string): Tertiary text color\n      - `colorBorder` (string): Border color\n      - `colorDanger` (string): Error/danger color\n      - `colorInfo` (string): Info background color\n      - `fontSizeBase` (string): Base font size\n      - `borderRadius` (string): Border radius\n      - `buttonRadius` (string): Button border radius\n  - `style` (object, optional): Iframe CSS styles\n    - `width` (string): Width, default `'100%'`\n    - `height` (string): Height, default `'600px'`\n    - `border` (string): Border, default `'none'`\n    - `borderRadius` (string): Border radius, default `'0px'`\n    - `[key: string]` (string): Other CSS properties\n\n**Returns:** `PaymentInstance`\n\n**PaymentInstance Methods:**\n\n- `unmount()`: Unmount and cleanup iframe\n- `getIframe()`: Get iframe DOM element\n- `updateAppearance(appearance)`: Dynamically update theme and logo without reloading iframe\n\n**Example:**\n```javascript\nconst payment = WaffoSDK.renderIframe({\n  url: 'https://cashier.waffo.com/order123',\n  container: '#payment-container',\n  appearance: {\n    logoUrl: 'https://example.com/logo.png',\n    variables: {\n      colorPrimary: '#0570de',\n      colorCard: '#ffffff',\n    },\n  },\n});\n\n// Update theme and logo dynamically\nawait payment.updateAppearance({\n  logoUrl: 'https://example.com/logo.png',\n  variables: {\n    colorPrimary: '#00a86b',\n  },\n});\n\n// Clean up\npayment.unmount();\n```\n\n---\n\n### `payment.updateAppearance(appearance)`\n\nDynamically update the iframe theme and logo without reloading the page.\n\n**Parameters:**\n- `appearance` (object): Theme configuration\n  - `logoUrl` (string, optional): Merchant logo URL\n  - `variables` (object, optional): Theme variables (same as `renderIframe`)\n\n**Returns:** `Promise<void>`\n\n**Example:**\n```javascript\n// Initial render\nconst payment = WaffoSDK.renderIframe({\n  url: 'https://cashier.waffo.com/order123',\n  container: '#payment-container',\n  appearance: {\n    logoUrl: 'https://example.com/logo.png',\n    variables: {\n      colorPrimary: '#0570de',\n    },\n  },\n});\n\n// Update to dark theme (include logoUrl to preserve the logo)\nawait payment.updateAppearance({\n  logoUrl: 'https://example.com/logo.png',\n  variables: {\n    colorPrimary: '#5b8ef3',\n    colorBackground: '#1a1a1a',\n    colorCard: '#2a2a2a',\n    colorText: '#ffffff',\n  },\n});\n\n// Update only the logo\nawait payment.updateAppearance({\n  logoUrl: 'https://example.com/new-logo.png',\n});\n\n// Update only colors (include logoUrl to preserve the logo)\nawait payment.updateAppearance({\n  logoUrl: 'https://example.com/logo.png',\n  variables: {\n    colorPrimary: '#00a86b',\n  },\n});\n```\n\n**Important:** When calling `updateAppearance`, always include `logoUrl` if you want to preserve the merchant logo. If `logoUrl` is omitted, the logo may be hidden after the theme update.\n\n**Benefits:**\n- ✅ Real-time theme and logo updates without page reload\n- ✅ Smooth user experience\n- ✅ Preserves user input data\n- ✅ Reduces network requests\n- ✅ Perfect for theme switchers and color pickers\n\n---\n\n## 📄 License\n\nMIT © Waffo\n\n","readmeFilename":"README.md"}