Эх сурвалжийг харах

Merge branch 'dev' into 'mp-server-test'

Dev

See merge request quanshu/mp-server!648
jiang hao 2 жил өмнө
parent
commit
4027f66c5d

+ 96 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/open/LinkController.java

@@ -0,0 +1,96 @@
+package com.qs.mp.web.controller.api.open;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.common.core.domain.AjaxResult;
+import com.qs.mp.common.core.redis.RedisCache;
+import com.qs.mp.common.utils.LogUtil;
+import com.qs.mp.common.utils.LogUtils;
+import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.common.utils.ip.IpUtils;
+import com.qs.mp.framework.redis.RedisKey;
+import com.qs.mp.framework.security.handle.HostHolder;
+import com.qs.mp.framework.service.IWxUrlLinkService;
+import com.qs.mp.open.domain.ApiCallLog;
+import com.qs.mp.open.domain.IpWhitelist;
+import com.qs.mp.open.domain.param.SchemeParam;
+import com.qs.mp.open.service.IApiCallLogService;
+import com.qs.mp.open.service.IIpWhitelistService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author Cup
+ * @date 2022/6/1
+ */
+@Api(tags = "外部链接相关接口")
+@RestController
+@RequestMapping("/api/v1/mp/open/link")
+public class LinkController {
+
+    protected final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
+
+
+    @Value("${wx-user.appId}")
+    private String userAppId;
+
+    @Autowired
+    private IWxUrlLinkService wxUrlLinkService;
+
+    @Autowired
+    private IIpWhitelistService ipWhitelistService;
+
+    @Autowired
+    private IApiCallLogService apiCallLogService;
+
+    @Autowired
+    private RedisCache redisCache;
+
+    @PostMapping("wx/scheme")
+    @ApiOperation("微信小程序跳转链接")
+    public AjaxResult wxScheme(@Validated @RequestBody SchemeParam schemeParam, HttpServletRequest request) {
+
+        // 获取调用方ip
+        String ipaddr = IpUtils.getIpAddr(request);
+        // 白名单判断
+        int whiteCount = ipWhitelistService.count(new LambdaQueryWrapper<IpWhitelist>().eq(IpWhitelist::getCallNo, schemeParam.getCallNo())
+                .eq(IpWhitelist::getIpAddr, ipaddr));
+        if (whiteCount <= 0) {
+            return AjaxResult.error("您不在白名单中,请联系管理员");
+        }
+
+        // 保存调用日志
+        ApiCallLog apiCallLog = new ApiCallLog();
+        apiCallLog.setCallNo(schemeParam.getCallNo());
+        apiCallLog.setIpAddr(ipaddr);
+        apiCallLog.setInterfaceInfo("/api/v1/mp/open/link/wx/scheme");
+        apiCallLogService.save(apiCallLog);
+        LogUtil.info(logger, "微信Scheme生成调用日志:{0}", apiCallLog);
+
+        // 构建scheme缓存key
+        String key = RedisKey.build(RedisKey.OPEN_LINK_KEY, schemeParam.getCallNo(), schemeParam.getUid());
+        // 从redis中获取scheme
+        String scheme = redisCache.getCacheObject(key);
+        if (StringUtils.isNotBlank(scheme)) {
+            LogUtil.info(logger, "生成的scheme码:{0}", scheme);
+            // 不为空则直接返回,不生成新的
+            return AjaxResult.success("success",scheme);
+        }
+        // 生成scheme,并缓存到redis中,1天过期
+        scheme = wxUrlLinkService.generateUrlSchema("", "", userAppId);
+        redisCache.setCacheObject(key, scheme,1, TimeUnit.DAYS);
+        LogUtil.info(logger, "生成的scheme码:{0}", scheme);
+        return AjaxResult.success("success",scheme);
+    }
+}

+ 2 - 1
mp-framework/src/main/java/com/qs/mp/framework/config/SecurityConfig.java

@@ -145,7 +145,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                     "/api/v1/mp/user/marketing/detail/*",
                     "/api/v1/mp/user/marketing/userInfo/*",
                     "/api/v1/mp/user/exchange/category/listTree",
-                    "/api/v1/mp/user/marketing/recent"
+                    "/api/v1/mp/user/marketing/recent",
+                    "/api/v1/mp/open/link/**"
                 ).permitAll()
                 // 除上面外的所有请求全部需要鉴权认证
                 .anyRequest().authenticated()

