关注微信公众号使其自动发送欢迎你关注消息
一般我们关注微信公众号时。他都会自动推送一条消息。欢迎您关注了某公众号。而今天我们所做的就是这个功能。
关注公众号时我们需要获取到用户的一些个人基本信息。 而获取基本信息就要看他的运行原理。到底是怎么运行。
当我们申请了一个微信号时,关注公众号,公众号会推送我们的关注事件给我们服务器。而我们服务器又没有用户信息。但是当我们注册微信号时。一些信息会存放再腾讯服务器上。而腾讯服务器为了方便我们也给我们提供了一个获取用户信息的api。我们调用这个api就可以获取到用户的信息。
而调用获取用户信息接口的时候。我们发现了有一个必填参数时access_token,所有现在我们就必须要先去获取到access_token。
tips:而我们这里也要注意access_token的一些特性:
access_token的存储至少要保留512个字符空间
access_token的有效期目前为2个小时,需定时刷新
Access_token 每天能被调用的次数很少
重复获取将导致上次获取的access_token失效。
所以我们需要去服务器建一个数据库去用来存放access_token还有一会要获取到的用户基本信息
一、服务器上建立数据库
使用navicat链接linux上的数据库
建立后测试链接看是否可以正常连接上数据库
如果出现上述的错误。原因是因为我们mysql是一个安全性能较高的软件,不能说任何人都可以连接。我们要想连接需要mysql服务器给我们的客户端进行授权。所以我们要进入linux系统中通过mysql命令进入到mysql服务器中
让mysql服务器给要链接的客户端授权
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION;
如果还有错误在阿里云服务器在安全组中添加一个安全记录
云服务器ecs—找到实例—安全组—配置规则添加即可。
完后建立我们的表就好。
二、获取access_token
调用access_token接口需要得到三个必须参数
apiid和secret在
之后获取
//获取access_tokenpublic function get_access_token(){//刚进来先判断数据库中是否有access$access = AccessToken::orderBy("id","desc")->first();//数据库中没有或者时间超过了7000s 则重新获取accessif(!$access || time()-$access->access_token_time > 7000){//获取appid$appid = "wx1d72e376cd0e0cea";//获取secret$secret = "bc0f301236d4db2b20db3dc7cea63c14";//调用access_token接口$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$secret;//get请求接口$result = $this->http_get($url);//得到的json字符串转为数组形式$result = json_decode($result,true);//判断是否请求成功if(isset($result["access_token"])){//表示请求成功 存入数据库$access_token = new AccessToken();//token值$access_token->access_token = $result["access_token"];//获取到的时间$access_token->access_token_time = time();//存入数据库$access_token->save();//返回数据return $result["access_token"];}else{//表示失败,返回falsereturn false;}}else{//直接数据库中获取return $access->access_token;}}
三、获取用户信息
得到了access_token我们直接调用接口去获取
$obj = $this->receiveMsg();//接收消息//这个在前面文章有定义此方法//判断消息类型switch ($obj->MsgType){//事件类型case "event"://订阅事件if($obj->Event=="subscribe"){//获取用户信息$openid = $obj->FromUserName;//获取access_token$access_token = $this->get_access_token();//获取用户信息接口$url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$access_token."&openid=".$openid."&lang=zh_CN";//调用接口$result = $this->http_get($url);//返回的是json字符串转为数组$result = json_decode($result,true);//判断是否请求成功if(empty($result["errcode"])){//为空表示成功//查询数据库中是否有此数据$check = Fans::where('openid',$openid)->first();if(!$check){//没有查询到将数据存放到数据库中Fans::create($result);//给出提示$content = "欢迎你关注我们的微信公众号";}else{//查询有此数据修改他的关注状态为1$check->status=1;$check->save();$content="欢迎你再次关注我们的微信公众号";}}else{//不为空表示失败$content = "关注失败";}}//取消订阅事件if($obj->Event=="unsubscribe"){//获取用户信息$openid = $obj->FromUserName;//查询是否有该openid$check = Fans::where('openid',$openid)->first();//如果有则修改状态为0if($check){$check->status = 0;$check->save();$content = "取消订阅成功";}else{$content = "取消订阅失败";}}//发送消息$this->check($content);//这是我的调试方法 没有用$this->responseText($obj,$content);//这个在前面文章有定义此方法break;
我们这里将用户信息保存到数据库中时需要设置Model的白名单
<?phpnamespace App\Model;use Illuminate\Database\Eloquent\Model;class Fans extends Model
{//定义表名protected $table = "fans";//定义主键protected $primaryKey = "id";//关闭时间戳public $timestamps = false;//设置白名单protected $fillable = ['openid',"nickname","sex","city","province","country","headimgurl","subscribe_time"];
}