java 微信公众号 授权登陆 完善

package com.ltdd.hall.biz.api.controller;


import com.alibaba.fastjson.JSON;
import com.ltdd.core.domain.RestResponse;
import com.ltdd.core.exception.BizException;
import com.ltdd.hall.common.Token;
import com.ltdd.hall.common.util.CookieUtil;
import com.ltdd.hall.common.util.RestUtile;
import com.ltdd.hall.common.util.TokenUtils;
import com.ltdd.hall.core.service.KMemberService;
import com.ltdd.hall.dal.biz.dataobject.HotCityDO;
import com.ltdd.hall.dal.biz.dataobject.WxOauth2TokenDO;
import com.ltdd.hall.dal.biz.dataobject.WxUserInfo;
import com.ltdd.hall.dal.core.dataobject.KMemberDO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Map;

@Api(value = "WX", description = "微信相关文档")
@RestController
@RequestMapping("/wx")
@Slf4j
@Validated
public class WxController {
    @Autowired
    KMemberService kMemberService;
    @ApiOperation(value = "test微信", httpMethod = "GET")
    @RequestMapping(value = "/wxLogin", method = RequestMethod.GET)
    public void wxLogin(HttpServletRequest req, HttpServletResponse resp,String url) throws IOException {
        CookieUtil cookieUtil = new CookieUtil();
        Cookie cooname = cookieUtil.getCookieByName(req,"openId");
        if(null == cooname) {
            String uri = urlEncodeUTF8("http://xxxxxxxxx.com/wx/notifyLogin?url=" + url);
            String appid = "xxxxxxx1c3caa1e";
            String urlNameString = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=" + uri + "&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
            resp.sendRedirect(urlNameString);
        }else{
            resp.sendRedirect(urlDecodeUTF8(url));
        }


    }
//        @ApiOperation(value = "test微信", httpMethod = "GET")
//        @RequestMapping("/authorize")
//        public ModelAndView alipayforward(HttpServletRequest req, HttpServletResponse resp,String url) throws Exception {
//            CookieUtil cookieUtil = new CookieUtil();
//            Cookie cooname = cookieUtil.getCookieByName(req,"openId");
//            if(null == cooname){
//              String uri = urlEncodeUTF8("http://xxxxxxxxx.com/wx/notifyLogin?url="+url);
//                String appid ="xxxxxxx1c3caa1e";
//                String urlNameString = "redirect:https://open.weixin.qq.com/connect/oauth2/authorize?appid="+appid+"&redirect_uri="+uri+"&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";
//                return new ModelAndView(urlNameString);
//            }else{
//                String rurl = urlDecodeUTF8(url);
//                return new ModelAndView("redirect:"+rurl);
//
//            }
//
//
//        }
    /**
          * URL编码(utf-8)
           *
           * @param source
           * @return
     */
    public static String urlEncodeUTF8(String source) {
       String result = source;
        try {
               result = java.net.URLEncoder.encode(source, "utf-8");
            } catch (UnsupportedEncodingException e) {
                 e.printStackTrace();
        }
        return result;
    }
    public static String urlDecodeUTF8(String source) {
        String result = source;
        try {
            result = java.net.URLDecoder.decode(source, "utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return result;
    }
    @RequestMapping(value = "/notifyLogin", method = RequestMethod.GET)
    public void notifyLogin(HttpServletRequest request,HttpServletResponse response) throws Exception {
        Map<String, String[]> params = request.getParameterMap();//针对get获取get参数
        String[] codes = params.get("code");//拿到code的值
        String[] rurls = params.get("url");
        String rurl = rurls[0];
        String code = codes[0];
        WxOauth2TokenDO oauth2Token = this.getOauth2AccessToken("xxxxxxx1c3caa1e", "xxxxxxxxxb3fa77a2a06dec2", code);
        // 网页授权接口访问凭证
        String accessToken = oauth2Token.getAccessToken();
        // 用户标识
        String openId = oauth2Token.getOpenId();
        WxUserInfo snsUserInfo = this.getSNSUserInfo(accessToken,openId);
        CookieUtil cookieUtil = new CookieUtil();
        cookieUtil.setCookie("openId",snsUserInfo.getOpenId(),60*60,response);
        cookieUtil.setCookie("nickname",snsUserInfo.getNickname(),60*60,response);
        cookieUtil.setCookie("sex",String.valueOf(snsUserInfo.getSex()),60*60,response);
        cookieUtil.setCookie("headImgUrl",snsUserInfo.getHeadImgUrl(),60*60,response);
        cookieUtil.setCookie("unionid",snsUserInfo.getUnionid(),60*60,response);
        KMemberDO kMemberDO = kMemberService.selectByOpenId(snsUserInfo.getOpenId());

        if(null != kMemberDO || !"".equals(kMemberDO)){
            int insetResult = kMemberService.insert(snsUserInfo);
        }else{
            int updateResult = kMemberService.update(snsUserInfo);
        }
        KMemberDO kMemberDO1 = kMemberService.selectByOpenId(snsUserInfo.getOpenId());
        Token token = new Token();
        token.setMemberId(kMemberDO1.getMemberId());
        token.setMemberNickName(kMemberDO1.getMemberNickName());
        token.setMemberOpenId(kMemberDO1.getMemberOpenid());
        cookieUtil.setCookie("tokenm", String.valueOf(token),60*60,response);
        String tokenStr = TokenUtils.getTokenStr(token);
        cookieUtil.setCookie("token",tokenStr,60*60,response);
        response.sendRedirect(urlDecodeUTF8(rurl));
    }

    public static WxOauth2TokenDO   getOauth2AccessToken(String appId, String appSecret, String code) throws Exception {
        WxOauth2TokenDO wat = null;
        // 拼接请求地址
        String requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token";
        // 获取网页授权凭证
        String query = "appid="+appId+"&secret="+appSecret+"&code="+code+"&grant_type=authorization_code";
        RestUtile restUtil = new RestUtile();
        String resultString = restUtil.load(requestUrl,query);
        com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(resultString);
        if (null != jsonObject) {
            try {
                wat = new WxOauth2TokenDO();
                wat.setAccessToken(jsonObject.getString("access_token"));
                wat.setExpiresIn(jsonObject.getInteger("expires_in"));
                wat.setRefreshToken(jsonObject.getString("refresh_token"));
                wat.setOpenId(jsonObject.getString("openid"));
                wat.setScope(jsonObject.getString("scope"));
            } catch (Exception e) {
                wat = null;
                int errorCode = jsonObject.getInteger("errcode");
                String errorMsg = jsonObject.getString("errmsg");

            }
            return wat;
        }
        return wat;

    }


    public WxUserInfo getSNSUserInfo(String accessToken, String openId) throws Exception {
        WxUserInfo snsUserInfo = null;
        String requestUrl = "https://api.weixin.qq.com/sns/userinfo";
        // 获取网页授权凭证
        String query = "access_token="+accessToken+"&openid="+openId;
        RestUtile restUtil = new RestUtile();
        String resultString = restUtil.load(requestUrl,query);
        com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(resultString);

        if (null != jsonObject) {
            try {
                snsUserInfo = new WxUserInfo();
                // 用户的标识
                snsUserInfo.setOpenId(jsonObject.getString("openid"));
                // 昵称
                snsUserInfo.setNickname(jsonObject.getString("nickname"));
                // 性别(1是男性,2是女性,0是未知)
                snsUserInfo.setSex(jsonObject.getInteger("sex"));
                // 用户所在国家
                snsUserInfo.setCountry(jsonObject.getString("country"));
                // 用户所在省份
                snsUserInfo.setProvince(jsonObject.getString("province"));
                // 用户所在城市
                snsUserInfo.setCity(jsonObject.getString("city"));
                // 用户头像
                snsUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));
                // 用户特权信息
                List<String> list = JSON.parseArray(jsonObject.getString("privilege"),String.class);
                snsUserInfo.setPrivilegeList(list);
                //与开放平台共用的唯一标识,只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。
                snsUserInfo.setUnionid(jsonObject.getString("unionid"));
            } catch (Exception e) {
                snsUserInfo = null;
                int errorCode = jsonObject.getInteger("errcode");
                String errorMsg = jsonObject.getString("errmsg");

            }
        }
        return snsUserInfo;
    }
    @RequestMapping(value = "/cookie", method = RequestMethod.GET)
    public RestResponse<KMemberDO> testCookie(HttpServletRequest request,HttpServletResponse response,String name,String value) throws Exception {

//        response.sendRedirect("http://wechat.lvtudiandian.com/index.php/TpApi/Test/test");
//        CookieUtil cookieUtil = new CookieUtil();
//        cookieUtil.setCookie(name,value,60*60*24,response);
//        Cookie names = cookieUtil.getCookieByName(request,name);
        KMemberDO kMemberDO = kMemberService.selectByOpenId("oaIK-wrQAMe1Zw0t9AgHJ4VPkrQQ");
        WxUserInfo wxUserInfo = new WxUserInfo();
        wxUserInfo.setHeadImgUrl("httP:kkkkkkk1");
       // wxUserInfo.setOpenId("222222222222222222");
        wxUserInfo.setNickname("wwwwwwwwww1");
        wxUserInfo.setOpenId("ooopppppweeeneid");
        wxUserInfo.setUnionid("uuunnniiidddd1");

       int insetResult = kMemberService.insert(wxUserInfo);
       long id = kMemberDO.getMemberId();
       KMemberDO kMemberDO1 = new KMemberDO();
       long id1 = kMemberDO1.getMemberId();
//        KMemberDO kMemberDO1 = new KMemberDO();
//        k
//        if(null != kMemberDO || !"".equals(kMemberDO)){
//            int insetResult = kMemberService.insert(wxUserInfo);
//        }else{
//            int updateResult = kMemberService.update(wxUserInfo);
//        }
        return RestResponse.succ("历史城市详情查询成功", kMemberDO);


    }
    @ApiOperation(value = "tests微信", httpMethod = "GET")
    @RequestMapping("/testcookie")
    public ModelAndView cookie123(HttpServletRequest req, HttpServletResponse resp) throws Exception {
        //String uri = urlEncodeUTF8("redirect:http://wechat.lvtudiandian.com/index.php/TpApi/Test/test");
        //String appid ="xxxxxxx1c3caa1e";
        String urlNameString = "redirect:http://wechat.lvtudiandian.com/index.php/TpApi/Test/test";
        return new ModelAndView(urlNameString);

    }


}
 

猜你喜欢

转载自blog.csdn.net/Lucky____Boy/article/details/87783234