业务需求要用到公众号给用户发送模板消息,在此记录。
模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。
关于使用规则,请注意:
关于接口文档,请注意:
设置行业可在微信公众平台后台完成,每月可修改行业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"
}
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
复制
注:url和miniprogram都是非必填字段,若都不传则模板无跳转;若都传,会优先跳转至小程序。开发者可根据实际需要选择其中一种跳转方式即可。当用户的微信客户端版本不支持跳小程序时,将会跳转至url。
返回码说明
在调用模板消息接口后,会返回JSON数据包。正常时的返回JSON数据包示例:
{
"errcode":0,
"errmsg":"ok",
"msgid":200228332
}
1 2 3 4 5 6 7 8 9
复制
关于网页授权回调域名的说明
关于网页授权的两种scope的区别说明
关于网页授权access_token
和普通access_token
的区别
access_token
),通过网页授权access_token
可以进行授权后接口调用,如获取用户基本信息;access_token
”接口来获取到的普通access_token
调用。关于UnionID机制
关于特殊场景下的静默授权
snsapi_base
为scope的网页授权,就静默授权的,用户无感知;snsapi_userinfo
,也是静默授权,用户无感知。具体而言,网页授权流程分为四步:
access_token
(与基础支持中的access_token
不同)access_token
,避免过期access_token
和openid获取用户基本信息(支持UnionID机制)在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base
和snsapi_userinfo
),引导关注者打开如下页面:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=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/authorize?appid=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/authorize?appid=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_token?appid=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"
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
复制
错误时微信会返回JSON数据包如下(示例为Code无效错误):
{"errcode":40029,"errmsg":"invalid code"}
1
复制
由于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"
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
复制
错误时微信会返回JSON数据包如下(示例为openid无效):
{"errcode":40003,"errmsg":" invalid openid "}
1
复制
请求方法
http:GET(请使用https协议)
https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID
返回说明 正确的JSON返回结果:
{ "errcode":0,"errmsg":"ok"}
1
复制
错误时的JSON返回示例:
{ "errcode":40003,"errmsg":"invalid openid"}
1
复制
注意:公众号接入开发者服务器后,将无法使用自定义菜单及自动回复等微信公众平台后台功能,需要开发者独自完成后台逻辑功能。
接入微信公众平台开发,开发者需要按照如下步骤完成:
下面详细介绍这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 参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
验证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"
}
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
复制
注:url和miniprogram都是非必填字段,若都不传则模板无跳转;若都传,会优先跳转至小程序。开发者可根据实际需要选择其中一种跳转方式即可。当用户的微信客户端版本不支持跳小程序时,将会跳转至url。
返回码说明
在调用模板消息接口后,会返回JSON数据包。正常时的返回JSON数据包示例:
{
"errcode":0,
"errmsg":"ok",
"msgid":200228332
}
1 2 3 4 5 6 7 8 9
复制
图 1 通过网页授权获取用户对于公众号的openid
图 2 依据openid通过公众号发送模板消息给特定用户
图 3 开发服务器配置流程图