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(2)――PHP类型
Feb 15 PHP
PHP return语句另类用法不止是在函数中
Sep 17 PHP
php常用的安全过滤函数集锦
Oct 09 PHP
PHP删除指定目录中的所有目录及文件的方法
Feb 26 PHP
PHP查询快递信息的方法
Mar 07 PHP
PHP实现长文章分页实例代码(附源码)
Feb 03 PHP
详解PHP的Yii框架中自带的前端资源包的使用
Mar 31 PHP
PHP串行化与反串行化实例分析
Dec 27 PHP
ThinkPHP删除栏目(实现批量删除栏目)
Jun 21 PHP
php+redis消息队列实现抢购功能
Feb 08 PHP
浅谈laravel框架与thinkPHP框架的区别
Oct 23 PHP
PHP之header函数详解
Mar 02 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 iconv 函数转gb2312的bug解决方法
2009/10/11 PHP
作为程序员必知的16个最佳PHP库
2015/12/09 PHP
PHP 传输会话curl函数的实例详解
2017/09/12 PHP
利用jQuery接受和处理xml数据的代码(.net)
2011/03/28 Javascript
Jquery中Ajax 缓存带来的影响的解决方法
2011/05/19 Javascript
JQuery分别取得每行最后一列和最后一行的示例代码
2013/08/18 Javascript
使用apply方法实现javascript中的对象继承
2013/12/16 Javascript
浅析Node.js查找字符串功能
2014/09/03 Javascript
在JavaScript中使用对数Math.log()方法的教程
2015/06/15 Javascript
js表单中选择框值的获取及表单的序列化
2015/12/17 Javascript
简单谈谈Vue 模板各类数据绑定
2016/09/25 Javascript
Node.js的环境安装配置(使用nvm方式)
2016/10/11 Javascript
JavaScript中object和Object的区别(详解)
2017/02/27 Javascript
浅谈webpack打包之后的文件过大的解决方法
2018/03/07 Javascript
layui字体图标 loading图标静止不旋转的解决方法
2019/09/23 Javascript
分享Angular http interceptors 拦截器使用(推荐)
2019/11/10 Javascript
[01:52]深扒TI7聊天轮盘语音出处7
2017/05/11 DOTA
python读文件逐行处理的示例代码分享
2013/12/27 Python
python 自动化将markdown文件转成html文件的方法
2016/09/23 Python
在django中使用自定义标签实现分页功能
2017/07/04 Python
Python及Django框架生成二维码的方法分析
2018/01/31 Python
Python变量及数据类型用法原理汇总
2020/08/06 Python
化工专业应届生求职信
2013/11/08 职场文书
电钳专业个人求职信
2014/01/04 职场文书
便利店投资的创业计划书
2014/01/12 职场文书
校本教研工作方案
2014/01/14 职场文书
《新型玻璃》教学反思
2014/04/13 职场文书
乡镇党的群众路线对照检查材料
2014/09/24 职场文书
2015出纳试用期工作总结
2014/12/12 职场文书
保研推荐信格式
2015/03/25 职场文书
工程质检员岗位职责
2015/04/08 职场文书
七一晚会主持词
2015/06/29 职场文书
2015年国培研修感言
2015/08/01 职场文书
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
2021/06/08 Python
python 对图片进行简单的处理
2021/06/23 Python
GoFrame基于性能测试得知grpool使用场景
2022/06/21 Golang