springboot对接微信公众号获取头像和昵称

在Spring Boot中对接微信公众号以获取用户头像和昵称,主要涉及微信OAuth2.0网页授权流程。以下是详细步骤和代码示例:

1. 准备工作

  • 注册微信公众号(服务号)并完成开发者资质认证
  • 配置公众号网页授权域名(在公众号后台设置)
  • 获取AppID和AppSecret

2. 配置application.properties

ini 复制代码
wx.mp.appId=你的公众号AppID
wx.mp.appSecret=你的公众号AppSecret
wx.mp.callbackUrl=你的回调地址

3. 创建配置类

kotlin 复制代码
@Configuration
public class WeChatConfig {
    @Value("${wx.mp.appId}")
    private String appId;
    
    @Value("${wx.mp.appSecret}")
    private String appSecret;
    
    @Value("${wx.mp.callbackUrl}")
    private String callbackUrl;

    // 获取网页授权access_token的URL
    public static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token";
    // 获取用户信息的URL
    public static final String USER_INFO_URL = "https://api.weixin.qq.com/sns/userinfo";
}

4. 授权流程实现

步骤1:生成授权URL

kotlin 复制代码
@RestController
@RequestMapping("/wechat")
public class WeChatController {

    @Autowired
    private WeChatConfig weChatConfig;

    @GetMapping("/auth")
    public String auth() throws UnsupportedEncodingException {
        String redirectUri = URLEncoder.encode(weChatConfig.getCallbackUrl(), "UTF-8");
        return "redirect:https://open.weixin.qq.com/connect/oauth2/authorize?" +
                "appid=" + weChatConfig.getAppId() +
                "&redirect_uri=" + redirectUri +
                "&response_type=code" +
                "&scope=snsapi_userinfo" +  // 需要获取用户信息时使用snsapi_userinfo
                "&state=STATE#wechat_redirect";
    }
}

步骤2:处理回调(获取code)

typescript 复制代码
@GetMapping("/callback")
public String callback(@RequestParam("code") String code,
                       @RequestParam(value = "state", required = false) String state) {
    // 1. 使用code获取access_token和openid
    Map<String, String> accessTokenMap = getAccessToken(code);
    
    // 2. 使用access_token和openid获取用户信息
    Map<String, Object> userInfo = getUserInfo(accessTokenMap.get("access_token"), 
                                             accessTokenMap.get("openid"));
    
    // 处理用户信息(示例返回)
    return "用户信息:" + userInfo.toString();
}

private Map<String, String> getAccessToken(String code) {
    String url = WeChatConfig.ACCESS_TOKEN_URL +
            "?appid=" + weChatConfig.getAppId() +
            "&secret=" + weChatConfig.getAppSecret() +
            "&code=" + code +
            "&grant_type=authorization_code";

    RestTemplate restTemplate = new RestTemplate();
    String response = restTemplate.getForObject(url, String.class);
    return JSON.parseObject(response, Map.class);
}

private Map<String, Object> getUserInfo(String accessToken, String openid) {
    String url = WeChatConfig.USER_INFO_URL +
            "?access_token=" + accessToken +
            "&openid=" + openid +
            "&lang=zh_CN";

    RestTemplate restTemplate = new RestTemplate();
    String response = restTemplate.getForObject(url, String.class);
    return JSON.parseObject(response, Map.class);
}

5. 用户信息响应示例

成功响应示例:

json 复制代码
{
    "openid": "OPENID",
    "nickname": "NICKNAME",
    "sex": 1,
    "province":"PROVINCE",
    "city":"CITY",
    "country":"COUNTRY",
    "headimgurl": "http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
    "privilege": ["PRIVILEGE1", "PRIVILEGE2"]
}

6. 注意事项

  1. 域名备案:回调域名必须与公众号后台配置的网页授权域名一致
  2. URL编码:redirect_uri需要URLEncode处理
  3. 安全验证:实际生产环境应验证state参数防止CSRF攻击
  4. 异常处理:需要处理微信接口返回的错误码(如40029无效code)
  5. HTTPS:正式环境需要使用HTTPS协议
  6. 存储用户信息:建议将获取的用户信息存储到数据库或session中

7. 常见错误处理

  • 40163:code已被使用,确保code只能使用一次
  • 40029:无效code,检查code是否正确且未过期
  • 48001:未授权该API,检查公众号权限设置

完整实现时建议:

  1. 添加异常处理机制
  2. 使用HTTP客户端工具类(如OkHttp)
  3. 添加日志记录
  4. 使用Redis缓存access_token(注意网页授权的access_token与普通access_token不同)

以上代码示例展示了基本的微信OAuth2.0授权流程,实际应用中需要根据具体业务需求进行扩展和完善。

相关推荐
劫大大4 小时前
前端开发公众号或服务号,本地怎么与后端测试服接口打通呢
前端·微信
追逐时光者2 天前
推荐 2 款简洁美观的微信公众号 Markdown 编辑器,让你不再为微信内容排版而发愁!
微信
陈思杰系统思考Jason5 天前
系统思考:经济反馈的循环
百度·微信·微信公众平台·新浪微博·微信开放平台
天朝八阿哥6 天前
PC上多开微信的方法
linux·windows·微信
悟空码字6 天前
微信公众号开发文档,这谁写的,要扣绩效吧
微信
avoidaily7 天前
vue2使用v-viewer图片预览:打开页面自动预览,禁止关闭预览,解决在微信浏览器的页面点击事件老是触发预览初始化的问题
微信
Kiri霧9 天前
Kotlin内联函数
android·开发语言·微信·kotlin
Kiri霧9 天前
Kotlin比较接口
android·java·前端·微信·kotlin
sunly_11 天前
Flutter:上传图片,选择相机或相册:wechat_assets_picker
数码相机·flutter·微信
陈思杰系统思考Jason12 天前
系统思考场景应用
百度·微信·微信公众平台·新浪微博·微信开放平台