Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >微信公众平台-微信服务号开发

微信公众平台-微信服务号开发

作者头像
全栈程序员站长
发布于 2022-07-28 09:15:48
发布于 2022-07-28 09:15:48
8.4K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

文章目录

背景:

近期接到了涉及微信开放平台和微信公众平台相关的开发需求,开发过程中踩了许多坑,把相关问题整理记录下来以便巩固记忆,并把总结的经验分享出来,本篇分享微信服务号开发,希望可以给大家提供帮助

一、微信各个平台介绍

1、微信开放平台:面向开发人员,为网站、App提供微信第三方登录功能,为App提供支付功能。

2、微信公众平台:对应的是公众号,包括订阅号、服务号、企业号,面向运营人员和开发人员,运营可以直接登录公众号管理后台查看公众号的整体情况,开发人员则是通过调用微信提供的各种接口来增强公众号的功能;

3、微信商户平台,用户通过微信支付的钱,最终到达商户账号。无论是开放平台还是公众平台,涉及到支付,都需要商户平台账号

解释一下什么是服务号什么是订阅号

通过官方提供的图片可以了解到,订阅号的优势就是进行消息推送,而服务号的优势是能够提供个性化的服务

二、公众平台介绍

公众平台只能通过管理员扫码登录,当运营、开发人员较多时,可以进行绑定运营/开发者微信号进行自行扫码登录(http://kf.qq.com/faq/120911VrYVrA141211FbEnq2.html)

登录后可以在管理后台进行一系列操作,例如:

  • 创作管理:图文素材、多媒体素材上传
  • 公众号设置:设置公众号关注回复内容,收到关键词回复规则和内容,设置收到消息自动回复内容,自定义公众号菜单 (注意:如果在开发者中心开启回调URL和Token进行公众号二次开发后,官方提供的公众号设置功能将被关闭,后面我会针对这个场景做介绍)
  • 管理功能:查看关注该公众号的用户、接收的用户消息,可以通过管理后台对关注的用户进行消息回复、消息群发
  • 统计功能:用户分析、内容分析、菜单分析、图文分析、消息分析等

三、开发前准备

  • 公众号开发切记保存好AppID和AppSecret信息(请求获取AccessToken时用到),其中AppSecret在管理后台不显示,且无法查看,忘记只能重置,因此AppSecret一定要进行备份并注意防止泄露。 (官方对AccessToken进行了详细说明https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html
  • 设置开发环境、测试环境、正式环境的服务器 IP为白名单,白名单以外的ip请求access_token接口会报40164错误,有了 access_token 才能调用微信的各种接口

四、服务器配置

开启服务器配置,开启以后服务号的推送信息将会传送到所配置的服务器中,包括关注事件、事件回复、关键词回复、用户消息接收、自定义菜单等功能都将被服务器接管,并且在公众平台配置的一切推送规则都将被停用,需要注意。

(PS:在配置服务器URL时,由于微信会发送请求进行签名校验,填写的URL必须是可以外网访问的,开发时建议使用ngrok进行内网穿透方便调试 附上网址: https://ngrok.com/

其他详情可以参考服务器配置接入指南(https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html

五、服务器验证

开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:

参数

描述

signature

微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。

timestamp

时间戳

nonce

随机数

echostr

随机字符串

开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:

1)将token、timestamp、nonce三个参数进行字典序排序

2)将三个参数字符串拼接成一个字符串进行sha1加密

3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

代码示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
代码示例:
//解析
@GetMapping("/weChatParseXml")
public String parseXmlGet(@RequestParam("signature") String signature,
@RequestParam("timestamp") String timestamp,
@RequestParam("nonce") String nonce,
@RequestParam("echostr") String echostr) {
logger.info("signature: " + signature);
logger.info("timestamp: " + timestamp);
logger.info("nonce: " + nonce);
logger.info("echostr: " + echostr);
//排序
String[] strArray = {TOKEN, timestamp, nonce}; //TOKEN为公众平台填写的Token
Arrays.sort(strArray);
StringBuilder sb = new StringBuilder();
for (String str : strArray) {
sb.append(str);
}
String sortString = sb.toString();
logger.info("sortString: " + sortString);
//加密  这里主要是进行sha1加密 可以使用 SecurityUtil工具类进行加密
String myString = weChatAppletBiz.weChatParseXmlSha1(sortString);
logger.info("myString: " + myString);
//校验
if (myString != null && myString != "" && myString.equals(signature)) {
logger.info("签名校验通过");
//如果检验成功原样返回echostr,微信服务器接收到此输出,才会确认检验完成。
return echostr;
} else {
logger.info("签名校验失败");
return "";
}
}

六、消息接收

当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。

(PS:官方提供了对文本、图片、语音、视频、地理位置等消息接收的方法,一般对文本的解析足以满足大部分需求,因此下面只针对文本解析进行说明,其他详情可以查阅上面的服务器接入指南)

请注意:

  1. 关于重试的消息排重,推荐使用msgid排重。
  2. 微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。详情请见“发送消息-被动回复消息”。
  3. 如果开发者需要对用户消息在5秒内立即做出回应,即使用“发送消息-被动回复消息”接口向用户被动回复消息时,可以在

公众平台官网的开发者中心处设置消息加密。开启加密后,用户发来的消息和开发者回复的消息都会被加密(但开发者通过客服接口等API调用形式向用户发送消息,则不受影响)。关于消息加解密的详细说明,请见“发送消息-被动回复消息加解密说明”。 关于文本消息的推送XML数据包结构如下:

文本消息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<xml>
  <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[fromUser]]></FromUserName>
  <CreateTime>1348831860</CreateTime>
  <MsgType><![CDATA[text]]></MsgType>
  <Content><![CDATA[this is a test]]></Content>
  <MsgId>1234567890123456</MsgId>
</xml>

参数

描述

ToUserName

开发者微信号

FromUserName

发送方帐号(一个OpenID)

CreateTime

消息创建时间 (整型)

MsgType

消息类型,文本为text

Content

文本消息内容

MsgId

消息id,64位整型

代码示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@PostMapping("/weChatParseXml")
public Object parseXmlPost(HttpServletRequest request) throws Exception {
logger.info("==================接收到微信消息==================");
//解析xml
// Map<String, String> stringStringMap = weChatAppletBiz.parseXml(request);


Map<String, String> messageMap = new HashMap<>();

// 从request中取得输入流
InputStream inputStream = request.getInputStream();
// 读取输入流
SAXReader reader = new SAXReader();
Document document = reader.read(inputStream);
String asXML = document.asXML();
logger.info(asXML);
// 得到xml根元素
Element root = document.getRootElement();
// 得到根元素的所有子节点
List<Element> elementList = root.elements();

// 遍历所有子节点
for (Element e : elementList) {
messageMap.put(e.getName(), e.getText());
}

// 释放资源
inputStream.close();

logger.info("获取到的信息:\n" + messageMap);

weChatAppletBiz.dealWithInfo(messageMap);//该方法内根据用户行为做对应的消息推送

logger.info("==================接收微信消息结束==================");
return "";
}

实际效果:

用户事件:

当服务器后台获取到用户发送的信息后,可以根据Event参数获取事件类型,针对不用的事件进行对应处理

事件类型分为subscribe(订阅)、unsubscribe(取消订阅)、 SCAN(扫描二维码)、 CLICK(菜单点击)、 LOCATION(地理位置)、 VIEW(菜单跳转)

不同事件相关参数也不同,具体还请到上面分享的配置接入指南页面,”消息管理模块-接收事件推送”进行参考

七、客服消息

接口调用请求说明

http请求方式: POST https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN

消息类型分为多种,包含文本、图片、语音、视频、音频、视频、图文、菜单,这里举例几个常用JSON数据包如下:

发送文本消息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{ 
   
    "touser":"OPENID",
    "msgtype":"text",
    "text":
    { 
   
         "content":"Hello World"
    }
}

发送图片消息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{ 
   
    "touser":"OPENID",
    "msgtype":"image",
    "image":
    { 
   
      "media_id":"MEDIA_ID"
    }
}

发送视频消息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{ 
   
    "touser":"OPENID",
    "msgtype":"video",
    "video":
    { 
   
      "media_id":"MEDIA_ID",
      "thumb_media_id":"MEDIA_ID",
      "title":"TITLE",
      "description":"DESCRIPTION"
    }
}

发送图文消息(有两种方式,这里举例一种) 注意!!图文消息条数限制在1条以内,如果图文数超过1,则将会返回错误码45008。 这里非常坑!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{ 
   
    "touser":"OPENID",
    "msgtype":"mpnews",
    "mpnews":
    { 
   
         "media_id":"MEDIA_ID"
    }
}

发送文本消息时,还支持插入跳小程序的文字链

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
文本内容<a href="[http://www.qq.com](http://www.qq.com/)" data-miniprogram-appid="appid" data-miniprogram-path="pages/index/index">点击跳小程序</a>

说明:

1.data-miniprogram-appid 项,填写小程序appid,则表示该链接跳小程序;

2.data-miniprogram-path项,填写小程序路径,路径与app.json中保持一致,可带参数;

3.对于不支持data-miniprogram-appid 项的客户端版本,如果有herf项,则仍然保持跳href中的网页链接;

4.data-miniprogram-appid对应的小程序必须与公众号有绑定关系。

JSON数据包发送时需要注意以下几点

1、OPENID可以通过接收参数中fromUserName字段获得

2、msgtype一定要遵从规范,否则会出错

3、media_id是管理员自行上传的相关资源,上传成功后会成为微信素材同时生成唯一的media_id,上传方式可以从公众平台页面上传或使用curl命令进行上传

(PS:这里我curl用的很少,大多数资源都是通过公众平台进行上传,而且上传的都是永久素材)

新增永久视频素材的调用示例(慎用):

curl “https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN&type=TYPE” -F media=@media.file -F description=’{“title”:VIDEO_TITLE, “introduction”:INTRODUCTION}’

参数说明

参数

是否必须

说明

title

视频素材的标题

introduction

视频素材的描述

返回说明

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{ 
   
  "media_id":MEDIA_ID,
  "url":URL
}

返回参数说明

参数

描述

media_id

新增的永久素材的media_id

url

新增的图片素材的图片URL(仅新增图片素材时会返回该字段)

八、获取素材

调用微信系统的素材接口可以获取对应的资源列表,注意!!获取资源接口调用时有每日次数限制,不建议实时查询,我这里是通过设计表,找恰当的时机将数据同步到我们自己服务器中。

接口说明:

1、获取永久素材的列表,也包含公众号在公众平台官网素材管理模块中新建的图文消息、语音、视频等素材

2、临时素材无法通过本接口获取

3、调用该接口需https协议

接口调用请求说明

http请求方式:

POST https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=ACCESS_TOKEN

调用示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{ 
   
    "type":TYPE,
    "offset":OFFSET,
    "count":COUNT
}

参数说明

参数

是否必须

说明

type

素材的类型,图片(image)、视频(video)、语音 (voice)、图文(news)

offset

从全部素材的该偏移位置开始返回,0表示从第一个素材 返回

count

返回素材的数量,取值在1到20之间

返回说明

永久图文消息素材列表的响应如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{ 
   
   "total_count": TOTAL_COUNT,
   "item_count": ITEM_COUNT,
   "item": [{ 
   
       "media_id": MEDIA_ID,
       "content": { 
   
           "news_item": [{ 
   
               "title": TITLE,
               "thumb_media_id": THUMB_MEDIA_ID,
               "show_cover_pic": SHOW_COVER_PIC(0 / 1),
               "author": AUTHOR,
               "digest": DIGEST,
               "content": CONTENT,
               "url": URL,
               "content_source_url": CONTETN_SOURCE_URL
           },
           //多图文消息会在此处有多篇文章
           ]
        },
        "update_time": UPDATE_TIME
    },
    //可能有多个图文消息item结构
  ]
}

其他类型(图片、语音、视频)的返回如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{ 
   
   "total_count": TOTAL_COUNT,
   "item_count": ITEM_COUNT,
   "item": [{ 
   
       "media_id": MEDIA_ID,
       "name": NAME,
       "update_time": UPDATE_TIME,
       "url":URL
   },
   //可能会有多个素材
   ]
}

返回参数说明

参数

描述

total_count

该类型的素材的总数

item_count

本次调用获取的素材的数量

title

图文消息的标题

thumb_media_id

图文消息的封面图片素材id(必须是永久mediaID)

show_cover_pic

是否显示封面,0为false,即不显示,1为true,即显示

author

作者

digest

图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空

content

图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS

url

图文页的URL,或者,当获取的列表是图片素材列表时,该字段是图片的URL

content_source_url

图文消息的原文地址,即点击“阅读原文”后的URL

update_time

这篇图文消息素材的最后更新时间

name

文件名称

九、相关工具

十、最终效果展示

总结

微信开发过程中很容易踩坑,遇到问题建议仔细阅读官方文档或通过微信开放社区寻找帮助

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/128532.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
微信公众平台开发 自定义菜单
自定义菜单能够帮助公众号丰富界面,让用户更好更快地理解公众号的功能。开启自定义菜单后,公众号界面如图所示:
庞小明
2018/09/19
2.1K0
微信公众平台开发 自定义菜单
公众号开发:获取用户消息和回复消息
最近在看微信公众号的开发文档,觉得很有意思,可以自定义开发一些功能,比如有人关注了公众号之后,你可以做出稍微复杂点的回复(简单的回复在公众号后台配置就好啦);比如关注者发送了「学习」消息,你可以给他推送一些文章,发送「天气」的消息,你可以回复当前的天气状况;还可以进行素材的管理,用户的管理等等。
Java技术编程
2020/06/10
6K0
公众号开发:获取用户消息和回复消息
第三方平台可以通过微信公众平台素材管理接口实现同步了
  平时运营微信公众平台时有没发现素材管理有点不太好操作,特别是素材一多,找个东西都翻半天。现在好了,微信宣布公众平台新增素材管理接口,对所有认证公众号开放,方便快捷,可以实现同步互通。(4.29更新第三方平台也能为未微信认证的订阅号调用自定义菜单接口和素材管理接口)   微信公众平台素材管理接口具体如下: 新增临时素材 公众号经常有需要用到一些临时性的多媒体素材的场景,例如在使用接口特别是发送消息时,对多媒体文件、多媒体消息的获取和调用等操作,是通过media_id来进行的。素材管理接口对所有认证的订
ytkah
2018/03/05
3.4K0
图解微信公众号后台服务开发(nodejs版)
IMWeb前端团队
2017/12/28
7.4K0
图解微信公众号后台服务开发(nodejs版)
微信公众平台开发(一)——概述&微信消息处理
微信公众平台是运营者通过公众号为微信用户提供资讯和服务的平台,而公众平台开放接口则是提供服务的基础,开发者在公众平台网站中创建公众号、获取接口权限后,可以通过阅读本接口文档来帮助开发。可以理解为微信公众平台开发就是开发者借助微信公众号,将自己的网站或者应用接入微信平台的服务。
不愿意做鱼的小鲸鱼
2023/03/25
7.4K0
微信公众平台开发(一)——概述&微信消息处理
微信开发--微信公众号(一)
1.在新浪云服务器的仓库里新建PHP文件,右键url访问,复制url地址在 微信测试账号的 接口配置信息里,Token 随便起一个 (好记的)名字
生南星
2019/07/22
22.7K0
微信开发--微信公众号(一)
C#开发微信公众平台-就这么简单(附Demo)
  最近公司在做微信开发,其实就是接口开发,网上找了很多资料,当然园友也写了很多教程,但都是理论说了一大堆,实用指导或代码很少。如果你自己仔细研究下,其实就那么点东西,C#实现起来也很简单,原本不想写这篇文章的,但是本人当时摸索走了很多弯路,这边总结下,希望初次接触微信公众平台的朋友别像当时的我一样。
庞小明
2018/09/19
3.1K0
C#开发微信公众平台-就这么简单(附Demo)
微信公众号开发系统入门教程(公众号注册、开发环境搭建、access_token管理、Demo实现、natapp外网穿透)
微信公众号分为服务号、订阅号、企业号,订阅号可以个人申请,服务号和企业号要有企业资质才可以。
全栈程序员站长
2022/09/06
3K0
微信公众号开发系统入门教程(公众号注册、开发环境搭建、access_token管理、Demo实现、natapp外网穿透)
微信公众平台开发入门教程[2020版]
在这篇微信公众平台开发教程中,我们假定你已经有了PHP语言程序、MySQL数据库、计算机网络通讯、及HTTP/XML/CSS/JS等基础。
全栈程序员站长
2022/09/06
4.6K0
Java微信公众平台开发_02_启用服务器配置
                     见:【  Java微信公众平台开发_01_本地服务器映射外网  】
shirayner
2018/08/10
8.5K0
Java微信公众平台开发_02_启用服务器配置
独立开发微信公众号服务的一次复盘
上篇文章主要分享了异步编程的一些经验。主要包括回调函数,发布订阅,Promise,async await以及yield关键字。
terrence386
2022/07/14
4610
独立开发微信公众号服务的一次复盘
微信公众平台开发教程(二) 基本原理及消息接口
微信服务器就相当于一个转发服务器,终端(手机、Pad等)发起请求至微信服务器,微信服务器,然后将请求转发给自定义服务(这就里就是我们的具体实现)。
Java架构师必看
2021/05/19
1.1K0
公众号开发笔记一
用户识别,每个公众号都有对应的一个OpenID.移动应用包含个人以及企业级应用,如果有多个公众号和应用,那么绑定后有多个不同的OpenID,但对这些同一开放平台账号下只有一个UnionID.
达达前端
2019/07/03
1.8K0
公众号开发笔记一
巧用 Serverless,轻松搭建微信公众号的智能后台服务
一般来说,想给微信公众号增加更多的功能,需要有一台服务器,来进行公众号后台服务的搭建。那么在 Serverless 架构下,是否有更简便的方法来实现这么一个公众号后台呢?我们试试? 初步搭建 一、Serverless 原生开发 首先要有一个微信公众号! 接下来,我们要为我们的函数计算服务申请固定 IP: 点击白名单之后,我们可以填写表单,完成固定公网出口 IP 的申请。 接下来进行代码开发。 将函数绑定到公众号后台,并按照文档在函数中完成一个基本的鉴定功能: def checkSignature(
腾讯云serverless团队
2020/05/22
3.7K0
unicloud云函数开发微信客服消息自动回复图片消息(完整步骤)
此时点击提交,会提示你Token校验失败,请检查确认,不要慌,只是云函数里面没有写而已。这个时候就可以去写云函数的代码了~~
猿来是前端
2022/09/19
1.5K0
unicloud云函数开发微信客服消息自动回复图片消息(完整步骤)
一看便会微信后台服务器开发
就要下班了,兵长打开手机,看到弹出的某微信聊天机器人广告便点了进去,于是有了如下故事…
阿兵云原生
2023/02/16
6750
公众号关注/订阅事件-微信公众号开发
微信公众号开发之关注事件(订阅事件),当我们启用开发者设置后,微信本身的消息回复将无法使用,那么在用户关注我们公众号的时候就没有任何反馈了, 对用户体验是非常不友好的。下面教大家如果做关注事件,既用户关注公众号,系统给用户一个反馈。
申霖
2019/12/27
8.2K0
公众号关注/订阅事件-微信公众号开发
nodejs微信公众号开发
网上关于node开发公众号的资料相当缺乏,本文旨在以node的视角对公众号开发做一个阐述。
一粒小麦
2019/08/06
6.4K4
Python开发微信公众号后台(系列一)
專 欄 ❈ 段晓晨,写过一点爬虫,写过几篇文章。能力虽有限,会尽量把想说的东西讲清楚。 知乎ID:段小草 知乎专栏:小段同学的杂记, https://zhuanlan.zhihu.com/666666❈—— 通过这一系列的文章,我们来介绍一下如何用Python开发微信公众号的后台。 主要工具:SAE+微信公众号+Git+Python本地环境(最好已经安装好了Git并配置好了Python IDE,比如Pycharm) 1. 工欲善其事 首先要简单介绍一下一些准备工作。 1.1 微信公众号 第一步是要注册一个
Python中文社区
2018/01/31
6K0
Python开发微信公众号后台(系列一)
Java微信公众平台开发_06_素材管理
一、本节要点 1.官方文档的media  这个media可以理解为文件,即我们需要以POST方式提交一个文件 2.媒体文件有效期 媒体文件在微信后台保存时间为3天,即3天后media_id失效。 二、
shirayner
2018/08/10
1.9K0
Java微信公众平台开发_06_素材管理
推荐阅读
相关推荐
微信公众平台开发 自定义菜单
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验