微信服务号开发笔记

原理

微信服务号的原理比较简单。从请求响应角度来看,逻辑是:

用户微信客户端 <—> 微信服务器 <—> 微信服务号后台程序 <—> 数据库或Web Service

也就是,用户的各种请求先经过微信的服务器,微信服务器将请求转发给微信服务号后台程序。

既然是微信服务器把用户请求数据转发给我们开发的微信服务号后台程序,那么在启用服务号的开发模式时就需要提供一个URL。另外为了安全 考虑,还需要提供一个token,用来校验请求是否来自微信服务器。校验的方法见微信开发者文档。校验又分两种:

在开发者首次提交验证申请时,微信服务器将发送GET请求到填写的URL上,并且带上四个参数(signature、timestamp、nonce、echostr),开发者通过对签名(即signature)的效验,来判断此条消息的真实性。

此后,每次开发者接收用户消息的时候,微信也都会带上前面三个参数(signature、timestamp、nonce)访问开发者设置的URL,开发者依然通过对签名的效验判断此条消息的真实性。效验方式与首次提交验证申请一致。

微信服务器转发到微信服务号后台程序的消息以及服务号后台程序返回给微信服务器的响应,都是XML格式,消息中都会指明发送者和接收者。 请求消息中的发送者为微信用户的openid,接收者为服务号开发者微信号,响应消息则相反。

消息中还有一个关键字段MsgType指明消息类型。微信将请求消息分为:普通消息、事件推送、语音识别结果三大类,其中,

  • 普通消息分6种:文本、图片、语音、视频、地理位置、链接。
  • 事件推送分4种:关注/取消关注事件、扫描带参数二维码事件、上报地理位置事件、自定义菜单事件(点击菜单拉取消息时的事件推送、点击菜单跳转链接时的事件推送)

响应消息也分6种:文本、图片、语音、视频、音乐、图文。

工作中为产品开发的微信服务号,目前对于普通消息,服务号后台程序自动响应一段文本消息;对于事件推送中的关注事件,则是响应一段欢迎、 功能简介的文本消息。

另外我们使用了自定义菜单事件,要想使用该事件,先要为你的微信服务号提供自定义菜单。自定义菜单是通过微信提供的API向其推送的。

在通过API向微信服务器推送自定义菜单时,微信服务器需要确认是否为可信任请求,确认方法是基于请求参数access_token。 access_token需要通过API向微信服务器获取。成功启用服务号的开发模式后,微信会为服务号分配一个AppId和AppSecret,获取access_token时 需要带上这两个参数,用于微信服务器确认是否为已注册服务号的请求。access_token相关文档见这里

当成功获取access_token后就可以通过API创建、删除、查询服务号的自定义菜单了。

自定义菜单相关文档见这里

以下Python代码是对自定义菜单API的简单封装:

开发

对于微信服务号后台程序,当然可以参照微信官方文档,从头开始实现。但可用非官方微信公众号SDK也不少。比如我使用的PHP SDK是这个

其他语言的SDK也可以找找看。

注意

  • 我在启用微信服务号的开发模式之后,就直接使用该服务号进行开发测试,但在开发测试过程中,已经有一些产品的用户关注了该服务号,那么这个过程中用户的体验会很差。正确的过程应该是先申请测试帐号进行开发测试,等开发测试完成后,再上线服务号 。
  • 自定义菜单在变更之后并不是实时更新的,官方文档的说明是:创建自定义菜单后,由于微信客户端缓存,需要24小时微信客户端才会展现出来。建议测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。
  • 微信客户端应该是基于浏览器内核技术的,所以能解释渲染网页元素。图文消息中图片其实是一个img元素,所以需要你自己提供图床。微信官方的公众平台提供的消息发送功能,对于图文消息要求必须带图片,但服务号后台程序响应的图文消息中其实可以留空图片链接,这样用户收到图文消息看到的效果也许就是你需要的。另外,文本消息也是可以带超链接a元素的。
时间: 2024-10-13 16:14:50

微信服务号开发笔记的相关文章

微信订阅号开发笔记(三)

