微信公众号开发Day02:access_token 获取用户关注列表,网页授权(有bug),生成带参数的二维码

目录

0x00 access_token:

0x01 获取access_token

0x02 自定义菜单的创建

0x03 获取用户关注列表

0x04 网页授权

#实战:

0x05 生成带参数的二维码


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为二维码参数

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章