導航:首頁 > 萬維百科 > java微信cms系統

java微信cms系統

發布時間:2020-12-25 15:04:40

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端+手機端的網站

做網站還是找專業的網站建設公司吧
每個地方都會有網站建設公司
先去網上搜一下,然後一家家的對比
看公司辦公環境及資質,是否正規
看公司案例,是否真實,要記得驗證,如何證明是他們做的
看公司官方網站,自己官網都做不好的網路公司肯定不怎麼樣!
看團隊人數。
如果本地找不到好的可以考慮北上廣深等大城市

與java微信cms系統相關的知識