背景:
在新年前后,我做了一个微信正式帐户项目。这已经有一段时间。花时间回顾和总结基本过程,否则我很快就会忘记它。
微信公众平台的官方网站:
文章目录
一、注册的官方帐户
首次注册时,您会看到官方帐户有三种类型。大多数个人用户选择订阅帐户,而公司用户通常选择服务帐户和企业帐户。
我们通常注意订阅帐户。它们都放置在微信应用程序的订阅帐户消息列表中。没有微信付款等高级功能,但有发布文章等基本功能。
服务帐户和公司帐户位于对话列表中,并且与我们的微信朋友处于同一级别,具有微信付款等高级功能,这些功能通常是某些公司的外部操作窗口海底捞火锅,顺丰速运等品牌。
我们的预开发和测试只需注册一个个人订阅号。实际开发使用开发人员工具中的测试编号,下面将对此进行说明。
对于实际生产,将使用微信认证的所有订购号,服务号和企业号。
二、了解官方帐户管理页面
在微信公共平台上进行扫描和登录后,我们发现管理页面左侧的菜单栏具有丰富的功能:
它可以大致分为以下主要模块:
首页,功能,小程序,管理,升级,统计信息,设置,开发
作为开发人员,您首先要注意的是设置和开发模块。作为产品操作员,您应该注意功能,管理和促销模块;作为数据分析师,您应该注意统计模块。
首先,我们不妨单击并查看每个功能模块以了解我们可以做什么。可以确认的是,这个微信公共平台当然不仅适用于开发人员,而且还提供了许多功能模块,非技术人员可以在UI界面上进行交互。
例如,配置消息响应,自定义菜单,发布文章等:
这时,我们可能会认为:这些功能似乎是由非技术人员自由操作的,那么我们需要技术人员来开发它吗?
答案是:如果像我们关注的大多数官方帐户一样,每天只是简单的文章推送,就不需要技术人员来开发;但是如果您想将网站嵌入到官方帐户菜单中(此处指的是在自定义菜单中配置前端项目的首页链接),并实现微信侧的独立登录身份验证,则可以获得[ 微信用户信息,微信付款和其他高级功能或UI交互的配置该方法无法满足您的需求。您需要更自由,更自由地操作。然后,必须启用开发人员模式并使用技术人员的手段来灵活控制官方帐户。
这里有一点需要注意。如果我们决定由技术人员开发一个正式帐户,则必须启用服务器配置,这将导致UI界面的自动回复和自定义菜单设置失败!
我们单击以在“开发-基本配置-服务器配置”中启用:
我们的团队遇到了这种情况:两个项目组共享同一个正式帐户,因此,一个项目组启用了服务器配置,这使另一个项目组的手动配置菜单无效。所以请注意这一点!
关于服务器配置中的选项的含义以及填写方法,我们稍后再讨论。
三、使用必要的开发人员工具
我们进入开发-开发人员工具,我们可以发现微信提供了六种开发人员工具,其中前四种对于开发是必需的:开发人员文档,在线界面调试工具,Web开发人员工具,公共平台测试帐号。
1.开发人员文档
不用多说!这是我们发展中最基本,最重要的事情。如果我们想熟练地开发官方帐户,则必须先阅读开发人员文档!一些功能的发展甚至需要反复研究和苦涩的话。 PS:此文档中有很多抱怨,而且某些部分还不够清楚!
2.在线界面调试工具
该工具也非常实用,包括大多数接口的在线调试。我们可以直接在上面输入参数以获得微信服务器的返回结果。
3.网络开发人员工具
此工具是一个桌面应用程序,需要下载。它模拟微信客户端UI,以便开发人员可以使用此工具在PC或Mac上轻松进行开发和调试。通常,前端使用此工具进行页面和界面调试。
4.公共平台测试帐户
这个测试编号工具对我们的重要性可以说仅次于开发人员文档。我们可以创建一个测试帐户,无需申请,认证真实的公共帐户,并且可以在该测试帐户中体验和测试微信公共平台的所有高级界面。而且所有配置都可以在一页上进行编辑,从而使开发和测试变得极为方便。
四、仔细阅读开发人员文档
文档地址:
应该注意的是,仔细阅读开发人员文档并不允许您阅读所有模块,而是重复和非重点选择性的阅读。
前两个模块:在开始和开始开发之前必须阅读。它们是关注的焦点,并且是整个微信开发的基石。您需要阅读几次。接下来是微信 Web开发模块的微信网页授权,这更难理解,需要特别注意。其他模块可以根据您的项目功能要求有选择地读取。
在这里我不会太罗word,让我们阅读文档!下面,我将描述一些关键内容的实际操作和代码,请确保您已浏览文档。
五、开发过程的关键分析
1.开发环境准备
这里所谓的开发环境准备主要是指我们的项目服务器和微信服务器的网络通信环境准备。
我们通常的开发可能只需要IP端口即可进行通信。此配置最多允许白名单,但是我们需要通过域名进行通信的微信官方帐户开发(微信将访问我们配置的域名地址:基本服务器配置,网址为下面介绍),也就是说,我们各自的开发环境需要具有独立的域名。 微信可以通过该域名请求我们的本地开发服务,并分别进行开发和测试。
我们通常会开发Intranet,并且整个Intranet只有一个外部域名。因此,我们需要Intranet渗透才能为每个开发人员配置开发计算机的域名。
如何进行Intranet渗透?您首先可以找到您的网络管理员,看看他是否可以帮助您解决问题。如果没有,请安装Intranet渗透工具,我们将自己完成!
我选择的Intranet渗透工具是natapp。它有一个免费版本和一个付费版本。免费版本的域名将随机更改,而付费版本可以具有固定域名。建议选择付费版本。每月9元并不贵;您可以根据natapp文档进行安装和使用,这并不困难。
这样,我们的本地开发环境将拥有我们自己的域名!然后,您可以在考试编号管理页面上配置本地访问地址URL。
2.基本服务器配置
无论是在开发真正的官方帐户-基本配置-服务器配置,还是在测试帐户管理中,我们都可以看到以下基本参数:
开发人员ID(AppID),开发人员密码(AppSecret),服务器地址(URL),令牌(Token)
AppID是官方帐户的唯一开发标识代码,并且可以使用开发人员的密码来调用官方帐户的接口功能。大多数微信接口都需要此参数。
AppSecret是用于验证官方帐户开发者身份的密码,具有很高的安全性。请记住不要将密码直接传递给第三方开发人员,也不要直接将其存储在代码中。如果您需要第三方开发官方帐户,请使用授权方法进行访问。要获取accessToken,您需要同时传递AppID和AppSecret。
URL是开发人员用来接收微信消息和事件的接口URL,这是我们服务后端的入口地址。请注意,该地址必须作为域名填写,并且必须以http或https开头,分别支持80端口和443端口。如:
开发人员可以随意填写令牌,并使用该令牌生成签名(将令牌与接口URL中包含的令牌进行比较以验证安全性),即我们的项目与微信通信时服务器,必须确保在公共平台上配置的令牌与我们的后端代码配置的令牌一致,以便微信可以验证我们的身份。
注意:EncodingAESKey参数由开发人员手动填写或随机生成,并将用作消息正文加密和解密密钥。我们可以在早期阶段使用纯文本模式进行开发和测试,因此暂时不要关注它。
当我们单击Submit(提交)时,微信将访问为我们配置了GET请求的URL地址,并附加几个参数以进行验证,因此您需要在与该地址对应的项目后端接口中检查这些参数。执行处理并返回微信要求的结果,以便验证可以成功进行,并且微信服务器可以识别您配置的URL和Token参数,然后就可以相互通信!
有关详细信息,请阅读文档微信-使用前先阅读-访问指南。
接口的Java代码附在这里:
/*** 微信对接验证接口* */@RestController@RequestMapping(value = "/wechat")public class ValidateController { @Autowired WechatConfig wechatConfig; @RequestMapping(value = "", method = RequestMethod.GET) public void validate(HttpServletRequest req, HttpServletResponse resp) { System.out.println("-----开始校验签名-----"); // 接收微信服务器发送请求时传递过来的参数 String signature = req.getParameter("signature"); String timestamp = req.getParameter("timestamp"); String nonce = req.getParameter("nonce"); //随机数 String echostr = req.getParameter("echostr");//随机字符串 // 将token、timestamp、nonce三个参数进行字典序排序并拼接为一个字符串 String TOKEN = wechatConfig.getToken(); String sortStr = sort(TOKEN,timestamp,nonce); // 字符串进行shal加密 String mySignature = WechatUtils.shal(sortStr); // 校验微信服务器传递过来的签名 和 加密后的字符串是否一致, 若一致则签名通过 if(!"".equals(signature) && !"".equals(mySignature) && signature.equals(mySignature)){ System.out.println("-----签名校验通过-----"); try { resp.getWriter().write(echostr); } catch (IOException e) { e.printStackTrace(); } }else { System.out.println("-----校验签名失败-----"); } } /** * 参数排序 * @param token * @param timestamp * @param nonce * @return */ public static String sort(String token, String timestamp, String nonce) { String[] strArray = {token, timestamp, nonce}; Arrays.sort(strArray); StringBuilder sb = new StringBuilder(); for (String str : strArray) { sb.append(str); } return sb.toString(); }}
3.访问access_token参数
Access_token是官方帐户的全局唯一接口调用凭据,并且官方帐户在调用每个接口时需要使用access_token。开发人员需要妥善保存它。 access_token的存储必须至少保留512个字符。 access_token的有效期当前为2小时(7200秒),需要定期刷新。重复获取将使上次获取的access_token无效。
access_token参数非常重要,它几乎贯穿整个微信公共关系项目的开发。在有效期内我们如何定期刷新并获取它?
如果我们的微信官方帐户项目是单服务架构,则可以将其作为静态变量直接存储在内存中;如果是多服务,则可以由中间件(Redis和数据库)存储。在SpringBoot项目中,您可以使用@Scheduled批注执行定时任务。由于access_token有效期为2个小时,因此我们可以每小时刷新一次并将其保存在Redis中,以覆盖之前的access_token。
4.官方帐户消息管理
许多官方帐户可以通过发送消息与它们进行交互,那么如何编写这样的功能?
有关详细信息,我们可以参考微信文档消息管理模块:
我想在这里提到的是微信官方帐户的消息交互都是以XML格式进行的!这是一个陷阱。 。现在我们的前端,后端和服务器端消息传输基本上都采用Json格式,并且我们也习惯于解析和处理Json格式,因此处理XMl格式需要花费更多的工作。
为什么微信使用XML格式?我个人认为几年前它仍然是XML格式。杰森当时并不那么受欢迎。毕竟,腾讯受产品和业务驱动。当然,它选择了开发人员在开发时最熟悉的XML格式,然后选择了微信平台。 ,用户越来越多,估计重建和更改为Json格式非常困难,因此留下了历史。
我建议在GitHub上使用微信开发Java SDK,其中包含由整个微信开发平台的许多功能模块组成的轮子。我们可以将其直接使用:
例如,对于XMl消息解析的要求,上面提供了完整而详细的代码。
5.获得openid和网页授权(困难)
注意,这是开发官方帐户中最困难的点之一。请阅读两次技术文档中的微信网页授权模块,然后提出问题进行分析。
([1)首先说明为什么需要网页授权?我们的目的是什么?
回答:当用户在微信客户端中访问第三方网页时,官方帐户可以通过微信网页授权机制获得用户的基本信息,然后实现业务逻辑。也就是说,通过这种授权机制,我们可以获得微信用户信息,例如:头像,昵称,区域和个性化签名。
([2)由于目的是获取基本的用户信息,微信是否没有提供特殊的界面?网页授权是强制性的吗?
答案:在文档的“用户管理-获取用户基本信息(UnionID机制)”模块中,您可以看到确实存在用于获取用户基本信息的界面:
如您所见,该界面仅需要提供openid或unionid即可直接获取基本用户信息。所以问题是,如何获得openid(unionid)?
微信平台提供了两种获取用户的openid的方法
第一种方式:
用户与官方帐户进行交互时,它将以POST请求的形式将XML格式的消息发送到我们配置的服务器的URL地址,并附加用户对应的官方帐户的openid!关于什么是消息交互,我们可以查看文档中的消息管理模块。例如,我们在官方帐户输入栏中发送文本,图片,语音等,这些信息属于普通的消息交互。我们遵循,检查,单击自定义菜单等,属于事件消息交互。当前端用户执行此操作时,微信服务器将向我们项目的后端发送POST请求,以向我们传达信息:
如您所见,此推包包含用户的消息交互类型,时间和我们需要的openid!换句话说,无论用户在官方帐户中执行了什么操作,我们都可以知道他进行了什么操作以及他是谁(openid),然后我们可以调用用户管理获取用户基本信息(UnionID机制)。基本的用户信息。
别太高兴了,这种通过消息交互获取用户信息的方法,用户是主动的,我们的项目后端服务被动地接受,那么如果我有基本需要:我想自定义菜单对应给我们[是否可以在k15的首页上显示微信用户基本信息]?您如何将在后台收到的消息与前端用户相关联?
可以看出,这种被动方法无法实现此功能。我们需要主动获取前端当前运行用户的openid!
第二种方式:
这种方式是通过网页授权机制来主动的!有关详情,请参见下文。
([3)网页授权的机制是什么?它们是如何实现的?它们用于什么情况?
答案:主要有两种机制,分别对应两个范围:
以snsapi_base作为范围启动的网页授权用于获取进入页面的用户的openid,它被静默授权并自动跳转到回调页面。用户认为他们已经直接进入了回调页面(通常是业务页面)。
以snsapi_userinfo作为范围启动的网页授权用于获取基本用户信息。但是这种授权需要用户手动同意,并且由于用户已经同意,因此授权后无需关注即可获取用户的基本信息。
只要看看这两个句子来说明您可能有很多问题,让我们逐一分析它们:
这两种机制的先前授权步骤相同,大致如下:
我们首先需要根据文档要求构建一个链接:#wechat_redirect
关键参数是redirect_uri。此参数可以是前端项目URL或后端接口URL。单击此链接后,微信服务器将被重定向到我们填写的redirect_uri。在该redirect_uri之后拼接代码参数!然后前端或后端可以通过代码参数调整微信界面以获得诸如openid之类的信息:
以下是snsapi_base和snsapi_userinfo之间的区别:
首先,snsapi_base是静默授权,这意味着什么?这意味着用户不会感知它;它对应于非静默授权snsapi_userinfo。该范围的正式帐户将弹出一个小窗口,要求用户手动单击以进行授权,类似于:
那么这两个范围授权的优缺点是什么?
snsapi_base的优点是用户没有感知力,良好的体验,方便快捷。缺点是用户只能通过用户管理获取基本用户信息,获取openid后才能获取用户基本信息(UnionID机制)界面,该方法需要确保用户注意,否则没有相关信息!
snsapi_userinfo的优点是用户无需注意官方帐户。只要用户单击授权确认,他们就可以使用access_token和openid调用特殊的pull用户信息接口来获取信息,这更加暴力。 。 缺点是需要用户手动授权,这可能会影响用户体验。
在这种情况下,我们的项目是通过snsapi_base进行静默授权的,其中redirect_uri配置前端项目的首页地址(前端和后端分离),并封装构造的链接并将其直接配置在自定义菜单中,然后用户单击菜单,直接将其重定向到前端项目,然后前端获取code参数并调用后端getopenid接口,并将获取的openid缓存到客户端以供以后使用。
([4)要授权网页,我们需要在公共平台上进行任何配置吗?
答案:需要!
如果它是测试帐户,则需要在“测试帐户管理-体验界面授权表-Web服务-Web帐户”中单击“修改”。
此处配置的是回调页面的域名,即redirect_uri!
如果这是官方号码(需要微信身份验证),则需要在“开发-接口权限-Web服务-Web帐户-Web授权”的配置选项中修改授权回调域名,以获取用户基本信息。请注意,这里是域名(字符串),而不是URL,因此请不要添加协议标头;
此外,正式帐户的其他配置与测试帐户不同,例如在域名的根路径下添加IP白名单和txt验证文件。进行一些微探索就可以了。
我暂时有很多回忆。 。 。可能有遗漏,您可以提出来〜下一篇博客文章将在开发过程中写一些小问题。