要求必须公众号曾经认证
原理通过生成带参数二维码+随机字符串
存入库中
而后用户扫描关注后,微信推送音讯中带 随机字符串
,与库中相比实现登录
只贴外围代码
生成二维码推送
<?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");//模仿数据库操作。 } } ?>