{"id":20459725,"url":"https://github.com/rosbit/go-wx-api","last_synced_at":"2025-04-13T05:51:19.960Z","repository":{"id":57501569,"uuid":"180748435","full_name":"rosbit/go-wx-api","owner":"rosbit","description":"微信公众号开发API封装","archived":false,"fork":false,"pushed_at":"2025-03-13T08:45:09.000Z","size":91,"stargazers_count":22,"open_issues_count":0,"forks_count":11,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-03-26T22:36:08.821Z","etag":null,"topics":["go","go-modules","golang","service","wechat"],"latest_commit_sha":null,"homepage":null,"language":"Go","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/rosbit.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}},"created_at":"2019-04-11T08:28:23.000Z","updated_at":"2025-03-13T08:44:54.000Z","dependencies_parsed_at":"2023-01-21T19:00:13.352Z","dependency_job_id":null,"html_url":"https://github.com/rosbit/go-wx-api","commit_stats":null,"previous_names":[],"tags_count":23,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rosbit%2Fgo-wx-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rosbit%2Fgo-wx-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rosbit%2Fgo-wx-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rosbit%2Fgo-wx-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rosbit","download_url":"https://codeload.github.com/rosbit/go-wx-api/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248670500,"owners_count":21142901,"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":["go","go-modules","golang","service","wechat"],"created_at":"2024-11-15T12:17:05.926Z","updated_at":"2025-04-13T05:51:19.934Z","avatar_url":"https://github.com/rosbit.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 微信公众号开发SDK\n\ngo-wx-api是对微信公众号API的封装，可以当作SDK使用，主要特点:\n\n - 对常用消息、事件的接收和回复做了封装，已经无需了解相关的公众号开发文档；见使用方法1；\n - 提供了缺省的消息、事件处理方法，可以根据实际需求覆盖相关实现；见使用方法2；\n - 使用`go-wx-api`可以同时支持**多个公众号**；见使用方法3;\n - 菜单点击后允许进入自己的页面，go-wx-api提供了统一的入口进入菜单处理，获取用户openId，\n   根据state参数进入具体业务处理。可以通过提供菜单跳转处理器实现具体业务；见使用方法1;\n - 已经支持视频号小店的推送接口、查看订单/售后单详情的接口\n - [go-wx-gateway](https://github.com/rosbit/go-wx-gateway)是使用go-wx-api实现的微信公众号网关服务，\n   通过`go-wx-gateway`，就可以把微信公众号服务的开发转化为普通web服务开发。\n\n## 编译例子\n 1. 该函数包已经使用go modules发布，需要golang 1.11.x及以上版本\n 1. 请参考[go-wx-apps](https://github.com/rosbit/go-wx-apps)，那里包含了例程和工具程序\n\n## 使用方法1: (实现消息处理器、菜单跳转处理器的例子)\n\ngo-wx-api已经对公众号常用的消息(文本框架输入、发语音等)、事件(用户关注、点击菜单等)做了提取和封装处理。缺省处理对消息、事件做了简单的应答处理，缺省处理除了能给公众号管理后台做开发者设置功能外，没有实际意义。具体业务可以根据需要对go-wx-api的消息处理器接口进行实现：\n\n 1. 消息处理器的定义和实现\n\n    ```go\n    import (\n        \"github.com/rosbit/go-wx-api/v2/msg\"\n        \"fmt\"\n    )\n\n    // 消息处理器定义\n    type YourMsgHandler struct {\n        wxmsg.WxMsgHandlerAdapter  // 包含了所有消息、事件的缺省实现\n    }\n\n    // 接口定义见 wxmsg.WxMsgHandler，根据需要选择实现其中的方法\n\n    // 文本消息处理\n    func (h *YourMsgHandler) HandleTextMsg(textMsg *wxmsg.TextMsg) wxmsg.ReplyMsg {\n        return NewReplyTextMsg(textMsg.FromUserName, textMsg.ToUserName, fmt.Sprintf(\"收到了消息:%s\", textMsg.Content))\n    }\n\n    // 用户关注公众号处理\n    func (h *YourMsgHandler) HandleSubscribeEvent(subscribeEvent *wxmsg.SubscribeEvent) wxmsg.ReplyMsg {\n        return wxmsg.NewReplyTextMsg(subscribeEvent.FromUserName, subscribeEvent.ToUserName, \"welcome\")\n    }\n    ```\n\n 1. 注册消息处理器\n    - 单一公众号注册方法见方法2\n    - 多公众号注册方法见方法3\n\n## 使用方法2: (单一公众号服务)\n\n以下是一个简单的例子，用于说明使用go-wx-api的主要执行步骤。更详细的例子参考[go-wx-apps](https://github.com/rosbit/go-wx-apps)\n\n```go\npackage main\n\nimport (\n\t\"github.com/rosbit/go-wx-api/v2/conf\"\n\t\"github.com/rosbit/go-wx-api/v2/msg\"\n\t\"github.com/rosbit/go-wx-api/v2\"\n\t\"net/http\"\n\t\"fmt\"\n)\n\nconst (\n\ttoken     = \"微信公众号的token\"\n\tappId     = \"微信公众号appId\"\n\tappSecret = \"微信公众号的secret\"\n\taesKey    = \"\" //安全模式 使用的AESKey，如果是 明文传输，该串为空\n\t\n\tlistenPort = 7070   // 服务侦听的端口号，请根据微信公众号管理端的服务器配置正确设置\n\tservice    = \"/wx\"  // 微信公众号管理端服务器配置中URL的路径部分\n\n\tworkerNum = 3 // 处理请求的并发数\n\tname = \"test\" // 服务的名字\n)\n\nfunc main() {\n\t// 步骤1. 初始化accessToken缓存路径\n\twxapi.InitWx(\"/tmp\")\n\n\t// 步骤2. 设置配置参数\n\tif err := wxapi.SetWxParams(name, token, appId, appSecret, aesKey); err != nil {\n\t\tfmt.Printf(\"failed to set params: %v\\n\", err)\n\t\treturn\n\t}\n\n\t// 步骤3: 设置签名验证的中间件。由于net/http不支持中间件，省去该步骤\n\t// signatureChecker := wxapi.NewWxSignatureChecker(token, 0, []string{service})\n\t// \u003cmiddleWareContainer\u003e.Use(signatureChecker)\n\n\t// 步骤4. 设置http路由，启动http服务\n\t// 用于公众号配置\n\thttp.HandleFunc(service, wxapi.CreateEcho(token))\n\n\t// 用于实际执行公众号请求，和wxapi.CreateEcho只能使用一个。\n\t// 可以使用支持高级路由功能的web框架同时设置\n\thttp.HandleFunc(service, wxapi.CreateMsgHandler(name, workerNum, wxmsg.MsgHandler))  // 使用缺省的消息处理器\n\thttp.HandleFunc(service, wxapi.CreateMsgHandler(name, workerNum, \u0026YourMsgHandler{})) // 使用自定义的消息处理器\n\t                                         \n\thttp.ListenAndServe(fmt.Sprintf(\":%d\", listenPort), nil)\n}\n```\n\n## 使用方法3: (多个公众号服务)\n\n以下代码仅仅为同时启用公众号的示例:\n\n```go\npackage main\n\nimport (\n\t\"github.com/rosbit/go-wx-api/v2/conf\"\n\t\"github.com/rosbit/go-wx-api/v2\"\n\t\"net/http\"\n\t\"fmt\"\n)\n\ntype WxConf struct {\n\tname string\n\ttoken string\n\tappId string\n\tappSecret string\n\taesKey string\n\tworkerNum int\n\tservice string\n\trd string\n\tredirectUrl string\n}\n\nvar (\n\tlistenPort = 7070   // 服务侦听的端口号，请根据微信公众号管理端的服务器配置正确设置\n\twxServices = []WxConf{\n\t\tWxConf{\n\t\t\tname: \"wx1\",\n\t\t\ttoken: \"微信公众号1的token\",\n\t\t\tappId: \"微信公众号1的appId\",\n\t\t\tappSecret: \"微信公众号的1secret\",\n\t\t\taesKey: \"\",      // 安全模式 使用的AESKey，如果是 明文传输，该串为空\n\t\t\tworkerNum: 3,    // 处理请求的并发数\n\t\t\tservice: \"/wx1\", // 微信公众号管理端服务器配置中URL的路径部分\n\t\t\trd: \"/rd1\", // 网页授权接受地址\n\t\t\tredirectUrl: \"http://localhost:port/redirect\", // 接受网页授权转发的其它服务\n\t\t},\n\t\tWxConf{\n\t\t\tname: \"wx2\",\n\t\t\ttoken: \"微信公众号2的token\",\n\t\t\tappId: \"微信公众号2的appId\",\n\t\t\tappSecret: \"微信公众号2的secret\",\n\t\t\taesKey: \"\",      // 安全模式 使用的AESKey，如果是 明文传输，该串为空\n\t\t\tworkerNum: 3,    // 处理请求的并发数\n\t\t\tservice: \"/wx2\", // 微信公众号管理端服务器配置中URL的路径部分\n\t\t\trd: \"/rd2\", // 网页授权接受地址\n\t\t\tredirectUrl: \"http://localhost:port/redirect\", // 接受网页授权转发的其它服务\n\t\t},\n\t\t// 其它服务号\n\t}\n)\n\nfunc main() {\n\t// 步骤1. 初始化accessToken缓存路径\n\twxapi.InitWx(\"/tmp\")\n\n\t// 对于每一个公众号执行\n\tfor _, conf := range wxServices {\n\t\t// 步骤2. 设置配置参数\n\t\tif err := wxapi.SetWxParams(conf.name, conf.token, conf.appId, conf.appSecret, conf.aesKey); err != nil {\n\t\t\tfmt.Printf(\"failed to set params: %v\\n\", err)\n\t\t\treturn\n\t\t}\n\n\t\t// 步骤2.5 设置签名验证的中间件。由于net/http不支持中间件，省去该步骤\n\t\t// signatureChecker := wxapi.NewWxSignatureChecker(conf.token, 0, []string{conf.service})\n\t\t// \u003cmiddleWareContainer\u003e.Use(signatureChecker)\n\n\t\t// 步骤3. 设置http路由，启动http服务\n\t\thttp.HandleFunc(conf.service, wxapi.CreateEcho(conf.token))     // 用于配置\n\n\t\t// 用于实际执行公众号请求，和wxapi.CreateEcho只能使用一个。\n\t\t// 可以使用支持高级路由功能的web框架同时设置。使用POST路由\n\t\thttp.HandleFunc(conf.service, wxapi.CreateMsgHandler(conf.name, conf.workerNum, wxmsg.MsgHandler))  // 使用缺省的消息处理器\n\t\thttp.HandleFunc(conf.service, wxapi.CreateMsgHandler(conf.name, conf.workerNum, \u0026YourMsgHandler{})) // 使用自定义的消息处理器\n\n\t\t// 菜单跳转全权交给另外一个URL处理，用GET路由\n\t\t// redirectURL接收POST请求，POST body是一个JSON: {\"appId\":\"xxx\", \"openId\", \"xxx\", \"state\": \"xxx\", \"userInfo\": {}}\n\t\t// 它可以随意处理HTTP请求、输出HTTP响应，响应结果直接返回公众号浏览器\n\t\thttp.HandleFunc(conf.rd, wxapi.CreateOAuth2Redirector(conf.name, conf.workerNum, conf.redirectUrl))\n\t}\n\n\thttp.ListenAndServe(fmt.Sprintf(\":%d\", listenPort), nil)\n}\n\n```\n\n## 其它\n 1. 该函数包可以处理文本消息、用户关注/取消关注事件、菜单点击事件\n 2. 其它消息、事件可以根据需要扩充\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frosbit%2Fgo-wx-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frosbit%2Fgo-wx-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frosbit%2Fgo-wx-api/lists"}