{"_id":"@carllee1983/newebpay","_rev":"10-fde21a272c3d4b05d452170c42dfffa9","name":"@carllee1983/newebpay","dist-tags":{"latest":"1.5.0"},"versions":{"1.0.0":{"name":"@carllee1983/newebpay","version":"1.0.0","keywords":["newebpay","payment","gateway","taiwan","credit-card","atm","cvs","linepay","taiwanpay","sdk"],"author":{"name":"Carl Lee","email":"carllee0520@gmail.com"},"license":"MIT","_id":"@carllee1983/newebpay@1.0.0","maintainers":[{"name":"carllee1983","email":"carllee0520@gmail.com"}],"homepage":"https://github.com/CarlLee1983/newebpay-node#readme","bugs":{"url":"https://github.com/CarlLee1983/newebpay-node/issues"},"dist":{"shasum":"e1efc772b1a029b5bf1df1bb7ed4b993caf5997e","tarball":"https://registry.npmjs.org/@carllee1983/newebpay/-/newebpay-1.0.0.tgz","fileCount":9,"integrity":"sha512-6nDANqk9mIeoBjE7Npky2zb5tTGsvQjhLYpnTtls2ak8SHxAhKK3VmZF9Iuayr2kmB1cnHjOJ/X7rHlToiRG5Q==","signatures":[{"sig":"MEUCIQCnRjc1qRWvcDKrZpdUBsyPDK95BLOXj9j3WLS2lvU+EgIgM3QdmR0Fopw+IiZUnkNRXaLakbJ7+VFVMkltlJnfCDE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":447075},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"a49458f38ca44ff7995f4c142087db6fecefd6e7","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"carllee1983","email":"carllee0520@gmail.com"},"repository":{"url":"git+https://github.com/CarlLee1983/newebpay-node.git","type":"git"},"_npmVersion":"10.8.2","description":"藍新金流 SDK - NewebPay Payment Gateway SDK for Node.js","directories":{},"_nodeVersion":"18.20.8","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","eslint":"^9.39.1","vitest":"^2.0.0","@eslint/js":"^9.39.1","typescript":"^5.3.0","@types/node":"^20.10.0","typescript-eslint":"^8.48.0","@vitest/coverage-v8":"^2.0.0","@typescript-eslint/parser":"^8.48.0","@typescript-eslint/eslint-plugin":"^8.48.0"},"_npmOperationalInternal":{"tmp":"tmp/newebpay_1.0.0_1764311611327_0.10278502893957153","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@carllee1983/newebpay","version":"1.1.0","keywords":["newebpay","payment","gateway","taiwan","credit-card","atm","cvs","linepay","taiwanpay","sdk"],"author":{"name":"Carl Lee","email":"carllee0520@gmail.com"},"license":"MIT","_id":"@carllee1983/newebpay@1.1.0","maintainers":[{"name":"carllee1983","email":"carllee0520@gmail.com"}],"homepage":"https://github.com/CarlLee1983/newebpay-node#readme","bugs":{"url":"https://github.com/CarlLee1983/newebpay-node/issues"},"bin":{"newebpay":"dist/cli/index.js"},"dist":{"shasum":"5302d279b4e8d6c6f71ed561417bffb3e6786858","tarball":"https://registry.npmjs.org/@carllee1983/newebpay/-/newebpay-1.1.0.tgz","fileCount":22,"integrity":"sha512-16YObDAPz67ZP8xnT7LeRMgrPZCdpMwSDkzunjUJJotpO+lSBfd+SS22T/wxHHq0K/WVC/+ILDA2B1Ug75jRSg==","signatures":[{"sig":"MEQCIB56HVFppQ7Agkrc4nAQXe899w9SYJ1uIBv5rAFzzb9KAiBhGdQt92/e4fNhIyk1j7QN4U/5ogW2ykA05TS53nxEBA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1319254},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./common":{"import":{"types":"./dist/frameworks/common/index.d.ts","default":"./dist/frameworks/common/index.js"},"require":{"types":"./dist/frameworks/common/index.d.cts","default":"./dist/frameworks/common/index.cjs"}},"./express":{"import":{"types":"./dist/frameworks/express/index.d.ts","default":"./dist/frameworks/express/index.js"},"require":{"types":"./dist/frameworks/express/index.d.cts","default":"./dist/frameworks/express/index.cjs"}}},"gitHead":"216dfdcf5c61c51581fa131ed0e2c6ddf4c3a0b1","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"carllee1983","email":"carllee0520@gmail.com"},"repository":{"url":"git+https://github.com/CarlLee1983/newebpay-node.git","type":"git"},"_npmVersion":"10.8.2","description":"藍新金流 SDK - NewebPay Payment Gateway SDK for Node.js","directories":{},"_nodeVersion":"18.20.8","dependencies":{"commander":"^13.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","eslint":"^9.39.1","vitest":"^2.0.0","@eslint/js":"^9.39.1","typescript":"^5.3.0","@types/node":"^20.10.0","@types/express":"^5.0.5","typescript-eslint":"^8.48.0","@vitest/coverage-v8":"^2.0.0","@typescript-eslint/parser":"^8.48.0","@typescript-eslint/eslint-plugin":"^8.48.0"},"_npmOperationalInternal":{"tmp":"tmp/newebpay_1.1.0_1764320269322_0.4660083921084024","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@carllee1983/newebpay","version":"1.2.0","keywords":["newebpay","payment","gateway","taiwan","credit-card","atm","cvs","linepay","taiwanpay","sdk"],"author":{"name":"Carl Lee","email":"carllee0520@gmail.com"},"license":"MIT","_id":"@carllee1983/newebpay@1.2.0","maintainers":[{"name":"carllee1983","email":"carllee0520@gmail.com"}],"homepage":"https://github.com/CarlLee1983/newebpay-node#readme","bugs":{"url":"https://github.com/CarlLee1983/newebpay-node/issues"},"bin":{"newebpay":"dist/cli/index.js"},"dist":{"shasum":"6ec1d8a1f6ccb3eedc701fb2ece6fdb09fff910c","tarball":"https://registry.npmjs.org/@carllee1983/newebpay/-/newebpay-1.2.0.tgz","fileCount":22,"integrity":"sha512-rc/+d/L/w7YMf3ghCZy79Bsbi10CBitmngoQ+mllWwN7GqTHRM40SPjF3GqPnb5ILx3WtpDGrvj9OOOxgBflAQ==","signatures":[{"sig":"MEQCIB9LlHg+LW8PMr+fh+Qv7jfqfDpwll6eomfHXerIMONbAiAI30T6RjQgJX/9VlRLjV+5/ktkMie3FQK2Snc5/JSGRg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1322285},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./common":{"import":{"types":"./dist/frameworks/common/index.d.ts","default":"./dist/frameworks/common/index.js"},"require":{"types":"./dist/frameworks/common/index.d.cts","default":"./dist/frameworks/common/index.cjs"}},"./express":{"import":{"types":"./dist/frameworks/express/index.d.ts","default":"./dist/frameworks/express/index.js"},"require":{"types":"./dist/frameworks/express/index.d.cts","default":"./dist/frameworks/express/index.cjs"}}},"gitHead":"982620a2714dc6e7846da8591bfdfb1e4235b1ee","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src/","test":"vitest run","build":"tsup","test:e2e":"vitest run tests/e2e","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"carllee1983","email":"carllee0520@gmail.com"},"repository":{"url":"git+https://github.com/CarlLee1983/newebpay-node.git","type":"git"},"_npmVersion":"10.9.4","description":"藍新金流 SDK - NewebPay Payment Gateway SDK for Node.js","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","dependencies":{"commander":"^13.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","eslint":"^9.39.1","vitest":"^2.0.0","express":"^5.2.1","typedoc":"^0.28.15","supertest":"^7.1.4","@eslint/js":"^9.39.1","typescript":"^5.3.0","@types/node":"^20.10.0","@types/express":"^5.0.5","@types/supertest":"^6.0.3","semantic-release":"^24.2.9","typescript-eslint":"^8.48.0","@vitest/coverage-v8":"^2.0.0","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^12.0.2","typedoc-plugin-markdown":"^4.9.0","@semantic-release/github":"^11.0.6","@typescript-eslint/parser":"^8.48.0","@semantic-release/changelog":"^6.0.3","@typescript-eslint/eslint-plugin":"^8.48.0","conventional-changelog-conventionalcommits":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/newebpay_1.2.0_1764991559415_0.5879704411267355","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@carllee1983/newebpay","version":"1.3.0","keywords":["newebpay","payment","gateway","taiwan","credit-card","atm","cvs","linepay","taiwanpay","sdk"],"author":{"name":"Carl Lee","email":"carllee0520@gmail.com"},"license":"MIT","_id":"@carllee1983/newebpay@1.3.0","maintainers":[{"name":"carllee1983","email":"carllee0520@gmail.com"}],"homepage":"https://github.com/CarlLee1983/newebpay-node#readme","bugs":{"url":"https://github.com/CarlLee1983/newebpay-node/issues"},"bin":{"newebpay":"dist/cli/index.js"},"dist":{"shasum":"9bd8d7de599955e888102c4a43bb5676bcc45aa6","tarball":"https://registry.npmjs.org/@carllee1983/newebpay/-/newebpay-1.3.0.tgz","fileCount":28,"integrity":"sha512-s8H9ydVtdv0VIOwtDrHRr2v8oNTdx8o0t8vQIPx0TfbXcxoniJef06Ant6i+YcfJ12ua7tRB5qGhD47CTBiuig==","signatures":[{"sig":"MEUCIQDGeowtE1qtBuIiwMfqmPyk6aqNgNup0KJDlrU5A9aSUAIgQyXXwFaCQtYwrEysV5Mit0eZhprDyKdT7OpjrLcxU6Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1508894},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./koa":{"import":{"types":"./dist/frameworks/koa/index.d.ts","default":"./dist/frameworks/koa/index.js"},"require":{"default":"./dist/frameworks/koa/index.js"}},"./common":{"import":{"types":"./dist/frameworks/common/index.d.ts","default":"./dist/frameworks/common/index.js"},"require":{"types":"./dist/frameworks/common/index.d.cts","default":"./dist/frameworks/common/index.cjs"}},"./express":{"import":{"types":"./dist/frameworks/express/index.d.ts","default":"./dist/frameworks/express/index.js"},"require":{"types":"./dist/frameworks/express/index.d.cts","default":"./dist/frameworks/express/index.cjs"}},"./fastify":{"import":{"types":"./dist/frameworks/fastify/index.d.ts","default":"./dist/frameworks/fastify/index.js"},"require":{"default":"./dist/frameworks/fastify/index.js"}}},"gitHead":"fdb5d083379dafb15179e20ac79dd229c8a3aea2","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src/","test":"vitest run","build":"tsup","test:e2e":"vitest run tests/e2e","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"carllee1983","email":"carllee0520@gmail.com"},"repository":{"url":"git+https://github.com/CarlLee1983/newebpay-node.git","type":"git"},"_npmVersion":"10.9.4","description":"藍新金流 SDK - NewebPay Payment Gateway SDK for Node.js","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","dependencies":{"koa":"^3.1.1","fastify":"^5.6.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","eslint":"^9.39.1","vitest":"^2.0.0","express":"^5.2.1","typedoc":"^0.28.15","supertest":"^7.1.4","@eslint/js":"^9.39.1","@types/koa":"^3.0.1","typescript":"^5.3.0","@types/node":"^20.10.0","@types/express":"^5.0.5","@types/supertest":"^6.0.3","semantic-release":"^24.2.9","typescript-eslint":"^8.48.0","@vitest/coverage-v8":"^2.0.0","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^12.0.2","typedoc-plugin-markdown":"^4.9.0","@semantic-release/github":"^11.0.6","@typescript-eslint/parser":"^8.48.0","@semantic-release/changelog":"^6.0.3","@typescript-eslint/eslint-plugin":"^8.48.0","conventional-changelog-conventionalcommits":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/newebpay_1.3.0_1764993647537_0.5100319176988704","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@carllee1983/newebpay","version":"1.3.1","keywords":["newebpay","payment","gateway","taiwan","credit-card","atm","cvs","linepay","taiwanpay","sdk"],"author":{"name":"Carl Lee","email":"carllee0520@gmail.com"},"license":"MIT","_id":"@carllee1983/newebpay@1.3.1","maintainers":[{"name":"carllee1983","email":"carllee0520@gmail.com"}],"homepage":"https://github.com/CarlLee1983/newebpay-node#readme","bugs":{"url":"https://github.com/CarlLee1983/newebpay-node/issues"},"bin":{"newebpay":"dist/cli/index.js"},"dist":{"shasum":"5db72abccac6d29c61995343518fc4fe05c98c72","tarball":"https://registry.npmjs.org/@carllee1983/newebpay/-/newebpay-1.3.1.tgz","fileCount":28,"integrity":"sha512-/Hoc2+vTC7xed0SpO0t6q/I5LKZ6qtSWNsd01KWN5hJ00fqVkfBmxWdY/vm5II5klghsb2lGVJJ7/o5osDnwPw==","signatures":[{"sig":"MEUCIQDeGja8aEYuFZBbQhLJtLsZk0QbT2Mxtk7muBJIHE7SoQIgb6Xge/LyK2Q01/gmJ/DIM5RD64K39j9RJMXgcgjvhHY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1489410},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./koa":{"import":{"types":"./dist/frameworks/koa/index.d.ts","default":"./dist/frameworks/koa/index.js"},"require":{"default":"./dist/frameworks/koa/index.js"}},"./common":{"import":{"types":"./dist/frameworks/common/index.d.ts","default":"./dist/frameworks/common/index.js"},"require":{"types":"./dist/frameworks/common/index.d.cts","default":"./dist/frameworks/common/index.cjs"}},"./express":{"import":{"types":"./dist/frameworks/express/index.d.ts","default":"./dist/frameworks/express/index.js"},"require":{"types":"./dist/frameworks/express/index.d.cts","default":"./dist/frameworks/express/index.cjs"}},"./fastify":{"import":{"types":"./dist/frameworks/fastify/index.d.ts","default":"./dist/frameworks/fastify/index.js"},"require":{"default":"./dist/frameworks/fastify/index.js"}}},"gitHead":"3aaa6d3955d678d4b37909639bef552c5bbb2b99","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src/","test":"vitest run","build":"tsup","format":"prettier --write .","test:e2e":"vitest run tests/e2e","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check .","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"carllee1983","email":"carllee0520@gmail.com"},"repository":{"url":"git+https://github.com/CarlLee1983/newebpay-node.git","type":"git"},"_npmVersion":"10.9.4","description":"藍新金流 SDK - NewebPay Payment Gateway SDK for Node.js","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","dependencies":{"koa":"^3.1.1","fastify":"^5.6.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","eslint":"^9.39.1","vitest":"^2.0.0","express":"^5.2.1","typedoc":"^0.28.15","prettier":"^3.7.4","supertest":"^7.1.4","@eslint/js":"^9.39.1","@types/koa":"^3.0.1","typescript":"^5.3.0","@types/node":"^20.10.0","@types/express":"^5.0.5","@types/supertest":"^6.0.3","semantic-release":"^24.2.9","typescript-eslint":"^8.48.0","@vitest/coverage-v8":"^2.0.0","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^12.0.2","typedoc-plugin-markdown":"^4.9.0","@semantic-release/github":"^11.0.6","@typescript-eslint/parser":"^8.48.0","@semantic-release/changelog":"^6.0.3","@typescript-eslint/eslint-plugin":"^8.48.0","conventional-changelog-conventionalcommits":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/newebpay_1.3.1_1765115658251_0.5456771386079586","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"@carllee1983/newebpay","version":"1.3.2","keywords":["newebpay","payment","gateway","taiwan","credit-card","atm","cvs","linepay","taiwanpay","sdk"],"author":{"name":"Carl Lee","email":"carllee0520@gmail.com"},"license":"MIT","_id":"@carllee1983/newebpay@1.3.2","maintainers":[{"name":"carllee1983","email":"carllee0520@gmail.com"}],"homepage":"https://github.com/CarlLee1983/newebpay-node#readme","bugs":{"url":"https://github.com/CarlLee1983/newebpay-node/issues"},"bin":{"newebpay":"dist/cli/index.js"},"dist":{"shasum":"9477524d37dad65e1840f047c46dd365048de1ea","tarball":"https://registry.npmjs.org/@carllee1983/newebpay/-/newebpay-1.3.2.tgz","fileCount":28,"integrity":"sha512-a7K/eMc5VlqW+uSclImoa59e0ocsfrzDc653x1o5251HmIcwo/Dj5vXG5nJBhNkZgQAwf3PS4/22rcjV30KyQA==","signatures":[{"sig":"MEQCIACV5bEBPGtCaZSNr7FsvXW65J5bD2OqVSJAoil5nd0SAiBT+iPKLq8rdFdLm5x60RtGE29QjODZ8BJMTYVNdZsC4Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1492801},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./koa":{"import":{"types":"./dist/frameworks/koa/index.d.ts","default":"./dist/frameworks/koa/index.js"},"require":{"default":"./dist/frameworks/koa/index.js"}},"./common":{"import":{"types":"./dist/frameworks/common/index.d.ts","default":"./dist/frameworks/common/index.js"},"require":{"types":"./dist/frameworks/common/index.d.cts","default":"./dist/frameworks/common/index.cjs"}},"./express":{"import":{"types":"./dist/frameworks/express/index.d.ts","default":"./dist/frameworks/express/index.js"},"require":{"types":"./dist/frameworks/express/index.d.cts","default":"./dist/frameworks/express/index.cjs"}},"./fastify":{"import":{"types":"./dist/frameworks/fastify/index.d.ts","default":"./dist/frameworks/fastify/index.js"},"require":{"default":"./dist/frameworks/fastify/index.js"}}},"gitHead":"400f260c9e0c8a5019cd471d635a39d9e6422794","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src/","test":"vitest run","build":"tsup","format":"prettier --write .","test:e2e":"vitest run tests/e2e","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check .","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"carllee1983","email":"carllee0520@gmail.com"},"repository":{"url":"git+https://github.com/CarlLee1983/newebpay-node.git","type":"git"},"_npmVersion":"10.9.4","description":"藍新金流 SDK - NewebPay Payment Gateway SDK for Node.js","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","dependencies":{"koa":"^3.1.1","fastify":"^5.6.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","eslint":"^9.39.1","vitest":"^2.0.0","express":"^5.2.1","typedoc":"^0.28.15","prettier":"^3.7.4","supertest":"^7.1.4","@eslint/js":"^9.39.1","@types/koa":"^3.0.1","typescript":"^5.3.0","@types/node":"^20.10.0","@types/express":"^5.0.5","@types/supertest":"^6.0.3","semantic-release":"^24.2.9","typescript-eslint":"^8.48.0","@vitest/coverage-v8":"^2.0.0","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^12.0.2","typedoc-plugin-markdown":"^4.9.0","@semantic-release/github":"^11.0.6","@typescript-eslint/parser":"^8.48.0","@semantic-release/changelog":"^6.0.3","@typescript-eslint/eslint-plugin":"^8.48.0","conventional-changelog-conventionalcommits":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/newebpay_1.3.2_1765116417383_0.06164747680116944","host":"s3://npm-registry-packages-npm-production"}},"1.3.3":{"name":"@carllee1983/newebpay","version":"1.3.3","keywords":["newebpay","payment","gateway","taiwan","credit-card","atm","cvs","linepay","taiwanpay","sdk"],"author":{"name":"Carl Lee","email":"carllee0520@gmail.com"},"license":"MIT","_id":"@carllee1983/newebpay@1.3.3","maintainers":[{"name":"carllee1983","email":"carllee0520@gmail.com"}],"homepage":"https://github.com/CarlLee1983/newebpay-node#readme","bugs":{"url":"https://github.com/CarlLee1983/newebpay-node/issues"},"bin":{"newebpay":"dist/cli/index.js"},"dist":{"shasum":"f38dffa85f4982243d8e74026cd0ae91443d00a2","tarball":"https://registry.npmjs.org/@carllee1983/newebpay/-/newebpay-1.3.3.tgz","fileCount":28,"integrity":"sha512-CJhVW6b1wcSAqex0kRXGwEhMWMlHGn3IPJH0GdHMr21BNcoCOWstzeIMU+rlbvwjQNBkgQArakbE6QSit4o2Vg==","signatures":[{"sig":"MEQCIHRu4bO+mXHkQcgFZhr/F1tKCzKuOojJlbqIqrst4AbLAiAxAO2sZCYOXjXDK4Xofmkl0nhpjWyIcyubQ5FN2hGusQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1494398},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./koa":{"import":{"types":"./dist/frameworks/koa/index.d.ts","default":"./dist/frameworks/koa/index.js"},"require":{"default":"./dist/frameworks/koa/index.js"}},"./common":{"import":{"types":"./dist/frameworks/common/index.d.ts","default":"./dist/frameworks/common/index.js"},"require":{"types":"./dist/frameworks/common/index.d.cts","default":"./dist/frameworks/common/index.cjs"}},"./express":{"import":{"types":"./dist/frameworks/express/index.d.ts","default":"./dist/frameworks/express/index.js"},"require":{"types":"./dist/frameworks/express/index.d.cts","default":"./dist/frameworks/express/index.cjs"}},"./fastify":{"import":{"types":"./dist/frameworks/fastify/index.d.ts","default":"./dist/frameworks/fastify/index.js"},"require":{"default":"./dist/frameworks/fastify/index.js"}}},"gitHead":"6aea2590c4072b2aebfdbb4b451c8f221bad5032","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src/","test":"vitest run","build":"tsup","format":"prettier --write .","test:e2e":"vitest run tests/e2e","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check .","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"carllee1983","email":"carllee0520@gmail.com"},"repository":{"url":"git+https://github.com/CarlLee1983/newebpay-node.git","type":"git"},"_npmVersion":"10.9.4","description":"藍新金流 SDK - NewebPay Payment Gateway SDK for Node.js","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","dependencies":{"koa":"^3.1.1","fastify":"^5.6.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","eslint":"^9.39.1","vitest":"^2.0.0","express":"^5.2.1","typedoc":"^0.28.15","prettier":"^3.7.4","supertest":"^7.1.4","@eslint/js":"^9.39.1","@types/koa":"^3.0.1","typescript":"^5.3.0","@types/node":"^20.10.0","@types/express":"^5.0.5","@types/supertest":"^6.0.3","semantic-release":"^24.2.9","typescript-eslint":"^8.48.0","@vitest/coverage-v8":"^2.0.0","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^12.0.2","typedoc-plugin-markdown":"^4.9.0","@semantic-release/github":"^11.0.6","@typescript-eslint/parser":"^8.48.0","@semantic-release/changelog":"^6.0.3","@typescript-eslint/eslint-plugin":"^8.48.0","conventional-changelog-conventionalcommits":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/newebpay_1.3.3_1765116891732_0.5919835404424454","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@carllee1983/newebpay","version":"1.4.0","keywords":["newebpay","payment","gateway","taiwan","credit-card","atm","cvs","linepay","taiwanpay","sdk"],"author":{"name":"Carl Lee","email":"carllee0520@gmail.com"},"license":"MIT","_id":"@carllee1983/newebpay@1.4.0","maintainers":[{"name":"carllee1983","email":"carllee0520@gmail.com"}],"homepage":"https://github.com/CarlLee1983/newebpay-node#readme","bugs":{"url":"https://github.com/CarlLee1983/newebpay-node/issues"},"bin":{"newebpay":"dist/cli/index.js"},"dist":{"shasum":"d1ade4383bcc16f16f638e0d8a21f54b18ef7660","tarball":"https://registry.npmjs.org/@carllee1983/newebpay/-/newebpay-1.4.0.tgz","fileCount":28,"integrity":"sha512-aawDIepcZbtcCUYv+DwE/cERH6CVoWr2POutwKED1432bCrinc6oOjVwKjZWF0C1rc4gwqDh2wk1yf/fdi+fbQ==","signatures":[{"sig":"MEUCIQCnqh/QU0/Ko2JH4ThyMc99g+wlidjDKoM5ck3bYqlJowIgF5m2s8ElTlLjHtH9RdzowFiX1eF07XwvN6KtELy5m3g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1549396},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./koa":{"import":{"types":"./dist/frameworks/koa/index.d.ts","default":"./dist/frameworks/koa/index.js"},"require":{"default":"./dist/frameworks/koa/index.js"}},"./common":{"import":{"types":"./dist/frameworks/common/index.d.ts","default":"./dist/frameworks/common/index.js"},"require":{"types":"./dist/frameworks/common/index.d.cts","default":"./dist/frameworks/common/index.cjs"}},"./express":{"import":{"types":"./dist/frameworks/express/index.d.ts","default":"./dist/frameworks/express/index.js"},"require":{"types":"./dist/frameworks/express/index.d.cts","default":"./dist/frameworks/express/index.cjs"}},"./fastify":{"import":{"types":"./dist/frameworks/fastify/index.d.ts","default":"./dist/frameworks/fastify/index.js"},"require":{"default":"./dist/frameworks/fastify/index.js"}}},"gitHead":"2c68f8f01e50ad844a831dce5cd8213e0bdd124e","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"eslint src/","test":"vitest run","build":"tsup","format":"prettier --write .","test:e2e":"vitest run tests/e2e","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check .","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"carllee1983","email":"carllee0520@gmail.com"},"repository":{"url":"git+https://github.com/CarlLee1983/newebpay-node.git","type":"git"},"_npmVersion":"10.9.4","description":"藍新金流 SDK - NewebPay Payment Gateway SDK for Node.js","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","dependencies":{"koa":"^3.1.1","fastify":"^5.6.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","eslint":"^9.39.1","vitest":"^2.0.0","express":"^5.2.1","typedoc":"^0.28.15","prettier":"^3.7.4","supertest":"^7.1.4","@eslint/js":"^9.39.1","@types/koa":"^3.0.1","typescript":"^5.3.0","@types/node":"^20.10.0","@types/express":"^5.0.5","@types/supertest":"^6.0.3","semantic-release":"^24.2.9","typescript-eslint":"^8.48.0","@vitest/coverage-v8":"^2.0.0","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^12.0.2","typedoc-plugin-markdown":"^4.9.0","@semantic-release/github":"^11.0.6","@typescript-eslint/parser":"^8.48.0","@semantic-release/changelog":"^6.0.3","@typescript-eslint/eslint-plugin":"^8.48.0","conventional-changelog-conventionalcommits":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/newebpay_1.4.0_1765339289084_0.311025403279366","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@carllee1983/newebpay","version":"1.5.0","keywords":["newebpay","payment","gateway","taiwan","credit-card","atm","cvs","linepay","taiwanpay","sdk"],"author":{"name":"Carl Lee","email":"carllee0520@gmail.com"},"license":"MIT","_id":"@carllee1983/newebpay@1.5.0","maintainers":[{"name":"carllee1983","email":"carllee0520@gmail.com"}],"homepage":"https://github.com/CarlLee1983/newebpay-node#readme","bugs":{"url":"https://github.com/CarlLee1983/newebpay-node/issues"},"bin":{"newebpay":"dist/cli/index.js"},"dist":{"shasum":"edb3e3fdcc1508b380d9758a60a987e15a6d432a","tarball":"https://registry.npmjs.org/@carllee1983/newebpay/-/newebpay-1.5.0.tgz","fileCount":28,"integrity":"sha512-Pp8RE0BviTGsLYghz96WHZ9zVSSU1uupFTzF4EhTR+dS0OZjsB0w3a84SVYMLY58qutronwT8jM62XvnPdpEPw==","signatures":[{"sig":"MEUCICLtUOQZCdpH8HFempsWF7Olf8E/R/maFEcru1rYPHPAAiEAtAlvz82EbApjOz2kcKCl6FgGHRY288d2h+MjKQvEX48=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1641624},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"bun":">=1.0.0","node":">=18.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./koa":{"import":{"types":"./dist/frameworks/koa/index.d.ts","default":"./dist/frameworks/koa/index.js"},"require":{"types":"./dist/frameworks/koa/index.d.ts","default":"./dist/frameworks/koa/index.js"}},"./common":{"import":{"types":"./dist/frameworks/common/index.d.ts","default":"./dist/frameworks/common/index.js"},"require":{"types":"./dist/frameworks/common/index.d.cts","default":"./dist/frameworks/common/index.cjs"}},"./express":{"import":{"types":"./dist/frameworks/express/index.d.ts","default":"./dist/frameworks/express/index.js"},"require":{"types":"./dist/frameworks/express/index.d.cts","default":"./dist/frameworks/express/index.cjs"}},"./fastify":{"import":{"types":"./dist/frameworks/fastify/index.d.ts","default":"./dist/frameworks/fastify/index.js"},"require":{"types":"./dist/frameworks/fastify/index.d.ts","default":"./dist/frameworks/fastify/index.js"}}},"gitHead":"630ab86b30307b7ec0f3a78f830015f0479b0aab","scripts":{"dev":"tsup --watch","docs":"typedoc","lint":"biome check .","test":"bun test","build":"tsup","format":"biome format --write .","test:ci":"bun test --coverage","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","test:watch":"bun test --watch","format:check":"biome format .","test:coverage":"bun test --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"carllee1983","email":"carllee0520@gmail.com"},"repository":{"url":"git+https://github.com/CarlLee1983/newebpay-node.git","type":"git"},"_npmVersion":"10.8.2","description":"藍新金流 SDK - NewebPay Payment Gateway SDK for Node.js","directories":{},"sideEffects":false,"_nodeVersion":"20.18.1","dependencies":{"koa":"^3.1.1","fastify":"^5.6.2","commander":"^13.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","express":"^5.2.1","typedoc":"^0.28.15","supertest":"^7.1.4","@types/koa":"^3.0.1","typescript":"^5.3.0","@types/node":"^20.10.0","@biomejs/biome":"^1.9.4","@types/express":"^5.0.5","@types/supertest":"^6.0.3","semantic-release":"^24.2.9","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^12.0.2","typedoc-plugin-markdown":"^4.9.0","@semantic-release/github":"^11.0.6","@semantic-release/changelog":"^6.0.3","conventional-changelog-conventionalcommits":"^9.1.0"},"_npmOperationalInternal":{"tmp":"tmp/newebpay_1.5.0_1765466623133_0.3520000386080908","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2025-11-28T06:33:31.227Z","modified":"2026-09-15T02:54:45.264Z","1.0.0":"2025-11-28T06:33:31.539Z","1.1.0":"2025-11-28T08:57:49.508Z","1.2.0":"2025-12-06T03:25:59.605Z","1.3.0":"2025-12-06T04:00:47.770Z","1.3.1":"2025-12-07T13:54:18.429Z","1.3.2":"2025-12-07T14:06:57.560Z","1.3.3":"2025-12-07T14:14:51.947Z","1.4.0":"2025-12-10T04:01:29.280Z","1.5.0":"2025-12-11T15:23:43.323Z"},"bugs":{"url":"https://github.com/CarlLee1983/newebpay-node/issues"},"author":{"name":"Carl Lee","email":"carllee0520@gmail.com"},"license":"MIT","homepage":"https://github.com/CarlLee1983/newebpay-node#readme","keywords":["newebpay","payment","gateway","taiwan","credit-card","atm","cvs","linepay","taiwanpay","sdk"],"repository":{"url":"git+https://github.com/CarlLee1983/newebpay-node.git","type":"git"},"description":"藍新金流 SDK - NewebPay Payment Gateway SDK for Node.js","maintainers":[{"email":"yashino538@gmail.com","name":"praxisbound"}],"readme":"# 藍新金流 Node.js SDK\n\n[![npm version](https://img.shields.io/npm/v/@carllee1983/newebpay.svg)](https://www.npmjs.com/package/@carllee1983/newebpay)\n[![Node.js Version](https://img.shields.io/badge/Node.js-%3E%3D18.0.0-green)](https://nodejs.org)\n[![Bun Version](https://img.shields.io/badge/Bun-supported-blue)](https://bun.sh)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.x-blue)](https://www.typescriptlang.org)\n[![License](https://img.shields.io/badge/License-MIT-green)](LICENSE)\n[![CI](https://github.com/CarlLee1983/newebpay-node/actions/workflows/ci.yml/badge.svg)](https://github.com/CarlLee1983/newebpay-node/actions/workflows/ci.yml)\n\n> **📖 [English Version](README_EN.md)**\n\n藍新金流（NewebPay）Node.js SDK，提供簡潔易用的 API 整合藍新金流支付服務。\n\n## 功能特色\n\n- ✅ 支援全部支付方式：信用卡、ATM 轉帳、超商代碼/條碼繳費、LINE Pay、台灣 Pay 等\n- ✅ 完整的 AES-256-CBC 加解密實作（使用 Node.js 原生 crypto）\n- ✅ 支援交易查詢、退款、取消授權\n- ✅ 完整的 TypeScript 型別定義\n- ✅ ESM 和 CommonJS 雙重支援\n- ✅ Node.js 18/20/22 LTS 支援\n- ✅ Bun 原生支援（使用 Bun 原生 fetch 和 crypto API）\n- ✅ Express、Fastify、Koa 框架整合\n\n## 系統需求\n\n- Node.js 18.0.0 或更高版本（支援 18.x、20.x、22.x LTS）\n- 或 Bun 1.0.0 或更高版本（完全相容，使用 Bun 原生 API）\n\n## 安裝\n\n```bash\nnpm install @carllee1983/newebpay\n```\n\n或使用 yarn / pnpm / bun：\n\n```bash\nyarn add @carllee1983/newebpay\n# 或\npnpm add @carllee1983/newebpay\n# 或\nbun add @carllee1983/newebpay\n```\n\n## 快速開始\n\n### 基本使用\n\n```typescript\nimport { CreditPayment, FormBuilder } from '@carllee1983/newebpay'\n\n// 建立信用卡付款\nconst payment = new CreditPayment('特店編號', 'HashKey', 'HashIV')\n  .setTestMode(true) // 測試環境\n  .setMerchantOrderNo('ORDER' + Date.now()) // 訂單編號\n  .setAmt(1000) // 金額\n  .setItemDesc('測試商品') // 商品描述\n  .setEmail('buyer@example.com') // 買家 Email\n  .setReturnURL('https://your-site.com/return') // 付款完成返回網址\n  .setNotifyURL('https://your-site.com/notify') // 付款結果通知網址\n\n// 產生 HTML 表單（自動送出）\nconst form = FormBuilder.create(payment).build()\nconsole.log(form)\n\n// 或取得表單資料供前端使用\nconst formData = FormBuilder.create(payment).getFormData()\n// { action: 'https://...', fields: { MerchantID: '...', TradeInfo: '...', ... } }\n```\n\n### Express 整合\n\n```typescript\nimport express from 'express'\nimport {\n  createNewebPayRouter,\n  loadConfigFromEnv,\n  NewebPayService,\n} from '@carllee1983/newebpay/express'\n\nconst app = express()\napp.use(express.json())\napp.use(express.urlencoded({ extended: true }))\n\n// 從環境變數載入設定\nconst config = loadConfigFromEnv()\n\n// 方式一：使用內建路由\napp.use('/newebpay', createNewebPayRouter(config))\n\n// 方式二：使用 NewebPayService\napp.post('/api/payment/create', (req, res) => {\n  const { orderId, amount, itemDesc, email } = req.body\n  const newebpay = new NewebPayService(config)\n\n  const params = newebpay\n    .payment(orderId, amount, itemDesc, email)\n    .creditCard()\n    .setReturnUrl('https://your-site.com/return')\n    .setNotifyUrl('https://your-site.com/notify')\n    .getParams()\n\n  res.json({ success: true, data: params })\n})\n\napp.listen(3000)\n```\n\n環境變數設定：\n\n```bash\n# .env\nNEWEBPAY_MERCHANT_ID=MS12345678\nNEWEBPAY_HASH_KEY=your_hash_key_32_chars\nNEWEBPAY_HASH_IV=your_hash_iv_16_chars\nNEWEBPAY_RETURN_URL=https://your-site.com/return\nNEWEBPAY_NOTIFY_URL=https://your-site.com/notify\nNEWEBPAY_TEST_MODE=true\n```\n\n## 前端自訂表單\n\n當你需要在前端框架（React、Vue 等）中自訂表單 UI 時，可以使用 `FormBuilder` 提供的資料取得方法，無需使用 HTML 表單。\n\n### 取得表單資料\n\n`FormBuilder` 提供以下方法來取得表單資料：\n\n- `getFormData()` 或 `getData()`: 取得完整的表單資料（包含 `action`、`method`、`fields`）\n- `getFields()`: 只取得表單欄位資料\n\n```typescript\nimport { CreditPayment, FormBuilder } from '@carllee1983/newebpay'\n\nconst payment = new CreditPayment('特店編號', 'HashKey', 'HashIV')\n  .setTestMode(true)\n  .setMerchantOrderNo('ORDER' + Date.now())\n  .setAmt(1000)\n  .setItemDesc('測試商品')\n  .setEmail('buyer@example.com')\n  .setReturnURL('https://your-site.com/return')\n  .setNotifyURL('https://your-site.com/notify')\n\nconst builder = FormBuilder.create(payment)\n\n// 取得完整表單資料\nconst { action, method, fields } = builder.getFormData()\n// 或使用別名\nconst { action, method, fields } = builder.getData()\n\n// 只取得欄位資料\nconst fields = builder.getFields()\n\n// 返回的資料結構：\n// {\n//   action: 'https://ccore.newebpay.com/MPG/mpg_gateway',\n//   method: 'POST',\n//   fields: {\n//     MerchantID: 'MS12345678',\n//     TradeInfo: '...',\n//     TradeSha: '...',\n//     Version: '2.0'\n//   }\n// }\n```\n\n### React 整合範例\n\n#### 使用 React Hook Form\n\n```typescript\nimport { useState, useEffect } from 'react'\nimport { CreditPayment, FormBuilder } from '@carllee1983/newebpay'\n\nfunction PaymentForm() {\n  const [formData, setFormData] = useState<{\n    action: string\n    method: string\n    fields: Record<string, string>\n  } | null>(null)\n\n  useEffect(() => {\n    // 從後端 API 取得表單資料\n    fetch('/api/payment/create', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({\n        orderId: 'ORDER' + Date.now(),\n        amount: 1000,\n        itemDesc: '測試商品',\n        email: 'buyer@example.com',\n      }),\n    })\n      .then((res) => res.json())\n      .then((data) => setFormData(data.formData))\n  }, [])\n\n  const handleSubmit = async (e: React.FormEvent) => {\n    e.preventDefault()\n    if (!formData) return\n\n    // 建立動態表單並提交\n    const form = document.createElement('form')\n    form.method = formData.method\n    form.action = formData.action\n\n    Object.entries(formData.fields).forEach(([name, value]) => {\n      const input = document.createElement('input')\n      input.type = 'hidden'\n      input.name = name\n      input.value = value\n      form.appendChild(input)\n    })\n\n    document.body.appendChild(form)\n    form.submit()\n  }\n\n  if (!formData) return <div>載入中...</div>\n\n  return (\n    <form onSubmit={handleSubmit}>\n      <button type=\"submit\">前往付款</button>\n    </form>\n  )\n}\n```\n\n#### 使用 Fetch API 直接提交\n\n```typescript\nimport { useState } from 'react'\n\nfunction PaymentForm() {\n  const [loading, setLoading] = useState(false)\n\n  const handlePayment = async () => {\n    setLoading(true)\n    try {\n      // 從後端取得表單資料\n      const response = await fetch('/api/payment/create', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/json' },\n        body: JSON.stringify({\n          orderId: 'ORDER' + Date.now(),\n          amount: 1000,\n          itemDesc: '測試商品',\n          email: 'buyer@example.com',\n        }),\n      })\n\n      const { formData } = await response.json()\n\n      // 建立 FormData 並提交到藍新金流\n      const formDataToSubmit = new FormData()\n      Object.entries(formData.fields).forEach(([key, value]) => {\n        formDataToSubmit.append(key, value)\n      })\n\n      // 使用 fetch 提交（注意：藍新金流需要 POST 到指定 URL）\n      const form = document.createElement('form')\n      form.method = formData.method\n      form.action = formData.action\n\n      Object.entries(formData.fields).forEach(([name, value]) => {\n        const input = document.createElement('input')\n        input.type = 'hidden'\n        input.name = name\n        input.value = value\n        form.appendChild(input)\n      })\n\n      document.body.appendChild(form)\n      form.submit()\n    } catch (error) {\n      console.error('付款失敗:', error)\n    } finally {\n      setLoading(false)\n    }\n  }\n\n  return (\n    <button onClick={handlePayment} disabled={loading}>\n      {loading ? '處理中...' : '前往付款'}\n    </button>\n  )\n}\n```\n\n### Vue 整合範例\n\n#### 使用 Vue 3 Composition API\n\n```vue\n<template>\n  <div>\n    <button @click=\"handlePayment\" :disabled=\"loading\">\n      {{ loading ? '處理中...' : '前往付款' }}\n    </button>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\n\nconst loading = ref(false)\n\nconst handlePayment = async () => {\n  loading.value = true\n  try {\n    // 從後端 API 取得表單資料\n    const response = await fetch('/api/payment/create', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({\n        orderId: 'ORDER' + Date.now(),\n        amount: 1000,\n        itemDesc: '測試商品',\n        email: 'buyer@example.com',\n      }),\n    })\n\n    const { formData } = await response.json()\n\n    // 建立動態表單並提交\n    const form = document.createElement('form')\n    form.method = formData.method\n    form.action = formData.action\n\n    Object.entries(formData.fields).forEach(([name, value]) => {\n      const input = document.createElement('input')\n      input.type = 'hidden'\n      input.name = name\n      input.value = value as string\n      form.appendChild(input)\n    })\n\n    document.body.appendChild(form)\n    form.submit()\n  } catch (error) {\n    console.error('付款失敗:', error)\n  } finally {\n    loading.value = false\n  }\n}\n</script>\n```\n\n#### 使用響應式表單資料\n\n```vue\n<template>\n  <form @submit.prevent=\"submitForm\">\n    <div v-if=\"formData\">\n      <input\n        v-for=\"(value, name) in formData.fields\"\n        :key=\"name\"\n        type=\"hidden\"\n        :name=\"name\"\n        :value=\"value\"\n      />\n      <button type=\"submit\">前往付款</button>\n    </div>\n    <div v-else>載入中...</div>\n  </form>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onMounted } from 'vue'\n\ninterface FormData {\n  action: string\n  method: string\n  fields: Record<string, string>\n}\n\nconst formData = ref<FormData | null>(null)\n\nonMounted(async () => {\n  const response = await fetch('/api/payment/create', {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify({\n      orderId: 'ORDER' + Date.now(),\n      amount: 1000,\n      itemDesc: '測試商品',\n      email: 'buyer@example.com',\n    }),\n  })\n\n  const data = await response.json()\n  formData.value = data.formData\n})\n\nconst submitForm = () => {\n  if (!formData.value) return\n\n  const form = document.createElement('form')\n  form.method = formData.value.method\n  form.action = formData.value.action\n\n  Object.entries(formData.value.fields).forEach(([name, value]) => {\n    const input = document.createElement('input')\n    input.type = 'hidden'\n    input.name = name\n    input.value = value\n    form.appendChild(input)\n  })\n\n  document.body.appendChild(form)\n  form.submit()\n}\n</script>\n```\n\n### 原生 JavaScript 範例\n\n#### 使用 Fetch API\n\n```javascript\nasync function createPayment() {\n  try {\n    // 從後端 API 取得表單資料\n    const response = await fetch('/api/payment/create', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify({\n        orderId: 'ORDER' + Date.now(),\n        amount: 1000,\n        itemDesc: '測試商品',\n        email: 'buyer@example.com',\n      }),\n    })\n\n    const { formData } = await response.json()\n\n    // 建立動態表單並提交\n    const form = document.createElement('form')\n    form.method = formData.method\n    form.action = formData.action\n    form.style.display = 'none'\n\n    Object.entries(formData.fields).forEach(([name, value]) => {\n      const input = document.createElement('input')\n      input.type = 'hidden'\n      input.name = name\n      input.value = value\n      form.appendChild(input)\n    })\n\n    document.body.appendChild(form)\n    form.submit()\n  } catch (error) {\n    console.error('付款失敗:', error)\n  }\n}\n\n// 使用範例\ndocument.getElementById('pay-button').addEventListener('click', createPayment)\n```\n\n#### 使用 XMLHttpRequest\n\n```javascript\nfunction createPayment() {\n  const xhr = new XMLHttpRequest()\n  xhr.open('POST', '/api/payment/create', true)\n  xhr.setRequestHeader('Content-Type', 'application/json')\n\n  xhr.onload = function () {\n    if (xhr.status === 200) {\n      const { formData } = JSON.parse(xhr.responseText)\n\n      // 建立動態表單並提交\n      const form = document.createElement('form')\n      form.method = formData.method\n      form.action = formData.action\n\n      Object.entries(formData.fields).forEach(([name, value]) => {\n        const input = document.createElement('input')\n        input.type = 'hidden'\n        input.name = name\n        input.value = value\n        form.appendChild(input)\n      })\n\n      document.body.appendChild(form)\n      form.submit()\n    }\n  }\n\n  xhr.send(\n    JSON.stringify({\n      orderId: 'ORDER' + Date.now(),\n      amount: 1000,\n      itemDesc: '測試商品',\n      email: 'buyer@example.com',\n    })\n  )\n}\n```\n\n### API 端點範例\n\n#### Express\n\n```typescript\nimport express from 'express'\nimport { CreditPayment, FormBuilder } from '@carllee1983/newebpay'\n\nconst app = express()\napp.use(express.json())\n\napp.post('/api/payment/create', (req, res) => {\n  const { orderId, amount, itemDesc, email } = req.body\n\n  const payment = new CreditPayment(\n    process.env.NEWEBPAY_MERCHANT_ID!,\n    process.env.NEWEBPAY_HASH_KEY!,\n    process.env.NEWEBPAY_HASH_IV!\n  )\n    .setTestMode(process.env.NEWEBPAY_TEST_MODE === 'true')\n    .setMerchantOrderNo(orderId)\n    .setAmt(amount)\n    .setItemDesc(itemDesc)\n    .setEmail(email)\n    .setReturnURL(process.env.NEWEBPAY_RETURN_URL!)\n    .setNotifyURL(process.env.NEWEBPAY_NOTIFY_URL!)\n\n  const formData = FormBuilder.create(payment).getFormData()\n\n  res.json({\n    success: true,\n    formData: formData,\n  })\n})\n\napp.listen(3000)\n```\n\n#### Fastify\n\n```typescript\nimport Fastify from 'fastify'\nimport { CreditPayment, FormBuilder } from '@carllee1983/newebpay'\n\nconst fastify = Fastify()\n\nfastify.post('/api/payment/create', async (request, reply) => {\n  const { orderId, amount, itemDesc, email } = request.body as {\n    orderId: string\n    amount: number\n    itemDesc: string\n    email: string\n  }\n\n  const payment = new CreditPayment(\n    process.env.NEWEBPAY_MERCHANT_ID!,\n    process.env.NEWEBPAY_HASH_KEY!,\n    process.env.NEWEBPAY_HASH_IV!\n  )\n    .setTestMode(process.env.NEWEBPAY_TEST_MODE === 'true')\n    .setMerchantOrderNo(orderId)\n    .setAmt(amount)\n    .setItemDesc(itemDesc)\n    .setEmail(email)\n    .setReturnURL(process.env.NEWEBPAY_RETURN_URL!)\n    .setNotifyURL(process.env.NEWEBPAY_NOTIFY_URL!)\n\n  const formData = FormBuilder.create(payment).getFormData()\n\n  return {\n    success: true,\n    formData: formData,\n  }\n})\n\nfastify.listen({ port: 3000 })\n```\n\n#### Koa\n\n```typescript\nimport Koa from 'koa'\nimport Router from '@koa/router'\nimport bodyParser from 'koa-bodyparser'\nimport { CreditPayment, FormBuilder } from '@carllee1983/newebpay'\n\nconst app = new Koa()\nconst router = new Router()\n\napp.use(bodyParser())\n\nrouter.post('/api/payment/create', async (ctx) => {\n  const { orderId, amount, itemDesc, email } = ctx.request.body\n\n  const payment = new CreditPayment(\n    process.env.NEWEBPAY_MERCHANT_ID!,\n    process.env.NEWEBPAY_HASH_KEY!,\n    process.env.NEWEBPAY_HASH_IV!\n  )\n    .setTestMode(process.env.NEWEBPAY_TEST_MODE === 'true')\n    .setMerchantOrderNo(orderId)\n    .setAmt(amount)\n    .setItemDesc(itemDesc)\n    .setEmail(email)\n    .setReturnURL(process.env.NEWEBPAY_RETURN_URL!)\n    .setNotifyURL(process.env.NEWEBPAY_NOTIFY_URL!)\n\n  const formData = FormBuilder.create(payment).getFormData()\n\n  ctx.body = {\n    success: true,\n    formData: formData,\n  }\n})\n\napp.use(router.routes())\napp.listen(3000)\n```\n\n## 支援的支付方式\n\n| 支付方式       | 類別                | 說明                  |\n| -------------- | ------------------- | --------------------- |\n| 信用卡一次付清 | `CreditPayment`     | 支援紅利折抵、銀聯卡  |\n| 信用卡分期     | `CreditInstallment` | 3/6/12/18/24/30 期    |\n| WebATM         | `WebAtmPayment`     | 即時網路 ATM 轉帳     |\n| ATM 轉帳       | `AtmPayment`        | 虛擬帳號轉帳          |\n| 超商代碼繳費   | `CvsPayment`        | 金額限制 30~20,000 元 |\n| 超商條碼繳費   | `BarcodePayment`    | 金額限制 20~40,000 元 |\n| LINE Pay       | `LinePayPayment`    | LINE Pay 電子錢包     |\n| 台灣 Pay       | `TaiwanPayPayment`  | 台灣 Pay 行動支付     |\n| 玉山 Wallet    | `EsunWalletPayment` | 玉山銀行電子錢包      |\n| BitoPay        | `BitoPayPayment`    | 加密貨幣支付          |\n| TWQR           | `TwqrPayment`       | TWQR 共通支付         |\n| 付啦           | `FulaPayment`       | 先買後付              |\n| 超商取貨付款   | `CvscomPayment`     | 超商物流取貨付款      |\n| 全支付方式     | `AllInOnePayment`   | 自訂啟用多種支付      |\n\n## 使用範例\n\n### 信用卡分期\n\n```typescript\nimport { CreditInstallment, FormBuilder } from '@carllee1983/newebpay'\n\nconst payment = new CreditInstallment('特店編號', 'HashKey', 'HashIV')\n  .setTestMode(true)\n  .setMerchantOrderNo('INST' + Date.now())\n  .setAmt(3000)\n  .setItemDesc('分期商品')\n  .setEmail('buyer@example.com')\n  .setInstallment([3, 6, 12]) // 提供 3/6/12 期選項\n  .setReturnURL('https://your-site.com/return')\n  .setNotifyURL('https://your-site.com/notify')\n\nconst form = FormBuilder.create(payment).build()\n```\n\n### ATM 虛擬帳號\n\n```typescript\nimport { AtmPayment, BankType, FormBuilder } from '@carllee1983/newebpay'\n\nconst payment = new AtmPayment('特店編號', 'HashKey', 'HashIV')\n  .setTestMode(true)\n  .setMerchantOrderNo('ATM' + Date.now())\n  .setAmt(2000)\n  .setItemDesc('ATM 轉帳測試')\n  .setEmail('buyer@example.com')\n  .setExpireDate('2025-12-31') // 繳費期限\n  .setBankType(BankType.BOT) // 指定銀行（可選）\n  .setReturnURL('https://your-site.com/return')\n  .setNotifyURL('https://your-site.com/notify')\n  .setCustomerURL('https://your-site.com/customer') // 取號完成返回\n\nconst form = FormBuilder.create(payment).build()\n```\n\n### 全支付方式（多種支付選項）\n\n```typescript\nimport { AllInOnePayment, FormBuilder } from '@carllee1983/newebpay'\n\nconst payment = new AllInOnePayment('特店編號', 'HashKey', 'HashIV')\n  .setTestMode(true)\n  .setMerchantOrderNo('ALL' + Date.now())\n  .setAmt(1000)\n  .setItemDesc('多元支付測試')\n  .setEmail('buyer@example.com')\n  .setReturnURL('https://your-site.com/return')\n  .setNotifyURL('https://your-site.com/notify')\n  // 啟用多種支付方式（依需求選擇）\n  .enableCredit() // 信用卡一次付清\n  .enableWebAtm() // WebATM 即時轉帳\n  .enableAtm() // ATM 虛擬帳號\n  .enableCvs() // 超商代碼繳費\n  .enableBarcode() // 超商條碼繳費\n  .enableLinePay() // LINE Pay\n  .enableTaiwanPay() // 台灣 Pay\n  .enableEsunWallet() // 玉山 Wallet\n  .enableBitoPay() // BitoPay 加密貨幣\n  .enableTwqr() // TWQR 共通支付\n  .enableFula() // 付啦（先買後付）\n  .enableInstallment([3, 6, 12]) // 信用卡分期（3/6/12 期）\n  .enableRedeem() // 信用卡紅利折抵\n  .enableUnionPay() // 銀聯卡\n\nconst form = FormBuilder.create(payment).build()\n```\n\n#### AllInOnePayment 可用方法\n\n| 方法                        | 說明                           |\n| --------------------------- | ------------------------------ |\n| `.enableCredit()`           | 啟用信用卡一次付清             |\n| `.enableWebAtm()`           | 啟用 WebATM 即時轉帳           |\n| `.enableAtm()`              | 啟用 ATM 虛擬帳號轉帳          |\n| `.enableCvs()`              | 啟用超商代碼繳費               |\n| `.enableBarcode()`          | 啟用超商條碼繳費               |\n| `.enableLinePay()`          | 啟用 LINE Pay                  |\n| `.enableTaiwanPay()`        | 啟用台灣 Pay                   |\n| `.enableEsunWallet()`       | 啟用玉山 Wallet                |\n| `.enableBitoPay()`          | 啟用 BitoPay 加密貨幣支付      |\n| `.enableTwqr()`             | 啟用 TWQR 共通支付             |\n| `.enableFula()`             | 啟用付啦（先買後付）           |\n| `.enableInstallment([3,6])` | 啟用信用卡分期（指定可選期數） |\n| `.enableRedeem()`           | 啟用信用卡紅利折抵             |\n| `.enableUnionPay()`         | 啟用銀聯卡                     |\n\n> 所有 `enable*()` 方法都可傳入 `false` 來停用該支付方式，例如：`.enableCredit(false)`\n\n### 超商取貨付款\n\n```typescript\nimport { CvscomPayment, LgsType, FormBuilder } from '@carllee1983/newebpay'\n\nconst payment = new CvscomPayment('特店編號', 'HashKey', 'HashIV')\n  .setTestMode(true)\n  .setMerchantOrderNo('CVSCOM' + Date.now())\n  .setAmt(500)\n  .setItemDesc('超商取貨商品')\n  .setEmail('buyer@example.com')\n  .setLgsType(LgsType.B2C) // 大宗寄倉\n  .setReceiverName('收件人')\n  .setReceiverPhone('0912345678')\n  .setReceiverEmail('receiver@example.com')\n  .setReturnURL('https://your-site.com/return')\n  .setNotifyURL('https://your-site.com/notify')\n\nconst form = FormBuilder.create(payment).build()\n```\n\n## 通知處理\n\n### 付款完成通知\n\n```typescript\nimport { PaymentNotify } from '@carllee1983/newebpay'\n\napp.post('/payment/notify', (req, res) => {\n  const notify = new PaymentNotify('HashKey', 'HashIV')\n\n  try {\n    notify.verifyOrFail(req.body)\n\n    if (notify.isSuccess()) {\n      const orderNo = notify.getMerchantOrderNo()\n      const amount = notify.getAmt()\n      const paymentType = notify.getPaymentType()\n      const tradeNo = notify.getTradeNo()\n\n      // 更新訂單狀態...\n      console.log(`訂單 ${orderNo} 付款成功，金額 ${amount}`)\n    }\n\n    res.send('OK')\n  } catch (error) {\n    console.error('驗證失敗:', error)\n    res.status(400).send('Verification failed')\n  }\n})\n```\n\n### ATM 取號通知\n\n```typescript\nimport { AtmNotify } from '@carllee1983/newebpay'\n\napp.post('/atm/notify', (req, res) => {\n  const notify = new AtmNotify('HashKey', 'HashIV')\n\n  if (notify.verify(req.body) && notify.isSuccess()) {\n    const orderNo = notify.getMerchantOrderNo()\n    const bankCode = notify.getBankCode() // 銀行代碼\n    const codeNo = notify.getCodeNo() // 虛擬帳號\n    const expireDate = notify.getExpireDate() // 繳費截止日\n\n    // 儲存繳費資訊，通知買家...\n    console.log(`ATM 帳號: ${bankCode}-${codeNo}，截止日: ${expireDate}`)\n  }\n\n  res.send('OK')\n})\n```\n\n### 超商取號通知\n\n```typescript\nimport { CvsNotify } from '@carllee1983/newebpay'\n\napp.post('/cvs/notify', (req, res) => {\n  const notify = new CvsNotify('HashKey', 'HashIV')\n\n  if (notify.verify(req.body) && notify.isSuccess()) {\n    const codeNo = notify.getCodeNo() // 繳費代碼\n    const storeType = notify.getStoreType() // 超商類型\n    const expireDate = notify.getExpireDate() // 繳費截止日\n\n    // 條碼繳費資訊\n    const barcode1 = notify.getBarcode1()\n    const barcode2 = notify.getBarcode2()\n    const barcode3 = notify.getBarcode3()\n\n    // 儲存繳費資訊...\n  }\n\n  res.send('OK')\n})\n```\n\n### 超商取貨付款通知\n\n```typescript\nimport { CvscomNotify } from '@carllee1983/newebpay'\n\napp.post('/cvscom/notify', (req, res) => {\n  const notify = new CvscomNotify('HashKey', 'HashIV')\n\n  if (notify.verify(req.body) && notify.isSuccess()) {\n    const storeCode = notify.getStoreCode() // 門市代碼\n    const storeName = notify.getStoreName() // 門市名稱\n    const storeAddr = notify.getStoreAddr() // 門市地址\n    const lgsNo = notify.getLgsNo() // 物流編號\n    const lgsType = notify.getLgsType() // 物流類型\n    const receiverName = notify.getCVSCOMName() // 取貨人姓名\n\n    // 儲存物流資訊...\n  }\n\n  res.send('OK')\n})\n```\n\n## 交易查詢\n\n### 一般交易查詢\n\n```typescript\nimport { QueryOrder } from '@carllee1983/newebpay'\n\nconst query = QueryOrder.create('特店編號', 'HashKey', 'HashIV').setTestMode(true)\n\ntry {\n  const result = await query.query('ORDER123456', 1000)\n\n  console.log('交易狀態:', result.TradeStatus)\n  console.log('付款方式:', result.PaymentType)\n  console.log('付款時間:', result.PayTime)\n} catch (error) {\n  console.error('查詢失敗:', error.message)\n}\n```\n\n### 信用卡明細查詢\n\n```typescript\nimport { QueryCreditDetail } from '@carllee1983/newebpay'\n\nconst query = QueryCreditDetail.create('特店編號', 'HashKey', 'HashIV').setTestMode(true)\n\ntry {\n  const result = await query.query('ORDER123456', 1000)\n\n  console.log('請款狀態:', result.CloseStatus)\n  console.log('退款狀態:', result.BackStatus)\n  console.log('授權碼:', result.Auth)\n  console.log('卡號末四碼:', result.Card4No)\n} catch (error) {\n  console.error('查詢失敗:', error.message)\n}\n```\n\n## 退款與取消\n\n### 信用卡請款/退款\n\n```typescript\nimport { CreditClose } from '@carllee1983/newebpay'\n\nconst creditClose = CreditClose.create('特店編號', 'HashKey', 'HashIV').setTestMode(true)\n\n// 請款（授權後請款）\nconst payResult = await creditClose.pay('ORDER123456', 1000)\n\n// 退款\nconst refundResult = await creditClose.refund('ORDER123456', 500)\n\n// 取消請退款\nconst cancelResult = await creditClose.cancelClose(\n  'ORDER123456',\n  500,\n  CreditClose.CLOSE_TYPE_REFUND,\n)\n```\n\n### 取消授權\n\n```typescript\nimport { CreditCancel } from '@carllee1983/newebpay'\n\nconst creditCancel = CreditCancel.create('特店編號', 'HashKey', 'HashIV').setTestMode(true)\n\nconst result = await creditCancel.cancel('ORDER123456', 1000)\n```\n\n### 電子錢包退款\n\n```typescript\nimport { EWalletRefund } from '@carllee1983/newebpay'\n\nconst refund = EWalletRefund.create('特店編號', 'HashKey', 'HashIV').setTestMode(true)\n\n// 支援 LINE Pay、台灣 Pay、玉山 Wallet 等\nconst result = await refund.refund('ORDER123456', 500, 'LINEPAY')\n```\n\n## 錯誤處理\n\nSDK 提供 `NewebPayError` 類別處理各種錯誤情況：\n\n```typescript\nimport { CreditPayment, NewebPayError } from '@carllee1983/newebpay'\n\ntry {\n  const payment = new CreditPayment('特店編號', 'HashKey', 'HashIV')\n    .setMerchantOrderNo('ORDER001')\n    .setAmt(-100) // 金額錯誤\n} catch (error) {\n  if (error instanceof NewebPayError) {\n    console.log('錯誤代碼:', error.code) // 'INVALID_FIELD'\n    console.log('錯誤訊息:', error.message) // 'Amt 無效：金額必須大於 0'\n  }\n}\n```\n\n### 常見錯誤代碼\n\n| 錯誤代碼             | 說明                |\n| -------------------- | ------------------- |\n| `REQUIRED_FIELD`     | 必填欄位未填寫      |\n| `FIELD_TOO_LONG`     | 欄位值超過最大長度  |\n| `INVALID_FIELD`      | 欄位值無效          |\n| `DECRYPT_FAILED`     | 解密失敗            |\n| `CHECK_VALUE_FAILED` | CheckValue 驗證失敗 |\n| `API_ERROR`          | API 請求錯誤        |\n\n## CLI 工具\n\n套件提供 CLI 工具協助快速設定：\n\n```bash\n# 初始化環境變數設定檔\nnpx @carllee1983/newebpay init\n\n# 產生 Express 整合範例專案\nnpx @carllee1983/newebpay express\n```\n\n## 測試卡號\n\n| 類型                    | 卡號                | 說明      |\n| ----------------------- | ------------------- | --------- |\n| 信用卡（一次付清/分期） | 4000-2211-1111-1111 | 一般測試  |\n| 紅利折抵                | 4003-5511-1111-1111 | 紅利測試  |\n| 美國運通卡              | 3760-000000-00006   | AMEX 測試 |\n\n> 測試卡號的有效月年及卡片背面末三碼可任意填寫。\n\n## API 文件\n\n本套件依據藍新金流「線上交易-幕前支付技術串接手冊」（NDNF-1.1.9）開發。\n\n### 環境網址\n\n| 環境     | 網址                       |\n| -------- | -------------------------- |\n| 測試環境 | https://ccore.newebpay.com |\n| 正式環境 | https://core.newebpay.com  |\n\n### 主要 API 端點\n\n| API          | 路徑                   | 說明            |\n| ------------ | ---------------------- | --------------- |\n| MPG 交易     | /MPG/mpg_gateway       | 幕前支付        |\n| 交易查詢     | /API/QueryTradeInfo    | 查詢訂單狀態    |\n| 取消授權     | /API/CreditCard/Cancel | 取消信用卡授權  |\n| 請退款       | /API/CreditCard/Close  | 信用卡請款/退款 |\n| 電子錢包退款 | /API/EWallet/Refund    | LINE Pay 等退款 |\n\n## 目錄結構\n\n```\nnewebpay-node/\n├── src/\n│   ├── index.ts                    # 主要匯出\n│   ├── content.ts                  # 基礎 Content 類別\n│   ├── form-builder.ts             # HTML 表單產生器\n│   ├── infrastructure/             # 加解密器\n│   ├── operations/                 # 支付操作\n│   ├── notifications/              # 通知處理器\n│   ├── queries/                    # 查詢 API\n│   ├── actions/                    # 退款/取消授權\n│   ├── types/                      # TypeScript 型別\n│   ├── errors/                     # 例外類別\n│   └── frameworks/                 # 框架整合\n│       ├── express/                # Express 整合\n│       ├── fastify/                # Fastify 整合\n│       └── koa/                    # Koa 整合\n├── tests/                          # 單元測試\n├── examples/                       # 範例程式\n├── docs/                           # API 文件\n└── README.md\n```\n\n## 開發\n\n```bash\n# 安裝依賴\nnpm install\n\n# 建置\nnpm run build\n\n# 執行測試（使用 Bun）\nbun test\n\n# 執行測試（監看模式）\nbun test --watch\n\n# 測試覆蓋率\nbun test --coverage\n\n# Lint 檢查\nbun run lint\n\n# 格式化程式碼\nbun run format\n\n# TypeScript 類型檢查\nbun run typecheck\n```\n\n> **注意**：本專案使用 Bun 作為開發基底，所有測試和開發工具都使用 Bun 原生功能。若使用 Node.js，請確保 Node.js 版本為 18.0.0 或更高版本。\n\n## 授權\n\nMIT License\n\n## 貢獻\n\n歡迎提交 Issue 和 Pull Request。詳細資訊請參閱 [CONTRIBUTING.md](CONTRIBUTING.md)。\n\n## 相關連結\n\n- [藍新金流官網](https://www.newebpay.com/)\n- [藍新金流商店後台](https://www.newebpay.com/main/index)\n- [PHP 版本 SDK](https://github.com/CarlLee1983/newebpay)\n- [API 文件](https://github.com/CarlLee1983/newebpay-node/tree/master/docs)\n","readmeFilename":"README.md"}