(目前已經(jīng)完成了這個(gè)功能,示例網(wǎng)址:愛招標(biāo)——免費(fèi)實(shí)時(shí)標(biāo)訊推送平臺(tái),為企業(yè)負(fù)責(zé)人及商務(wù)人員即時(shí)掌控招標(biāo)動(dòng)態(tài)、中標(biāo)檢索、競(jìng)爭(zhēng)對(duì)手中標(biāo)項(xiàng)目分析等服務(wù)平臺(tái)。)
做微信掃碼登陸,生成二維碼必須是微信公眾號(hào)中綁定的域這個(gè)域名,網(wǎng)站生成不了二維碼(網(wǎng)站與微信服務(wù)器不是同一個(gè)域名),而是調(diào)用微信系統(tǒng)的接口獲取二維碼,用戶掃碼后也是請(qǐng)求微信服務(wù)器
微信公眾號(hào)
實(shí)現(xiàn)思路
1,微信的系統(tǒng)域名總是自動(dòng)轉(zhuǎn)掃到https,提供生成帶參數(shù)的二維碼的接口,這個(gè)參數(shù)就是唯一值(場(chǎng)景值)
2,網(wǎng)站調(diào)用微信系統(tǒng),獲取生成的二維碼圖片
3,用戶掃碼會(huì)直接調(diào)用微信服務(wù)器域名總是自動(dòng)轉(zhuǎn)掃到https,將用戶訪問微信服務(wù)器的信息記錄到redis,key就是唯一值(場(chǎng)景值)
4,網(wǎng)站端做輪訓(xùn)去查詢r(jià)edis中是否有這個(gè)唯一值的數(shù)據(jù),如果有就獲取用戶信息登錄,沒有就五秒一次輪訓(xùn),登錄后就不在做輪訓(xùn)(從二維碼彈出之后開始做輪訓(xùn),關(guān)閉二維碼后停止輪訓(xùn))
5,這里的唯一值是可以自己定義的,我用的是截取了幾位的時(shí)間戳
實(shí)現(xiàn)步驟
(1)微信端:寫一個(gè)獲取帶參數(shù)的臨時(shí)二維碼接口。
// 臨時(shí)二維碼 private final static String QR_SCENE = "QR_SCENE"; // 永久二維碼 private final static String QR_LIMIT_SCENE = "QR_LIMIT_SCENE"; // 永久二維碼(字符串) private final static String QR_LIMIT_STR_SCENE = "QR_LIMIT_STR_SCENE"; // 創(chuàng)建二維碼 private String create_ticket_path = "https://api.weixin.qq.com/cgi-bin/qrcode/create"; // 通過ticket換取二維碼 private String showqrcode_path = "https://mp.weixin.qq.com/cgi-bin/showqrcode"; @RequestMapping("getQrcode") public @ResponseBody String getQrcode(@RequestParam(value = "sceneId")int sceneId) throws Exception{ String ticket = createTempTicket(tokenService.getToken(),"2592000",sceneId); LOGGER.info("get wechat qrcode ==> start"); LOGGER.info("sceneId :"+sceneId); LOGGER.info("ticket :"+ticket); LOGGER.info("get wechat qrcode ==> end"); return ticket; } /** * 創(chuàng)建臨時(shí)帶參數(shù)二維碼 * @param accessToken * @expireSeconds 該二維碼有效時(shí)間,以秒為單位。 最大不超過2592000(即30天),此字段如果不填,則默認(rèn)有效期為30秒。 * @param sceneId 場(chǎng)景Id * @return */ public String createTempTicket(String accessToken, String expireSeconds, int sceneId) { TreeMapparams = new TreeMap (); params.put("access_token", accessToken); Map intMap = new HashMap (); intMap.put("scene_id",sceneId); Map > mapMap = new HashMap >(); mapMap.put("scene", intMap); Map paramsMap = new HashMap (); paramsMap.put("expire_seconds", expireSeconds); paramsMap.put("action_name", QR_SCENE); paramsMap.put("action_info", mapMap); String data = new Gson().toJson(paramsMap); String tse = HttpRequestUtil.HttpsDefaultExecute(HttpRequestUtil.POST_METHOD,create_ticket_path,params,data); JSONObject jsonObject = JSONObject.fromObject(tse); LOGGER.info("ticket :"+jsonObject.getString("ticket"));
return showqrcode_path+"?ticket="+jsonObject.getString("ticket");
}
accessToken就是調(diào)用微信接口的憑證token
(2)網(wǎng)站端:網(wǎng)站寫一個(gè)調(diào)用微信生成二維碼的接口
@RequestMapping("getQrcode") public @ResponseBody Hashtable getQrcode(int sceneId){ System.out.println(sceneId); Hashtable param = new Hashtable(); param.put("sceneId", sceneId); String qrcodePath = HttpUtil.postRequest(Constant.getValue("get_qrcode"), param); System.out.println(" qrcodePath ==> "+qrcodePath); param.put("path", qrcodePath); return param; }