调整微信公众号,新增微信小程序认证

This commit is contained in:
wenc000 2020-05-09 19:32:56 +08:00
parent 7c54f28631
commit a02eda5349
12 changed files with 578 additions and 33 deletions

View File

@ -1,7 +1,9 @@
package com.cm.common.wechat.config;
import com.cm.common.constants.ISystemConstant;
import com.cm.common.wechat.config.pojo.WechatOfficialAccountProperties;
import com.cm.common.wechat.filter.WechatFilter;
import com.cm.common.wechat.filter.WechatMiniAppFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
@ -21,9 +23,6 @@ import org.springframework.context.annotation.Configuration;
@Configuration
public class WechatFilterConfig {
@Value(value = "${open-platform.wechat.apiCrossOrigin}")
private Boolean apiCrossOrigin;
@Autowired
private WechatOfficialAccountProperties wechatOfficialAccountProperties;
@ -31,14 +30,25 @@ public class WechatFilterConfig {
public FilterRegistrationBean wechatFilterRegister() {
WechatFilter wechatFilter = new WechatFilter();
wechatFilter.setWechatOfficialAccountProperties(wechatOfficialAccountProperties);
wechatFilter.setApiCrossOrigin(apiCrossOrigin);
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(wechatFilter);
filterRegistrationBean.addUrlPatterns("/wechat/*", "/wechatroute/*");
filterRegistrationBean.addUrlPatterns(ISystemConstant.WECHAT_PREFIX + "/*", ISystemConstant.WECHAT_ROUTE_PREFIX + "/*");
filterRegistrationBean.setName("wechatFilter");
filterRegistrationBean.setOrder(1);
return filterRegistrationBean;
}
@Bean
public FilterRegistrationBean wechatMiniAppRegister() {
WechatMiniAppFilter wechatMiniAppFilter = new WechatMiniAppFilter();
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(wechatMiniAppFilter);
filterRegistrationBean.addUrlPatterns(ISystemConstant.WECHAT_MINI_APP_PREFIX + "/*");
filterRegistrationBean.setName("wechatMiniAppFilter");
filterRegistrationBean.setOrder(1);
return filterRegistrationBean;
}
}

View File

@ -0,0 +1,104 @@
package com.cm.common.wechat.config.pojo;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* When you feel like quitting. Think about why you started
* 当你想要放弃的时候想想当初你为何开始
*
* @ClassName: WechatMiniProgramProperties
* @Description: 微信小程序
* @Author: WangGeng
* @Date: 2020/5/9 15:50
* @Version: 1.0
**/
@Configuration
@ConfigurationProperties(prefix = "open-platform.wechat.mini-app")
public class WechatMiniAppProperties {
private Boolean active;
private String authorizeUrl;
private String bindUserUrl;
private String grantType;
private String appKey;
private String appSecret;
private String configToken;
public Boolean getActive() {
return active;
}
public void setActive(Boolean active) {
this.active = active;
}
public String getAuthorizeUrl() {
return authorizeUrl == null ? "" : authorizeUrl;
}
public void setAuthorizeUrl(String authorizeUrl) {
this.authorizeUrl = authorizeUrl;
}
public String getBindUserUrl() {
return bindUserUrl == null ? "" : bindUserUrl;
}
public void setBindUserUrl(String bindUserUrl) {
this.bindUserUrl = bindUserUrl;
}
public String getGrantType() {
return grantType == null ? "" : grantType;
}
public void setGrantType(String grantType) {
this.grantType = grantType;
}
public String getAppKey() {
return appKey == null ? "" : appKey;
}
public void setAppKey(String appKey) {
this.appKey = appKey;
}
public String getAppSecret() {
return appSecret == null ? "" : appSecret;
}
public void setAppSecret(String appSecret) {
this.appSecret = appSecret;
}
public String getConfigToken() {
return configToken == null ? "" : configToken;
}
public void setConfigToken(String configToken) {
this.configToken = configToken;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("{");
sb.append("\"active\":")
.append(active);
sb.append(",\"authorizeUrl\":\"")
.append(authorizeUrl).append('\"');
sb.append(",\"bindUserUrl\":\"")
.append(bindUserUrl).append('\"');
sb.append(",\"grantType\":\"")
.append(grantType).append('\"');
sb.append(",\"appKey\":\"")
.append(appKey).append('\"');
sb.append(",\"appSecret\":\"")
.append(appSecret).append('\"');
sb.append(",\"configToken\":\"")
.append(configToken).append('\"');
sb.append('}');
return sb.toString();
}
}

View File

@ -18,6 +18,7 @@ import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "open-platform.wechat.official-account")
public class WechatOfficialAccountProperties {
private Boolean apiCrossOrigin;
private Boolean activate;
private WechatOfficialAccountAuthorizeProperties authorize;
private String accessTokenUrl;
@ -27,6 +28,14 @@ public class WechatOfficialAccountProperties {
private String grantType;
private String configToken;
public Boolean getApiCrossOrigin() {
return apiCrossOrigin;
}
public void setApiCrossOrigin(Boolean apiCrossOrigin) {
this.apiCrossOrigin = apiCrossOrigin;
}
public Boolean getActivate() {
return activate;
}
@ -94,22 +103,24 @@ public class WechatOfficialAccountProperties {
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("{");
sb.append("\"activate\":")
sb.append("\"apiCrossOrigin\":")
.append(apiCrossOrigin);
sb.append(",\"activate\":")
.append(activate);
sb.append(",\"authorize\":")
.append(authorize);
sb.append(",\"accessTokenUrl\":")
.append("\"").append(accessTokenUrl).append("\"");
sb.append(",\"bindUserUrl\":")
.append("\"").append(bindUserUrl).append("\"");
sb.append(",\"appId\":")
.append("\"").append(appId).append("\"");
sb.append(",\"appSecret\":")
.append("\"").append(appSecret).append("\"");
sb.append(",\"grantType\":")
.append("\"").append(grantType).append("\"");
sb.append(",\"configToken\":")
.append("\"").append(configToken).append("\"");
sb.append(",\"accessTokenUrl\":\"")
.append(accessTokenUrl).append('\"');
sb.append(",\"bindUserUrl\":\"")
.append(bindUserUrl).append('\"');
sb.append(",\"appId\":\"")
.append(appId).append('\"');
sb.append(",\"appSecret\":\"")
.append(appSecret).append('\"');
sb.append(",\"grantType\":\"")
.append(grantType).append('\"');
sb.append(",\"configToken\":\"")
.append(configToken).append('\"');
sb.append('}');
return sb.toString();
}

View File

@ -0,0 +1,36 @@
package com.cm.common.wechat.controller;
import com.cm.common.annotation.CheckRequestBodyAnnotation;
import com.cm.common.constants.ISystemConstant;
import com.cm.common.result.SuccessResultData;
import com.cm.common.wechat.pojo.WechatMiniAppLoginVO;
import com.cm.common.wechat.service.IWechatMiniAppAuthService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* When you feel like quitting. Think about why you started
* 当你想要放弃的时候想想当初你为何开始
*
* @ClassName: WechatMiniAppSignController
* @Description: 微信小程序登录
* @Author: WangGeng
* @Date: 2020/5/9 18:08
* @Version: 1.0
**/
@Api(tags = ISystemConstant.API_TAGS_WECHAT_MINI_APP_PREFIX + "小程序认证")
@RestController
@RequestMapping(ISystemConstant.WECHAT_MINI_APP_PREFIX + "/auth")
public class WechatMiniAppAuthController {
@Autowired
private IWechatMiniAppAuthService wechatMiniAppAuthService;
@PostMapping("login")
@CheckRequestBodyAnnotation
public SuccessResultData login(@RequestBody WechatMiniAppLoginVO wechatMiniAppLoginVO) throws Exception {
return wechatMiniAppAuthService.login(wechatMiniAppLoginVO);
}
}

View File

@ -41,29 +41,28 @@ public class WechatFilter implements Filter {
private static final Logger LOG = LoggerFactory.getLogger(WechatFilter.class);
private WechatOfficialAccountProperties wechatOfficialAccountProperties;
private Boolean apiCrossOrigin;
private AntPathMatcher antPathMatcher;
private static final String WECHAT_LOGIN_URL = "/**/wechat/sign/login";
private static final String WECHAT_LOGIN_URL = String.format("/**%s/sign/login", ISystemConstant.WECHAT_PREFIX);
/**
* 微信类放行
*/
private static final String WECHAT_RELEASE_URL = "/**/wechatrelease/**";
private static final String WECHAT_RELEASE_URL = String.format("/**%s%s/**", ISystemConstant.WECHAT_PREFIX, ISystemConstant.RELEASE_SUFFIX);
/**
* 微信放行
*/
private static final String WECHAT_API_RELEASE_URL = "/**/wechat/**/**release/**";
private static final String WECHAT_API_RELEASE_URL = String.format("/**%s/**/**%s/**", ISystemConstant.WECHAT_PREFIX, ISystemConstant.RELEASE_SUFFIX);
/**
* 微信路由放行
*/
private static final String WECHAT_ROUTE_RELEASE_URL = "/**/wechatroute/**/**release/**";
private static final String WECHAT_ROUTE_RELEASE_URL = String.format("/**%s/**/**%s/**", ISystemConstant.WECHAT_ROUTE_PREFIX, ISystemConstant.RELEASE_SUFFIX);
/**
* 微信路由静态资源
*/
private static final String WECHAT_ROUTE_STATIC_URL = "/**/wechatroute/static/**";
private static final String WECHAT_ROUTE_CSS_URL = "/**/wechatroute/css/**";
private static final String WECHAT_ROUTE_JS_URL = "/**/wechatroute/js/**";
private static final String WECHAT_ROUTE_IMAGES_URL = "/**/wechatroute/images/**";
private static final String WECHAT_ROUTE_STATIC_URL = String.format("/**%s/static/**", ISystemConstant.WECHAT_ROUTE_PREFIX);
private static final String WECHAT_ROUTE_CSS_URL = String.format("/**%s/css/**", ISystemConstant.WECHAT_ROUTE_PREFIX);
private static final String WECHAT_ROUTE_JS_URL = String.format("/**%s/js/**", ISystemConstant.WECHAT_ROUTE_PREFIX);
private static final String WECHAT_ROUTE_IMAGES_URL = String.format("/**%s/images/**", ISystemConstant.WECHAT_ROUTE_PREFIX);
/**
* 上传文件
*/
@ -79,7 +78,7 @@ public class WechatFilter implements Filter {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
if (apiCrossOrigin != null && apiCrossOrigin) {
if (wechatOfficialAccountProperties.getApiCrossOrigin() != null && wechatOfficialAccountProperties.getApiCrossOrigin()) {
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Credentials", "true");
@ -228,10 +227,6 @@ public class WechatFilter implements Filter {
this.wechatOfficialAccountProperties = wechatOfficialAccountProperties;
}
public void setApiCrossOrigin(Boolean apiCrossOrigin) {
this.apiCrossOrigin = apiCrossOrigin;
}
/**
* 错误返回
*

View File

@ -0,0 +1,119 @@
package com.cm.common.wechat.filter;
import com.alibaba.fastjson.JSON;
import com.cm.common.constants.ISystemConstant;
import com.cm.common.enums.AppTokenTypeEnum;
import com.cm.common.enums.ErrorResultCodeEnum;
import com.cm.common.exception.TokenException;
import com.cm.common.result.ErrorResult;
import com.cm.common.token.app.AppTokenManager;
import com.cm.common.token.app.entity.AppToken;
import com.cm.common.token.app.entity.AppTokenUser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.StringUtils;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* When you feel like quitting. Think about why you started
* 当你想要放弃的时候想想当初你为何开始
*
* @ClassName: MiniProgramFilter
* @Description: 小程序过滤器
* @Author: WangGeng
* @Date: 2020/5/9 16:06
* @Version: 1.0
**/
public class WechatMiniAppFilter implements Filter {
private static final Logger LOG = LoggerFactory.getLogger(WechatMiniAppFilter.class);
private AntPathMatcher antPathMatcher;
private static final String WECHAT_MINI_APP_LOGIN_URL = String.format("/**%s/auth/login", ISystemConstant.WECHAT_MINI_APP_PREFIX);
/**
* 微信类放行
*/
private static final String WECHAT_MINI_APP_RELEASE_URL = String.format("/**%s%s/**", ISystemConstant.WECHAT_MINI_APP_PREFIX, ISystemConstant.APP_RELEASE_SUFFIX);
/**
* 微信放行
*/
private static final String WECHAT_API_MINI_APP_RELEASE_URL = String.format("/**%s/**/**%s/**", ISystemConstant.WECHAT_MINI_APP_PREFIX, ISystemConstant.APP_RELEASE_SUFFIX);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
antPathMatcher = new AntPathMatcher();
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String requestUri = request.getRequestURI();
boolean isLogin = antPathMatcher.match(WECHAT_MINI_APP_LOGIN_URL, requestUri);
if (isLogin) {
return;
}
boolean isRelease = antPathMatcher.match(WECHAT_MINI_APP_RELEASE_URL, requestUri) ||
antPathMatcher.match(WECHAT_API_MINI_APP_RELEASE_URL, requestUri);
if (isRelease) {
filterChain.doFilter(request, response);
return;
}
String token = request.getHeader("token");
if (StringUtils.isEmpty(token)) {
errorResponse(response, "token不能为空");
return;
}
LOG.debug("校验token");
try {
checkToken(token);
} catch (TokenException e) {
errorResponse(response, e.getMessage());
return;
}
filterChain.doFilter(request, response);
}
@Override
public void destroy() {
}
private void checkToken(String token) throws TokenException {
AppTokenManager appTokenManager = AppTokenManager.getInstance();
LOG.debug("检查token是否存在");
AppToken appToken = appTokenManager.getToken(token);
if (appToken != null) {
return;
}
LOG.debug("解析token是否合法");
AppTokenUser appTokenUser = appTokenManager.parseToAppTokenUser(token);
appTokenManager.addToken(token, AppTokenTypeEnum.WECHAT_MINI_APP, appTokenUser);
}
/**
* 错误返回
*
* @param response
* @param errorInfo
* @throws IOException
*/
private void errorResponse(HttpServletResponse response, String errorInfo) throws IOException {
response.setStatus(HttpStatus.BAD_REQUEST.value());
response.setHeader("Content-Type", "application/json;charset=UTF-8");
ErrorResult result = new ErrorResult(ErrorResultCodeEnum.PARAMS_ERROR.getValue(), errorInfo);
response.getWriter().write(JSON.toJSONString(result));
}
}

View File

@ -0,0 +1,27 @@
package com.cm.common.wechat.manager.miniapp;
import com.cm.common.wechat.config.pojo.WechatMiniAppProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* When you feel like quitting. Think about why you started
* 当你想要放弃的时候想想当初你为何开始
*
* @ClassName: WechatMiniAppManager
* @Description: 微信小程序管理
* @Author: WangGeng
* @Date: 2020/5/9 18:05
* @Version: 1.0
**/
public class WechatMiniAppManager {
private static final Logger LOG = LoggerFactory.getLogger(WechatMiniAppManager.class);
private WechatMiniAppProperties wechatMiniAppProperties;
public void setWechatMiniAppProperties(WechatMiniAppProperties wechatMiniAppProperties) {
this.wechatMiniAppProperties = wechatMiniAppProperties;
}
}

View File

@ -46,7 +46,8 @@ public class WechatOfficialAccountManager {
private String accessToken;
private long updateTime = 0L;
private WechatOfficialAccountManager() {}
private WechatOfficialAccountManager() {
}
public static WechatOfficialAccountManager getInstance() {
return wechatOfficialAccountManager;

View File

@ -0,0 +1,40 @@
package com.cm.common.wechat.pojo;
import com.cm.common.annotation.CheckEmptyAnnotation;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/**
* When you feel like quitting. Think about why you started
* 当你想要放弃的时候想想当初你为何开始
*
* @ClassName: WechatMiniProgramLoginVO
* @Description: 小程序登录VO
* @Author: WangGeng
* @Date: 2020/5/9 18:12
* @Version: 1.0
**/
@ApiModel
public class WechatMiniAppLoginVO {
@ApiModelProperty(name = "jsCode", value = "临时code")
@CheckEmptyAnnotation(name = "jsCode")
private String jsCode;
public String getJsCode() {
return jsCode == null ? "" : jsCode;
}
public void setJsCode(String jsCode) {
this.jsCode = jsCode;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("{");
sb.append("\"jsCode\":\"")
.append(jsCode).append('\"');
sb.append('}');
return sb.toString();
}
}

View File

@ -0,0 +1,77 @@
package com.cm.common.wechat.pojo;
/**
* When you feel like quitting. Think about why you started
* 当你想要放弃的时候想想当初你为何开始
*
* @ClassName: WechatMiniAppUserInfo
* @Description: 微信小程序用户信息
* @Author: WangGeng
* @Date: 2020/5/9 18:29
* @Version: 1.0
**/
public class WechatMiniAppUserInfo {
private String openid;
private String session_key;
private String unionid;
private Integer errcode;
private String errmsg;
public String getOpenid() {
return openid == null ? "" : openid;
}
public void setOpenid(String openid) {
this.openid = openid;
}
public String getSession_key() {
return session_key == null ? "" : session_key;
}
public void setSession_key(String session_key) {
this.session_key = session_key;
}
public String getUnionid() {
return unionid == null ? "" : unionid;
}
public void setUnionid(String unionid) {
this.unionid = unionid;
}
public Integer getErrcode() {
return errcode;
}
public void setErrcode(Integer errcode) {
this.errcode = errcode;
}
public String getErrmsg() {
return errmsg == null ? "" : errmsg;
}
public void setErrmsg(String errmsg) {
this.errmsg = errmsg;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("{");
sb.append("\"openid\":\"")
.append(openid).append('\"');
sb.append(",\"session_key\":\"")
.append(session_key).append('\"');
sb.append(",\"unionid\":\"")
.append(unionid).append('\"');
sb.append(",\"errcode\":\"")
.append(errcode).append('\"');
sb.append(",\"errmsg\":\"")
.append(errmsg).append('\"');
sb.append('}');
return sb.toString();
}
}

View File

@ -0,0 +1,28 @@
package com.cm.common.wechat.service;
import com.cm.common.exception.SaveException;
import com.cm.common.exception.SearchException;
import com.cm.common.exception.TokenException;
import com.cm.common.result.SuccessResultData;
import com.cm.common.wechat.pojo.WechatMiniAppLoginVO;
/**
* When you feel like quitting. Think about why you started
* 当你想要放弃的时候想想当初你为何开始
*
* @ClassName: IWechatMiniAppAuthService
* @Description: 小程序认证
* @Author: WangGeng
* @Date: 2020/5/9 18:16
* @Version: 1.0
**/
public interface IWechatMiniAppAuthService {
/**
* 登录
*
* @param wechatMiniAppLoginVO
* @return
* @throws TokenException
*/
SuccessResultData login(WechatMiniAppLoginVO wechatMiniAppLoginVO) throws Exception;
}

View File

@ -0,0 +1,97 @@
package com.cm.common.wechat.service.impl;
import com.cm.common.exception.SearchException;
import com.cm.common.exception.WechatAccessTokenForUserException;
import com.cm.common.exception.WechatUserInfoException;
import com.cm.common.exception.base.SystemException;
import com.cm.common.result.SuccessResultData;
import com.cm.common.utils.AesUtil;
import com.cm.common.wechat.config.pojo.WechatMiniAppProperties;
import com.cm.common.wechat.pojo.WechatMiniAppLoginVO;
import com.cm.common.wechat.pojo.WechatMiniAppUserInfo;
import com.cm.common.wechat.pojo.WechatOfficialAccountUserInfo;
import com.cm.common.wechat.service.IWechatMiniAppAuthService;
import org.apache.commons.codec.binary.Base64;
import org.codehaus.jackson.map.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* When you feel like quitting. Think about why you started
* 当你想要放弃的时候想想当初你为何开始
*
* @ClassName: WechatMiniAppAuthServiceImpl
* @Description: 小程序认证
* @Author: WangGeng
* @Date: 2020/5/9 18:16
* @Version: 1.0
**/
@Service
public class WechatMiniAppAuthServiceImpl implements IWechatMiniAppAuthService {
private static final Logger LOG = LoggerFactory.getLogger(WechatMiniAppAuthServiceImpl.class);
@Autowired
private WechatMiniAppProperties wechatMiniAppProperties;
@Override
public SuccessResultData login(WechatMiniAppLoginVO wechatMiniAppLoginVO) throws Exception {
if (wechatMiniAppProperties == null) {
throw new SystemException("未有相关配置");
}
Map<String, Object> params = new HashMap<>(2);
params.put("appid", wechatMiniAppProperties.getAppKey());
params.put("secret", wechatMiniAppProperties.getAppSecret());
params.put("js_code", wechatMiniAppLoginVO.getJsCode());
params.put("grant_type", wechatMiniAppProperties.getGrantType());
StringBuilder url = new StringBuilder(wechatMiniAppProperties.getAuthorizeUrl());
url.append("?appid={appid}&secret={secret}&js_code={js_code}&grant_type={grant_type}");
RestTemplate restTemplate = new RestTemplate();
String resultJson = restTemplate.getForObject(url.toString(), String.class, params);
WechatMiniAppUserInfo wechatMiniAppUserInfo = new ObjectMapper().readValue(resultJson, WechatMiniAppUserInfo.class);
if (wechatMiniAppUserInfo == null) {
throw new WechatUserInfoException("获取微信用户信息失败");
}
if (wechatMiniAppUserInfo.getErrcode() != null && wechatMiniAppUserInfo.getErrcode() != 0) {
throw new WechatAccessTokenForUserException(String.format("获取用户信息失败,错误码:%s错误信息%s", wechatMiniAppUserInfo.getErrcode(), wechatMiniAppUserInfo.getErrmsg()));
}
LOG.debug("绑定用户 | 登录");
String wechatSignInfo = Base64.encodeBase64String(AesUtil.aesCommonEncoder("WECHAT_SIGN_INFO", new StringBuilder(wechatMiniAppUserInfo.getOpenid()).append("_WenG_").append(wechatMiniAppProperties.getAppKey()).toString()).getBytes("UTF-8"));
String token = getAppToken(wechatSignInfo);
return new SuccessResultData(token);
}
/**
* 获取token
*
* @param wechatSignInfo
* @return
*/
public String getAppToken(String wechatSignInfo) {
RestTemplate restTemplate = new RestTemplate();
Map<String, Object> params = new HashMap<>(1);
params.put("signInfo", wechatSignInfo);
HttpEntity<Map<String, Object>> requestBody = new HttpEntity<>(params);
ResponseEntity<Map> result = restTemplate.postForEntity(wechatMiniAppProperties.getBindUserUrl(), requestBody, Map.class);
LOG.debug("状态码:{}", result.getStatusCodeValue());
if (HttpStatus.OK.value() != result.getStatusCodeValue()) {
throw new SearchException("获取Token失败");
}
Map body = result.getBody();
return (String) body.get("data");
}
}