1、如何使用java實現二維碼掃描登錄微信網頁版(微信端)?
jsp+spring+struts2+mybatis:
模仿微信pc網頁版掃碼登錄
使用js代碼生成qrcode二維碼減輕伺服器壓力
js循環請求服務端,判斷是否qrcode被掃
二維碼超時失效功能
二維碼被掃成功登錄,服務端產生sessionId,傳到頁面使用js保存cookie
多線程
### 生成qrcode相關js jquery.qrcode.js - ### 代碼 「
請使用手機掃碼
//生成二維碼
!function(){
var uuid = (「#uuid」).val();
var content;
content = 「……….do?uuid=」+uuid;
//console.dir(content);(『.pc_qr_code』).qrcode({
render:」canvas」,
width:200,
height:200,
correctLevel:0,
text:content,
background:」#ffffff」,
foreground:」black」,
src:」/logo.png」
});
setCookie(「sid」, 123, -1*60*60*1000);
keepPool();//自動循環調用
}();
function keepPool(){
var uuid = $("#uuid").val();
$.get(ctx+"/web/login/pool.do",{uuid:uuid,},function(msg){//如果放入一個不存在的網址怎麼辦?
//console.log(msg);
if(msg.successFlag == '1'){
$("#result").html("掃碼成功");
setCookie(msg.data.cname, msg.data.cvalue, 3*60*60*1000);
//alert("將跳轉...");
window.location.href = ctx +"/webstage/login/success.do";
}else if(msg.successFlag == '0'){
$("#result").html("該二維碼已經失效,請重新獲取");
}else{
keepPool();
}
});
}
//設置cookie
function setCookie(cname, cvalue, expireTime) {
var d = new Date();
d.setTime(d.getTime() + expireTime);//設置過期時間
var expires = "expires="+d.toUTCString();
var path = "path=/"
document.cookie = cname + "=" + cvalue + "; " + expires + "; " + path;
}
java代碼
//二維碼首頁public String index() { try {
uuid = UUID.randomUUID().toString(); super.getRequest().setAttribute("uuid", uuid);
ScanPool pool = new ScanPool();
pool.setCreateTime(System.currentTimeMillis());
Map<String, ScanPool> map = new HashMap<String, ScanPool>(1);
map.put(uuid, pool);
PoolCache.cacheMap.put(uuid, pool);
pool = null;
} catch (Exception e) {
Log4jUtil.CommonLog.error("pc生成二維碼登錄", e);
} return "index";
}//判斷二維碼是否被掃描public void pool() {
DataResultInfo result = null;
System.out.println("檢測[ " + uuid + " ]是否登錄");
ScanPool pool = null;
if(MapUtils.isNotEmpty(PoolCache.cacheMap)) pool = PoolCache.cacheMap.get(uuid); try { if (pool == null) { // 掃碼超時,進線程休眠
result = DataResultInfo.getInstance().failure();
result.setSuccessFlag(CommonConstant.Zero);
result.setExtension(CommonConstant.Zero, "該二維碼已經失效,請重新獲取");
Thread.sleep(10 * 1000L);
} else { // 使用計時器,固定時間後不再等待掃描結果--防止頁面訪問超時
new Thread(new ScanCounter(uuid, pool)).start(); boolean scanFlag = pool.getScanStatus(); //這里得到的ScanPool(時間靠前)和用戶使用手機掃碼後得到的不是一個,用戶掃碼後又重新更新了ScanPool對象,並重新放入了redis中,,所以這里要等待上面的計時器走完,才能獲得最新的ScanPool
if (scanFlag) {
result = DataResultInfo.getSuccess(); // 根據uuid從redis中獲取pool對象,得到對應的sessionId,返給頁面,通過js存cookie中
JSONObject jsonObj = new JSONObject();
jsonObj.put("cname", CookieConstant.SESSION_KEY);
jsonObj.put("cvalue", pool.getSession());
result.setData(jsonObj);
} else {
result = DataResultInfo.getInstance().failure();
result.setMessage("等待掃描");
}
}
} catch (Exception e) {
e.printStackTrace();
}
sendJsonMessage(result);
}//手機掃碼介面(以id和token作為用戶身份登錄)
public String phoneScanLogin() {
DataResultInfo result = null;
ScanPool pool = null;
if(MapUtils.isNotEmpty(PoolCache.cacheMap)) pool = PoolCache.cacheMap.get(uuid); try { if (pool == null) {
result = DataResultInfo.getInstance().failure();
result.setMessage("該二維碼已經失效,請重新獲取");
} else { if (StringUtils.isNotEmpty(id) && StringUtils.isNotEmpty(token)) { //根據id和token查詢後台,獲取用戶信息userBean
String redisToken = redisUtil.getRedis(RedisKeyConstant.APP_TOKEN+userId); if(redisToken != null && redisToken.equals(token)){
UserBean userBean = userService.findByUserId(Long.valueOf(userId)); if (userBean != null) {
String sessionId = SessionConstant.SESSION_ID_PRE
+ FormatUtils.password(userBean.getId()
.toString());
Map<String, String> cookieSession = new HashMap<String, String>();
cookieSession
.put(CookieConstant.SESSION_KEY, sessionId); // WrCookie.writeCookie(getResponse(),cookieSession);
// 添加用戶信息到redis
boolean re = redisUtil.addUserInfo( RedisKeyConstant.SESSION + sessionId, BeanUtils.toBean(userBean, UserInfo.class));
getSession().setAttribute( SessionConstant.USER_INFO_WEB, BeanUtils.toBean(userBean, UserInfo.class));
getSession().setAttribute( DomainConstant.USER_CENTER_KEY, DomainConstant.USER_CENTER);
pool.setSession(sessionId);
pool.scanSuccess();
}else{
result = DataResultInfo.getInstance().failure();
result.setMessage("用戶信息獲取異常!請稍後再試");
}
} else {
result = DataResultInfo.getInstance().failure();
result.setExtension("11", "用戶身份信息失效,請重新登錄!");
}
} else {
result = DataResultInfo.getInstance().failure();
result.setMessage("請求參數有誤!"); return "error";
} // 不能清除,否則conn方法得不到pool對象,不會進入線程休眠
// System.out.println("清除掃描過的uuid");
//PoolCache.cacheMap.remove(uuid);
}
} catch (Exception e) {
Log4jUtil.CommonLog.error("手機掃碼 後訪問 異常", e);
}
sendJsonMessage(result); return null;
}//掃碼成功跳轉頁
public String success() {
String sessionId = WrCookie.getCookie(super.getRequest(), CookieConstant.SESSION_KEY);
UserInfo userInfo = redisUtil.getUserInfo(RedisKeyConstant.SESSION + sessionId); super.getRequest().setAttribute(SessionConstant.USER_INFO_WEB, userInfo); return SUCCESS;
}//線程判斷二維碼是否超時class ScanCounter implements Runnable { public Long timeout = 30 * 1000L; //超時時長
// 傳入的對象
private String uuid; private ScanPool scanPool; public ScanCounter(String p, ScanPool scanPool) {
uuid = p; this.scanPool = scanPool;
} @Override
public void run() { try {
Thread.sleep(timeout);
} catch (InterruptedException e) {
e.printStackTrace();
}
notifyPool(uuid, scanPool);
} public synchronized void notifyPool(String uuid, ScanPool scanPool) { if (scanPool != null) scanPool.notifyPool();
} public String getUuid() { return uuid;
} public void setUuid(String uuid) { this.uuid = uuid;
} public ScanPool getScanPool() { return scanPool;
} public void setScanPool(ScanPool scanPool) { this.scanPool = scanPool;
}}
ScanPool.java(存放uuid的bean)
public class ScanPool implements Serializable{
/**
* @Fields serialVersionUID : TODO(用一句話描述這個變數表示什麼)
*/
private static final long serialVersionUID = -9117921544228636689L; private Object session ; //創建時間
private Long createTime = System.currentTimeMillis();
//登錄狀態
private boolean scanFlag = false;
public boolean isScan(){
return scanFlag;
}
public void setScan(boolean scanFlag){
this.scanFlag = scanFlag;
}
/**
* 獲取掃描狀態,如果還沒有掃描,則等待固定秒數
* @param wiatSecond 需要等待的秒數
* @return
*/
public synchronized boolean getScanStatus(){
try
{
if(!isScan()){ //如果還未掃描,則等待
this.wait();
}
if (isScan())
{ System.err.println("手機掃描完成設置getScanStatus..true..........."); return true;
}
} catch (InterruptedException e)
{
e.printStackTrace();
}
return false;
}
/**
* 掃碼之後設置掃碼狀態
* @param token
* @param id
*/
public synchronized void scanSuccess(){
try
{ System.err.println("手機掃描完成setScan(true)....同時釋放notifyAll(手機掃碼時,根據uuid獲得的scanpool對象)");
setScan(true);
this.notifyAll();
} catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public synchronized void notifyPool(){
try
{
this.notifyAll();
} catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/***********************************************/
public Long getCreateTime()
{
return createTime;
}
public void setCreateTime(Long createTime)
{
this.createTime = createTime;
} public Object getSession() { return session;
} public void setSession(Object session) { this.session = session;
}
2、請問微信的開放平台只有服務號才可以使用嗎?我有一個java+jsp+tomcat的網站想接入微信不知道可不可以?
服務號是要求你去申請的。
去微信公眾平台申請一個。然後用java開發相關的功能就好了。
這是完全可以的。
3、一個java後台網站如何給微信公眾號(android)做api?
應該是公眾號上自定義菜單的介面吧。根據菜單需求提供對應的介面就行了。
4、如何把微信熱門文章發布到phpcms系統
有個api的鏈接,要寫token什麼的,然後發一個指定格式的xml,裡面有一個openId(也叫FromUserName)是關聯用戶的,發到那個api鏈接就好了,至於openId怎麼拿到,用戶給你發消息的時候會有,你把它記錄下來就好了。給個詳細鏈接你看http://www.jb51.net/article/41750.htm,直接看發送消息那塊,其實可以在微信開發者文檔那裡看,挺詳細的。
5、請問電腦怎麼安裝微信,怎樣安裝java環境?下載java、sdk的網站
java環境,copy下載jdk1.6,雙擊運行,一路next到底。就成了。
jdk網站:www.sun.com.cn
6、怎麼自己做一個微信端+pc端+手機端的網站
做網站還是找專業的網站建設公司吧
每個地方都會有網站建設公司
先去網上搜一下,然後一家家的對比
看公司辦公環境及資質,是否正規
看公司案例,是否真實,要記得驗證,如何證明是他們做的
看公司官方網站,自己官網都做不好的網路公司肯定不怎麼樣!
看團隊人數。
如果本地找不到好的可以考慮北上廣深等大城市