微信登錄第三方平臺

   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;
    }

}
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章