{"_id":"@4a/wechat","_rev":"3-3916800f605db6655f230bf0c5cd28e7","name":"@4a/wechat","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@4a/wechat","author":{"name":"gavinning"},"module":"dist/wechat.esm.js","version":"0.1.0","license":"MIT","main":"dist/index.js","typings":"dist/index.d.ts","engines":{"node":">=10"},"husky":{"hooks":{"pre-commit":"tsdx lint"}},"size-limit":[{"path":"dist/wechat.cjs.production.min.js","limit":"10 KB"},{"path":"dist/wechat.esm.js","limit":"10 KB"}],"devDependencies":{"@size-limit/preset-small-lib":"^6.0.3","@types/ioredis":"^4.27.8","@types/koa":"^2.13.4","@types/koa-bodyparser":"^4.3.3","husky":"^7.0.4","koa":"^2.13.4","size-limit":"^6.0.3","tsdx":"^0.14.1","tslib":"^2.3.1","ioredis":"^4.28.0","typescript":"^4.4.4"},"dependencies":{"@4a/asp":"^1.0.1","@4a/helper":"^0.2.0","axios":"^0.23.0","rmdb":"^0.3.2","tnwx":"^2.5.6","uid":"^2.0.0"},"scripts":{"dev":"tsdx watch","build":"tsdx build","test":"tsdx test","lint":"tsdx lint","size":"size-limit","analyze":"size-limit --why"},"_resolved":"","_integrity":"","_from":"file:4a-wechat-0.1.0.tgz","description":"* 生成微信公众号带参二维码 * 二维码自动缓存复用，突破每日10万限制 * 支持公众号其他通用消息处理","_id":"@4a/wechat@0.1.0","_nodeVersion":"14.17.3","_npmVersion":"6.14.13","dist":{"integrity":"sha512-9OAvoyd3kEpVN74jdd+WSTvsxb/+NhnZKc1DR9h8myh0zHb9Hh3djbL1zNdexyFbO+dVIOW7BLpBmMk7crdpcQ==","shasum":"7a3eceb93ca257aba0024a14fcb20f39fb387a1d","tarball":"https://registry.npmjs.org/@4a/wechat/-/wechat-0.1.0.tgz","fileCount":22,"unpackedSize":366318,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCgxIA5vqZCcta0mfeFYdFpbuhytKdMEVwRVcLrHG9ejwIgQNyWyP5BaeS7cXfSbIAGu8X1ftrcbm6yptSRkxM3dcE="}]},"_npmUser":{"name":"gavinning","email":"gavinning@qq.com"},"directories":{},"maintainers":[{"name":"gavinning","email":"gavinning@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechat_0.1.0_1634894305309_0.8944344533328736"},"_hasShrinkwrap":false},"0.2.0":{"name":"@4a/wechat","author":{"name":"gavinning"},"module":"dist/wechat.esm.js","version":"0.2.0","license":"MIT","main":"dist/index.js","typings":"dist/index.d.ts","engines":{"node":">=10"},"husky":{"hooks":{"pre-commit":"tsdx lint"}},"size-limit":[{"path":"dist/wechat.cjs.production.min.js","limit":"10 KB"},{"path":"dist/wechat.esm.js","limit":"10 KB"}],"devDependencies":{"@size-limit/preset-small-lib":"^6.0.3","@types/ioredis":"^4.27.8","@types/koa":"^2.13.4","@types/koa-bodyparser":"^4.3.3","husky":"^7.0.4","koa":"^2.13.4","size-limit":"^6.0.3","tsdx":"^0.14.1","tslib":"^2.3.1","ioredis":"^4.28.0","typescript":"^4.4.4"},"dependencies":{"@4a/asp":"^1.0.1","@4a/helper":"^0.2.0","axios":"^0.23.0","rmdb":"^0.3.2","tnwx":"^2.5.6","uid":"^2.0.0"},"scripts":{"dev":"tsdx watch","build":"tsdx build","test":"tsdx test","lint":"tsdx lint","size":"size-limit","analyze":"size-limit --why"},"_resolved":"","_integrity":"","_from":"file:4a-wechat-0.2.0.tgz","description":"* 生成微信公众号带参二维码 * 二维码自动缓存复用，突破每日10万限制 * 支持公众号其他通用消息处理","_id":"@4a/wechat@0.2.0","_nodeVersion":"14.17.3","_npmVersion":"6.14.13","dist":{"integrity":"sha512-ZIii/6fmx4KaLI3usczAzqI9+9jdQ7BwGw/6HuOJvh9blh7Ugo9xq8LnaisFfG4oRFdWiWw1h3qjbUdLJ3ZHCg==","shasum":"4b6f7641965ccee70bb149a8a5638bf0e26135c6","tarball":"https://registry.npmjs.org/@4a/wechat/-/wechat-0.2.0.tgz","fileCount":22,"unpackedSize":384222,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhuhkeCRA9TVsSAnZWagAATosP/2d5/rdmqP+reBhdThD+\nGeFfDICj06SzXFfdX3d1afRAJ0ecpQDAzXRidlmGoh7JibQqnhEw/sWd4bmK\nHI3UrUDHOIJkuMAipIzzwtsqlvh4BPI0NUx+MTrtxz5vdy+pC5jSAJAGjI3h\nvW2khlPjis3uSkKojih9FzDgnZSIG6yvOLDvfynRHWtXPmmzcQsWB0nqGzNs\nbV2CchYPJweD7Aj2Ms9YP4wYFcdeiqr5udo8HsxlGoWs5dCvB9cWfrwQrgJl\n6nf3Qssderb4kxRfXmW4li+1++NE9GV6KvSJRxlC/gJ0hZmpwHOOOVr7X+n1\n024ctEzoCEZ2yl4O3p30MTBuq1S/0d13KgLy71QA1olXI7TSf+tGFVa81RKi\nF56BrCPu7585Mw8AxisHoOvkUwU0bK/QJ0q9PqC1jKysp4LYuRlciDLpo3Wf\ntwlqS3zxsaz42NCtt/alHLFnPBbY2DVjuqiA77ajT/+SAwnXbrYNh9a5L2Fl\nryZgNMDROip4I2J+UhBQ0q9c+4GW7W/fmCw52jBabs3tVldh8ikYxjKW7dBX\ncwtNNOx0+ThuBCgXcxnXXDnP8i+z9hsB0o0AOrOgtuNJjRDeKzenlYVF5g/l\nD1Gv/4XX1w5ATZMqbk4etnaJqmrOb0cugC7K9lH42VfdZqRN2e1BJ7uuAtc7\nybbi\r\n=Jb5S\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCOFqfBLtqIqII7nCqfRXF3DuFAfz4EZohGjY1DhzlRCwIgaecckn5xdQtIGzDp6htaM/qRybWIqtFvrJ3mqDT945g="}]},"_npmUser":{"name":"gavinning","email":"gavinning@qq.com"},"directories":{},"maintainers":[{"name":"gavinning","email":"gavinning@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/wechat_0.2.0_1635168081544_0.01065327441785291"},"_hasShrinkwrap":false}},"time":{"created":"2021-10-22T09:18:25.241Z","0.1.0":"2021-10-22T09:18:25.412Z","modified":"2022-04-04T10:46:02.964Z","0.2.0":"2021-10-25T13:21:21.723Z"},"maintainers":[{"name":"gavinning","email":"gavinning@qq.com"}],"description":"* 生成微信公众号带参二维码 * 二维码自动缓存复用，突破每日10万限制 * 支持公众号其他通用消息处理","author":{"name":"gavinning"},"license":"MIT","readme":"# 微信公众号关注并自动登录\n\n* 生成微信公众号带参二维码\n* 二维码自动缓存复用，突破每日10万限制\n* 支持公众号其他通用消息处理\n\n### 安装使用\n```sh\nnpm i @4a/wechat\nyarn add @4a/wechat\n```\n```ts\nimport Wechat from '@4a/wechat'\n// Or\nimport { Wechat } from '@4a/wechat'\n\nexport new Wechat(opt: Options)\n```\n初始化参数 **Options**\n```ts\n/**\n * 初始化参数\n * @param appId 公众号appid\n * @param appSecret 公众号secret\n * @param appToken 公众号token\n * @param safemode 安全模式，默认为false，建议为false\n * @param encodingAesKey 安全模式下加密信息\n * @param debug debug模式会打印一些调试信息\n * @param redis ioredis实例\n * @param qrcodeTimeout 二维码有效期，默认22天，涉及到二维码复用缓存策略，如非必要不建议调整\n * @param accessTokenTimeout 公众号token缓存时间，默认100分钟\n * @param MsgAdapterFactory 公众号通用消息处理工厂函数，返回:tnwx.MsgAdapter\n */\nexport interface Options {\n    appId: string;\n    appSecret: string;\n    appToken: string;\n    msgAdapter: MsgAdapter;\n    safemode?: boolean;\n    encodingAesKey?: string;\n    debug?: boolean;\n    redis: Redis;\n    qrcodeTimeout?: number;\n    accessTokenTimeout?: number;\n    MsgAdapterFactory: (wechat: Wechat) => MsgAdapter;\n}\n```\n方法集合 **Methods**\n```ts\nexport declare class Wechat {\n    /**\n     * 微信公众号消息聚合处理，包含认证和通用消息处理\n     * 根据请求类型自动调用(authHandler | messageHandler)\n     */\n    wechatRequestHandler(ctx: Context): Promise<string>;\n    /**\n     * 处理微信公众号认证请求\n     */\n    authHandler(ctx: Context): string;\n    /**\n     * 微信公众号消息通用处理，仅处理消息，不处理认证\n     */\n    messageHandler(ctx: Context): Promise<string>;\n    /**\n     * 获取闲置微信公众号带参二维码\n     */\n    getFreeWechatQrcode(): Promise<{ scene_id: string; url: string; }>;\n    /**\n     * 清零二维码作业状态，重置为闲置状态\n     */\n    closeQrcodeWorking(scene_id: string): void;\n    /**\n     * 获取微信公众号AccessToken，缓存默认有效期100分钟\n     * 优先从缓存获取，缓存失效则从微信获取，推荐使用此方法\n     */\n    getAccessToken(): Promise<import(\"./config\").AccessTokenPayload>;\n    /**\n     * 注意！请勿频繁调用此方法，微信有调用数量限制\n     * 从微信获取微信公众号AccessToken，不经过缓存，不处理缓存\n     * 除非知道自己在做什么，否则推荐调用`getAccessToken`方法\n     */\n    getAccessTokenFromWechat(): Promise<import(\"./config\").AccessTokenPayload>;\n    /**\n     * 从缓存中查询微信公众号带参二维码元数据\n     * @param scene_id 场景id，Redis缓存key必须\n     */\n    getQrcodeFromRedis(scene_id: string): Promise<void | import(\"./config\").QrcodePayload>;\n}\n```\n\n### 缓存策略\n* `Redis`内有两个二维码集合，一个Hash\n    * `Free`集合：用于存放闲置二维码\n    * `Loading`集合：用于存放作业二维码\n    * `Hash`：用于存放二维码元数据\n* 当前端请求二维码时，使用`SPOP`命令从`Free`集合中取出一个闲置二维码\n    1. 当前端调用`closeQrcode`接口时，**作业二维码清零**\n    2. 当检查到二维码完成当前作业时，**作业二维码清零**\n* 每次请求二维码时检查集合过期时间，集合过期时间是二维码过期时间的一半 + 截止到当天晚上23点30分\n* 如果集合过期，则清理所有集合和Hash，重建缓存逻辑（防止二维码大量过期导致前端服务异常）\n<br />\n<br />\n\n> **作业二维码清零，重置为闲置二维码：**  \n> 使用`SMOVE`命令把目标二维码从`Loading`集合移动到`Free`集合，完成清零操作\n\n<br />\n\n### 占用的 Redis Keys\n```sh\n# 微信公众号access_token Key\nMod:@4a/wechat:accessToken:{AppId}\n\n    example:\n        Mod:@4a/wechat:accessToken:wx1234\n\n\n# 闲置二维码集合Key @Set\nMod:@4a/wechat:qrcodes:free\n\n# 作业中二维码集合Key @Set\nMod:@4a/wechat:qrcodes:loading\n\n# 二维码集合过期时间Key @String\nMod:@4a/wechat:qrcodes:cleanKey\n\n# 二维码元数据存储 @Hash\nMod:@4a/wechat:qrcodes:hash\n\n    Key: SceneId\n    example: HGET Mod:@4a/wechat:qrcodes:hash {SceneId}\n\n```\n\n### 鸣谢\n感谢开源优秀作品[`tnwx`](https://gitee.com/javen205/TNWX)提供支持\n","readmeFilename":"README.md"}