From 6cf376c0d245bdf8c1941d5ed290f422908e967f Mon Sep 17 00:00:00 2001 From: chen-xin-zhi <3588068430@qq.com> Date: Sun, 3 Nov 2024 14:49:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=BA=86=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 13 ++ .../controller/user/WeChatController.java | 72 ++++++++++ .../model/dto/coupon/CouponAddRequest.java | 9 +- .../heritage/utils/HttpClientUtil.java | 134 ++++++++++++++++++ .../cultural/heritage/utils/WeChatUtil.java | 27 ++++ src/main/resources/application.yml | 4 + 6 files changed, 257 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/cultural/heritage/controller/user/WeChatController.java create mode 100644 src/main/java/com/cultural/heritage/utils/HttpClientUtil.java create mode 100644 src/main/java/com/cultural/heritage/utils/WeChatUtil.java diff --git a/pom.xml b/pom.xml index 04c6d20..71045ee 100644 --- a/pom.xml +++ b/pom.xml @@ -150,6 +150,19 @@ + + + org.apache.httpcomponents + httpclient + 4.5.2 + + + + com.alibaba + fastjson + 1.2.62 + + diff --git a/src/main/java/com/cultural/heritage/controller/user/WeChatController.java b/src/main/java/com/cultural/heritage/controller/user/WeChatController.java new file mode 100644 index 0000000..97188ed --- /dev/null +++ b/src/main/java/com/cultural/heritage/controller/user/WeChatController.java @@ -0,0 +1,72 @@ +package com.cultural.heritage.controller.user; + + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.cultural.heritage.common.BaseResponse; +import com.cultural.heritage.model.entity.User; +import com.cultural.heritage.model.vo.UserVO; +import com.cultural.heritage.service.user.UserService; +import com.cultural.heritage.utils.WeChatUtil; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.digest.DigestUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/wx") +@Slf4j +@Tag(name = "微信登录接口") +public class WeChatController { + + + @Resource + private UserService userService; + + + + @PostMapping("/wx/login") + public BaseResponse user_login(@RequestParam(value = "code", required = false) String code, + @RequestParam(value = "rawData", required = false) String rawData, + @RequestParam(value = "signature", required = false) String signature) { + // 用户非敏感信息:rawData + // 签名:signature + JSONObject rawDataJson = JSON.parseObject(rawData); + // 1.接收小程序发送的code + // 2.开发者服务器 登录凭证校验接口 appi + appsecret + code + JSONObject SessionKeyOpenId = WeChatUtil.getSessionKeyOrOpenId(code); + // 3.接收微信接口服务 获取返回的参数 + String openid = SessionKeyOpenId.getString("openid"); + String sessionKey = SessionKeyOpenId.getString("session_key"); + + // 4.校验签名 小程序发送的签名signature与服务器端生成的签名signature2 = sha1(rawData + sessionKey) + String signature2 = DigestUtils.sha1Hex(rawData + sessionKey); + if (!signature.equals(signature2)) { +// return ResultUtils.success(ErrorCode.PARAMS_ERROR, "签名校验失败"); + } + // 5.根据返回的User实体类,判断用户是否是新用户,是的话,将用户信息存到数据库; + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(User::getMiniOpenId, openid); + User user = userService.getOne(lqw); + if (user == null) { + // 用户信息入库 + String nickName = rawDataJson.getString("nickName"); + String avatarUrl = rawDataJson.getString("avatarUrl"); + user = new User(); + user.setMiniOpenId(openid); + user.setUserAvatar(avatarUrl); + user.setUserName(nickName); + userService.save(user); + } +// return R.ok().data(user); + return null; + } + + +} diff --git a/src/main/java/com/cultural/heritage/model/dto/coupon/CouponAddRequest.java b/src/main/java/com/cultural/heritage/model/dto/coupon/CouponAddRequest.java index 21aa479..5075c50 100644 --- a/src/main/java/com/cultural/heritage/model/dto/coupon/CouponAddRequest.java +++ b/src/main/java/com/cultural/heritage/model/dto/coupon/CouponAddRequest.java @@ -1,7 +1,5 @@ package com.cultural.heritage.model.dto.coupon; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import java.io.Serial; @@ -62,6 +60,13 @@ public class CouponAddRequest implements Serializable { */ private Date endTime; + + /** + * 优惠券图片 + */ + private String image; + + /** * 使用说明 */ diff --git a/src/main/java/com/cultural/heritage/utils/HttpClientUtil.java b/src/main/java/com/cultural/heritage/utils/HttpClientUtil.java new file mode 100644 index 0000000..c9ea0e0 --- /dev/null +++ b/src/main/java/com/cultural/heritage/utils/HttpClientUtil.java @@ -0,0 +1,134 @@ +package com.cultural.heritage.utils; + + +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; + +import java.io.IOException; +import java.net.URI; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class HttpClientUtil { + + public static String doGet(String url, Map param) { + + // 创建Httpclient对象 + CloseableHttpClient httpclient = HttpClients.createDefault(); + + String resultString = ""; + CloseableHttpResponse response = null; + try { + // 创建uri + URIBuilder builder = new URIBuilder(url); + if (param != null) { + for (String key : param.keySet()) { + builder.addParameter(key, param.get(key)); + } + } + URI uri = builder.build(); + + // 创建http GET请求 + HttpGet httpGet = new HttpGet(uri); + + // 执行请求 + response = httpclient.execute(httpGet); + // 判断返回状态是否为200 + if (response.getStatusLine().getStatusCode() == 200) { + resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (response != null) { + response.close(); + } + httpclient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return resultString; + } + + public static String doGet(String url) { + return doGet(url, null); + } + + public static String doPost(String url, Map param) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建参数列表 + if (param != null) { + List paramList = new ArrayList<>(); + for (String key : param.keySet()) { + paramList.add(new BasicNameValuePair(key, param.get(key))); + } + // 模拟表单 + UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList); + httpPost.setEntity(entity); + } + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + return resultString; + } + + public static String doPost(String url) { + return doPost(url, null); + } + + public static String doPostJson(String url, String json) { + // 创建Httpclient对象 + CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse response = null; + String resultString = ""; + try { + // 创建Http Post请求 + HttpPost httpPost = new HttpPost(url); + // 创建请求内容 + StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON); + httpPost.setEntity(entity); + // 执行http请求 + response = httpClient.execute(httpPost); + resultString = EntityUtils.toString(response.getEntity(), "utf-8"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + response.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + return resultString; + } +} diff --git a/src/main/java/com/cultural/heritage/utils/WeChatUtil.java b/src/main/java/com/cultural/heritage/utils/WeChatUtil.java new file mode 100644 index 0000000..30e4be5 --- /dev/null +++ b/src/main/java/com/cultural/heritage/utils/WeChatUtil.java @@ -0,0 +1,27 @@ +package com.cultural.heritage.utils; + + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; + +import java.util.HashMap; +import java.util.Map; + +public class WeChatUtil { + public static JSONObject getSessionKeyOrOpenId(String code) { + String requestUrl = "https://api.weixin.qq.com/sns/jscode2session"; + Map requestUrlParam = new HashMap<>(); + // https://mp.weixin.qq.com/wxopen/devprofile?action=get_profile&token=164113089&lang=zh_CN + //小程序appId + requestUrlParam.put("appid", "wx3f968a09e31d6bed"); + //小程序secret + requestUrlParam.put("secret", "847bdda7c2b01e88d59948b9ba50ef8d"); + //小程序端返回的code + requestUrlParam.put("js_code", code); + //默认参数 + requestUrlParam.put("grant_type", "authorization_code"); + //发送post请求读取调用微信接口获取openid用户唯一标识 + JSONObject jsonObject = JSON.parseObject(HttpClientUtil.doPost(requestUrl, requestUrlParam)); + return jsonObject; + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index a2b213b..c8187f4 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -46,3 +46,7 @@ hwyun: securityKey: djX3WNrYjRDmp5v7rOXfa25e9CHj8OXKRzQJp6Ec endPoint: obs.cn-north-4.myhuaweicloud.com bucketName: carbon2 + +weixin: + appid: wx3f968a09e31d6bed + secret: 847bdda7c2b01e88d59948b9ba50ef8d