php生成Android客户端扫描可登录的二维码


Posted in PHP onMay 13, 2016

本文实例为大家分享了php网页生成二维码,Android客户端扫描登录的具体代码,供大家参考,具体内容如下

使用了Github上具有扫码功能的ZXing开源库,使用了通过随机数生成二维码图片网络API,整个过程经过三步:

1.PHP网页生成二维码,相应随机数存储到数据库中;
2.Android客户端扫码,携带username保存至随机数对应的位置;
3.每隔一段时间,PHP通过Ajax轮询数据库,判断是否为空,不为空则跳转网页。

具体代码:
1. 通过随机数生成二维码图片,并执行轮询操作命令的主页面    

<html>
 <head>
  <title>qrlogin</title>
  <meta charset="UTF-8"/>
 </head>
 <body>
  <?php
  /**
   * @author Cenquanyu
   * @version 2016年5月12日
   *
   */
    require 'mysql_connect.php';
    $randnumber = "";
    for($i=0;$i<8;$i++){
    $randnumber.=rand(0,9);
    }
    //将生成的随机数保存至数据库
    mysql_query("insert into login_data (randnumber) values ('$randnumber')")
    
  ?>
   
  <img src="http://qr.liantu.com/api.php?text=<?php echo $randnumber;?>" width="300px"/>
  <input hidden="hidden" type="text" name="randnumber" id="randnumber"value="<?php echo $randnumber;?>"/>
 
 </body>
 <script>
  xmlHttpRequest.onreadystatechange = function(){
    if(xmlHttpRequest.status == 200 && xmlHttpRequest.readyState ==4){
  result = xmlHttp.responseText;
  if(result==true){//username不为空则跳转页面
     window.location.href='welcome.php';
  }
}
}
 }
 function polling(){
 
   //执行轮询操作
   var xmlHttpRequest;
   if(window.XMLHttpRequest){
     xmlHttpRequest = new XMLHttpRequest();
     }
   else{
     xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
   }
    randnumber = document.getElementById('randnumber').value;
    xmlHttpRequest.open("GET","polling.php?randnumber="+ randnumber,true);
    xmlHttpRequest.send();
 }
    setInterval("polling()",1000);
</script>
 
</html>

2. 数据库连接页面    

<?php
/**
 * 数据库连接文件
 * @author Cenquanyu
 * @version 2016年5月12日
 * 
 */
$con = mysql_connect("localhost","root","") or die(mysql_error());
mysql_select_db("qr_login");
 
?>

3.执行轮询操作的页面,username不为空则跳转    

<?php
/**
 * @author Cenquanyu
 * @version 2016年5月12日
 * 执行轮询操作,查询随机数在数据库中的相应位置的username字段为不为空
 * 为空,则返回false,页面不跳转
 * 不为空,则说明有用户进行了该二维码的扫码登录,页面进行跳转
 */
require 'mysql_connect.php';
$randnumber = $_GET['randnumber'];
$result = mysql_query("select * from login_data where randnumber='$randnumber'");
$row = mysql_fetch_array($result);
if($row['username']!="")
  echo "true";
else
  echo "false";
?>

4.自定义的API,对客户端的username进行保存    

<?php
/**
 * @author Cenquanyu
 * @version 2016年5月12日
 * 自定义API用于Android客户端扫码登录,将客户端的username保存至二维码对应的随机数在数据库中的相应位置。
 * 参数:username,randnumber
 * 无返回值
 */
$randnumber = $_GET('randnumber');
$username = $_GET('username');
 
require 'mysql_connect.php';
mysql_query("update qr_login set username='$username' where randnumber= '$randnumber'");
 
 
?>

5. Android客户端执行扫码操作的Activity    

package com.Cenquanyu.qrlogin;
 
import com.Cenquanyu.qrlogin.R;
import com.zxing.activity.CaptureActivity;
 
import android.app.Activity;
import android.content.Intent;
import android.graphics.Paint.Cap;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
/**
 * @author Cenquanyu
 * @version 2016年5月12日
 * 
 */
public class MainActivity extends Activity implements OnClickListener {
 
  private Button btnScan;
  private EditText etUsername;
 
   
  private static final String WEB_URL = "http://172.31.19.202/QRLogin/";//改成PC端相应地址
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
 
    btnScan = (Button) findViewById(R.id.btnScan);
    btnScan.setOnClickListener(this);
    etUsername = (EditText) findViewById(R.id.etUsername);
  }
 
  @Override
  public void onClick(View v) {
    // 扫码操作
    Intent intent = new Intent(this, CaptureActivity.class);
    startActivityForResult(intent, 0);//返回结果
  }
 
  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK) {
      String randnumber = data.getExtras().getString("result");//客户端扫码后返回扫描结果,将二维码对应的随机数取出
      String username = etUsername.getText().toString();
      String url = WEB_URL + "saveUsername.php?randnumber=" + randnumber
          + "&username=" + username;
      HttpUtils.login(url);//访问url
    }
  }
 
}

