业务需求要用到公众号给用户发送模板消息,在此记录。
模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。
关于使用规则,请注意:
所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的入口,但只有认证后的服务号才可以申请模板消息的使用权限并获得该权限;
需要选择公众账号服务所处的2个行业,每月可更改1次所选行业;
在所选择行业的模板库中选用已有的模板进行调用;
每个账号可以同时使用25个模板。
当前每个账号的模板消息的日调用上限为10万次,单个模板没有特殊限制。【2014年11月18日将接口调用频率从默认的日1万次提升为日10万次,可在MP登录后的开发者中心查看】。当账号粉丝数超过10W/100W/1000W时,模板消息的日调用上限会相应提升,以公众号MP后台开发者中心页面中标明的数字为准。
关于接口文档,请注意:
模板消息调用时主要需要模板ID和模板中各参数的赋值内容;
模板中参数内容必须以".DATA"结尾,否则视为保留字;
模板保留符号""。
设置行业可在微信公众平台后台完成,每月可修改行业1次,帐号仅可使用所属行业中相关的模板。
从行业模板库选择模板到帐号后台,获得模板ID的过程可在微信公众平台后台完成。
接口调用请求说明
http请求方式: POST
https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN
该ACCESS_TOKEN为公众号接口调用凭据
获得方式(GET)
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=公众号APPID&secret=公众号AppSecret
POST数据说明
POST数据示例如下:
{
"touser":"接收者OPENID",
"template_id":"模板ID",
"url":"跳转的URL(低优先级)",
"miniprogram":{
"appid":"所需跳转到的小程序appid(该小程序appid必须与发模板消息的公众号是绑定关联关系,暂不支持小游戏)",
"pagepath":"所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar),要求该小程序已发布,暂不支持小游戏"
},
"data":{//模板数据
"first": {
"value":"顶部文字",
"color":"\#173177"//模板内容字体颜色,不填默认为黑色
},
"keyword1":{
"value":"关键字段1",
"color":"\#173177"
},
"keyword2": {
"value":"关键字段2",
"color":"\#173177"
},
"keyword3": {
"value":"关键字段3",
"color":"\#173177"
},
"remark":{
"value":"底部备注",
"color":"\#173177"
}
}
}
注:url和miniprogram都是非必填字段,若都不传则模板无跳转;若都传,会优先跳转至小程序。开发者可根据实际需要选择其中一种跳转方式即可。当用户的微信客户端版本不支持跳小程序时,将会跳转至url。
返回码说明
在调用模板消息接口后,会返回JSON数据包。正常时的返回JSON数据包示例:
{
"errcode":0,
"errmsg":"ok",
"msgid":200228332
}
关于网页授权回调域名的说明
在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 -
接口权限 - 网页服务 - 网页帐号 -
网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加
http:// 等协议头;
授权回调域名配置规范为全域名,比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.html
、 http://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.com
、 http://music.qq.com 、 http://qq.com 无法进行OAuth2.0鉴权
如果公众号登录授权给了第三方开发者来进行管理,则不必做任何设置,由第三方代替公众号实现网页授权即可
关于网页授权的两种scope的区别说明
以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。
关于网页授权access_token
和普通access_token
的区别
微信网页授权是通过OAuth2.0机制实现的,在用户授权给公众号后,公众号可以获取到一个网页授权特有的接口调用凭证(网页授权access_token
),通过网页授权access_token
可以进行授权后接口调用,如获取用户基本信息;
其他微信接口,需要通过基础支持中的“获取access_token
”接口来获取到的普通access_token
调用。
关于UnionID机制
请注意,网页授权获取用户基本信息也遵循UnionID机制。即如果开发者有在多个公众号,或在公众号、移动应用之间统一用户帐号的需求,需要前往微信开放平台(open.weixin.qq.com)绑定公众号后,才可利用UnionID机制来满足上述需求。
UnionID机制的作用说明:如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为同一用户,对同一个微信开放平台下的不同应用(移动应用、网站应用和公众帐号),unionid是相同的。
关于特殊场景下的静默授权
上面已经提到,对于以snsapi_base
为scope的网页授权,就静默授权的,用户无感知;
对于已关注公众号的用户,如果用户从公众号的会话或者自定义菜单进入本公众号的网页授权页,即使是scope为snsapi_userinfo
,也是静默授权,用户无感知。
具体而言,网页授权流程分为四步:
引导用户进入授权页面同意授权,获取code
通过code换取网页授权access_token
(与基础支持中的access_token
不同)
如果需要,开发者可以刷新网页授权access_token
,避免过期
通过网页授权access_token
和openid获取用户基本信息(支持UnionID机制)
在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base
和snsapi_userinfo
),引导关注者打开如下页面:
https://open.weixin.qq.com/connect/oauth2/authorizeappid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE\#wechat_redirect
若提示“该链接无法访问”,请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。
尤其注意:由于授权操作安全等级较高,所以在发起授权请求时,微信会对授权链接做正则强匹配校验,如果链接的参数顺序不对,授权页面将无法正常访问
参考链接(请在微信客户端中打开此链接体验):
scope为snsapi_base
https://open.weixin.qq.com/connect/oauth2/authorizeappid=APPID&redirect_uri=https%3A%2F%2Fchong.qq.com%2Fphp%2Findex.php%3Fd%3D%26c%3DwxAdapter%26m%3DmobileDeal%26showwxpaytitle%3D1%26vb2ctag%3D4_2030_5_1194_60&response_type=code&scope=snsapi_base&state=123\#wechat_redirect
scope为snsapi_userinfo
https://open.weixin.qq.com/connect/oauth2/authorizeappid=APPID&redirect_uri=http%3A%2F%2Fnba.bluewebgame.com%2Foauth_response.php&response_type=code&scope=snsapi_userinfo&state=STATE\#wechat_redirect
尤其注意:跳转回调redirect_uri
,应当使用https链接来确保授权code的安全性。
参数说明
参数名称 | 说明 |
---|---|
appid | 公众号的唯一标识 |
redirect_uri | 授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理 |
response_type | 返回类型,请填写code |
scope | 应用授权作用域,snsapi_base ,snsapi_userinfo |
state | 重定向后会带上state参数,非必填 |
#wechat_redirect | 无论直接打开还是做页面302重定向时候,必须带此参数 |
用户同意授权后
如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE
。
code说明:
code作为换取access_token
的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。
首先请注意,这里通过code换取的是一个特殊的网页授权access_token
,与基础支持中的access_token
(该access_token
用于调用其他接口)不同。公众号可通过下述接口来获取网页授权access_token
。如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token
的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。
尤其注意:由于公众号的secret和获取到的access_token
安全级别都非常高,必须只保存在服务器,不允许传给客户端。后续刷新access_token
、通过access_token
获取用户信息等步骤,也必须从服务器发起。
请求方法
获取code后,请求以下链接获取access_token
:
https://api.weixin.qq.com/sns/oauth2/access_tokenappid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
返回说明
正确时返回的JSON数据包如下:
{
//网页授权接口调用凭证,注意:此`access_token`与基础支持的`access_token`不同
"`access_token`":"ACCESS_TOKEN",
//`access_token`接口调用凭证超时时间,单位(秒)
"expires_in":7200,
//用户刷新`access_token`
"refresh_token":"REFRESH_TOKEN",
//用户唯一标识,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
"openid":"OPENID",
//用户授权的作用域,使用逗号(,)分隔
"scope":"SCOPE"
}
错误时微信会返回JSON数据包如下(示例为Code无效错误):
{"errcode":40029,"errmsg":"invalid code"}
由于access_token
拥有较短的有效期,当access_token
超时后,可以使用refresh_token进行刷新,refresh_token有效期为30天,当refresh_token失效之后,需要用户重新授权。
请求方法
获取第二步的refresh_token后,请求以下链接获取access_token
:
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
返回数据同第二步
如果网页授权作用域为snsapi_userinfo
,则此时开发者可以通过access_token
和openid拉取用户信息了。
请求方法
http:GET(请使用https协议)
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
返回说明
正确时返回的JSON数据包如下:
{
"openid":" OPENID",
"nickname": NICKNAME,
"sex":"1",
"province":"PROVINCE",
"city":"CITY",
"country":"COUNTRY",
"headimgurl":"http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
"privilege":[ "PRIVILEGE1" "PRIVILEGE2" ],
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
错误时微信会返回JSON数据包如下(示例为openid无效):
{"errcode":40003,"errmsg":" invalid openid "}
请求方法
http:GET(请使用https协议)
https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID
返回说明 正确的JSON返回结果:
{ "errcode":0,"errmsg":"ok"}
错误时的JSON返回示例:
{ "errcode":40003,"errmsg":"invalid openid"}
注意:公众号接入开发者服务器后,将无法使用自定义菜单及自动回复等微信公众平台后台功能,需要开发者独自完成后台逻辑功能。
接入微信公众平台开发,开发者需要按照如下步骤完成:
填写服务器配置
验证服务器地址的有效性
依据接口文档实现业务逻辑
下面详细介绍这3个步骤。
登录微信公众平台官网后,在公众平台官网的开发-基本设置页面,勾选协议成为开发者,点击“修改配置”按钮,填写服务器地址(URL)、Token和EncodingAESKey:
URL: 开发者用来接收微信消息和事件的接口 URL。开发者所填写的URL 必须以
http:// 或 https:// 开头,分别支持 80 端口和 443 端口。
Token: 可由开发者可以任意填写,用作生成签名(该 Token 会和接口 URL 中包含的
Token 进行比对,从而验证安全性)。
EncodingAESKey: 由开发者手动填写或随机生成,将用作消息体加解密密钥。
同时,开发者可选择消息加解密方式:明文模式、兼容模式和安全模式。模式的选择与服务器配置在提交后都会立即生效,请开发者谨慎填写及选择。
加解密方式的默认状态为明文模式,选择兼容模式和安全模式需要提前配置好相关加解密代码,详情请参考消息体签名及加解密部分的文档。
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:
参数名称 | 说明 |
---|---|
signature | 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
开发者通过检验 signature 对请求进行校验(下面有校验方式)。若确认此次 GET
请求来自微信服务器,请原样返回 echostr
参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
将token、timestamp、nonce三个参数进行字典序排序
将三个参数字符串拼接成一个字符串进行sha1加密
开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
验证URL有效性成功后即接入生效,成为开发者。
验证URL有效性成功后即接入生效,成为开发者。你可以在公众平台网站中申请微信认证,认证成功后,将获得更多接口权限,满足更多业务需求。
成为开发者后,用户每次向公众号发送消息、或者产生自定义菜单、或产生微信支付订单等情况时,开发者填写的服务器配置URL将得到微信服务器推送过来的消息和事件,开发者可以依据自身业务逻辑进行响应,如回复消息。
公众号调用各接口时,一般会获得正确的结果,具体结果可见对应接口的说明。返回错误时,可根据返回码来查询错误原因。全局返回码说明
用户向公众号发送消息时,公众号方收到的消息发送者是一个OpenID,是使用用户微信号加密后的结果,每个用户对每个公众号有一个唯一的OpenID。
此外,由于开发者经常有需在多个平台(移动应用、网站、公众帐号)之间共通用户帐号,统一帐号体系的需求,微信开放平台(open.weixin.qq.com)提供了UnionID机制。开发者可通过OpenID来获取用户基本信息,而如果开发者拥有多个应用(移动应用、网站应用和公众帐号,公众帐号只有在被绑定到微信开放平台帐号下后,才会获取UnionID),可通过获取用户基本信息中的UnionID来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的UnionID是唯一的。换句话说,同一用户,对同一个微信开放平台帐号下的不同应用,UnionID是相同的。详情请在微信开放平台的资源中心-移动应用开发-微信登录-授权关系接口调用指引-获取用户个人信息(UnionID机制)中查看。
另请注意,微信公众号接口必须以http://或https://开头,分别支持80端口和443端口。
参考链接
scope为snsapi_base(静默授权,不弹出用户是否同意授权页面,只能获取到openid)
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=授权后重定向的回调链接地址,请使用urlEncode对链接进行处理&response_type=code&scope=snsapi_base&state=123\#wechat_redirect
scope为snsapi_userinfo(弹出授权页面,可通过openid拿到昵称、性别、所在地)
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=授权后重定向的回调链接地址,请使用urlEncode对链接进行处理&response_type=code&scope=snsapi_userinfo&state=STATE\#wechat_redirect
尤其注意:跳转回调redirect_uri
,应当使用https链接来确保授权code的安全性。
参数说明
参数名称 | 说明 |
---|---|
appid | 公众号的唯一标识 |
redirect_uri | 授权后重定向的回调链接地址,请使用 urlEncode 对链接进行处理 |
response_type | 返回类型,请填写code |
scope | 应用授权作用域,snsapi_base ,snsapi_userinfo |
state | 重定向后会带上state参数,非必填 |
#wechat_redirect | 无论直接打开还是做页面302重定向时候,必须带此参数 |
只在小程序中提供跳转链接并携带操作的用户的手机号等验证数据,跳转到网页授权域名路径下利用获得的数据进行业务处理。若用户验证不通过则不予处理。
请求方法
获取code后,请求以下链接获取access_token
:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
返回数据中就有用户对于公众号的唯一的openid,拿到后便可依据用户唯一标识存入数据库中以便以后进行业务处理。
接口调用请求说明
http请求方式: POST
https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN
该ACCESS_TOKEN为公众号接口调用凭据
获得方式(GET)
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=公众号APPID&secret=公众号AppSecret
POST数据说明
POST数据示例如下:
{
"touser":"接收者OPENID",
"template_id":"模板ID",
"url":"跳转的URL(低优先级)",
"miniprogram":{
"appid":"所需跳转到的小程序appid(该小程序appid必须与发模板消息的公众号是绑定关联关系,暂不支持小游戏)",
"pagepath":"所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar),要求该小程序已发布,暂不支持小游戏"
},
"data":{//模板数据
"first": {
"value":"顶部文字",
"color":"\#173177"//模板内容字体颜色,不填默认为黑色
},
"keyword1":{
"value":"关键字段1",
"color":"\#173177"
},
"keyword2": {
"value":"关键字段2",
"color":"\#173177"
},
"keyword3": {
"value":"关键字段3",
"color":"\#173177"
},
"remark":{
"value":"底部备注",
"color":"\#173177"
}
}
}
注:url和miniprogram都是非必填字段,若都不传则模板无跳转;若都传,会优先跳转至小程序。开发者可根据实际需要选择其中一种跳转方式即可。当用户的微信客户端版本不支持跳小程序时,将会跳转至url。
返回码说明
在调用模板消息接口后,会返回JSON数据包。正常时的返回JSON数据包示例:
{
"errcode":0,
"errmsg":"ok",
"msgid":200228332
}