|
@@ -0,0 +1,104 @@
|
|
|
+package com.flyer.foster.util;
|
|
|
+
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.flyer.exception.BusinessException;
|
|
|
+import com.flyer.foster.pojo.Code2SessionResp;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.http.HttpEntity;
|
|
|
+import org.springframework.http.HttpHeaders;
|
|
|
+import org.springframework.http.MediaType;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+import org.springframework.web.client.RestClientException;
|
|
|
+import org.springframework.web.client.RestTemplate;
|
|
|
+
|
|
|
+import javax.annotation.PostConstruct;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 微信小程序api工具类
|
|
|
+ */
|
|
|
+@Component
|
|
|
+@Slf4j
|
|
|
+public class WeChatApiUtil {
|
|
|
+ @Autowired
|
|
|
+ private RestTemplate restTemplate;
|
|
|
+
|
|
|
+ @PostConstruct
|
|
|
+ public void initRestTemplate() {
|
|
|
+ // 解决调用微信服务返回信息无法反序列化
|
|
|
+// restTemplate.getMessageConverters().add(new WxMappingJackson2HttpMessageConverter());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据code(临时调用凭证),请求微信api获取用户unionid
|
|
|
+ *
|
|
|
+ * @param code 前端调用微信登录接口生成的临时凭证
|
|
|
+ * @param appId 微信小程序的appId
|
|
|
+ * @param appSecret 小程序appId对应的秘钥
|
|
|
+ */
|
|
|
+ public Code2SessionResp getCode2Session(String code, String appId, String appSecret) {
|
|
|
+ String url = "https://api.weixin.qq.com/sns/jscode2session?appid={appid}&secret={secret}&js_code={code}&grant_type={authorization_code}";
|
|
|
+ HashMap<String, String> map = new HashMap<>();
|
|
|
+ map.put("appid", appId);
|
|
|
+ map.put("secret", appSecret);
|
|
|
+ map.put("code", code);
|
|
|
+ map.put("authorization_code", "authorization_code");
|
|
|
+ Code2SessionResp resp = new Code2SessionResp();
|
|
|
+ try {
|
|
|
+ resp = restTemplate.getForObject(url, Code2SessionResp.class, map);
|
|
|
+ } catch (RestClientException e) {
|
|
|
+ throw new BusinessException("调用微信服务错误");
|
|
|
+ }
|
|
|
+ return resp;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取微信调用凭证
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public String getAccessToken(String appId, String secret) {
|
|
|
+ String accessToken = null;
|
|
|
+ String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type={grantType}&appid={appId}&secret={secret}";
|
|
|
+ HashMap<String, String> map = new HashMap<>();
|
|
|
+ map.put("grantType", "client_credential");
|
|
|
+ map.put("appId", appId);
|
|
|
+ map.put("secret", secret);
|
|
|
+
|
|
|
+ JSONObject res;
|
|
|
+ try {
|
|
|
+ res = restTemplate.getForObject(url, JSONObject.class, map);
|
|
|
+ if (res != null) {
|
|
|
+ accessToken = String.valueOf(res.get("access_token"));
|
|
|
+ }
|
|
|
+ } catch (RestClientException e) {
|
|
|
+ throw new BusinessException("调用微信服务错误");
|
|
|
+ }
|
|
|
+
|
|
|
+ return accessToken;
|
|
|
+ }
|
|
|
+
|
|
|
+ public String getPhoneNumber(String appId, String appSecret, String code) {
|
|
|
+ String accessToken = this.getAccessToken(appId, appSecret);
|
|
|
+ String tel = "";
|
|
|
+ String url = StrUtil.format("https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token={}", accessToken);
|
|
|
+ try {
|
|
|
+ HttpHeaders headers = new HttpHeaders();
|
|
|
+ headers.setContentType(MediaType.APPLICATION_JSON);
|
|
|
+ HashMap<String, String> bodyParams = new HashMap<>();
|
|
|
+ bodyParams.put("code", code);
|
|
|
+ // 用HttpEntity封装整个请求报文
|
|
|
+ HttpEntity<Map<String, String>> httpEntity = new HttpEntity<>(bodyParams, headers);
|
|
|
+ JSONObject res = restTemplate.postForObject(url, httpEntity, JSONObject.class);
|
|
|
+ if (res != null) {
|
|
|
+ tel = res.getJSONObject("phone_info").getString("phoneNumber");
|
|
|
+ }
|
|
|
+ } catch (RestClientException e) {
|
|
|
+ throw new BusinessException("调用微信服务错误");
|
|
|
+ }
|
|
|
+ return tel;
|
|
|
+ }
|
|
|
+}
|