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授权流程,实际应用中需要根据具体业务需求进行扩展和完善。

相关推荐
忧伤火锅麻辣烫16 小时前
Spark,RDD中的转换算子
笔记·微信
AI黑客5 天前
恶心的win11更新DIY 设置win11更新为100年
人工智能·游戏·微信·everything·火绒安全
开开心心就好11 天前
无限制文本转语音解决方案
开发语言·人工智能·macos·微信·pdf·c#·语音识别
JiDaoPay12 天前
如何解决 H5 远程收款的问题呢?
笔记·其他·微信
乔冠宇12 天前
Java使用微信云服务HTTP API操作微信云开发数据库
java·http·微信
JiDaoPay13 天前
如何选择游戏支付平台呢?
笔记·其他·微信
niech_cn14 天前
仿微信上传头像,实现拍摄、相册选择、手动缩放、裁剪、蒙版、撤回、还原、上传微信本地文件功能
微信·小程序
前端太佬16 天前
小程序登录与授权功能全解析:从原理到设计的实战指南 (2025年最新规范实践版)
前端·微信·微信小程序
前端太佬16 天前
微信公众号网页登录:前端视角下的技术实现精要
前端·javascript·微信
百锦再16 天前
Kotlin学习基础知识大全(上)
android·xml·学习·微信·kotlin·studio·mobile