用户关注公众号并进行消息推送

微信开发文档:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html

1. 先在配置文件中进行配置

# 微信公众号配置
wx:
  appid: wx2904694ea2XXXXX
  secret: c1f3dcb6fa8949db30XXXXXXXXXXXX

2. 引入JSON依赖

<!-- 阿里JSON解析器 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.70</version>
</dependency>

3. 编写接口

package com.xxx.service;

public interface WXService {

    // 通过code换取OpenId
    String getOpenId(String code);
    
    // 获取token
    String getBaseToken();

    // 判断是否关注公众号
    String getSubscribe(String openid, String accessToken);
}

4. 实现接口

package com.upmsproj.wp.wx.service.impl;

@Service
@RequiredArgsConstructor
@Transactional
@Slf4j
public class WXServiceImpl implements WXService {

    @Value("${wx.appid}")
    private String appid;

    @Value("${wx.secret}")
    private String secret;

    private final RestTemplate restTemplate;


    @Override
    public String getOpenId(String code) {
        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appid
                + "&secret=" + secret + "&code=" + code + "&grant_type=authorization_code";
        String forObject = restTemplate.getForObject(url, String.class);
        JSONObject jsonObject = JSON.parseObject(forObject);
        String openid = jsonObject.getString("openid");
        log.info("用户AccessToken:" + forObject);
        return openid;
    }

    @Override
    public String getBaseToken() {
        // https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" +
                "&appid=" + appid + "&secret=" + secret;
        String forObject = restTemplate.getForObject(url, String.class);
        log.info("baseToken:" + forObject);
        JSONObject jsonObject = JSON.parseObject(forObject);
        return jsonObject.getString("access_token");
    }

    @Override
    public String getSubscribe(String openid, String accessToken) {
        // https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
        String userInfoUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token="
                + accessToken + "&openid=" + openid + "&lang=zh_CN";
        String forObject = restTemplate.getForObject(userInfoUrl, String.class);
        JSONObject jsonObject = JSON.parseObject(forObject);
        log.info("是否关注公众号:" + forObject);
        Integer subscribe = jsonObject.getInteger("subscribe");
        if (subscribe == 1){
            // 如果已经关注公众号返回昵称
            return jsonObject.getString("nickname");
        }
        return null;
    }

}

5. 控制层实现

package com.upmsproj.wp.wx.controller;

@Api(tags = "微信公众号获取信息")
@RequiredArgsConstructor
@RequestMapping("wx")
@Slf4j
@Controller
public class WXController {

    private final WXService wxService;

    @ApiOperation(value = "扫码绑定")
    @GetMapping("login")
    public String login(@RequestParam String code, @RequestParam String state) {
        String openId = wxService.getOpenId(code);
        String baseToken = wxService.getBaseToken();
        String nickname = wxService.getSubscribe(openId, baseToken);

        // 如果还没进行关注
        if (nickname == null) {
            log.info("还没关注");
            return "wxFail";
        }
        // state传递用户Kid
        wxService.updateUserInfo(state, openId, nickname);
        return "wxSuccess";
    }

}

6. Controller 获取 code 和 state

文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html

# 案例:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=重定向URL(使用 urlEncode 对链接进行处理)&response_type=code&scope=snsapi_base&state=自定义携带参数&connect_redirect=1#wechat_redirect

# 完整写法:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=https%3A%2F%2Fchong.qq.com%2Fphp%2Findex.php%3Fd%3D%26c%3DwxAdapter%26m%3DmobileDeal%26showwxpaytitle%3D1%26vb2ctag%3D4_2030_5_1194_60&response_type=code&scope=snsapi_base&state=123#wechat_redirect

# 在微信中进行访问后会进行跳转到指定的URL:
指定的重定向URL?code=043HmHkl2BYmO741SYkl2qRaRR1HmHk6&state=123#/index
其中:code和state为我们想要的参数值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值