1.接收语音识别结果 if($msgType=="voice"){ //收到语音消息 //MediaId 语音消息媒体id,可以调用多媒体文件下载接口拉取数据. //Format 语音格式,如amr,speex等 $format = $postObj->Format; $mediaId = $postObj->MediaId; //开通语音识别功能,用户每次发送语音给公众号时,微信会在推送的语音消息XML数据包中,增加一个Recongnition字段. //注:由于客户端缓

微信订阅号开发笔记(二)

微信开发的流程其实很简单 o(∩_∩)o 哈哈!在微信网站的编辑操作 额,就不说了.虽然有人问过.下面是我的微信开发过程,简单记录下. 成为开发者 材料:1.自己的服务器资源,百度的BAE,新浪的SAE都不错. 2.懂那么点编程语言. 3.注册微信公众号. 上面的都有了之后,就可以自己动手开发了.哇咔咔,好兴奋.有木有. 在登录进去之后,怎么成为开发者?不知道,自己看去. 开始coding吧. 1.验证 if (! empty ( $_GET ['echostr'] ) && ! empt

微信订阅号开发笔记(四)

1.创建菜单 //创建菜单 public function createMenu(){ $url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token="; $url.=$this->getacctoken(); //目前自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单.一级菜单最多4个汉字, //二级菜单最多7个汉字,多出来的部分将会以"..."代替.请注意,创建自定义菜单

微信服务号开发-获取用户位置信息

微信服务号开发-获取用户位置信息 在微信公众号开发的中,获取用户位置信息是非常常见的功能需求,通过用户的位置信息,可以做一些地图导航,以及基于LBS的营销活动.下面将介绍微信服务号获取用户位置信息的原理与步骤. 原理 1. 位置信息获取流程 2. 位置信息报文 <xml><ToUserName><![CDATA[gh_public_member_account]]></ToUserName> <FromUserName><![CDATA[o

微信订阅号开发笔记(五)

1.用户管理 //查询所有分组 public function queryGroups(){ $url = "https://api.weixin.qq.com/cgi-bin/groups/get?access_token="; $url.=$this->getacctoken(); $result = $this->cget($url); header("Content-type: text/html; charset=utf-8"); print_

微信公众号开发笔记1(nodejs开发的)

本篇记录了微信公众号开发的一些笔记 一.微信服务器与我们服务器的交流 微信开发者拥有自己的服务器,在我们服务器上可以与微信服务器进行交流.既然可以交流,那就必定需要前提条件(微信认证),也就是说,只有自己的服务器与微信服务器进行认证通过后,才能与他交流.如何进行认证? 1. 接口认证 接口的认证是token验证,微信服务器会发送一个get请求给我们在公众号配置的接口,如http://xxxx/weixin/api ,这个请求带了如下参数 然后,微信规定我们 1)将token.timestamp.

微信公众号开发笔记

试了一段时间的微信公众号开发,本文主要以图片和代码的形式,介绍一些公众号开发的内容. 基于微信公众号的第三方开发,主要是需要搞清楚[微信用户],[微信服务器],[第三方服务器]三者之间的数据流程和走向,废话不说,直接上图吧. 1. 第三方URL验证,微信用户关注公众号事件 2. 用户发送消息,点击自定义菜单事件 3. 设置公众号自定义菜单 4. 网页开发授权 暂时先发这4张图,代码后续再发.希望对开发者有所帮助.

微信服务号开发-商城微信登录

最近帮朋友写了个微信服务号,服务号名字叫做十四行诗.没错是卖月饼的商城. 简单介绍下微信登录,与官方文档不同,简单画了一下UML图 简单的说就是先建立了一个index.php(直接拍域名就过去了.),然后传一个appid,微信公众号后台能拿到 <?php $appid = ''; header('location:https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$appid.'&redirect_uri=http://w

微信 服务号开发

tp5.0  一个入口文件,一个wx类 //WxAction.php 入口 <?php /** * Created by PhpStorm. * User: lxd * Date: 17/10/31 * Time: 18:01 * 微信请求统一入口,单独的类,无需基础其他类 */ namespace app\index\controller; use telerr\Chaoxin; use think\Config; use think\Request; use wx\Wx; class WxA