在家里没事干,想到网站扫码登录原理,做了一下,由于需要服务器端支持,所以顺便学了一下PHP怎么做接口。
先说下服务器端,我使用了wampserver搭建了一个本地服务器环境。使用的是mysql数据库
我已经建了一个数据库qrlogin,表名loginrecord
表结构如下:
首先做了一个类来连接数据库
<?php
$con = mysql_connect("localhost", "root", "") or die(mysql_error()) ;
mysql_select_db("qrlogin");
?>
这是index.php的代码,其中包括了轮询数据库
<!DOCTYPE html>
<html>
<head>
<title >QRLogin</title>
<meta charset="utf-8" />
</head>
<body>
<?php
require "mysql_connect.php";
$randnumber = "";
for ($i = 0; $i < 8; $i++) {
$randnumber .= rand(0, 9);
}
echo $randnumber;
mysql_query("insert into loginrecord (randnumber) values($randnumber)");
?>
<img src="http://qr.topscan.com/api.php?text=<?php echo $randnumber; ?>" width="300px"/>
<input hidden="hidden" style="display: none;"type="text" name= "randnumber" id="randnumber" value="<?php echo $randnumber; ?>"/>
</body>
<script>function polling() {
var xmlHttp;
var ht;
if(window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
} else {
xmlHttp = new ActiveXObject("Microsoft.XMLHttp");
}
xmlHttp.onreadystatechange = function() {
if(xmlHttp.status == 200 && xmlHttp.readyState == 4) {
result = xmlHttp.responseText;
if(result == 'true')
window.location.href = "welcome.php";
}
}
ht = document.getElementById('randnumber').value;
xmlHttp.open("GET", "polling.php?randnumber=" + ht, true);
xmlHttp.send();
}
setInterval("polling()", 1000);</script>
</html>
算了php的代码不说了下面来研究下原理,android客户端首先获取扫码权限,进行扫码,二维码为随机生成,然后我们在android引入框架zxing用于解析二维码的内容,然后将内容发给服务器,服务器收到后修改数据库,一旦数据库改变,就跳转到welcome.php界面。
下面是mainactivity类。注意WEB_URL要写自己服务器的地址。
package com.example.qrlogin;
import com.zxing.activity.CaptureActivity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity implements OnClickListener{
private Button btn_Scan;
private EditText edt_username;
public static final String WEB_URL = "http://192.168.0.102/";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewFind();
}
private void ViewFind() {
btn_Scan = (Button)findViewById(R.id.btn_scan);
edt_username = (EditText)findViewById(R.id.username);
btn_Scan.setOnClickListener(this);
}
@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 = edt_username.getText().toString();
String url = WEB_URL+"saveUserName.php?randnumber="+randnumber+"&username="+username;
Log.e(url, "url"+url);
HttpUtils.login(url);
}
}
}
HttpUtils封装了一个get方法,用于请求服务器。不再贴代码了。
地址点击打开链接