请问pc网站如何实现关注公众号自动登录网站?
网友回复
第一步:生成一个二维码ticket,并且传参scence
<?php
/**
* 微信公众平台操作类
*/
class WeChat
{
private $_appid;
private $_appsecret;
//微信公众平台请求开发者的服务器需要token
private $_token;
//标识qrcodeticket的类型,是永久还是临时
const QRCODE_TYPE_TEMP = 1;
const QRCODE_TYPE_TEMP_STR = 2;
const QRCODE_TYPE_LIMIT = 3;
const QRCODE_TYPE_LIMIT_STR = 4;
/**
* 构造函数
* @param string $id appid
* @param string $secret app秘钥
*/
public function __construct($id, $secret, $token) {
$this->_appid = $id;
$this->_appsecret = $secret;
$this->_token = $token;
}
/**
* 用于第一次验证URl合法性
*/
public function firstValid() {
//校验签名的合法性
if ($this->_checkSignature()) {
//签名合法,告知微信服务器
echo $_GET['echostr'];
}
}
/**
* 验证签名
* @return [type] [description]
*/
private function _checkSignature() {
//获取由微信服务器发过来的数据
$signature = $_GET['signature'];
$timestamp = $_GET['timestamp'];
$nonce = $_GET['nonce'];
//开始验证数据
$tmp_arr = array($this->_token, $timestamp, $nonce);
sort($tmp_arr, SORT_STRING);
$tmp_str = implode($tmp_arr);
$tmp_str = sha1($tmp_str);
//对比数据
if ($signature == $tmp_str) {
return true;
} else {
return false;
}
}
/**
* 消息类型判断
* @return array
*/
public function responseMsg() {
//因为很多都设置了register_globals禁止,不能用$GLOBALS["HTTP_RAW_POST_DATA"] 改用file_get_contents("php://input")即可
$postStr = file_get_contents("php://input");
if (!empty($postStr)) {
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$RX_TYPE = trim($postObj->MsgType);
//用户发送的消息类型判断
switch ($RX_TYPE) {
case "text": //文本消息
return array('type' => 'text', 'msg' => '文本', 'obj' => $postObj);
break;
case "image": //图片消息
return array('type' => 'image', 'msg' => '图片', 'obj' => $postObj);
break;
case "voice": //语音消息
return array('type' => 'voice', 'msg' => '语音', 'obj' => $postObj);
break;
case "video": //视频消息
return array('type' => 'video', 'msg' => '视频', 'obj' => $postObj);
break;
case "location"://位置消息
return array('type' => 'location', 'msg' => '位置', 'obj' => $postObj);
break;
case "link": //链接消息
return array('type' => 'link', 'msg' => '链接', 'obj' => $postObj);
break;
case "event": //事件消息
return array('type' => 'event', 'msg' => $postObj->Event, 'obj' => $postObj);
break;
default:
return array('type' => 'unknow msg type', 'msg' => '未知', 'obj' => $postObj);
break;
}
} else {
echo "";
exit;
}
}
/**
* 获取 access_tonken值
* @param string $token_file 用来存储的文件
* @return access_token
*/
public function getAccessToken($token_file = 'access_token_file') {
//处理是否过期问题,将access_token存储到文件
$life_time = 7200;
if (file_exists($token_file) && time() - filemtime($token_file) < $life_time) {
// 存在有效的access_token 直接返回文件内容
return file_get_contents($token_file);
}
//接口URL
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->_appid."&secret=".$this->_appsecret;
//发送GET请求
$result = $this->_request('get', $url);
if (!$result) {
return false;
}
//处理数据
$result_obj = json_decode($result);
//写入到文件
file_put_contents($token_file, $result_obj->access_token);
return $result_obj->access_token;
}
/**
* 获取Ticket
* @param string $content 二维码内容
* @param int $type 二维码类型 1 临时整形 2临时字符串 3永久整形 4永久字符串
* @param int $expire 有效时间
* @return ticket
*/
public function getQRCodeTicket($content, $type = 2, $expire = 604800) {
$access_token = $this->getAccessToken();
$url = 'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token='.$access_token;
$type_list = array(
self::QRCODE_TYPE_TEMP => 'QR_SCENE',
self::QRCODE_TYPE_TEMP_STR => 'QR_STR_SCENE',
self::QRCODE_TYPE_LIMIT => 'QR_LIMIT_SCENE',
self::QRCODE_TYPE_LIMIT_STR => 'QR_LIMIT_STR_SCENE'
);
$action_name = $type_list[$type];
//post发送的数据
switch ($type) {
case self::QRCODE_TYPE_TEMP:
$data_arr['expire_seconds'] = $expire;
$data_arr['action_name'] = $action_name;
$data_arr['action_info']['scene']['scene_id'] = $content;
break;
case self::QRCODE_TYPE_TEMP_STR:
$data_arr['expire_seconds'] = $expire;
$data_arr['action_name'] = $action_name;
$data_arr['action_info']['scene']['scene_str'] = $content;
break;
case self::QRCODE_TYPE_LIMIT:
$data_arr['action_name'] = $action_name;
$data_arr['action_info']['scene']['scene_id'] = $content;
break;
case self::QRCODE_TYPE_LIMIT_STR:
$data_arr['action_name'] = $action_name;
$data_arr['action_info']['scene']['scene_str'] = $content;
break;
}
$data = json_encode($data_arr);
$result = $this->_request('post', $url, $data);
if (!$result) {
return false;
}
$result_obj = json_decode($result);
return $result_obj->ticket;
}
/**
* 根据ticket获取二维码
* @param int|string $content qrcode内容标识
* @param [type] $file 存储为文件的地址,如果null直接输出
* @param integer $type 类型
* @param integer $expire 如果是临时,标识有效期
* @return [type]
*/
public function getQRCode($content, $file = NULL, $type = 2, $expire = 604800) {
//获取ticket
$ticket = $this->getQRCodeTicket($content, $type = 2, $expire = 604800);
$url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=$ticket";
//发送,取得图片数据
$result = $this->_request('get', $url);
if ($file) {
file_put_contents($file, $result);
} else {
header('Content-Type:image/jpeg');
echo $result;
}
}
/**
* 封装发送http请求
* @param string $method 请求方式 get/post
* @param st...点击查看剩余70%
如何让ai帮我自动在小红书或抖音上自动根据需求截流与潜在客户聊天拉客?
如果用go编写一个在virtualbox中启动的简单操作系统?
go如何搭建一个零信任网络?
如何用python实现一个公网代理访问软件?
如何用go实现一个公网代理访问软件?
如何用python实现一个内网穿透打洞程序,实现内网的80端口暴露到公网上可以访问?
如何用go实现一个内网穿透打洞程序,实现内网的80端口暴露到公网上可以访问?
何为Shadowsocks 代理?
python如何实现类似php的opendir目录相互隔离的fastcgi多租户虚拟空间?
nodejs如何实现类似php的opendir目录相互隔离的fastcgi多租户虚拟空间?


