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 相关文章推荐
phpmyadmin操作流程
Oct 09 PHP
PHP 变量的定义方法
Jan 26 PHP
PHP 工厂模式使用方法
May 18 PHP
PHP 中检查或过滤IP地址的实现代码
Nov 27 PHP
php开发留言板的CRUD(增,删,改,查)操作
Apr 19 PHP
memcache命令启动参数中文解释
Jan 13 PHP
PHP实现使用优酷土豆视频地址获取swf播放器分享地址
Jun 05 PHP
搭建基于Docker的PHP开发环境的详细教程
Jul 01 PHP
浅谈php+phpStorm+xdebug配置方法
Sep 17 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
Dec 25 PHP
Laravel多用户认证系统示例详解
Mar 13 PHP
PHP通过get方法获得form表单数据方法总结
Sep 12 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日期时间函数的高级应用技巧
2009/05/16 PHP
删除html标签得到纯文本可处理嵌套的标签
2014/04/28 PHP
PHP如何将XML转成数组
2016/04/04 PHP
PHP强制转化的形式整理
2020/05/22 PHP
input的focus方法使用
2010/03/13 Javascript
jQuery 锚点跳转滚动条平滑滚动一句话代码
2010/04/30 Javascript
javascript 进阶篇1 正则表达式,cookie管理,userData
2012/03/14 Javascript
js中同步与异步处理的方法和区别总结
2013/12/25 Javascript
Jquery动态添加及删除页面节点元素示例代码
2014/06/16 Javascript
jquery制作 随机弹跳的小球特效
2015/02/01 Javascript
JavaScript对HTML DOM使用EventListener进行操作
2015/10/21 Javascript
Jquery ajax基础教程
2015/11/20 Javascript
jQuery无缝轮播图代码
2016/12/22 Javascript
使用vue-router beforEach实现判断用户登录跳转路由筛选功能
2018/06/25 Javascript
Angular父子组件通过服务传参的示例方法
2018/10/31 Javascript
Vue使用路由钩子拦截器beforeEach和afterEach监听路由
2020/11/16 Javascript
[00:43]DOTA2小紫本全民票选福利PA至宝全方位展示
2014/11/25 DOTA
python读文件逐行处理的示例代码分享
2013/12/27 Python
pandas把dataframe转成Series,改变列中值的类型方法
2018/04/10 Python
Python利用pandas计算多个CSV文件数据值的实例
2018/04/19 Python
Python在groupby分组后提取指定位置记录方法
2018/04/20 Python
python+ffmpeg批量去视频开头的方法
2019/01/09 Python
如何用PyPy让你的Python代码运行得更快
2020/12/02 Python
html5实现canvas阴影效果示例
2014/05/07 HTML / CSS
New Balance俄罗斯官方网上商店:购买运动鞋
2020/03/02 全球购物
建筑自我鉴定
2013/10/19 职场文书
公司培训欢迎词
2014/01/10 职场文书
道路交通安全实施方案
2014/03/12 职场文书
煤矿安全演讲稿
2014/05/09 职场文书
司法建议书范文
2014/05/13 职场文书
2014年办公室工作总结范文
2014/11/12 职场文书
2014年仓管员工作总结
2014/11/18 职场文书
大班上学期个人总结
2015/02/13 职场文书
开展警示教育活动总结
2015/05/09 职场文书
海洋天堂观后感
2015/06/05 职场文书
Nginx隐藏式跳转(浏览器URL跳转后保持不变)
2022/04/07 Servers