java关注微信公众号登录

1、微信公众号配置类,采用springboot配置文件存储相关信息和密钥


@ConfigurationProperties(prefix = "wx.offiaccount")
@Component
@Slf4j
public class WxConfig {

    private String appSecret;//开发者密码(AppSecret)

    private String appId;//开发者ID(AppID)

    private String token;//令牌(Token)

    private String accessToken;

    private List<String> ipList;

    @Autowired
    private RestTemplate restTemplate;

    @PostConstruct
    public void init(){
        refreshAccessToken();
        refreshIPAddress();
    }

    public void refreshAccessToken(){
        String url = "https://api.weixin.qq.com/cgi-bin/token?";
        String grant_type = "client_credential";
        ResponseEntity<Map> responseEntity = restTemplate.getForEntity(url + "grant_type=" + grant_type + "&appid=" + appId + "&secret=" + appSecret, Map.class);
        Map body = responseEntity.getBody();
        accessToken = (String) body.get("access_token");
        log.info("accessToken refresh:{}",accessToken);
    }

    public void refreshIPAddress(){
        String url = "https://api.weixin.qq.com/cgi-bin/getcallbackip?";
        ResponseEntity<Map> res = restTemplate.getForEntity(url + "access_token=" + accessToken, Map.class);
        Map body = res.getBody();
        List<String> ips = (List<String>) body.get("ip_list");
        log.info("ip address:{}",ips);
        ipList = ips;
    }

    public void setAppSecret(String appSecret) {
        this.appSecret = appSecret;
    }

    public void setAppId(String appId) {
        this.appId = appId;
    }

    public void setToken(String token) {
        this.token = token;
    }

    public void setAccessToken(String accessToken) {
        this.accessToken = accessToken;
    }

    public String getAppSecret() {
        return appSecret;
    }

    public String getAppId() {
        return appId;
    }

    public String getToken() {
        return token;
    }

    public String getAccessToken() {
        return accessToken;
    }

    public List<String> getIpList() {
        return ipList;
    }

    public void setIpList(List<String> ipList) {
        this.ipList = ipList;
    }
}
accessToken有效期两个小时,项目启动后用@PostConstruct注解实现启动后自动执行初始化,可以用定时任务刷新,回调ip同理

