




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
使用Golang开发微信公众平台 关注并使用过微信“飞常准”公众号的朋友们都有过如下体验:查询一个航班情况后,这个航班的checkin、登机、起降等信息都会在后续陆续异步发给你,这个服务就是通过微信公众平台的客服消息实现的。微信公众平台开发文档中关于客服消息的解释如下:“当用户主动发消息给公众号的时候(包括发送信息、点击自定义菜单、订阅事件、扫描二维码事件、支付成功 事件、用户维权),微信将会把消息数据推送给开发者,开发者在一段时间内(目前修改为48小时)可以调用客服消息接口,通过POST一个JSON数据包来 发送消息给普通用户,在48小时内不限制发送次数。此接口主要用于客服等有人工消息处理环节的功能,方便开发者为用户提供更加优质的服务”。这篇文章我们就来说说如何用golang实现发送文本客服消息。一、获取access_tokenaccess_token是公众号的全局唯一票据,公众号调用微信平台各接口时都需使用access_token。我们要主动给微信平台发送客服消息,该access_token就是我们的凭证。在构造和下发客服消息前,我们需要获取这个access_token。access_token的有效期为2小时(7200s),我们获取一次,两小时内均可使用。微信公众平台开发文档也给出了access_token获取、保存以及刷新的技术建议。但我们这里仅是Demo,无需考虑这么多。通过https GET请求,我们可以得到属于我们的access_token,请求line为:/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRETgolang提供了默认的http client实现,通过默认的client实现我们可以很容器的获取access_token。const ( token = wechat4go appID = wx8e0fb2659c2eexxx appSecret = 22746009b0162fe50cb915851c53fyyy accessTokenFetchUrl = /cgi-bin/token)func fetchAccessToken() (string, float64, error) requestLine := strings.Join(stringaccessTokenFetchUrl, ?grant_type=client_credential&appid=, appID, &secret=, appSecret, ) resp, err := http.Get(requestLine) if err != nil | resp.StatusCode != http.StatusOK return , 0.0, err defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil return , 0.0, err fmt.Println(string(body) 无论成功与否,微信平台都会返回一个包含json数据的应答:如果获取正确,那么应答里的Json数据为:access_token:0QCeHwiRtPRUCiM5MM0cSPYIP5QOUNYdb8usRSgVZcsFuVF6mu3vQq41OIifJdrtJPGn7b1x90HdvUanpb7eZHxg40B6bU_Sgszh2byyF40,expires_in:7200如果获取错误,那么应答里的Json数据为:errcode:40001,errmsg:invalid credential和xml数据包一样,golang也提供了json格式数据包的Marshal和Unmarshal方法,且使用方式相同,也是将一个json数据包与一 个struct对应起来。从上面来看,通过http response,我们无法区分出是否成功获取了token,因此我们需要首先判断试下body中是否包含某些特征字符串,比 如access_token:if bytes.Contains(body, byte(access_token) /unmarshal to AccessTokenResponse struct else /unmarshal to AccessTokenErrorResponse struct针对获取成功以及失败的两种Json数据,我们定义了两个结构体:type AccessTokenResponse struct AccessToken string json:access_token ExpiresIn float64 json:expires_intype AccessTokenErrorResponse struct Errcode float64 Errmsg stringJson unmarshal的代码片段如下:/Json Decodingif bytes.Contains(body, byte(access_token) atr := AccessTokenResponse err = json.Unmarshal(body, &atr) if err != nil return , 0.0, err return atr.AccessToken, atr.ExpiresIn, nil else fmt.Println(return err) ater := AccessTokenErrorResponse err = json.Unmarshal(body, &ater) if err != nil return , 0.0, err return , 0.0, fmt.Errorf(%s, ater.Errmsg)我们的main函数如下:func main() accessToken, expiresIn, err := fetchAccessToken() if err != nil log.Println(Get access_token error:, err) return fmt.Println(accessToken, expiresIn)编译执行,成功获取access_token的输出如下:0QCeHwiRtPRUCiM5MM0cSPYIP5QOUNYdb8usRSgVZcsFuVF6mu3vQq41OIifJdrtJPGn7b1x90HdvUanpb7eZHxg40B6bU_Sgszh2byyF40 7200失败时,输出如下:2014/12/30 12:39:56 Get access_token error: invalid credential二、发送客服消息平台开发文档中定义了文本客服消息的body格式,一个json数据: touser:OPENID, msgtype:text, text: content:Hello World 其中的touser填写的是openid。之前的文章中提到过,每个微信用户针对某一个订阅号/服务号都有唯一的OpenID,这个ID可以在微信订阅号 /服务号管理页面中看到,也可以在收到的微信平台转发的消息中看到(FromUserName)。比如我个人订阅的我的测试体验号后得到的OpenID 为:BQcwuAbKpiSAbbvd_DEZg7q27QI我们要做的就是构造这样一个json数据,并放入HTTP Post包中,发到:/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN从平台开发文档给出的json数据包样例来看,这是个嵌套json数据包,我们通过下面方法marshall:type CustomServiceMsg struct ToUser string json:touser MsgType string json:msgtype Text TextMsgContent json:texttype TextMsgContent struct Content string json:contentfunc pushCustomMsg(accessToken, toUser, msg string) error csMsg := &CustomServiceMsg ToUser: toUser, MsgType: text, Text: TextMsgContentContent: msg, body, err := json.MarshalIndent(csMsg, , ) if err != nil return err fmt.Println(string(body) 如果单纯输出上面marshal的结果,可以看到: touser: oBQcwuAbKpiSAbbvd_DEZg7q27QI, msgtype: text, text: content: 你好 接下来将marshal后的byte放入一个http post的body中,发送到指定url中:var openID = oBQcwuAbKpiSAbbvd_DEZg7q27QIfunc pushCustomMsg(accessToken, toUser, msg string) error postReq, err := http.NewRequest(POST, strings.Join(stringcustomServicePostUrl, ?access_token=, accessToken, ), bytes.NewReader(body) if err != nil return err postReq.Header.Set(Content-Type, application/json; encoding=utf-8) client := &http.Client resp, err := client.Do(postReq) if err != nil return err resp.Body.Close() return nil我们在main函数中加上客服消息的发送环节:func main() / Fetch access_token accessToken, expiresIn, err := fetchAccessToken() if err != nil log.Println(Get access_token error:, err) return fmt.Println(accessToken, expiresIn) / Post custom service message msg := 你好 err = pushCustomMsg(accessToken, openID, msg) if err != nil log.Println(Push custom service message err:, err) return 编译执行,手机响起提示音,打开观看,微信公众平台测试号发来消息:“
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- Unit6 Rain or Shine SectionaA Pronunciation说课稿2024-2025学年人教版(2024)七年级英语下册
- 课题3 物质的转化与应用说课稿-2025-2026学年初中化学仁爱科普版2024九年级下册-仁爱科普版2024
- 2025年中考数学试题分类汇编:锐角三角函数(10大考点62题) (第1期)原卷版
- 2025年中考化学试题分类汇编:坐标图像题(第2期)解析版
- A A hard choice (Viewing and listening)教学设计-2025-2026学年初中英语沪教版五四学制2024七年级下册-沪教版五四学制2024
- 第六单元 平行四边形的认识 (教学设计)-2023-2024学年四年级下册数学西师大版
- 2025年四川高考地理试题及答案详解
- 七年级道德与法治下册 第2单元 做情绪情感的主人 第5课 品出情感的韵味 第2框 在品味情感中成长说课稿 新人教版
- 四年级语文下册一二单元测试题(附答案)
- 2025年全国高压电工作业人员操作证考试题库(含答案)
- 教师消防培训课件
- 中国血脂管理指南(基层版+2024年)解读
- 早期生产遏制-GP-12-加严控制-Reinforce-Control
- 什么是医院感染
- 2025年轴流式消防排烟风机项目可行性研究报告
- 《管理学基础》课程标准(含课程思政)
- 《涡街流量计交流会》课件
- QC/T 1206.1-2024电动汽车动力蓄电池热管理系统第1部分:通用要求
- 国企内部控制审计服务方案
- 宁德时代笔试题库
- 骨干教师专业成长规划
评论
0/150
提交评论