67自学网

58同城微信登录代码


根据上图所示,我们需要准备的代码不是单一的,而是好几个配合的。代码有:ajax长连接的js代码、ajax长连接数据判断代码、微信公众号api配置、微信二维码生成代码、数据库处理代码等。

效果就如http://ce.67zixue.com

要实现这功能需要用到六个文件分别处理数据,和一个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 ;



代码呢~留个言~

点我下载

那个微信的配置如下图,仅供参考


侧栏导航