Browse Source

外部开放scheme接口

cup 2 năm trước cách đây
mục cha
commit
81aa0bb801

+ 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);

+ 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;
+}