要求必须公众号已经认证
原理通过生成带参数二维码+随机字符串
存入库中
然后用户扫描关注后,微信推送消息中带 随机字符串
,与库中相比完成登录
只贴核心代码
生成二维码推送
<?php
include('./curl.php');
include('./file.php');
$appid = "APPID";
$secret = "SECRET";
$get_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$secret}";//获取access_token的url
//获取token过程开始
$token = curl_get($get_token_url);
$token = json_decode($token,true);
$token = $token['access_token'];
//获取token过程结束
$get_code_url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={$token}";//获取ticket的url
$string = createToken(24);//随机字符串
$get_code_url_parmeter = array(
'expire_seconds'=>2592000,//二维码有效期 2592000是30天
'action_name'=>'QR_STR_SCENE',//微信推送消息时的参数类型,QR_STR_SCENE为字符串
'action_info'=>array(
'scene'=>array(
'scene_str'=>$string,//微信随送消息时的参数。
)
)
);
//模拟器数据库存入开始
$logininfo_array = array('string'=>$string,'islogin'=>0);
writeArrayToFile($logininfo_array,"logininfo.txt");
//模拟器数据库存入结束
//获取ticket开始
$get_code_url_parmeter = json_encode($get_code_url_parmeter);
$qrcode = curl_post($get_code_url,$get_code_url_parmeter);
$ticket = json_decode($qrcode,true);
$ticket = $ticket['ticket'];
//获取ticket结束
$qrcodeimg = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket={$ticket}";
echo $qrcodeimg;
//向前端返回二维码链接
function createToken($long){//创建随机字符串 long参数为字符串长度
$char = '1234567890ABCDEFGHIGHLMNOPQRSTUVWXYZ';
$token = '';
for ($i = 0; $i <= $long; $i++) {
$token.= $char[rand(0, strlen($char) - 1) ];
}
return $token;
}
?>
//接收微信推送消息
<?php
include('./file.php');
if($_SERVER['REQUEST_METHOD'] == 'GET'){//配置服务器时的验证
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$echostr = $_GET["echostr"];
$token = "abcd";
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
echo $echostr;
}else{
return false;
}
}else{
$xml = $GLOBALS['HTTP_RAW_POST_DATA']; //接收微信推送,xml格式
$logininfo = readFileToArray("logininfo.txt"); //读取之前存入的随机字符串。
$objectxml = simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA); //xml转objcet
$userinfo = json_decode(json_encode($objectxml),true); //objcet 转php array
if($userinfo['EventKey']==$logininfo['string'] || $userinfo['EventKey']=='qrscene_'.$logininfo['string']){
//首次关注的推送前面多了一个qrscene_ 所以做或判断
//随机字符串和推送的字符串相匹配,证明已进入公众号
$logininfo['islogin']=1; //模拟数据库操作,登陆状态变1
$logininfo['openid']=$userinfo['FromUserName']; //模拟数据库操作,保存用户openid
if($userinfo['Event']==="subscribe"){//首次关注事件类型:subscribe
//first
$logininfo['text']="该用户首次关注";
}else if($userinfo['Event']==="SCAN"){//直接进入事件类型:SCAN
$logininfo['text']="该用户已关注";
}
writeArrayToFile($logininfo,"logininfo.txt");//模拟数据库操作。
}
}
?>
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。