后端完成微信静默授权

  • 相关配置
wechat: #微信授权的相关配置
app-id: ***
app-secret: ****
access-token-url: https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
base-oauth2-url: https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=123#wechat_redirect
  • 实现代码
@Value("${wechat.app-id}")
private String appId;
@Value("${wechat.app-secret}")
private String appSecret;
@Value("${wechat.access-token-url}")
private String accessTokenURL;
@Value("${wechat.base-oauth2-url}")
private String baseOauth2Url;


public ResponseBean getOpenIdByCode(BaseQuery params) {
      String code = params.getCode();
      logger.info("code=======>" + code);
      if (StringUtils.isEmpty(code)) {
          return new ResponseBean(ResponseBean.ERROR, "登录失败");
      }

      String url = accessTokenURL.replace("APPID", appId).replace("SECRET", appSecret).replace("CODE", code);
      ResponseEntity<WechatBean> entity = this.restTemplate.getForEntity(url, WechatBean.class, new Object[0]);

      if (ResponseBean.SUCCESS != entity.getStatusCodeValue()) {
          return new ResponseBean(ResponseBean.ERROR, "登录失败");
      }

      WechatBean wechatResultBean = (WechatBean) entity.getBody();
      if (null != wechatResultBean) {
          //code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期
          String errcode = wechatResultBean.getErrcode();
          if ("40029".equals(errcode)) {
              return new ResponseBean(ResponseBean.ERROR, "登录失败");
          }

          String accessToken = wechatResultBean.getAccess_token();
          logger.info("accessToken=======>" + accessToken);
          if (StringUtils.isEmpty(accessToken)) {
              return new ResponseBean(ResponseBean.ERROR, "登录失败");
          }

          //目前H5的授权只需要拿到openId,并存入数据即可
          String openId = wechatResultBean.getOpenid();
          logger.info("openId=======>" + openId);
          if (StringUtils.isEmpty(openId)) {
              return new ResponseBean(ResponseBean.ERROR, "登录失败");
          }

		  //判断openId是否已经注册过(在表里)
          User user = userService.getByWxOpenId(openId);
          if (null == user) {
              //TODO 业务操作
              logger.info("insert=======>" + i);
              if (1 == i) {
                  //TODO 业务操作
                  return new ResponseBean(ResponseBean.SUCCESS,"登录成功", userInfo);
              }

              return new ResponseBean(ResponseBean.ERROR,"登录失败");
          }

          return new ResponseBean(ResponseBean.SUCCESS,"登录成功", user);
      }

      return new ResponseBean(ResponseBean.ERROR,"登录失败");
  }
public class Wechat2HTTPConverter extends MappingJackson2HttpMessageConverter {

    public Wechat2HTTPConverter() {
        List<MediaType> mediaTypes = new ArrayList<>();
        mediaTypes.add(MediaType.TEXT_PLAIN);
        mediaTypes.add(MediaType.TEXT_HTML);
        setSupportedMediaTypes(mediaTypes);
    }

}
public class RestTemplateConfig {

    private RestTemplateBuilder restTemplateBuilder;

    public RestTemplateConfig(RestTemplateBuilder restTemplateBuilder) {
        this.restTemplateBuilder = restTemplateBuilder;
    }

    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = restTemplateBuilder.build(RestTemplate.class);
        restTemplate.getMessageConverters().add(new Wechat2HTTPConverter());
        return restTemplate;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值