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 相关文章推荐
第五节 克隆 [5]
Oct 09 PHP
解析在PHP中使用全局变量的几种方法
Jun 24 PHP
PHP实现货币换算的方法
Nov 29 PHP
php字符串过滤与替换小结
Jan 26 PHP
PHP中异常处理的一些方法整理
Jul 03 PHP
基于laravel制作APP接口(API)
Mar 15 PHP
PHP面试常用算法(推荐)
Jul 22 PHP
PHP对象实例化单例方法
Jan 19 PHP
PHP实现登陆表单提交CSRF及验证码
Jan 24 PHP
php操作access数据库的方法详解
Feb 22 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
Dec 25 PHP
Laravel重定向,a链接跳转,控制器跳转示例
Oct 22 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登录环节防止sql注入的方法浅析
2014/06/30 PHP
php中mysql操作buffer用法详解
2015/03/19 PHP
深入理解PHP原理之执行周期分析
2016/06/01 PHP
php解决DOM乱码的方法示例代码
2016/11/20 PHP
PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能
2018/05/31 PHP
JavaScript 浏览器验证代码(来自discuz)
2010/07/17 Javascript
基于jQuery的为attr添加id title等效果的实现代码
2011/04/20 Javascript
jQuery插件原来如此简单 jQuery插件的机制及实战
2012/02/07 Javascript
改变隐藏的input中value值的方法
2014/03/19 Javascript
jquery的each方法使用示例分享
2014/03/25 Javascript
jQuery中change事件用法实例
2014/12/26 Javascript
jQuery解决input超多的表单提交
2015/08/10 Javascript
开启Javascript中apply、call、bind的用法之旅模式
2015/10/28 Javascript
JS中使用mailto实现将用户在网页中输入的内容传递到本地邮件客户端
2016/10/08 Javascript
详解vue-router 2.0 常用基础知识点之导航钩子
2017/05/10 Javascript
Vue.js进行查询操作的实例详解
2017/08/25 Javascript
cnpm加速Angular项目创建的方法
2018/09/07 Javascript
node中IO以及定时器优先级详解
2019/05/10 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
2019/12/16 Javascript
Jquery Fade用法详解
2020/11/06 jQuery
Python使用Flask-SQLAlchemy连接数据库操作示例
2018/08/31 Python
python求质数的3种方法
2018/09/28 Python
利用Python脚本实现自动刷网课
2020/02/03 Python
Python 如何展开嵌套的序列
2020/08/01 Python
基于Python实现天天酷跑功能
2021/01/06 Python
美国当红的名品折扣网:Gilt Groupe
2016/08/15 全球购物
中学教师请假制度
2014/02/03 职场文书
会计电算化毕业生自荐信
2014/03/03 职场文书
新教师培训心得体会
2014/09/02 职场文书
新学期红领巾广播稿
2014/10/04 职场文书
2014年出纳工作总结与计划
2014/12/09 职场文书
python生成随机数、随机字符、随机字符串
2021/04/06 Python
Windows下redis下载、redis安装及使用教程
2021/06/02 Redis
Mysql中存储引擎的区别及比较
2021/06/04 MySQL
Golang gRPC HTTP协议转换示例
2022/06/16 Golang
MySQL实现用逗号进行拼接、以逗号进行分割
2022/12/24 MySQL