6. 网络请求类

package com.Cenquanyu.qrlogin;
 
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
 
public class HttpUtils{
  public static void login(final String url){
    new Thread(new Runnable() {
      @Override
      public void run() {
        HttpURLConnection connection;
        try {
          connection = (HttpURLConnection) new URL(url).openConnection();
          connection.setRequestMethod("GET");
          connection.getInputStream();
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }).start();
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助。

PHP 相关文章推荐
十天学会php之第三天
Oct 09 PHP
PHP下用rmdir实现删除目录的三种方法小结
Apr 20 PHP
提高PHP编程效率 引入缓存机制提升性能
Feb 15 PHP
PHP插入排序实现代码
Apr 04 PHP
php jsonp单引号转义
Nov 23 PHP
PHP安全下载文件的方法
Apr 07 PHP
PHP获取指定时间段之间的 年,月,天,时,分,秒
Jun 05 PHP
php遍历替换目录下文件指定内容的方法
Nov 10 PHP
php 生成加密公钥加密私钥实例详解
Jun 16 PHP
PHP数据对象映射模式实例分析
Mar 29 PHP
laravel-admin select框默认选中的方法
Oct 03 PHP
Thinkphp5.0框架的Db操作实例分析【连接、增删改查、链式操作等】
Oct 11 PHP
php短信接口代码
May 13 #PHP
php实现在线通讯录功能(附源码)
May 13 #PHP
PHP将MySQL的查询结果转换为数组并用where拼接的示例
May 13 #PHP
php仿微信红包分配算法的实现方法
May 13 #PHP
PHP简单实现无限级分类的方法
May 13 #PHP
PHP生成可点击刷新的验证码简单示例
May 13 #PHP
关于PHP文件的自动运行方法分析
May 13 #PHP
You might like
php中文件上传的安全问题
2006/10/09 PHP
杏林同学录(七)
2006/10/09 PHP
php header函数的常用http头设置
2015/06/25 PHP
详解PHP对数组的定义以及数组的创建方法
2015/11/27 PHP
thinkPHP3.1验证码的简单实现方法
2016/04/22 PHP
javascript编程起步(第六课)
2007/01/10 Javascript
百度 popup.js 完美修正版非常的不错 脚本之家推荐
2009/04/17 Javascript
js二维数组排序的简单示例代码
2014/01/24 Javascript
node.js中的fs.createWriteStream方法使用说明
2014/12/17 Javascript
jQuery实现点击按钮弹出可关闭层的浮动层插件
2015/09/19 Javascript
jQuery头像裁剪工具jcrop用法实例(附演示与demo源码下载)
2016/01/22 Javascript
jqueryMobile 动态添加元素,展示刷新视图的实现方法
2016/05/28 Javascript
浅谈JS运算符&amp;&amp;和|| 及其优先级
2016/08/10 Javascript
JavaScript中校验银行卡号的实现代码
2016/12/19 Javascript
JS表单传值和URL编码转换
2018/03/03 Javascript
移动端 Vue+Vant 的Uploader 实现上传、压缩、旋转图片功能
2019/06/10 Javascript
vue axios重复点击取消上一次请求封装的方法
2019/06/19 Javascript
windows实现npm和cnpm安装步骤
2019/10/24 Javascript
基于原生JS封装的Modal对话框插件的示例代码
2020/09/09 Javascript
python实现用户登录系统
2016/05/21 Python
python爬虫之模拟登陆csdn的实例代码
2018/05/18 Python
python并发编程多进程 模拟抢票实现过程
2019/08/20 Python
Python+OpenCV 实现图片无损旋转90°且无黑边
2019/12/12 Python
Python如何使用turtle库绘制图形
2020/02/26 Python
python实现提取COCO,VOC数据集中特定的类
2020/03/10 Python
浅谈keras中loss与val_loss的关系
2020/06/22 Python
10个python爬虫入门实例(小结)
2020/11/01 Python
SNIDEL官网:日本VIVI杂志人气少女第一品牌
2020/03/12 全球购物
SQL Server面试题
2013/04/04 面试题
设备动力科岗位职责范本
2014/02/23 职场文书
六五普法规划实施方案
2014/03/21 职场文书
专业技术职务聘任书
2014/03/29 职场文书
三月学雷锋月活动总结
2014/04/28 职场文书
亮剑精神观后感
2015/06/05 职场文书
法制工作总结2015
2015/07/23 职场文书
解决Navicat for MySQL 连接 MySQL 报2005错误的问题
2021/05/29 MySQL