{"_id":"@captcha-pro/weixin","_rev":"3-aeb904444ef80fdd415feb91e300d3a4","name":"@captcha-pro/weixin","dist-tags":{"latest":"2.2.0"},"versions":{"2.0.0":{"name":"@captcha-pro/weixin","version":"2.0.0","keywords":["captcha","weixin","miniprogram","slider-captcha","click-captcha"],"author":{"name":"saqqdy","email":"https://github.com/saqqdy"},"license":"MIT","_id":"@captcha-pro/weixin@2.0.0","maintainers":[{"name":"saqqdy","email":"saqqdy@qq.com"}],"dist":{"shasum":"9486d1f07274196785b72856477458ed0b7c5f40","tarball":"https://registry.npmjs.org/@captcha-pro/weixin/-/weixin-2.0.0.tgz","fileCount":19,"integrity":"sha512-jgs/Nos0xXNbQF4fCUPatemmEgeiQUZ1BcdUwldKyNdmFmOknAeCTe1XkfjokQu5BkZCD0m63yrQ+C2WGKk6UA==","signatures":[{"sig":"MEUCIQDHseQqtio5FjxDz5CTsk/YANg4zPxEgBmgnqNPlj0z8wIgab32ppV20i5XR5+9Q5iJhOANOctOY3C3YH5nfwG3NEE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38719},"main":"dist/index.cjs","_from":"file:captcha-pro-weixin-2.0.0.tgz","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"test":"echo 'no tests'","build":"vite build -c build/vite.config.ts","clean":"rm-all dist","watch":"vite build -c build/vite.config.ts -w"},"_npmUser":{"name":"saqqdy","email":"saqqdy@qq.com"},"_resolved":"/tmp/c7751a0dca4d6174c0bcfd32486010f4/captcha-pro-weixin-2.0.0.tgz","_integrity":"sha512-jgs/Nos0xXNbQF4fCUPatemmEgeiQUZ1BcdUwldKyNdmFmOknAeCTe1XkfjokQu5BkZCD0m63yrQ+C2WGKk6UA==","_npmVersion":"10.8.2","description":"WeChat mini-program captcha components for captcha-pro (backend-only mode)","directories":{},"miniprogram":"dist","_nodeVersion":"20.20.2","dependencies":{"@captcha-pro/mp-shared":"2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.19","rm-all":"^1.1.1","typescript":"^5.9.3","@types/node":"^24.13.3","miniprogram-api-typings":"^4.1.3"},"_npmOperationalInternal":{"tmp":"tmp/weixin_2.0.0_1786288875302_0.07205381069125227","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@captcha-pro/weixin","version":"2.1.0","keywords":["captcha","weixin","miniprogram","slider-captcha","click-captcha"],"author":{"name":"saqqdy","email":"https://github.com/saqqdy"},"license":"MIT","_id":"@captcha-pro/weixin@2.1.0","maintainers":[{"name":"saqqdy","email":"saqqdy@qq.com"}],"dist":{"shasum":"f48596d67ed0aa65bd9803c0c27543f670c21ecd","tarball":"https://registry.npmjs.org/@captcha-pro/weixin/-/weixin-2.1.0.tgz","fileCount":19,"integrity":"sha512-etHW+qd2yqgvtV4EqAGmAF0hvsPhDdjfvCOyTsB1jylBqpp5MAZtKXOLARtY+CJed5+IMxLkmzYWXqU4Mk7Fjw==","signatures":[{"sig":"MEQCIFYeHq4l05ibnBGQUPpcuO8ukGTYtYRL+ctPkTxT73gfAiAdlPRfW0yobs4P9QFUuJ9OzF/U8PJXYkIh9TDj9KxD9g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38719},"main":"dist/index.cjs","_from":"file:captcha-pro-weixin-2.1.0.tgz","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"test":"echo 'no tests'","build":"vite build -c build/vite.config.ts","clean":"rm-all dist","watch":"vite build -c build/vite.config.ts -w"},"_npmUser":{"name":"saqqdy","email":"saqqdy@qq.com"},"_resolved":"/tmp/2ad54635b73df9f140e6a13634b56f4d/captcha-pro-weixin-2.1.0.tgz","_integrity":"sha512-etHW+qd2yqgvtV4EqAGmAF0hvsPhDdjfvCOyTsB1jylBqpp5MAZtKXOLARtY+CJed5+IMxLkmzYWXqU4Mk7Fjw==","_npmVersion":"10.8.2","description":"WeChat mini-program captcha components for captcha-pro (backend-only mode)","directories":{},"miniprogram":"dist","_nodeVersion":"20.20.2","dependencies":{"@captcha-pro/mp-shared":"2.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.4.19","rm-all":"^1.1.1","typescript":"^5.9.3","@types/node":"^24.13.3","miniprogram-api-typings":"^4.1.3"},"_npmOperationalInternal":{"tmp":"tmp/weixin_2.1.0_1786844033349_0.32045486297642833","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@captcha-pro/weixin","description":"WeChat mini-program captcha components for captcha-pro (backend-only mode)","version":"2.2.0","main":"dist/index.cjs","module":"dist/index.js","types":"dist/index.d.ts","miniprogram":"dist","exports":{".":{"types":"./dist/index.d.ts","require":"./dist/index.cjs","import":"./dist/index.js","default":"./dist/index.js"}},"dependencies":{"@captcha-pro/mp-shared":"2.2.0"},"devDependencies":{"@types/node":"^24.13.3","miniprogram-api-typings":"^4.1.3","rm-all":"^1.1.1","typescript":"^5.9.3","vite":"^5.4.19"},"keywords":["captcha","weixin","miniprogram","slider-captcha","click-captcha"],"license":"MIT","author":{"name":"saqqdy","email":"https://github.com/saqqdy"},"publishConfig":{"registry":"https://registry.npmjs.org","access":"public"},"scripts":{"build":"vite build -c build/vite.config.ts","watch":"vite build -c build/vite.config.ts -w","clean":"rm-all dist","test":"echo 'no tests'"},"_id":"@captcha-pro/weixin@2.2.0","_integrity":"sha512-OMnxWeTl5wpp4G09W3MjvjolifWQ/rI9FMELU6s5CexcADnBJg17HrtSVzCrxkmLzVVED/n6NWcY/Zng4LJt/g==","_resolved":"/tmp/51cba25bb5518e3ee7b1760a7a0d4f81/captcha-pro-weixin-2.2.0.tgz","_from":"file:captcha-pro-weixin-2.2.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-OMnxWeTl5wpp4G09W3MjvjolifWQ/rI9FMELU6s5CexcADnBJg17HrtSVzCrxkmLzVVED/n6NWcY/Zng4LJt/g==","shasum":"d6ddfddc5e0b02c06149c05887e22de9ab0df1e7","tarball":"https://registry.npmjs.org/@captcha-pro/weixin/-/weixin-2.2.0.tgz","fileCount":19,"unpackedSize":40136,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC8vNIki1i53Nd2rzr0LNQl//NmgG4y/kRN+cEmLzdbfgIgWsapeua1+NwFljm4G6Qix8gOl4Is9y7IJ0yCCnHibQs="}]},"_npmUser":{"name":"saqqdy","email":"saqqdy@qq.com"},"directories":{},"maintainers":[{"name":"saqqdy","email":"saqqdy@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/weixin_2.2.0_1786972764377_0.567745520532495"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-09T15:21:15.063Z","modified":"2026-08-17T13:19:25.328Z","2.0.0":"2026-08-09T15:21:15.454Z","2.1.0":"2026-08-16T01:33:53.505Z","2.2.0":"2026-08-17T13:19:24.519Z"},"author":{"name":"saqqdy","email":"https://github.com/saqqdy"},"license":"MIT","keywords":["captcha","weixin","miniprogram","slider-captcha","click-captcha"],"description":"WeChat mini-program captcha components for captcha-pro (backend-only mode)","maintainers":[{"name":"saqqdy","email":"saqqdy@qq.com"}],"readme":"# @captcha-pro/weixin\n\nWeChat mini-program captcha components for Captcha Pro (backend-only mode).\n\n**[简体中文](./README_CN.md)**\n\n## Installation\n\n```bash\npnpm add @captcha-pro/weixin\n```\n\n## Important: Backend-Only Mode\n\nThis package only supports backend verification mode. All captcha images are provided by backend API, `backend` configuration is required.\n\n## Usage\n\n### 1. Build NPM\n\nIn WeChat DevTools:\n1. Open your project\n2. Click **Tools** → **Build npm**\n\n### 2. Register Components\n\n```json\n// page.json\n{\n  \"usingComponents\": {\n    \"slider-captcha\": \"@captcha-pro/weixin/components/slider-captcha/slider-captcha\",\n    \"click-captcha\": \"@captcha-pro/weixin/components/click-captcha/click-captcha\",\n    \"popup-captcha\": \"@captcha-pro/weixin/components/popup-captcha/popup-captcha\"\n  }\n}\n```\n\n### 3. Use Components\n\n```xml\n<!-- slider-captcha -->\n<slider-captcha\n  width=\"{{300}}\"\n  height=\"{{170}}\"\n  backend=\"{{backend}}\"\n  bind:success=\"onSuccess\"\n  bind:fail=\"onFail\"\n/>\n\n<!-- click-captcha -->\n<click-captcha\n  width=\"{{300}}\"\n  height=\"{{170}}\"\n  backend=\"{{backend}}\"\n  bind:success=\"onSuccess\"\n/>\n\n<!-- popup-captcha -->\n<popup-captcha\n  id=\"popupCaptcha\"\n  type=\"slider\"\n  backend=\"{{backend}}\"\n  bind:success=\"onSuccess\"\n/>\n```\n\n```javascript\n// page.js\nPage({\n  data: {\n    backend: {\n      getCaptcha: 'https://your-api.com/captcha/get',\n      verify: 'https://your-api.com/captcha/verify',\n      timeout: 10000,\n    },\n  },\n  onSuccess(e) {\n    console.log('Verification passed!', e.detail)\n  },\n  showPopup() {\n    this.selectComponent('#popupCaptcha').show()\n  },\n})\n```\n\n## Backend Configuration (Required)\n\n```typescript\ninterface BackendConfig {\n  getCaptcha: string | (params: any) => Promise<any>  // Required\n  verify: string | (data: any) => Promise<any>        // Required\n  headers?: Record<string, string>                     // Optional\n  timeout?: number                                     // Optional, default: 10000\n}\n```\n\nExample with custom functions:\n\n```javascript\nPage({\n  data: {\n    backend: {\n      getCaptcha(params) {\n        return new Promise((resolve) => {\n          wx.request({\n            url: '/api/captcha/get',\n            data: params,\n            success: (res) => resolve(res.data),\n          })\n        })\n      },\n      verify(data) {\n        return new Promise((resolve) => {\n          wx.request({\n            url: '/api/captcha/verify',\n            data,\n            method: 'POST',\n            success: (res) => resolve(res.data),\n          })\n        })\n      },\n    },\n  },\n})\n```\n\n## Components\n\n### slider-captcha\n\n| Property | Type | Default | Description |\n|----------|------|---------|-------------|\n| width | Number | 300 | Container width (px) |\n| height | Number | 170 | Container height (px) |\n| sliderWidth | Number | 42 | Slider piece width (px) |\n| sliderHeight | Number | 42 | Slider piece height (px) |\n| showRefresh | Boolean | true | Show refresh button |\n| locale | String | 'zh-CN' | Language |\n| backend | Object | - | **Required**, backend API config |\n\n### click-captcha\n\n| Property | Type | Default | Description |\n|----------|------|---------|-------------|\n| width | Number | 300 | Container width (px) |\n| height | Number | 170 | Container height (px) |\n| showRefresh | Boolean | true | Show refresh button |\n| locale | String | 'zh-CN' | Language |\n| backend | Object | - | **Required**, backend API config |\n\n### popup-captcha\n\n| Property | Type | Default | Description |\n|----------|------|---------|-------------|\n| type | String | 'slider' | 'slider' or 'click' |\n| title | String | '请完成安全验证' | Popup title |\n| maskClosable | Boolean | true | Close on mask click |\n| showClose | Boolean | true | Show close button |\n| autoClose | Boolean | true | Auto close on success |\n| closeDelay | Number | 500 | Close delay (ms) |\n| backend | Object | - | **Required**, backend API config |\n\n## Component Methods\n\n```javascript\n// Get component instance\nconst slider = this.selectComponent('#sliderCaptcha')\nconst popup = this.selectComponent('#popupCaptcha')\n\n// slider-captcha / click-captcha methods\nslider.refresh()\nslider.getData()\n\n// popup-captcha methods\npopup.show()\npopup.hide()\npopup.isVisible()\n```\n\n## Events\n\n| Event | Description | Detail |\n|-------|-------------|--------|\n| bind:success | Verification passed | `{ verifiedAt }` |\n| bind:fail | Verification failed | - |\n| bind:refresh | Refresh clicked | - |\n| bind:error | Loading error | `Error` |\n| bind:open | Popup opened | - |\n| bind:close | Popup closed | - |\n\n## Utility Functions\n\n```javascript\nconst { wxFetchCaptcha, wxVerifyCaptcha } = require('@captcha-pro/weixin')\n\n// Fetch captcha\nconst res = await wxFetchCaptcha(backendConfig, {\n  type: 'slider',\n  width: 300,\n  height: 170,\n})\n\n// Verify captcha\nconst result = await wxVerifyCaptcha(backendConfig, {\n  captchaId: 'xxx',\n  type: 'slider',\n  target: [123],\n})\n```\n\n## Backend API Reference\n\n### GET /api/captcha/get\n\nQuery Parameters:\n- `type`: 'slider' | 'click'\n- `width`: number\n- `height`: number\n- `precision`: number (optional, default: 5)\n- `clickCount`: number (optional, default: 3)\n\nResponse:\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"captchaId\": \"uuid\",\n    \"type\": \"slider\",\n    \"bgImage\": \"data:image/png;base64,...\",\n    \"sliderImage\": \"data:image/png;base64,...\",\n    \"sliderY\": 42,\n    \"width\": 300,\n    \"height\": 170,\n    \"expiresAt\": 1700000000000\n  }\n}\n```\n\n### POST /api/captcha/verify\n\nRequest:\n```json\n{\n  \"captchaId\": \"uuid\",\n  \"type\": \"slider\",\n  \"target\": [123]\n}\n```\n\nResponse:\n```json\n{\n  \"success\": true,\n  \"message\": \"Verification successful\",\n  \"data\": { \"verifiedAt\": 1700000000000 }\n}\n```\n\n## License\n\nMIT","readmeFilename":"README.md"}