微信服务号调研
微信服务号
1)申请服务号

邮箱激活后,选择公众号类型,这里选择服务号

2)开发者配置
1) 公众平台官网登录之后,找到“基本配置”菜单栏

2) 填写配置
url填写:http://外网IP/wx 。外网IP请到腾讯云购买成功处查询。 http的端口号固定使用80,不可填写其他。
Token:自主设置,这个token与公众平台wiki中常提的access_token不是一回事。这个token只用于验证开发者服务器。
3)用户故事
某产品做工人考试,那么这三个工人要关注你的服务号,你还要获取这三个工人的openID,同时openID与产品数据库对应的工人信息绑定,这样就可以遍历工人数组提取出openID,这时就可以创建模版消息对openID进行群发
4)对应技术点分析
获取openID
1、配置回调域名
进入公众号,接口权限,找到网页服务,网页获取用户基本信息

点进去设置REDIRECT_URI

2、拼接授权地址
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 若提示“该链接无法访问”,请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。
REDIRECT_URI
为1
中设置的重定向地址
尤其注意:由于授权操作安全等级较高,所以在发起授权请求时,微信会对授权链接做正则强匹配校验,如果链接的参数顺序不对,授权页面将无法正常访问
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
appid | 是 | 公众号的唯一标识 |
redirect_uri | 是 | 授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理 |
response_type | 是 | 返回类型,请填写code |
scope | 是 | 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 ) |
state | 否 | 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节 |
#wechat_redirect | 是 | 无论直接打开还是做页面302重定向时候,必须带此参数 |
3、获取返回结果
对应工人用微信访问2
的拼接网址,页面将跳转至 redirect_uri/?code=CODE&state=STATE。获取code后,请求以下链接获取access_token,openID: https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
appid | 是 | 公众号的唯一标识 |
secret | 是 | 公众号的appsecret |
code | 是 | 填写第一步获取的code参数 |
grant_type | 是 | 填写为authorization_code |
返回说明
正确时返回的JSON数据包如下
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
参数 | 描述 |
---|---|
access_token | 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同 |
expires_in | access_token接口调用凭证超时时间,单位(秒) |
refresh_token | 用户刷新access_token |
openid | 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID |
scope | 用户授权的作用域,使用逗号(,)分隔 |
发送模版消息
创建模版消息

模版消息发送样式

发送模版消息代码
<?php
$ACCESS_TOKEN = "替换你的ACCESS_TOKEN";
//OpenID数组
$touser = [
'ouD7BuHpIKRXPIz7pdrwI9IwDRCU',
'ouD7BuI36wSUZgteyiydmDrldQLU',
'ouD7BuLejq7R4Vbuyh41bH778cg0'];
//发送模板消息URL
$url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" . $ACCESS_TOKEN;
//遍历发送微信消息
foreach ($touser as $value) {
$data = getDataArray($value);
$json_data = json_encode($data);//转化成json数组让微信可以接收
$res = https_request($url, urldecode($json_data));//请求开始
$res = json_decode($res, true);
if ($res['errcode'] == 0 && $res['errcode'] == "ok") {
echo "发送成功!<br/>";
}
}
//获取发送数据数组
function getDataArray($value)
{
$data = array(
'touser' => $value, //对应接收消息的工人OpenID
'template_id' => "mfopDNUlvoBGGsPLB-d_nrfL8Je92xnTq5vk5ZBxL-w",//改成自己创建的模板消息id,在微信后台模板消息查看
'url' => "http://消息点击后跳转的地址", //自己网站链接
'data' => array(
'first' => array(
'value' => "亲爱的同学,您有考试提醒,请查阅。",
'color' => "#000"
),
'keyword1' => array(
'value' => "2019下半年从业资格证考试",
'color' => "#f00"
),
'remark' => array(
'value' => "\n点击链接地址开始考试>>>",
'color' => "#3d3d3d"
),
)
);
return $data;
}
//curl请求函数
function https_request($url, $data = null)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
if (!empty($data)) {
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($curl);
curl_close($curl);
return $output;
}
?>
5)已知的受限条件
1)多个服务器多个地址
可以统一使用一个开发者账号,公众号开发者使用中控服务器统一获取和刷新access_token,其他业务逻辑服务器所使用的access_token均来自于该中控服务器。
2)消息限制
每个开发者账号可以同时使用25个
模板消息,当前每个账号的模版消息日调用上限是10万
次(该数字会随着关注者数量增长儿增长,当账号粉丝数超过10W/100W/1000W时,模板消息的日调用上限会相应提升具体以后台数字为准),模版消息有固定的样式头
,并且为纯文本消息
,消息字数限制为200