{"id":13600573,"url":"https://github.com/esap/wechat","last_synced_at":"2026-01-12T06:54:28.150Z","repository":{"id":39585643,"uuid":"80583812","full_name":"esap/wechat","owner":"esap","description":"微信SDK的golang实现，短小精悍，同时兼容【企业号/服务号/订阅号/小程序】","archived":false,"fork":false,"pushed_at":"2024-08-12T01:43:18.000Z","size":224,"stargazers_count":479,"open_issues_count":5,"forks_count":95,"subscribers_count":22,"default_branch":"master","last_synced_at":"2025-04-06T09:41:13.365Z","etag":null,"topics":["corp","esap","golang-sdk","miniapp","mp","wechat"],"latest_commit_sha":null,"homepage":"","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/esap.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":"2017-02-01T02:42:22.000Z","updated_at":"2025-01-10T03:01:47.000Z","dependencies_parsed_at":"2024-11-07T03:33:12.119Z","dependency_job_id":null,"html_url":"https://github.com/esap/wechat","commit_stats":null,"previous_names":["woylyn/wechat"],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/esap%2Fwechat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/esap%2Fwechat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/esap%2Fwechat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/esap%2Fwechat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/esap","download_url":"https://codeload.github.com/esap/wechat/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248322280,"owners_count":21084334,"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":["corp","esap","golang-sdk","miniapp","mp","wechat"],"created_at":"2024-08-01T18:00:43.167Z","updated_at":"2026-01-12T06:54:28.143Z","avatar_url":"https://github.com/esap.png","language":"Go","funding_links":[],"categories":["Go"],"sub_categories":[],"readme":"# WeChat SDK\n[![Build Status](https://travis-ci.org/esap/wechat.svg?branch=master)](https://travis-ci.org/esap/wechat)\n[![Go Report Card](https://goreportcard.com/badge/github.com/esap/wechat)](https://goreportcard.com/report/github.com/esap/wechat)\n[![GoDoc](http://godoc.org/github.com/esap/wechat?status.svg)](http://godoc.org/github.com/esap/wechat)\n\n**微信SDK的golang实现，短小精悍，同时兼容【企业微信/服务号/订阅号/小程序】**\n\n## 快速开始\n\n5行代码，链式消息，快速开启微信API示例:\n\n```go\npackage main\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/esap/wechat\" // 微信SDK包\n)\n\nfunc main() {\n\twechat.Debug = true\n\t\n\tcfg := \u0026wechat.WxConfig{\n\t\tToken:          \"yourToken\",\n\t\tAppId:          \"yourAppID\",\n\t\tSecret:         \"yourSecret\",\n\t\tEncodingAESKey: \"yourEncodingAesKey\",\n\t}\n\n\tapp := wechat.New(cfg)\n\tapp.SendText(\"@all\", \"Hello,World!\")\n\t\n\thttp.HandleFunc(\"/\", func(w http.ResponseWriter, r *http.Request) {\n\t\tapp.VerifyURL(w, r).NewText(\"客服消息1\").Send().NewText(\"客服消息2\").Send().NewText(\"查询OK\").Reply()\n\t})\n\t\n\thttp.ListenAndServe(\":9090\", nil)\n}\n\n```\n## 配置方式\n\n```go\n\t// 创建公众号实例(服务号/订阅号/小程序) 不带aesKey则为明文模式\n\tcfg := \u0026wechat.WxConfig{\n\t\tToken:          \"yourToken\",\n\t\tAppId:          \"yourAppID\",\n\t\tSecret:         \"yourSecret\",\n\t}\n\n\t// 创建公众号实例(服务号/订阅号/小程序)\n\tcfg := \u0026wechat.WxConfig{\n\t\tToken:          \"yourToken\",\n\t\tAppId:          \"yourAppID\",\n\t\tSecret:         \"yourSecret\",\n\t\tEncodingAESKey: \"yourEncodingAesKey\",\n\t}\n\n\t// 创建企业微信实例\n\tcfg := \u0026wechat.WxConfig{\n\t\tToken:          \"yourToken\",\n\t\tAppId:          \"yourCorpID\",\n\t\tAgentId:        \"yourAgentId\",\n\t\tSecret:         \"yourSecret\",\n\t\tEncodingAESKey: \"yourEncodingAesKey\",\n\t\tAppType:        1,\n\t}\n```\n\n## 主动推送消息\n\n用户关注后，企业微信可以主动推送消息，服务号需要用户48小时内进入过。\n\n```go\n\tapp.SendText(to, msg)\n\tapp.SendImage(to, mediaId)\n\tapp.SendVoice(to, mediaId)\n\tapp.SendFile(to, mediaId)\n\tapp.SendVideo(to, mediaId, title, desc)\n\tapp.SendTextcard(to, title, desc, url)\n\tapp.SendMusic(to, mediaId, title, desc, musicUrl, qhMusicUrl)\n\tapp.SendNews(to, arts...)\n\tapp.SendMpNews(to, arts...)\n\tapp.SendMpNewsId(to, mediaId)\n\tapp.SendMarkDown(to, content)\n```\n\n## 消息回调\n\n* 通常将`app.VerifyURL(http.ResponseWriter, *http.Request)`嵌入http handler\n\n该函数返回`*wechat.Context`基本对象，其中的Msg为用户消息：\n\n```go\n\t// 混合用户消息，业务判断的主体\n\tWxMsg struct {\n\t\tXMLName      xml.Name `xml:\"xml\"`\n\t\tToUserName  \n\t\tFromUserName\n\t\tCreateTime  64\n\t\tMsgId       64\n\t\tMsgType     \n\t\tContent       // text\n\t\tAgentID          // corp\n\t\tPicUrl        // image\n\t\tMediaId       // image/voice/video/shortvideo\n\t\tFormat        // voice\n\t\tRecognition   // voice\n\t\tThumbMediaId  // video\n\t\tLocationX    float32 `xml:\"Latitude\"`  // location\n\t\tLocationY    float32 `xml:\"Longitude\"` // location\n\t\tPrecision    float32 // LOCATION\n\t\tScale            // location\n\t\tLabel         // location\n\t\tTitle         // link\n\t\tDescription   // link\n\t\tUrl           // link\n\t\tEvent         // event\n\t\tEventKey      // event\n\t\tSessionFrom   // event|user_enter_tempsession\n\t\tTicket      \n\t\tFileKey     \n\t\tFileMd5     \n\t\tFileTotalLen\n\n\t\tScanCodeInfo struct {\n\t\t\tScanType  \n\t\t\tScanResult\n\t\t}\n\t}\n\n```\n\n* 如果使用其他web框架，例如echo/gin/beego等，则把VerifyURL()放入controller或handler\n\n```go\n// echo示例 公众号回调接口\nfunc wxApiPost(c echo.Context) error {\n\tctx := app.VerifyURL(c.Response().Writer, c.Request())\n\t\n\t// TODO: 这里是其他业务操作\n\n\treturn nil\n}\n```\n\n### 回调回复消息\n\n回调回复消息有两种方式：\n\n* 被动回复，采用XML格式编码返回(Reply)；\n\n* 客服消息，采用json格式编码返回(Send)；\n\n* 两种方式都可先调用`*wechat.Context`对象的New方法创建消息，然后调用Reply()或Send()。\n\n* 支持链式调用，但Reply()只有第一次有效。\n\n```go\n\tctx.NewText(\"正在查询中...\").Reply()\n\tctx.NewText(\"客服消息1\").Send().NewText(\"客服消息2\").Send()\n```\n\n* 被动回复可直接调用Reply()，表示已收到，然后调用客服消息。\n\n####  文本消息\n\n```go\n\tctx.NewText(\"content\")\n```\n\n####  图片/语言/文件消息\n\n```go\n\t// mediaID 可通过素材管理-上上传多媒体文件获得\n\tctx.NewImage(\"mediaID\")\n\tctx.NewVoice(\"mediaID\")\n\t\n\t// 仅企业号支持\n\tctx.NewFile(\"mediaID\")\n```\n\n####  视频消息\n\n```go\n\tctx.NewVideo(\"mediaID\", \"title\", \"description\")\n```\n\n####  音乐消息\n\n```go\n\tctx.NewMusic(\"thumbMediaID\",\"title\", \"description\", \"musicURL\", \"hqMusicURL\")\n```\n\n####  图文消息\n\n```go\n\t// 先创建三个文章\n\tart1 := wechat.NewArticle(\"拥抱AI，享受工作\",\n\t\t\"来自村长的ESAP系统最新技术分享\",\n\t\t\"http://ylin.wang/img/esap18-1.png\",\n\t\t\"http://ylin.wang/2017/07/13/esap18/\")\n\tart2 := wechat.NewArticle(\"用企业微信代替pda实现扫描入库\",\n\t\t\"来自村长的ESAP系统最新技术分享\",\n\t\t\"http://ylin.wang/img/esap17-2.png\",\n\t\t\"http://ylin.wang/2017/06/23/esap17/\")\n\tart3 := wechat.NewArticle(\"大道至简的哲学\",\n\t\t\"来自村长的工作日志\",\n\t\t\"http://ylin.wang/img/golang.jpg\",\n\t\t\"http://ylin.wang/2017/01/29/log7/\")\n\t// 打包成新闻\n\tctx.NewNews(art1, art2, art3)\n```\n\n####  模板消息\n\n[相关issue](https://github.com/esap/wechat/issues/20#issue-451068915)\n\n```go\n\ttlpdata := map[string]struct {\n\t\tValue `json:\"value\"`\n\t\tColor `json:\"color\"`\n\t}{\n\t\t\"first\": {Value: \"我是渣渣涛\", Color: \"#173177\"},\n\t\t\"keyword1\": {Value: \"这是一个你从没有玩过的全新游戏\", Color: \"#173177\"},\n\t\t\"keyword2\": {Value: \"只要你跟着我一起试玩一下\", Color: \"#173177\"},\n\t\t\"keyword3\": {Value: \"你就会爱上这款游戏\", Color: \"#4B1515\"},\n\t\t\"remark\":   {Value: \"是兄弟就来砍我\", Color: \"#071D42\"},\n\t}\n\tctx.SendTemplate(\n\t\tctx.Msg.FromUserName,\n\t\t\"tempid\", // 模板ID\n\t\tc.Request.Host, // 跳转url\n\t\tctx.AppId, // 跳转小程序，比url优先\n\t\t\"\", // 小程序页面\n\t\ttlpdata,\n\t)\n```\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fesap%2Fwechat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fesap%2Fwechat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fesap%2Fwechat/lists"}