根据上图所示,我们需要准备的代码不是单一的,而是好几个配合的。代码有:ajax长连接的js代码、ajax长连接数据判断代码、微信公众号api配置、微信二维码生成代码、数据库处理代码等。
要实现这功能需要用到六个文件分别处理数据,和一个sql数据库
文件分别有:index.php,wxqr.php,send.php,weixin.php,config.php,wxlogin.php
数据库:67zixue_ce.sql
首页当然就是index.php
<?php
//获取二维码的ticket,并且定义页面唯一性的login_token
include('wxqr.php');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<script src="http://code.jquery.com/jquery-1.11.2.min.js"></script>
</head>
<body>
<h1>用微信扫我登录</h1>
<img width="200px" src="https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=<?=$ticket?>" />
<!--https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket= 就可以获取到二维码了-->
<p id="msg"></p>
<script>
//默认启动
$(document).ready(function(){sendajax();});
//ajax长连接函数,是使用jQuery的js插件
function sendajax(){
$.ajax({
type:"POST", //ajax发送的形式为post
dataType:"json", //ajax发送的格式为json
url:"send.php", //ajax发送到send.php文件
timeout:80000, //ajax请求超时时间80秒
data:{time:"80",token:"<?=$login_token?>"},
//ajax的提交的参数,time是长连接世界,token是当前页面的唯一token
success:function(data,textStatus){
//成功接收ajax反馈
if(data.success=="1"){
//成功反馈data.success=1扫描成功
$("#msg").append("[你扫我了]"+data.text+"<br>");
alert('你扫我了~刷新一下就好了');
sendajax();
}
//未从服务器得到数据,继续查询
if(data.success=="0"){
//成功反馈data.success=0扫描失败
//$("#msg").append("[还没扫我]<br>");
sendajax();
}
},
//Ajax请求超时,继续查询
error:function(XMLHttpRequest,textStatus,errorThrown){
if(textStatus=="timeout"){
//$("#msg").append("[居然还不扫我]<br>");
sendajax();
}
}
});
}
</script>
</body>
</html>
微信二维码生成文件wxqr.php
<?php
include('config.php'); //加载配置文件
$login_token = rand(1,100000); //随机定义页面的唯一性的登录login_token
$ticket_url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={$token}";
//使用配置的$token组合成为获得ticket_url的链接
$ticket_data = '{"expire_seconds": 1800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id":'.$login_token.'}}}';
//使用随机定义的唯一性的登录login_token制作微信带参数二维码
//参考网站http://mp.weixin.qq.com/wiki/18/28fc21e7ed87bec960651f0ce873ef8a.html
/*POST的代码和参数,网站抄回来的,不解析*/
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL,$ticket_url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $ticket_data);
$ticket_json = curl_exec($ch);
/*POST的代码和参数,不解析*/
$ticket_array = json_decode($ticket_json,true); //json转码回数组
$ticket = $ticket_array['ticket']; //获取二维码的ticket
微信服务器处理代码weixin.php
<?php
/**
* 微信服务器代码处理
*/
//define your token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
// $wechatObj->valid();
$wechatObj->responseMsg();
class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];
//valid signature , option
if($this->checkSignature()){
echo $echoStr;
exit;
}
}
public function responseMsg()
{
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
//默认处理代码
if (!empty($postStr)){
libxml_disable_entity_loader(true);
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content);
$eventkey = $postObj->EventKey;
$time = time();
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>";
$msgType = "text";
/*组装反馈的内容*/
$login_url = "http://ce.67zixue.com/wxlogin.php?login_token=$eventkey&user=$fromUsername"; //$eventkey就是带参数的二维码扫描后反馈的login_token
//参考网站http://mp.weixin.qq.com/wiki/2/5baf56ce4947d35003b86a9805634b1e.html#.E6.89.AB.E6.8F.8F.E5.B8.A6.E5.8F.82.E6.95.B0.E4.BA.8C.E7.BB.B4.E7.A0.81.E4.BA.8B.E4.BB.B6
$contentStr = "<a href='".$login_url."'>点击登录</a>";
//html组装,用a标签,不多说
/*组装反馈的内容*/
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else {
echo "";
exit;
}
}
private function checkSignature()
{
// you must define TOKEN by yourself
if (!defined("TOKEN")) {
throw new Exception('TOKEN is not defined!');
}
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
// use SORT_STRING rule
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
}
?>
微信反馈的页面wxlogin.php
<?php
/*微信反馈登录页面*/
include('config.php');
$token = $_GET['login_token'];
//获得url中的login_token
$result = mysql_query("INSERT INTO ajax (`token`) values ({$token})");
//查找数据库中是否有对应的token
?>
<h1>登录成功</h1>
最后就是我们的配置文件,config.php 进行各种数据配置的配置
<?php
/*数据库配置*/
$servername = "***";
$username = "***";
$password = "***";
$dbdatabase = "67zixue_ce";
$db_connect = mysql_connect($servername,$username,$password);
$res = mysql_select_db($dbdatabase,$db_connect);
/*微信参数 token*/
$appID = "***";
$appsecret = "***";
/*生成微信当前的token,用于生成二维码*/
/*因为token每天有次数和时间限制,因此需要制作数据库进行记录,以便token多次使用*/
/*参考网站http://mp.weixin.qq.com/wiki/11/0e4b294685f817b95cbed85ba5e82b8f.html*/
$now_time = time();
$token_result = mysql_query("SELECT * FROM token ORDER BY time");
$token_info = mysql_fetch_row($token_result);
$token_time = $token_info[2];
//判断获取时间与当前时间
if(($now_time - $token_time) < 7200){
$token = $token_info[1];
}else{
//以get形式提交获取数据
$token_url= "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appID}&secret={$appsecret}";
$token_json = file_get_contents($token_url);
$token_array = json_decode($token_json,true);
$token = $token_array['access_token'];
$result = mysql_query("INSERT INTO token (`token`,`time`) values ('{$token}','{$now_time}')");
}
最后就是sql文件了,67zixue_ce.sql
-- phpMyAdmin SQL Dump -- version 3.3.7 -- http://www.phpmyadmin.net -- -- 主机: localhost -- 生成日期: 2015 年 05 月 04 日 12:33 -- 服务器版本: 5.5.36 -- PHP 版本: 5.2.17p1 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; -- -- 数据库: `67zixue_ce` -- -- -------------------------------------------------------- -- -- 表的结构 `ajax` -- CREATE TABLE IF NOT EXISTS `ajax` ( `id` int(11) NOT NULL AUTO_INCREMENT, `token` varchar(255) DEFAULT NULL, `ticket` varchar(32) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=30 ; -- -------------------------------------------------------- -- -- 表的结构 `token` -- CREATE TABLE IF NOT EXISTS `token` ( `id` int(11) NOT NULL AUTO_INCREMENT, `token` varchar(128) DEFAULT NULL, `time` varchar(32) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=179 ;
代码呢~留个言~
那个微信的配置如下图,仅供参考
转自67自学网