关于微信静默登录问题

 

配置文件  H5登陆

 

<bean id="wxMpInMemoryConfigStorage" class="me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage">
    <property name="appId" value="${wx_mp_appid}"/>
    <property name="secret" value="${wx_mp_secret}"/>
    <property name="token" value="${wx_mp_mytoken}"/>
</bean>

<bean id="wxMpService" class="me.chanjar.weixin.mp.api.impl.WxMpServiceImpl">
    <property name="wxMpConfigStorage" ref="wxMpInMemoryConfigStorage"/>
</bean>
wx_mp_appid=appid
wx_mp_secret=secret
wx_mp_redirect_uri=http://*******************/userInfo
wx_mp_mytoken=testtoken
<dependency>
    <groupId>com.github.binarywang</groupId>
    <artifactId>weixin-java-mp</artifactId>
    <version>${weixin.tools.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
    <version>2.0.4.RELEASE</version>
</dependency>
/**
     * 检验token是否合法
     *
     * @param response
     * @param timestamp
     * @param nonce
     * @param signature
     * @param echostr
     */
    @RequestMapping("/check")
    @ApiOperation("检验token是否合法")
    public void check(ServletResponse response, String timestamp, String nonce, String signature, String echostr) {
        if (!wxMpService.checkSignature(timestamp, nonce, signature)) {
            log.error("不合法");
            throw new RuntimeException();
        }
        PrintWriter o = null;
        try {
            o = new PrintWriter(response.getWriter());
            o.print(echostr);
        } catch (IOException e) {
            log.error("写回微信端错误{}", e.getMessage());
        } finally {
            o.close();
        }
    }

    /**
     * 授权,获取code
     *
     * @param returnUrl
     * @return
     */
    @RequestMapping("authorize")
    @ApiOperation("授权,获取code")
    public String authorize(@RequestParam("returnUrl") String returnUrl) {
        String result = wxMpService.oauth2buildAuthorizationUrl(redirectUri, WxConsts.OAuth2Scope.SNSAPI_BASE, returnUrl);
        log.info("获取得redirectUrl ==========>>>>>>{}", result);
        return "redirect:" + result;
    }

    /**
     * 处理业务层,比如获取到open_id跳转到某个页面
     *
     * @param code      授权code
     * @param returnUrl 返回用户的请求url
     * @return
     */
    @ApiOperation("处理业务层,比如获取到open_id跳转到某个页面")
    @GetMapping(value = {"userInfo"})
    public String userInfo(@RequestParam("code") String code, @RequestParam("state") String returnUrl) {
        log.info("code===>{} , state====>{}", code, returnUrl);
        WxMpOAuth2AccessToken wxMpOAuth2AccessToken = null;
        try {
            wxMpOAuth2AccessToken = this.wxMpService.oauth2getAccessToken(code);
        } catch (WxErrorException e) {
            log.error("wechat  error{}", e.getError().getErrorMsg());
            throw new RuntimeException(e.getError().getErrorMsg());
        }
        boolean valid = this.wxMpService.oauth2validateAccessToken(wxMpOAuth2AccessToken);
        if (!valid) {
            try {
                wxMpOAuth2AccessToken = this.wxMpService.oauth2refreshAccessToken(wxMpOAuth2AccessToken.getRefreshToken());
            } catch (WxErrorException e) {
                log.error("wechat  error{}", e.getError().getErrorMsg());
                throw new RuntimeException(e.getError().getErrorMsg());
            }
        }
        WxMpUser wxMpUser = null;
        try {
            wxMpUser = this.wxMpService.oauth2getUserInfo(wxMpOAuth2AccessToken, null);
            log.info("获取到的用户信息是:=================================>>>>{}", wxMpUser);
            log.info("获取到wxMpOAuth2AccessToken========================>>>>{}", wxMpOAuth2AccessToken);
        } catch (WxErrorException e) {
            log.error("wechat  error{}", e.getError().getErrorMsg());
            e.printStackTrace();
        }

        //更新保存用户数据
        UserEntity entity = this.userService.selectByOpenIdUser(wxMpUser.getOpenId());
        if (ObjectUtils.isEmpty(entity)) {
            entity = new UserEntity();
            entity.setOpenId(wxMpUser.getOpenId());
            entity.setUserImg(wxMpUser.getHeadImgUrl());
            entity.setCreateTime(new Date());
            entity.setNickName(wxMpUser.getNickname());
            try {
                this.userService.inserUser(entity);
            } catch (RRException r) {
                r.setMsg("插入用户数据异常");
                log.error(r.getMsg());
            }
        } else {
            try {
                this.userService.updateById(entity);
            } catch (RRException r) {
                r.setMsg("插入用户数据异常");
                log.error(r.getMsg());
            }
        }
        RedisUtil redisUtil = RedisUtil.getInstance();
//        redisService.add(wxMpOAuth2AccessToken.getAccessToken(),entity.toString(),7200,0);
        redisUtil.putInRedis(wxMpOAuth2AccessToken.getAccessToken(),entity.toString(),7200);
        return "redirect:" + returnUrl + "?token=" + wxMpOAuth2AccessToken.getAccessToken();
    }

 

 

公众号配置:

开发者工具---->公众平台测试账号

URL:与项目中的要一致

Token:与项目中的一致

关注公众号

网页服务--------->网页账号-------------->修改,输入下面路径

junwei.free.idcfengye.com(解析出来的网址)

 

微信工具访问:

例:http://www.baidu.com(映射到外网的地址)/**********/authorize?returnUrl=http://www.baidu.com

以上是测试环境

配置不变:

在公众号中:开发者工具------->web开发者工具--------->绑定开发者微信号

接口权限:网页服务---->网页授权---------->修改------->网页授权域名  配置的域名是解析并备案的只要域名(www.baidu.com)

基本配置中的,服务器配置------->修改配置

 

配置完成

本地调试可搜索“内网映射外网工具”进行映射访问

 

 

 

APP登陆

@ResponseBody
@PostMapping("/getUserInfo")
@ApiImplicitParam(name = "code", value = "code", paramType = "query")
public YJResult getWeChatUserInfoByCode(String code) {
    log.info("1:进入微信授权登录:code={}",code);
    // accessToken/openid/unionid 获取
    JSONObject wechatAccessToken = HttpUtils.getInstance().sendGet(setUrl(code));
    log.info("2:通过get方式获取到的数据:{}",wechatAccessToken.toJSONString());
    if (wechatAccessToken.get("errcode") != null) {
        return YJResult.error(1005, "获取微信授权数据失败");
    }

    String accessToken = wechatAccessToken.getString("access_token");
    String openid = wechatAccessToken.getString("openid");
    String unionid = wechatAccessToken.getString("unionid");
    // 判断并校验获取到的数据
    if (StringUtils.isEmpty(accessToken) || StringUtils.isEmpty(openid) || StringUtils.isEmpty(unionid)) {
        return YJResult.error(1005, "失败");
    }
    log.info("3:wechatAccessToken:accessToken:{},openid:{},unionid:{}",accessToken,openid,unionid);
    //  通过openId查询本地数,
    WeChatUserInfo weChatUserInfo = weChatUserInfoService.findByOpenId(openid);
    // 如果本地数据不存在
    if (ObjectUtils.isEmpty(weChatUserInfo)) {
        // 新用户,获取用户信息数据
        weChatUserInfo = getUserInfoByAccessToken(accessToken,openid);
        if (ObjectUtils.isEmpty(weChatUserInfo)) {
            return YJResult.error(1005, "获取微信授权数据失败");
        }
        log.info("4:新用户注册微信:{}",weChatUserInfo.toString());
        // 数据库插入的操作
        weChatUserInfoService.insertInto(weChatUserInfo);
    }else   if (weChatUserInfo != null) {
        log.info("4:老用户更新微信:{}",weChatUserInfo.toString());
        weChatUserInfoService.update(weChatUserInfo);
    }
    log.info("5:微信授权登录weChatUserInfo:{}",weChatUserInfo.toString());
    // 获取关联数据更新redis
    Customer customer = customerService.getByOpenId(openid);
    log.info("6:获取到的用户的数据:{}",customer.toString());
    String token = tokenManager.createToken(customer);
    Map map = new HashMap(3);
    map.put("token", token);
    map.put("customer", customer);
    map.put("weChatUserInfo", weChatUserInfo);
    log.info("7: YJResult<Map> Map:{}",JSONObject.toJSONString(map));
    return YJResult.success(map);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值