{"id":16489060,"url":"https://github.com/thundernet8/wechat","last_synced_at":"2025-03-23T12:34:09.536Z","repository":{"id":79658648,"uuid":"116660597","full_name":"thundernet8/Wechat","owner":"thundernet8","description":"Easy to use Wechat SKD for Node(under dev)","archived":false,"fork":false,"pushed_at":"2018-02-13T07:45:17.000Z","size":401,"stargazers_count":11,"open_issues_count":1,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-04-26T06:20:40.522Z","etag":null,"topics":["express","koa","nodejs","wechat","wechat-sdk","weixin","weixin-sdk"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thundernet8.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-01-08T10:07:02.000Z","updated_at":"2020-04-14T11:33:48.000Z","dependencies_parsed_at":"2023-06-27T02:38:58.117Z","dependency_job_id":null,"html_url":"https://github.com/thundernet8/Wechat","commit_stats":{"total_commits":99,"total_committers":4,"mean_commits":24.75,"dds":0.4040404040404041,"last_synced_commit":"fbe74d9a47e7c622141e8fd2086987c1c320bca5"},"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thundernet8%2FWechat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thundernet8%2FWechat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thundernet8%2FWechat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thundernet8%2FWechat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thundernet8","download_url":"https://codeload.github.com/thundernet8/Wechat/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":221851126,"owners_count":16891722,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["express","koa","nodejs","wechat","wechat-sdk","weixin","weixin-sdk"],"created_at":"2024-10-11T13:42:51.963Z","updated_at":"2024-10-28T15:51:39.697Z","avatar_url":"https://github.com/thundernet8.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n## Wechat-One\n\n**Easy to use Wechat SDK for Node .**\n\n[![GitHub issues](https://img.shields.io/github/issues/thundernet8/Wechat.svg)](https://github.com/thundernet8/Wechat/issues)\n[![GitHub forks](https://img.shields.io/github/forks/thundernet8/Wechat.svg)](https://github.com/thundernet8/Wechat/network)\n[![GitHub stars](https://img.shields.io/github/stars/thundernet8/Wechat.svg)](https://github.com/thundernet8/Wechat/stargazers)\n[![dependency status](https://img.shields.io/david/thundernet8/Wechat.svg?maxAge=3600\u0026style=flat)](https://david-dm.org/thundernet8/Wechat)\n[![Build Status](https://travis-ci.org/thundernet8/Wechat.svg?branch=master)](https://travis-ci.org/thundernet8/Wechat)\n[![GitHub license](https://img.shields.io/github/license/thundernet8/Wechat.svg)](https://github.com/thundernet8/Wechat/blob/master/LICENSE)\n[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)\n\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n## Implements\n\n* 公众平台\n    * [x] 消息处理(中间件)\n    * [x] 媒体管理(临时素材)\n    * [x] 素材管理(永久素材)\n    * [x] 菜单操作（查询、创建、删除）\n    * [x] 二维码（创建临时、永久二维码，查看二维码 URL）\n    * [x] 短网址\n    * [x] 用户管理\n    * [x] 评论管理\n    * [x] 设备管理 (IoT)\n    * [x] 门店管理\n    * [x] 卡券管理\n    * [x] 自动回复 (查询自动回复规则)\n    * [x] 群发消息（文本、图片、语音、视频、图文）\n    * [x] 客服记录（查询客服记录，查看客服、查看在线客服）\n    * [x] 客服会话\n    * [x] 模版消息\n    * [x] 短网址\n    * [x] 语义查询\n    * [x] 数据分析\n    * [ ] 摇一摇\n    * [x] OAuth\n    * [x] 辅助\n        * [x] API Limit 清理\n        * [x] 获取微信服务器 IP 列表\n\n## Usage\n\n### Typings 支持\n\nnpm package 已经添加了 Typings 支持，为了获得更好的类型和自动提示支持，推荐使用 TypeScript 开发\n\n获取一个具体的类型化服务\n\n```typescript\nimport Wechat, { OfficialAccountService } from \"wechat-one\";\n\nconst wx = new Wechat.OfficialAccount({\n    appid: WX_APPID,\n    secret: WX_APPSECRET,\n    token: WX_TOKEN,\n    aesKey: WX_AESKEY,\n    server: \"koa\"\n});\n\nconst userService = wx.getService\u003cOfficialAccountService.UserService\u003e(\"user\");\n// or\nconst userService = wx.getService(\"user\") as OfficialAccountService.UserService;\n```\n\n实例化一个文本回复\n\n```typescript\nconst reply = new Wechat.Core.TextReply(\"content\");\n```\n\n实例化一个文本群发消息\n\n```typescript\nconst broadcast = new Wechat.Core.TextBroadcastMessage(\"content\");\n```\n\n参考[更多](src/index.d.ts)\n\n### 公众平台\n\n实例化 sdk 客户端\n\n```typescript\nimport Wechat from \"wechat-one\";\n\nconst wx = new Wechat.OfficialAccount({\n    appid: WX_APPID,\n    secret: WX_APPSECRET,\n    token: WX_TOKEN,\n    aesKey: WX_AESKEY,\n    server: \"koa\",\n    cacher // 可选\n});\n\n// 在多进程运行环境，需要统一的数据管理，例如Access Token的缓存，需要提供cacher实现(可以使用一个独立的redis server来提供数据)，接口如下:\ncacher: {\n    getter: (key: string) =\u003e string;\n    setter: (key: string, data: string) =\u003e void;\n}\n```\n\n* 消息处理\n\n```typescript\nimport * as Koa from \"koa\";\n\nconst app = new Koa();\nconst wx = ...\nconst mpServer = wx.getService(\"server\");\n\nmpServer.handle(async function handler(msg) {\n    switch (msg.type) {\n        case \"text\":\n            return \"received: \" + msg.content; // this will be a text reply\n            return new Wechat.Core.ImageReply(\"MediaId\") // this will be a image reply\n\n        ...\n        default:\n            return \"\" // no reply\n    }\n\n});\n\n// inject middlewares\nmpServer.connect(app);\n// or inject to specified path\nmpServer.connect(app, path);\n```\n\n* 媒体管理\n\n```typescript\nconst mediaService = wx.getService(\"media\");\n\nmediaService.uploadImage(\"image file path\");\nmediaService.uploadVoice(\"voice file path\");\nmediaService.uploadVideo(\"video file path\");\nmediaService.uploadThumb(\"thumb image file path\");\n```\n\n* 素材管理\n\n```typescript\nconst materialService = wx.getService(\"material\");\n\nmaterialService.uploadImage(\"image file path\");\nmaterialService.uploadVoice(\"voice file path\");\nmaterialService.uploadVideo(\"video file path\");\nmaterialService.uploadThumb(\"thumb image file path\");\n\n// 新增永久图文消息素材\nmaterialService.uploadArticle(articles);\n// 修改永久图文素材\nmaterialService.updateArticle(mediaId, article, index);\n// 上传图文消息内的图片获取URL\nmaterialService.uploadArticleImage(path);\n// 获取永久素材\nmaterialService.get(mediaId);\n// 删除永久素材\nmaterialService.delete(mediaId);\n// 获取素材列表\nmaterialService.list(type, offset, limit);\n// 获取素材总数\nmaterialService.stats();\n```\n\n* 菜单操作\n\n```typescript\nconst menuService = wx.getService(\"menu\");\n// 列出所有菜单\nmenuService.list();\n// 获取当前自定义菜单配置\nmenuService.current();\n// 创建自定义菜单\nmenuService.create([\n    {\n        type: \"click\",\n        name: \"name\",\n        // click等点击类型必须, 菜单KEY值，用于消息接口推送，不超过128字节\n        key: \"\",\n        sub_button: [],\n        // view、miniprogram类型必须, 网页 链接，用户点击菜单可打开链接，不超过1024字节。 type为miniprogram时，不支持小程序的老版本客户端将打开本url\n        url: \"\",\n        // media_id类型和view_limited类型必须, 调用新增永久素材接口返回的合法media_id\n        media_id: \"\",\n        // miniprogram类型必须, 小程序的appid（仅认证公众号可配置）\n        appid: \"\",\n        // miniprogram类型必须, 小程序的页面路径\n        pagepath: \"\"\n    }\n]);\n// 删除所有菜单\nmenuService.delete();\n// 创建个性化菜单\nmenuService.createConditional([\n    {\n        button: buttons,\n        matchrule: {}\n    }\n]);\n// 删除个性化菜单\nmenuService.deleteConditional(menuId);\n// 测试个性化菜单匹配\nmenuService.tryMatch(userId);\n```\n\n* 二维码\n\n```typescript\nconst qrcodeService = wx.getService(\"qrcode\");\n// 创建永久二维码\nqrcodeService.forever(\"your scene\");\n// 创建临时二维码\nqrcodeService.temporary(\"your scene\", 3600 /* expireSeconds */);\n// 通过ticket换取二维码\nqrcodeService.url(\"ticket\");\n```\n\n* 模板消息\n\n```typescript\nconst templatemessageService = wx.getService(\"templatemessage\");\n// 设置所属行业\ntemplatemessageService.setIndustry(primaryIndustry, secondaryIndustry);\n\n// 获取设置的行业信息\ntemplatemessageService.getIndustry();\n// 获得模板ID\ntemplatemessageService.addTemplate(shortId);\n// 获取模板列表\ntemplatemessageService.getPrivateTemplates();\n// 删除模板\ntemplatemessageService.deletePrivateTemplate(templateId);\n// 发送模板消息\ntemplatemessageService.send(data);\n// 一次性订阅消息\ntemplatemessageService.sendSubscription(data);\n```\n\n* 短网址\n\n```typescript\nconst urlService = wx.getService(\"url\");\n// 长链接转短链接\nurlService.shorten(\"your long url\");\n```\n\n* 用户管理\n\n```typescript\nconst userService = wx.getService(\"user\");\n// 创建用户标签\nuserService.createTag(\"tag name\");\n// 获取用户标签列表\nuserService.getTags();\n// 编辑用户标签\nuserService.updateTag(123 /* tag id */, \"tag name\");\n// 删除用户标签\nuserService.deleteTag(123 /* tag id */);\n// 获取标签下粉丝列表\nuserService.getTagUserList(123 /* tag id */, \"next openid\");\n// 批量为用户打标签\nuserService.tagUsers(123 /* tag id */, [\"openid1\", \"openid2\"]);\n// 批量为用户取消标签\nuserService.untagUsers(123 /* tag id */, [\"openid1\", \"openid2\"]);\n// 获取用户的标签列表\nuserService.getUserTags(\"openid\");\n// 设置用户备注名\nuserService.setRemark(\"openid\", \"remark\");\n// 获取用户基本信息\nuserService.getInfo(\"openid\", \"zh_CN\");\n// 批量获取用户基本信息\nuserService.batchGetInfo([\n    { openid: \"openid1\", lang: \"zh_CN\" },\n    { openid: \"openid2\", lang: \"zh_CN\" }\n]);\n// 获取用户列表\nuserService.list(\"next openid\");\n// 获取黑名单用户列表\nuserService.blacklist(\"next openid\");\n// 拉黑用户\nuserService.drop([\"openid1\", \"openid2\"]);\n// 取消拉黑用户\nuserService.recover([\"openid1\", \"openid2\"]);\n```\n\n* 评论管理\n\n```typescript\nconst commentService = wx.getService(\"comment\");\n// 打开已群发文章评论\ncommentService.open(msgId, index);\n// 关闭已群发文章评论\ncommentService.close(msgId, index);\n// 查看指定文章的评论数据\ncommentService.list(msgId, index, begin, count, type);\n// 将评论标记精选\ncommentService.markElect(msgId, index, commentId);\n// 将评论取消精选\ncommentService.unmarkElect(msgId, index, commentId);\n// 删除评论\ncommentService.delete(msgId, index, commentId);\n// 回复评论\ncommentService.reply(msgId, index, commentId, content);\n// 删除回复\ncommentService.deleteReply(msgId, index, commentId);\n```\n\n* 自动回复\n\n```typescript\nconst autoreplyService = wx.getService(\"autoreply\");\n// 获取公众号的自动回复规则\nautoreplyService.current();\n```\n\n* 群发消息\n\n```typescript\nconst broadcastService = wx.getService(\"broadcast\");\n// 根据OpenID列表群发消息\nbroadcastService.sendToList(message, to);\n// 根据标签进行群发\nbroadcastService.send(message, tagId, toAll);\n// 群发消息预览\nbroadcastService.preview(message, to, filter);\n// 删除群发消息\nbroadcastService.delete(msgId, articleIndex);\n// 获取群发消息\nbroadcastService.stats(msgId);\n// 群发文本消息\nbroadcastService.sendText();\n// 群发语音消息\nbroadcastService.sendVoice();\n// 群发图片消息\nbroadcastService.sendImage();\n// 群发视频消息\nbroadcastService.sendVideo();\n// 群发卡券消息\nbroadcastService.sendCard();\n// 群发图文消息\nbroadcastService.sendNews();\n```\n\n* 客服记录\n\n```typescript\nconst kfService = wx.getService(\"kf\");\n// 获取客服列表\nkfService.list();\n// 获取在线客服列表\nkfService.onlineList();\n// 添加客服帐号\nkfService.create(account, nickname);\n// 设置客服信息\nkfService.update(account, nickname);\n// 删除客服帐号\nkfService.delete(account);\n// 邀请绑定客服帐号\nkfService.invite(account, wechatId);\n// 上传客服头像\nkfService.uploadAvatar(account, imagePath);\n// 客服接口-发消息\nkfService.sendMessage(message, to, kfAccount?);\n// 客服输入状态\nkfService.sendTypingStatus(to);\n// 获取聊天记录\nkfService.messageHistory(startTime, endTime, msgId, count);\n```\n\n* 客服会话\n\n```typescript\nconst kfSessionService = wx.getService(\"kfsession\");\n// 获取客服会话列表\nkfSessionService.list(account);\n// 获取未接入会话列表\nkfSessionService.waitingList();\n// 创建会话\nkfSessionService.create(account, openId);\n// 关闭会话\nkfSessionService.close(account, openId);\n// 获取客户会话状态\nkfSessionService.stats(openId);\n```\n\n* 设备管理\n\n```typescript\nconst deviceService = wx.getService(\"device\");\n// 第三方发送消息给设备主人的微信终端，并最终送达设备\ndeviceService.message(deviceId, openId, content);\n// 第三方主动发送设备状态消息给微信终端\ndeviceService.statMessage(deviceId, openId, type, status);\n// 获取设备绑定openID\ndeviceService.openId(deviceId);\n// 获取设备二维码\ndeviceService.qrCode(deviceIds);\n// 验证二维码\ndeviceService.verifyQrCode(ticket);\n// 获取 deviceid 和二维码\ndeviceService.createId(productId);\n// 设备授权\ndeviceService.authorize(devices, productId, opType);\n// 利用 deviceid 更新设备属性\ndeviceService.update(devices);\n// 设备状态查询\ndeviceService.stats(deviceId);\n// 设备绑定成功通知\ndeviceService.bind(openId, deviceId, ticket);\n// 设备解绑成功通知\ndeviceService.unbind(openId, deviceId, ticket);\n// 强制绑定用户和设备\ndeviceService.forceBind(openId, deviceId);\n// 强制解绑用户和设备\ndeviceService.forceUnbind(openId, deviceId);\n// 通过openid获取用户绑定的设备\ndeviceService.getBindDevice(openId);\n```\n\n* 门店管理\n\n```typescript\nconst poiService = wx.getService(\"poi\");\n// 查询门店信息\npoiService.getPOI(id);\n// 查询门店列表\npoiService.list(offset, limit);\n// 创建门店\npoiService.create(poi);\n// 修改门店服务信息\npoiService.update(id, poi);\n// 删除门店\npoiService.delete(id);\n// 获取门店类目表\npoiService.categories();\n```\n\n* 卡券管理\n\n```typescript\nconst cardService = wx.getService(\"card\");\n// 获取卡券颜色列表\ncardService.colors();\n// 卡券开放类目查询接口\ncardService.categories();\n// 创建卡券\ncardService.create(cardType, attributes);\n// 查看卡券详情\ncardService.stats(cardId);\n// 批量查询卡券列表\ncardService.list(offset, count, statusList);\n// 更改卡券信息接口\ncardService.update(cardId, type, attributes);\n// 删除卡券接口\ncardService.delete(cardId);\n// 创建二维码\ncardService.createQrCode(cards);\n// 通过ticket换取二维码链接\ncardService.getQrCodeUrl(ticket);\n// 创建货架接口\ncardService.createLandingPage(banner, pageTitle, canShare, scene, cardList);\n// 图文消息群发卡券\ncardService.getHtml(cardId);\n// 设置测试白名单\ncardService.setTestWhitelist(openIds, isUsername?);\n// 获取用户已领取卡券\ncardService.getUserCards(openId, cardId?);\n// 设置买单接口\ncardService.setPayCell(cardId, isOpen?);\n// 增加卡券库存\ncardService.increaseStock(cardId, amount);\n// 减少卡券库存\ncardService.reduceStock(cardId, amount);\n```\n\n```typescript\nconst cardCodeService = wx.getService(\"card.code\");\n// 导入自定义code\ncardCodeService.deposit(cardId, codes);\n// 查询导入code数目\ncardCodeService.getDepositedCount(cardId);\n// 核查code\ncardCodeService.check(cardId, codes);\n// 查询Code接口\ncardCodeService.stats(code, cardId?, checkConsume?);\n// 更改Code接口\ncardCodeService.update(code, newCode, cardId?);\n// 设置卡券失效\ncardCodeService.disable(code, cardId?, reason?);\n// 核销Code\ncardCodeService.consume(code, cardId?);\n// Code解码\ncardCodeService.decrypt(encryptedCode);\n```\n\n```typescript\nconst coinCardService = wx.getService(\"card.coin\");\n// 开通券点账户\ncoinCardService.active();\n// 对优惠券批价\ncoinCardService.getPrice(cardId, quantity);\n// 查询券点余额\ncoinCardService.summary();\n// 充值券点\ncoinCardService.recharge(code);\n// 查询订单详情\ncoinCardService.order(orderId);\n// 查询券点流水详情\ncoinCardService.orders(filters);\n// 确认兑换库存\ncoinCardService.confirm(cardId, orderId, quantity);\n```\n\n```typescript\nconst generalCardService = wx.getService(\"card.general\");\n// 通用卡接口激活\ngeneralCardService.active(info);\n// 通用卡撤销激活\ngeneralCardService.deactivate(cardId, code);\n// 更新用户礼品卡信息\ngeneralCardService.updateUser(params);\n```\n\n```typescript\nconst meetingCardService = wx.getService(\"card.meeting\");\n// 更新用户会议卡信息\nmeetingCardService.updateUser(params);\n```\n\n```typescript\nconst memberCardService = wx.getService(\"card.member\");\n// 会员卡接口激活\nmemberCardService.active(info);\n// 设置开卡字段\nmemberCardService.setActivationForm(cardId, settings);\n// 拉取会员信息接口\nmemberCardService.getUser(cardId, code);\n// 更新会员信息\nmemberCardService.updateUser(params);\n```\n\n```typescript\nconst movieCardService = wx.getService(\"card.movie\");\n// 更新电影券会员信息\nmovieCardService.updateUser(params);\n```\n\n```typescript\nconst submerchantCardService = wx.getService(\"card.submerchant\");\n// 创建子商户\nsubmerchantCardService.create(info);\n// 更新子商户\nsubmerchantCardService.update(merchantId, info);\n// 获取子商户信息\nsubmerchantCardService.stats(merchantId);\n// 批量获取子商户信息\nsubmerchantCardService.list(beginId?, limit?, status?);\n```\n\n* 语义查询\n\n```typescript\nconst semanticService = wx.getService(\"semantic\");\n// 语义理解查询\nsemanticService.query(keyword, categories, optional?);\n```\n\n* 数据分析\n\n```typescript\nconst datacubeService = wx.getService(\"datacube\");\n// 获取用户增减数据\ndatacubeService.userSummary(from, to);\n// 获取累计用户数据\ndatacubeService.userCumulate(from, to);\n// 获取图文群发每日数据\ndatacubeService.articleSummary(from, to);\n// 获取图文群发总数据\ndatacubeService.articleTotal(from, to);\n// 获取图文阅读统计数据\ndatacubeService.userReadSummary(from, to);\n// 获取图文阅读统计分时数据\ndatacubeService.userReadHourly(from, to);\n// 获取图文分享转发数据\ndatacubeService.userShareSummary(from, to);\n// 获取图文分享转发分时数据\ndatacubeService.userShareHourly(from, to);\n// 获取消息发送概况数据\ndatacubeService.upstreamMessageSummary(from, to);\n// 获取消息发送分时数据\ndatacubeService.upstreamMessageHourly(from, to);\n// 获取消息发送周数据\ndatacubeService.upstreamMessageWeekly(from, to);\n// 获取消息发送月数据\ndatacubeService.upstreamMessageMonthly(from, to);\n// 获取消息发送分布数据\ndatacubeService.upstreamMessageDistSummary(from, to);\n// 获取消息发送分布周数据\ndatacubeService.upstreamMessageDistWeekly(from, to);\n// 获取消息发送分布月数据\ndatacubeService.upstreamMessageDistMonthly(from, to);\n// 获取接口分析数据\ndatacubeService.interfaceSummary(from, to);\n// 获取接口分析分时数据\ndatacubeService.interfaceSummaryHourly(from, to);\n// 拉取卡券概况数据接口\ndatacubeService.cardSummary(from, to, condSource);\n// 获取免费券数据接口\ndatacubeService.freeCardSummary(from, to, condSource, cardId);\n// 拉取会员卡数据接口\ndatacubeService.memberCardSummary(from, to, condSource);\n// 拉取单张会员卡数据接口\ndatacubeService.memberCardDetail(from, to, cardId);\n```\n\n* 辅助\n\n```typescript\nconst baseService = wx.getService(\"base\");\n// 获取微信服务器IP列表\nbaseService.getValidIps();\n// API限制数量清0(谨慎调用)\nbaseService.clearQuota();\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthundernet8%2Fwechat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthundernet8%2Fwechat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthundernet8%2Fwechat/lists"}