php生成Android客户端扫描可登录的二维码
本文实例为大家分享了php网页生成二维码,Android客户端扫描登录的具体代码,供大家参考,具体内容如下
使用了Github上具有扫码功能的ZXing开源库,使用了通过随机数生成二维码图片网络API,整个过程经过三步:
1.PHP网页生成二维码,相应随机数存储到数据库中;
2.Android客户端扫码,携带username保存至随机数对应的位置;
3.每隔一段时间,PHP通过Ajax轮询数据库,判断是否为空,不为空则跳转网页。
具体代码:
1.通过随机数生成二维码图片,并执行轮询操作命令的主页面
<html> <head> <title>qrlogin</title> <metacharset="UTF-8"/> </head> <body> <?php /** *@authorCenquanyu *@version2016年5月12日 * */ require'mysql_connect.php'; $randnumber=""; for($i=0;$i<8;$i++){ $randnumber.=rand(0,9); } //将生成的随机数保存至数据库 mysql_query("insertintologin_data(randnumber)values('$randnumber')") ?> <imgsrc="http://qr.liantu.com/api.php?text=<?phpecho$randnumber;?>"width="300px"/> <inputhidden="hidden"type="text"name="randnumber"id="randnumber"value="<?phpecho$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'; } } } } functionpolling(){ //执行轮询操作 varxmlHttpRequest; if(window.XMLHttpRequest){ xmlHttpRequest=newXMLHttpRequest(); } else{ xmlHttpRequest=newActiveXObject("Microsoft.XMLHTTP"); } randnumber=document.getElementById('randnumber').value; xmlHttpRequest.open("GET","polling.php?randnumber="+randnumber,true); xmlHttpRequest.send(); } setInterval("polling()",1000); </script> </html>
2.数据库连接页面
<?php /** *数据库连接文件 *@authorCenquanyu *@version2016年5月12日 * */ $con=mysql_connect("localhost","root","")ordie(mysql_error()); mysql_select_db("qr_login"); ?>
3.执行轮询操作的页面,username不为空则跳转
<?php /** *@authorCenquanyu *@version2016年5月12日 *执行轮询操作,查询随机数在数据库中的相应位置的username字段为不为空 *为空,则返回false,页面不跳转 *不为空,则说明有用户进行了该二维码的扫码登录,页面进行跳转 */ require'mysql_connect.php'; $randnumber=$_GET['randnumber']; $result=mysql_query("select*fromlogin_datawhererandnumber='$randnumber'"); $row=mysql_fetch_array($result); if($row['username']!="") echo"true"; else echo"false"; ?>
4.自定义的API,对客户端的username进行保存
<?php /** *@authorCenquanyu *@version2016年5月12日 *自定义API用于Android客户端扫码登录,将客户端的username保存至二维码对应的随机数在数据库中的相应位置。 *参数:username,randnumber *无返回值 */ $randnumber=$_GET('randnumber'); $username=$_GET('username'); require'mysql_connect.php'; mysql_query("updateqr_loginsetusername='$username'whererandnumber='$randnumber'"); ?>
5.Android客户端执行扫码操作的Activity
packagecom.Cenquanyu.qrlogin; importcom.Cenquanyu.qrlogin.R; importcom.zxing.activity.CaptureActivity; importandroid.app.Activity; importandroid.content.Intent; importandroid.graphics.Paint.Cap; importandroid.os.Bundle; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; importandroid.widget.EditText; importandroid.widget.Toast; /** *@authorCenquanyu *@version2016年5月12日 * */ publicclassMainActivityextendsActivityimplementsOnClickListener{ privateButtonbtnScan; privateEditTextetUsername; privatestaticfinalStringWEB_URL="http://172.31.19.202/QRLogin/";//改成PC端相应地址 @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnScan=(Button)findViewById(R.id.btnScan); btnScan.setOnClickListener(this); etUsername=(EditText)findViewById(R.id.etUsername); } @Override publicvoidonClick(Viewv){ //扫码操作 Intentintent=newIntent(this,CaptureActivity.class); startActivityForResult(intent,0);//返回结果 } @Override protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){ super.onActivityResult(requestCode,resultCode,data); if(resultCode==Activity.RESULT_OK){ Stringrandnumber=data.getExtras().getString("result");//客户端扫码后返回扫描结果,将二维码对应的随机数取出 Stringusername=etUsername.getText().toString(); Stringurl=WEB_URL+"saveUsername.php?randnumber="+randnumber +"&username="+username; HttpUtils.login(url);//访问url } } }
6.网络请求类
packagecom.Cenquanyu.qrlogin; importjava.io.IOException; importjava.net.HttpURLConnection; importjava.net.MalformedURLException; importjava.net.URL; publicclassHttpUtils{ publicstaticvoidlogin(finalStringurl){ newThread(newRunnable(){ @Override publicvoidrun(){ HttpURLConnectionconnection; try{ connection=(HttpURLConnection)newURL(url).openConnection(); connection.setRequestMethod("GET"); connection.getInputStream(); }catch(Exceptione){ e.printStackTrace(); } } }).start(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助。