目录
0x00 access_token:
access_token 是公众号的全局唯一接口调用凭据,公众号调用各种接口时都需要access_token
access_token 每天调用的次数上限是2000次,一个access_token的有效时间是2个小时,所以我们必须在Linux服务器上设置一个定时
任务,每隔2小时就获取一次access_token
0x01 获取access_token
<?php
$appid='你的appid';
$secret='你的secret';
$url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$secret";
// 将请求获得的json字符串转化为关联数组
//ps:json_decode()将json字符串转化为对象
//json_decode(xxx,true) 将json字符串转化为关联数组
$access_token=json_decode(file_get_contents($url),true);
// 将获取到的access_token保存到文件中
file_put_contents('access_token.txt',$access_token['access_token']);
?>
设置定时任务:
crontab -e
分 时 日 月 周
* */1 * * * /usr/local/php/bin/php /home/weixin/access.php > /dev/null 2>&1
0x02 自定义菜单的创建
最多3个一级菜单,一个一级菜单最多5个二级菜单
menu.php 发起请求,设置菜单
<?php
//获取文件中保存的access_token
$access_token = file_get_contents('access_token.txt');
//获取菜单中的json配置文件
$menu_json=file_get_contents('menu.json');
//发起请求
$msg = http_post($access_token,$menu_json);
echo $msg;
function http_post($access_token,$data){
$url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=$access_token";
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
$res = curl_exec($ch);
curl_exec($ch);
return $res;
}
?>
menu.json 菜单的配置文件
{
"button":[
{
"name":"站点",
"sub_button":[
{
"name":"DataBank西电站",
"type":"view",
"url":"http://101.200.142.148:90/"
},
{
"name":"DataBank哈商大站",
"type":"view",
"url":"http://101.200.142.148:8080/"
},
{
"name":"扫码推事件",
"type":"scancode_push",
"key":"rselfmenu_0_1",
"sub_button":[ ]
},
{
"name":"扫码带提示",
"type":"scancode_waitmsg",
"key":"rselfmenu_0_0",
"sub_button":[ ]
}
]
},
{
"name":"测试三",
"sub_button":[
{
"type":"pic_sysphoto",
"name":"系统拍照发图",
"key":"rselfmenu_1_0",
"sub_button":[ ]
},
{
"type":"pic_photo_or_album",
"name":"拍照或者相册发图",
"key":"rselfmenu_1_1",
"sub_button":[ ]
},
{
"type":"pic_weixin",
"name":"微信相册发图",
"key":"rselfmenu_1_2",
"sub_button":[ ]
}
]
},
{
"name":"关于我们",
"type":"click",
"key":"test_1"
}
]
}
扫码推事件:一扫二维码/条形码,如果是网址就直接跳转
扫码带提示:一扫二维码/条形码,就会将二维码/条形码的内容就为以post的形式发送到服务器上
0x03 获取用户关注列表
需要认证号,否则将会报
{"errcode":48001,"errmsg":"api unauthorized hints: [thbCMEMre-hzMTVa!]"}
1.获取用户关注列表
https://api.weixin.qq.com/cgi-bin/user/get?access_token=你的access_token
2.获取用户的基本信息
https://api.weixin.qq.com/cgi-bin/user/info?access_token=你的ACCESS_TOKEN&openid=该用户OPENID&lang=zh_CN
0x04 网页授权
#oAuth协议:
##名词定义:
(1)third-party application 第三方应用程序,又称客户端
例如:我们自己开发的网站有一个微信登录的功能,那么我们的网站就是第三方应用程序
(2)resource owner 资源所有者,即点击登录的用户
(3)User Agent 用户代理,即浏览器
(4)Authorization server 认证服务器 微信专门用来认证的服务器
(5)Resource server 资源服务器 微信的用户头像等图片等资源可能在另一个服务器上
##oAuth的实现思路:
腾讯当然不可能让 我们的网站 直接连 微信的数据库,所以腾讯设置了一个授权层(authorization layer),我们去请求授权层去获取相应的数据。
(A)我们的web站点 请求用户(资源的主人)给予 授权(也就是让用户输入qq密码点确认或者扫描微信二维码)
(B) 用户给予我们授权
(C)我们拿着用户给予的授权 发送给 腾讯的认证服务器
(D) 认证服务器认证成功后,返回给我们一个 令牌
(E) 我们拿着 令牌 又去 请求 腾讯的资源服务器
(F)资源服务其返回被保护的资源(用户头像呀用户信息呀)
#实战:
开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名
微信跳转有问题!暂定
0x05 生成带参数的二维码
思路:
首先向指定的url发送post请求,参数以json字符串的形式作为post请求的参数,来获取ticket
然后用ticket请求二维码
代码:
<?php
//获取文件中保存的access_token
$access_token = file_get_contents('access_token.txt');
/**
* 获取临时二维码的ticket
* 传送整数型自定义参数
* expire_seconds: 临时二维码有效时间
* scene_id: 你要带的整数型参数,自定义
*/
// $json = '{"expire_seconds": 604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}';
/**
* 获取临时二维码的ticket
* 传送字符串型自定义参数
* scene_str:自定义字符串参数
*/
// $json = '{"expire_seconds": 604800, "action_name": "QR_STR_SCENE", "action_info": {"scene": {"scene_str": "shang"}}}';
/**
* 获取永久二维码的ticket
*
*/
// $json ='{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 123}}} ';
$json = '{"action_name": "QR_LIMIT_STR_SCENE", "action_info": {"scene": {"scene_str": "test"}}}';
$url='https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token='.$access_token;
//发起POST请求
$msg = http_post($url,$json);
// echo $msg;
// 将json字符串解码为数组
$ticket = json_decode($msg,true);
$qr_url = 'https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket='.$ticket['ticket'];
//用ticket请求二维码
$res = file_get_contents($qr_url);
//必须用header说明类型,否则乱码
header('Content-type:image/png');
echo $res;
/**
* 发送post请求
* url 目标网址
* json post请求携带的参数,以json字符串的形式
*/
function http_post($url,$json){
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$json);
$res = curl_exec($ch);
curl_exec($ch);
return $res;
}
?>
当用户扫描对应的二维码时,我们服务器上的用来监听用户发来消息的index.php,就会获取到对应的post传参(xml的形式)
其中xml中就有eventkey 和ticket ,eventkey就是我们自定义的二维码参数。
如果用户没有关注公众号,扫描参数二维码并关注,则event将是subscribe
event_key 为qrscene_二维码参数
如果用户已经关注了公众号,扫描二维码将进入公众号,则event为scan
event_key为二维码参数