后端完成微信静默授权

  • 相关配置
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;
    }

}

你可能感兴趣的:(小程序,java,微信,java,开发语言)