2、接收微信回调消息,微信回调采用xml格式数据


    @ApiOperation("接收微信返回消息")
    @RequestMapping(value = "/getMsg",method = {RequestMethod.GET,RequestMethod.POST})
    public String msg(@RequestParam Map<String,String> param, HttpServletRequest request) throws IOException, DocumentException {
        String ip = ServletUtil.getClientIP(request);
        if (!wxConfig.getIpList().contains(ip)){
            log.info("非法IP:{}",ip);
            return "回调IP非法";
        }
        ServletInputStream inputStream = request.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String s = null;
        StringBuffer xmlData = new StringBuffer();
        while ((s = bufferedReader.readLine()) != null ){
            xmlData = xmlData.append(s);
        }
        log.info("微信消息:{}",param);
        log.info("微信推送:{}",xmlData);
        Document document = DocumentHelper.parseText(xmlData.toString());
        Element rootElement = document.getRootElement();
        Iterator iterator = rootElement.elementIterator();
        HashMap<String, String> msg = new HashMap<>();
        while (iterator.hasNext()){
            Element element = (Element) iterator.next();
            log.info("解析xml参数:key=>{},value=>{}",element.getName(),element.getTextTrim());
            msg.put(element.getName(),element.getTextTrim());
        }
        log.info("解析xml参数map:{}",msg);
        String openId = msg.get("FromUserName");
        String event = msg.get("Event");
        String eventKey = msg.get("EventKey");
        //关注行为 排除非扫码关注的情况:无eventKey
        if (WXEventEnum.SUBSCRIBE.getValue().equals(event) && StringUtils.isNotEmpty(eventKey)){
            String content = "公众号关注成功";
            wxApi.sendMsg(content,openId);
            //设置关注后的状态为1
            LambdaQueryWrapper<UserEntity> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(UserEntity::getOpenId,openId);
            int count = authService.count(queryWrapper);
            if (count > 0){
                LambdaUpdateWrapper<UserEntity> updateWrapper = new LambdaUpdateWrapper<>();
                updateWrapper.eq(UserEntity::getOpenId,openId).set(UserEntity::getWxSubscribe,BooleanEnum.TRUE.getCode());
                authService.update(updateWrapper);
            }
            redisTemplate.opsForValue().set(eventKey, openId, ConstantPool.QRSCENE_TIME, TimeUnit.MINUTES);
        }
        //扫码行为
        if (WXEventEnum.SCAN.getValue().equals(event)){
            redisTemplate.opsForValue().set(ConstantPool.QRSCENE + eventKey, openId, ConstantPool.QRSCENE_TIME, TimeUnit.MINUTES);
        }
        //取关  清除openId
        if (WXEventEnum.UNSUBSCRIBE.getValue().equals(event)){
            LambdaUpdateWrapper<UserEntity> updateWrapper = new LambdaUpdateWrapper<>();
            updateWrapper.eq(UserEntity::getOpenId,openId).set(UserEntity::getWxSubscribe,BooleanEnum.FALSE.getCode());
            authService.update(updateWrapper);
        }
        //1)将token、timestamp、nonce三个参数进行字典序排序


        // 微信加密签名,signature结合了开发者填写的 token 参数和请求中的 timestamp 参数、nonce参数。
        //timestamp	时间戳
        //nonce	随机数
        //echostr	随机字符串
//        String timestamp = param.get("timestamp");
//        String nonce = param.get("nonce");
//        String signature = param.get("signature");
//        String echostr = param.get("echostr");
//        ArrayList<String> list = new ArrayList<>();
//        list.add(wxConfig.getToken());
//        list.add(timestamp);
//        list.add(nonce);
//        log.info("排序前{}",list);
//        Collections.sort(list);
//        //2)将三个参数字符串拼接成一个字符串进行sha1加密
//        String ecryptStr = DigestUtils.sha1Hex(list.get(0) + list.get(1) + list.get(2));
//        log.info("加密后参数:{}",ecryptStr);
//        //3)开发者获得加密后的字符串可与 signature 对比,标识该请求来源于微信signature
//        if (StringUtils.equals(ecryptStr,signature)) {
//            log.info("参数相同");
//            return echostr;
//        }
        return null;
    }

消息接收枚举类

public enum WXEventEnum implements BaseEnum{
    SUBSCRIBE(0,"subscribe"),//订阅
    UNSUBSCRIBE(1,"unsubscribe"),//取消订阅
    SCAN(2,"SCAN") //扫码
    ;

    private int code;
    private String value;

    WXEventEnum(int code, String value) {
        this.code = code;
        this.value = value;
    }

    public String getValue(){
        return this.value;
    }

    @Override
    public int getCode() {
        return this.code;
    }
}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java实现微信公众号的关注登录可以通过调用微信开放平台的接口来实现。首先,需要在微信开放平台注册一个开发者账号,并创建一个应用。然后,使用Java开发框架可以通过发送HTTP请求来调用微信开放平台的接口。 在用户登录微信公众号时,首先需要引导用户点击关注按钮,跳转至微信登录授权页面。用户在页面中输入微信账号和密码,进行登录确认。然后根据微信开放平台提供的接口,获取用户的基本信息。Java中可以使用HttpClient或OkHttp等库来发送HTTP请求,获取用户登录的授权凭证access_token。 接下来,通过获取到的access_token,可以调用微信开放平台的接口来获取用户的详细信息,如用户名、头像等。具体调用的接口可以根据微信开放平台的文档进行选择和调用。 最后,将获取到的用户信息保存到数据库中,以便后续使用。在用户再次登录时,可以根据用户的微信账号来查询数据库中是否已存在该用户的信息,若存在则进行登录操作,若不存在则要求用户重新关注并进行登录授权。 总体来说,Java实现微信公众号的关注登录需要通过调用微信开放平台的接口来获取用户的授权凭证和详细信息,并将信息保存至数据库。在用户登录时,需要检查用户是否已关注并进行相应的登陆授权操作。这样,就可以实现Java微信公众关注登录的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值