+ 1 - 0
mp-service/src/main/java/com/qs/mp/framework/redis/RedisKey.java

@@ -9,6 +9,7 @@ import com.qs.mp.common.utils.MessageHelper;
  *
  */
 public enum RedisKey {
+    OPEN_LINK_KEY("open_link_key_{0}_{1}","微信scheme码缓存key"),
     WX_APP_TOKEN_KEY("app_token_key_{0}", "小程序app token"),
     CHANNEL_ORDER_KEY("channel_order_{0}", "经销商下的盲票采购单"),
     USER_TICKET_ORDER_KEY("user_ticket_order_key_{0}", "用户购票订单"),

+ 1 - 1
mp-service/src/main/java/com/qs/mp/framework/service/impl/WxUrlLinkServiceImpl.java

@@ -80,7 +80,7 @@ public class WxUrlLinkServiceImpl implements IWxUrlLinkService {
     // 单个小程序总共可生成长期有效 Link 上限为10万个,请谨慎调用
     param.put("is_expire", true);
     param.put("expire_type", 1);
-    param.put("expire_interval", 1);
+    param.put("expire_interval", 2);
     // 云管铺小程序永久短链接https://wxaurl.cn/YL8D48CQbMr
     // 获取access_token
     String accessToken = appTokenService.getAccessToken(appId);

+ 81 - 0
mp-service/src/main/java/com/qs/mp/open/domain/ApiCallLog.java

@@ -0,0 +1,81 @@
+package com.qs.mp.open.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @describe 接口调用日志表实体类
+ * @auther quanshu
+ * @create 2022-06-01 17:42:17
+ */
+@TableName("mp_api_call_log")
+@Data
+@ApiModel("接口调用日志表实体类")
+public class ApiCallLog implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ApiModelProperty("主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 调用方编号
+     */
+    @ApiModelProperty("调用方编号")
+    @TableField("call_no")
+    private String callNo;
+
+    /**
+     * 调用接口
+     */
+    @ApiModelProperty("调用接口")
+    @TableField("interface_info")
+    private String interfaceInfo;
+
+    /**
+     * ip地址
+     */
+    @ApiModelProperty("ip地址")
+    @TableField("ip_addr")
+    private String ipAddr;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    @TableField("created_time")
+    private Date createdTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty("更新时间")
+    @TableField("updated_time")
+    private Date updatedTime;
+
+    /**
+     * 逻辑删除标识
+     */
+    @ApiModelProperty("逻辑删除标识")
+    @TableField("is_deleted")
+    @TableLogic
+    private Integer isDeleted;
+
+
+}

+ 74 - 0
mp-service/src/main/java/com/qs/mp/open/domain/IpWhitelist.java

@@ -0,0 +1,74 @@
+package com.qs.mp.open.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @describe IP白名单实体类
+ * @auther quanshu
+ * @create 2022-06-01 17:41:43
+ */
+@TableName("mp_ip_whitelist")
+@Data
+@ApiModel("IP白名单实体类")
+public class IpWhitelist implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ApiModelProperty("主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 调用方编号
+     */
+    @ApiModelProperty("调用方编号")
+    @TableField("call_no")
+    private String callNo;
+
+    /**
+     * ip地址
+     */
+    @ApiModelProperty("ip地址")
+    @TableField("ip_addr")
+    private String ipAddr;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    @TableField("created_time")
+    private Date createdTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty("更新时间")
+    @TableField("updated_time")
+    private Date updatedTime;
+
+    /**
+     * 逻辑删除标识
+     */
+    @ApiModelProperty("逻辑删除标识")
+    @TableField("is_deleted")
+    @TableLogic
+    private Integer isDeleted;
+
+
+}

+ 26 - 0
mp-service/src/main/java/com/qs/mp/open/domain/param/SchemeParam.java

@@ -0,0 +1,26 @@
+package com.qs.mp.open.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * scheme外部调用生成入参类
+ * @author Cup
+ * @date 2022/6/2
+ */
+@ApiModel("scheme外部调用生成入参类")
+@Data
+public class SchemeParam {
+
+
+    @NotBlank(message = "调用方编号不能为空")
+    @ApiModelProperty("调用方编号")
+    private String callNo;
+
+    @NotBlank(message = "用户唯一标识不能为空")
+    @ApiModelProperty("用户唯一标识")
+    private String uid;
+}

+ 13 - 0
mp-service/src/main/java/com/qs/mp/open/mapper/ApiCallLogMapper.java

@@ -0,0 +1,13 @@
+package com.qs.mp.open.mapper;
+
+import com.qs.mp.open.domain.ApiCallLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @auther quanshu
+ * @create 2022-06-01 17:42:17
+ * @describe 接口调用日志表mapper类
+ */
+public interface ApiCallLogMapper extends BaseMapper<ApiCallLog> {
+
+}

+ 13 - 0
mp-service/src/main/java/com/qs/mp/open/mapper/IpWhitelistMapper.java

@@ -0,0 +1,13 @@
+package com.qs.mp.open.mapper;
+
+import com.qs.mp.open.domain.IpWhitelist;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @auther quanshu
+ * @create 2022-06-01 17:41:43
+ * @describe IP白名单mapper类
+ */
+public interface IpWhitelistMapper extends BaseMapper<IpWhitelist> {
+
+}

+ 16 - 0
mp-service/src/main/java/com/qs/mp/open/service/IApiCallLogService.java

@@ -0,0 +1,16 @@
+package com.qs.mp.open.service;
+
+import com.qs.mp.open.domain.ApiCallLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 接口调用日志表 服务类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-06-01
+ */
+public interface IApiCallLogService extends IService<ApiCallLog> {
+
+}

+ 16 - 0
mp-service/src/main/java/com/qs/mp/open/service/IIpWhitelistService.java

@@ -0,0 +1,16 @@
+package com.qs.mp.open.service;
+
+import com.qs.mp.open.domain.IpWhitelist;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * IP白名单 服务类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-06-01
+ */
+public interface IIpWhitelistService extends IService<IpWhitelist> {
+
+}

+ 20 - 0
mp-service/src/main/java/com/qs/mp/open/service/impl/ApiCallLogServiceImpl.java

@@ -0,0 +1,20 @@
+package com.qs.mp.open.service.impl;
+
+import com.qs.mp.open.domain.ApiCallLog;
+import com.qs.mp.open.mapper.ApiCallLogMapper;
+import com.qs.mp.open.service.IApiCallLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 接口调用日志表 服务实现类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-06-01
+ */
+@Service
+public class ApiCallLogServiceImpl extends ServiceImpl<ApiCallLogMapper, ApiCallLog> implements IApiCallLogService {
+
+}

+ 20 - 0
mp-service/src/main/java/com/qs/mp/open/service/impl/IpWhitelistServiceImpl.java

@@ -0,0 +1,20 @@
+package com.qs.mp.open.service.impl;
+
+import com.qs.mp.open.domain.IpWhitelist;
+import com.qs.mp.open.mapper.IpWhitelistMapper;
+import com.qs.mp.open.service.IIpWhitelistService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * IP白名单 服务实现类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2022-06-01
+ */
+@Service
+public class IpWhitelistServiceImpl extends ServiceImpl<IpWhitelistMapper, IpWhitelist> implements IIpWhitelistService {
+
+}

+ 21 - 0
mp-service/src/main/resources/mapper/open/ApiCallLogMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qs.mp.open.mapper.ApiCallLogMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.open.domain.ApiCallLog">
+        <id column="id" property="id" />
+        <result column="call_no" property="callNo" />
+        <result column="interface" property="interface" />
+        <result column="ip_addr" property="ipAddr" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_time" property="updatedTime" />
+        <result column="is_deleted" property="isDeleted" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, call_no, interface, ip_addr, created_time, updated_time, is_deleted
+    </sql>
+
+</mapper>

+ 20 - 0
mp-service/src/main/resources/mapper/open/IpWhitelistMapper.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qs.mp.open.mapper.IpWhitelistMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.open.domain.IpWhitelist">
+        <id column="id" property="id" />
+        <result column="call_no" property="callNo" />
+        <result column="ip_addr" property="ipAddr" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_time" property="updatedTime" />
+        <result column="is_deleted" property="isDeleted" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, call_no, ip_addr, created_time, updated_time, is_deleted
+    </sql>
+
+</mapper>