1.前臺請求後臺獲得相應的參數及回調地址,用戶掃面後登錄到回調的地址中,回調的地址中獲得用戶信息及返回信息,前臺監控返回信息做相應的處理及登錄註冊
public class WeChatLoginAction extends AbstractRestBaseAction {
@Autowired
private MembersService memberService;
@Autowired
private MemLoginLogService memLoginLogService;
@Autowired
private MemSignInRecordService memSignInRecordService;
// 應用唯一標識
private String appid = "wx2ed73e3d972bf2ce";
// 應用密鑰AppSecret,在微信開放平臺提交應用審覈通過後獲得
private String secret = "3dceda9ff389dbcce576e4ea4ed9da20";
// 應用授權作用域,擁有多個作用域用逗號(,)分隔,網頁應用目前僅填寫snsapi_login即
private String scope = "snsapi_login";
/**
*
* @category 登錄請求微信操作 (步驟1)
* @author hjj
* @date 2018年10月13日
* @return void
*/
public void _$indexBatchRequestWeChat(){
String redirect_uri = queryCallbackUri();// 請使用urlEncode對鏈接進行處理
Resp result = initResult();
result.dataMap("appid", appid);
result.dataMap("scope", scope);
try {
result.dataMap("redirect_uri",URLEncoder.encode(redirect_uri, "UTF-8"));
} catch (Exception e) {
e.printStackTrace();
initResult(RespCode.ErrFailure, "操作失敗");
}
}
/**
*
* @category 登錄獲得請求微信回調地址(步驟1)
* @author hjj
* @date 2018年10月13日
* @return
* @return String
*/
public String queryCallbackUri(){
String path = request.getContextPath();
String ServerName = request.getServerName();
//String ServerName = "1608e55a.all123.net";//測試ip 不加ip
String basePath = request.getScheme() + "://" + ServerName + path ;
basePath += "/we-chat-login";
return basePath;
}
}
頁面
引入
<script type="text/javascript" src="http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script>
步驟1 前臺請求後臺獲得微信所需參數並監聽用戶掃碼情況 及處理
index-login.tpl
App._$get('${ctxPath}/api/we-chat-login.json?_type=requestWeChat&_batch=true',null,null,null,null,
function(data){
_this.ewmDiv = true;
setTimeout(function(){
var obj = new WxLogin({
self_redirect:true,
id: "ewmDiv",
appid: data.appid,
scope: data.scope,
redirect_uri: data.redirect_uri,
style : 'black'
});
},0);
//監聽返回參數
_this.id_of_setinterval = setInterval(function(){
if(_this.ewmDiv == false){//關閉二維碼窗口
clearInterval(id_of_setinterval)
}
var weChatStatus = $("#weChatStatus",$('#ewmDiv iframe')[0].contentDocument).val();//$('#ewmDiv iframe')[0].contentDocument 在哪裏獲得
if(weChatStatus != null){ //只要監控到了就要停掉定時器
clearInterval(_this.id_of_setinterval)
if(weChatStatus == 200){//成功登錄
var login_jwt = $("#login_jwt",$('#ewmDiv iframe')[0].contentDocument).val();
var login_t = $("#login_t",$('#ewmDiv iframe')[0].contentDocument).val();
window.localStorage['_authorization'] = login_jwt;
window.localStorage['_t'] = login_t;
setTimeout(function(){
//登錄成功,跳轉到指定頁面
window.location.href = '${ctxPath}/member/';
},100)
}else if(weChatStatus == 201){//未註冊
_this.ewmDiv = false;
_this.registerDiv = true;//註冊
}
}
},1000);
},function(err){
});
we-chat-login.tpl
<div>
<input type="hidden" id="weChatStatus" value="${status}"/>
<input type="hidden" id="login_jwt" value="${jwt!}"/>
<input type="hidden" id="login_t" value="${_t!}"/>
<div style="text-align: center;margin-top: 100px;">
<div class="thirdParty_1">
<span class="thirdParty_1_1" style="font-size: 18px;">${statusTitle}</span>
</div>
</div>
</div>
package com.seryo.kpy.web.action;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import com.google.gson.JsonObject;
import com.seryo.common.Constants;
import com.seryo.kpy.web.AbstractTplAction;
import com.seryo.model.mem.MemOperateLog;
import com.seryo.model.mem.Members;
import com.seryo.service.mem.MemIntegralService;
import com.seryo.service.mem.MemOperateLogService;
import com.seryo.service.mem.MembersService;
import com.seryo.service.mem.SessionService;
import com.seryo.util.StringUtils;
import com.seryo.util.base.IpUtil;
import com.seryo.util.base.UrlUitl;
import com.seryo.util.json.JsonUtil;
import com.seryo.util.oauth.App;
import com.seryo.util.oauth.WebHelper;
import com.seryo.web.resp.Resp;
/**
* 功能:微信登錄操作
* @Package com.seryo.kpy.web.restapi.member
* @ClassName: WeChatLoginAction
* @author hjj
* @date 2018年10月13日 下午2:46:13
*/
public class WeChatLoginAction extends AbstractTplAction {
@Autowired
private MembersService memberService;
@Autowired
private SessionService sessionService;
@Autowired
private MembersService membersService;
@Autowired
private MemIntegralService memIntegralService;
@Autowired
private MemOperateLogService memOperateLogService;
// 應用唯一標識
private String appid = "wx2ed73e3d972bf2ce";
// 應用密鑰AppSecret,在微信開放平臺提交應用審覈通過後獲得
private String secret = "3dceda9ff389dbcce576e4ea4ed9da20";
/**
*
* @category (步驟1)回調地址
* @author hjj
* @date 2018年10月13日
* @return void
*/
@Override
public String execute(){
String code = param("code");
Resp result = initResult();
Integer status = null;
String statusTitle = "";
String weChatOpenId = "";
String access_token = "";
if(!StringUtils.isBlank(code)){//不爲空則是 用戶允許授權 否則不做處理
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+appid+"&secret="+secret+"&code="+code+"&grant_type=authorization_code";
try {
String fhz = UrlUitl.sendGet(url);
JsonObject json = JsonUtil.fromJson(fhz);
if(json.get("errcode") != null){
status = -1;
statusTitle = "操作異常";
}else{
access_token = json.get("access_token").getAsString();
weChatOpenId = json.get("openid").getAsString();
Members members = memberService.queryWeChat(weChatOpenId);
if(members != null){//0 正常 1不正常 2爲註冊
App app = WebHelper.getApp(request);
if(Constants.USER_STATUS_NORMAL.equals(members.getStatus())){//用戶轉態正常
JsonObject userJson = sessionService.thirdPartyLogin(members, null, response, request, app);
attr("jwt",userJson.get("jwt").getAsString());
attr("_t",userJson.get("_t").getAsString());
status = 200;
statusTitle = "登錄成功";
}else{//狀態異常
status = -2;
statusTitle = "用戶狀態異常";
}
}else{//未綁定賬號
JsonObject json2 = queryUserData(access_token, weChatOpenId);
if(json2.get("errcode") != null){//獲得用戶信息
status = -3;
statusTitle = "用戶授權失敗";
}else{
HttpSession session = request.getSession();
session.setAttribute("sessionUserData", json2);//設置到Session中
status = 201;
statusTitle = "未綁定賬號";
}
}
}
} catch (Exception e) {
e.printStackTrace();
status = -4;
statusTitle = "系統異常";
}
}
attr("status",status);
attr("statusTitle",statusTitle);
return SUCCESS;
}
/**
*
* @category 獲得微信用戶信息
* @author hjj
* @date 2018年10月17日
* @param ACCESS_TOKEN 調用憑證
* @param openid 普通用戶的標識,對當前開發者帳號唯一
* @return void
*/
public JsonObject queryUserData(String ACCESS_TOKEN, String openid){
String url = "https://api.weixin.qq.com/sns/userinfo?access_token="+ACCESS_TOKEN+"&openid="+openid;
String fhz = UrlUitl.sendGet(url);
return JsonUtil.fromJson(fhz);
}
@Override
public String detail(){
String code = param("code");
Resp result = initResult();
Integer status = null;
String statusTitle = "";
if(!StringUtils.isBlank(code)){//不爲空則是 用戶允許授權 否則不做處理
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+appid+"&secret="+secret+"&code="+code+"&grant_type=authorization_code";
try {
String fhz = UrlUitl.sendGet(url);
JsonObject json = JsonUtil.fromJson(fhz);
if(json.get("errcode") != null){
status = -1;
statusTitle = "操作異常";
}else{
String openid = json.get("openid").getAsString();
Members members = getMembers();// 獲取當前登錄用戶
if(members != null){
Members members2 = membersService.getById(members.getId());
members2.setWeChatId(openid);
MemOperateLog memOperateLog = new MemOperateLog();
String content = "用戶綁定微信";
if(!Constants.IS_TRUE.equals(members2.getIsWeChat())){//未綁定過微信
members2.setIsWeChat(Constants.IS_TRUE);
Integer integral = members2.getIntegral() == null ? 0 : members2.getIntegral();
Integer integral2 = memIntegralService.saveMemIntegral(members2, "綁定微信", Constants.IS_TRUE, Constants.SYS_INTEGRAL_CODE_BINDING_WE_CHAT);
integral += integral2;
members2.setIntegral(integral);
content += ",並獲得綁定微信積分"+integral2;
}
membersService.saveOrUpdate(members2);
WebHelper.updateUserInfoUflag(request, response, members2);// 重新注入對象
memOperateLog.setContent(content);
memOperateLog.setModule("個人中心");
memOperateLog.setResult(Constants.IS_TRUE);
App app = WebHelper.getApp(request);
memOperateLog.setIp(IpUtil.getIpAddr(request));// ip
memOperateLogService.addMemOperateLog(members2, app, memOperateLog);
status = 200;
statusTitle = "綁定成功";
}else{
status = 0;
statusTitle = "未登錄,請重新登錄!";
}
}
} catch (Exception e) {
e.printStackTrace();
status = -2;
statusTitle = "系統異常";
}
}
attr("status",status);
attr("statusTitle",statusTitle);
return SUCCESS;
}
}