package com.example.mini_program.service; import com.example.mini_program.config.WxMiniAppConfig; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; @Service public class WxLoginService { private static final Logger logger = LoggerFactory.getLogger(WxLoginService.class); private static final String JSCODE2SESSION_URL = "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code"; private final WxMiniAppConfig wxMiniAppConfig; private final RestTemplate restTemplate; public WxLoginService(WxMiniAppConfig wxMiniAppConfig, RestTemplate restTemplate) { this.wxMiniAppConfig = wxMiniAppConfig; this.restTemplate = restTemplate; } /** * 调用微信接口用code换取openid */ public WxLoginResult code2Session(String code) { String url = String.format(JSCODE2SESSION_URL, wxMiniAppConfig.getAppid(), wxMiniAppConfig.getSecret(), code); logger.info("调用微信jscode2session接口, code: {}", code); try { String response = restTemplate.getForObject(url, String.class); logger.info("微信返回原始结果: {}", response); JSONObject json = new JSONObject(response); WxLoginResult result = new WxLoginResult(); result.setOpenid(json.optString("openid")); result.setSessionKey(json.optString("session_key")); result.setUnionid(json.optString("unionid")); result.setErrcode(json.optString("errcode")); result.setErrmsg(json.optString("errmsg")); logger.info("解析后结果: openid={}, unionid={}, errcode={}", result.getOpenid(), result.getUnionid(), result.getErrcode()); return result; } catch (Exception e) { logger.error("调用微信接口失败", e); WxLoginResult errorResult = new WxLoginResult(); errorResult.setErrcode("-1"); errorResult.setErrmsg("系统错误: " + e.getMessage()); return errorResult; } } @Data public static class WxLoginResult { @JsonProperty("session_key") private String sessionKey; private String unionid; private String openid; private String errcode; private String errmsg; } }