Bläddra i källkod

Merge branch 'mini_linkUrl'

zoujiajian 3 år sedan
förälder
incheckning
171496dc23

+ 49 - 0
netflix-dao/src/main/java/com/cyksj/model/wechat/MiniURLLink.java

@@ -0,0 +1,49 @@
+package com.cyksj.model.wechat;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author valor.
+ * @date 2019/12/16 00:20
+ */
+@Getter
+@Setter
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class MiniURLLink {
+    /**
+     * 通过 URL Link 进入的小程序页面路径,必须是已经发布的小程序存在的页面,不可携带 query 。path 为空时会跳转小程序主页
+     */
+    private String path;
+
+    /**
+     * 通过 URL Link 进入小程序时的query,最大1024个字符,只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~%
+     */
+    private String query;
+
+    /**
+     * 默认值false。生成的 URL Link 类型,到期失效:true,30天有效:false
+     */
+    @JsonProperty("is_expire")
+    private Boolean isExpire;
+
+    /**
+     * 默认值0.小程序 URL Link 失效类型,失效时间:0,失效间隔天数:1
+     */
+    @JsonProperty("expire_type")
+    private Integer expireType;
+
+    /**
+     * 到期失效的 URL Link 的失效时间,为 Unix 时间戳。生成的到期失效 URL Link 在该时间前有效。最长有效期为30天。expire_type 为 0 必填
+     */
+    @JsonProperty("expire_time")
+    private Integer expireTime;
+
+    /**
+     * 云开发静态网站自定义 H5 配置参数,可配置中转的云开发 H5 页面。不填默认用官方 H5 页面
+     */
+    @JsonProperty("expire_interval")
+    private Integer expireInterval;
+}

+ 22 - 0
netflix-service/src/main/java/com/cyksj/config/YhMiniConfig.java

@@ -0,0 +1,22 @@
+package com.cyksj.config;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+/*
+ *项目名: netflix
+ *文件名: YhMiniConfig
+ *创建者: JavaZou
+ *创建时间:2023/5/11 18:21
+ */
+@Configuration
+@ConfigurationProperties(prefix = "yhmini")
+@Getter
+@Setter
+public class YhMiniConfig {
+	private String appId;
+
+	private String secret;
+}

+ 1 - 0
netflix-service/src/main/java/com/cyksj/redis/RedisService.java

@@ -604,6 +604,7 @@ public class RedisService {
         BUSINESS_FIRST_ORDER_USER_KEY("business_first_order_user_key:%s:", "商务分销首单提成key", 60l),
         PC_WEB_CACHE("pc_web_cache", "官网首页平台缓存", 5 * 60),
         H5_WEB_CACHE("h5_web_cache", "h5首页平台缓存", 5 * 60),
+        MINI_LINK_URL_CACHE("mini_link_url_cache:", "小程序链接缓存", 60 * 60 * 24),
         ;
 
         private String name;

+ 11 - 0
netflix-service/src/main/java/com/cyksj/service/mini/MiniService.java

@@ -0,0 +1,11 @@
+package com.cyksj.service.mini;
+
+/*
+ *项目名: netflix
+ *文件名: MiniService
+ *创建者: JavaZou
+ *创建时间:2023/5/11 18:06
+ */
+public interface MiniService {
+	String getMiniURLLink(String path, String minType) throws Exception;
+}

+ 53 - 0
netflix-service/src/main/java/com/cyksj/service/mini/impl/MiniServiceImpl.java

@@ -0,0 +1,53 @@
+package com.cyksj.service.mini.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.cyksj.config.YhMiniConfig;
+import com.cyksj.model.wechat.MiniURLLink;
+import com.cyksj.redis.RedisService;
+import com.cyksj.service.mini.MiniService;
+import com.cyksj.service.wechat.WeChatService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/*
+ *项目名: netflix
+ *文件名: MiniServiceImpl
+ *创建者: JavaZou
+ *创建时间:2023/5/11 18:07
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class MiniServiceImpl implements MiniService {
+	private final WeChatService weChatService;
+
+	private final YhMiniConfig yhMiniConfig;
+
+	private final RedisService redisService;
+
+	@Override
+	public String getMiniURLLink(String path, String query) throws Exception {
+		StringBuilder CACHE_KEY = new StringBuilder();
+		String key = RedisService.key.MINI_LINK_URL_CACHE.getName();
+		CACHE_KEY.append(key);
+		if (StrUtil.isNotBlank(path)) {
+			CACHE_KEY.append(path);
+		}
+		if (StrUtil.isNotBlank(query)) {
+			CACHE_KEY.append(query);
+		}
+		String appId = yhMiniConfig.getAppId();
+		CACHE_KEY.append(appId);
+		String linkUrl = (String) redisService.get(CACHE_KEY.toString());
+		if (StrUtil.isBlank(linkUrl)) {
+			MiniURLLink miniURLLink = new MiniURLLink();
+			miniURLLink.setPath(path);
+			miniURLLink.setQuery(query);
+			String accessToken = weChatService.getAccessToken(appId);
+			linkUrl = weChatService.getMiniURLLink(accessToken, miniURLLink);
+			redisService.set(CACHE_KEY.toString(), linkUrl, RedisService.key.MINI_LINK_URL_CACHE.getTimeout());
+		}
+		return linkUrl;
+	}
+}

+ 6 - 0
netflix-service/src/main/java/com/cyksj/service/wechat/WeChatService.java

@@ -3,6 +3,7 @@ package com.cyksj.service.wechat;
 
 import com.cyksj.model.dto.*;
 import com.cyksj.model.response.WxGzhQrCodeTicketRep;
+import com.cyksj.model.wechat.MiniURLLink;
 
 import java.math.BigDecimal;
 import java.util.Date;
@@ -93,4 +94,9 @@ public interface WeChatService {
      * 获取微信网页授权url
      */
     String createWxAuthLoginUrl(String state, String appId, String redirectUri);
+
+    /**
+     * 获取跳转微信小程序链接
+     */
+    String getMiniURLLink(String accessToken, MiniURLLink miniURLLink) throws Exception;
 }

+ 19 - 0
netflix-service/src/main/java/com/cyksj/service/wechat/impl/WeChatServiceImpl.java

@@ -23,6 +23,7 @@ import com.cyksj.model.entity.ShopConfig;
 import com.cyksj.model.entity.SysConfig;
 import com.cyksj.model.entity.WxApp;
 import com.cyksj.model.response.WxGzhQrCodeTicketRep;
+import com.cyksj.model.wechat.MiniURLLink;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.sys.SysConfigService;
 import com.cyksj.service.wechat.WeChatService;
@@ -585,6 +586,24 @@ public class WeChatServiceImpl implements WeChatService {
         return authLoginUrl;
     }
 
+    @Override
+    public String getMiniURLLink(String accessToken, MiniURLLink miniURLLink) throws Exception{
+        String url = String.format("https://api.weixin.qq.com/wxa/generate_urllink?access_token=%s", accessToken);
+        HttpResponse<String> send = J11HttpC.custom()
+                .url(url)
+                .ofPost()
+                .body(HttpRequest.BodyPublishers.ofString(Jsons.toJson(miniURLLink)))
+                .send(HttpResponse.BodyHandlers.ofString());
+        if (send.statusCode() != 200) {
+            throw BusinessRuntimeException.getInstance("获取小程序链接错误");
+        }
+        JSONObject body = Jsons.parseObject(send.body(), JSONObject.class);
+        if (body.getInt("errcode") != 0) {
+            throw BusinessRuntimeException.getInstance(body.getStr("errmsg"));
+        }
+        return body.getStr("url_link");
+    }
+
     /**
      * sha256_HMAC加密
      * @param message 消息

+ 31 - 0
netflix-web/src/main/java/com/cyksj/web/controller/mini/MiniController.java

@@ -0,0 +1,31 @@
+package com.cyksj.web.controller.mini;
+
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.service.mini.MiniService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+/*
+ *项目名: netflix
+ *文件名: MiniController
+ *创建者: JavaZou
+ *创建时间:2023/5/11 18:03
+ */
+@RestController
+@RequestMapping("/applets/mini")
+@RequiredArgsConstructor
+public class MiniController {
+	private final MiniService miniService;
+
+	/**
+	 * 生成小程序商品详情二维码
+	 */
+	@RequestMapping(value = "/linkUrl", method = RequestMethod.GET)
+	public Result<String> getMiniLinkURL(String path, String query) throws Exception {
+		String linkUrl = miniService.getMiniURLLink(path, query);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(linkUrl);
+	};
+}

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
netflix-web/src/main/resources/application-dev.yml


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
netflix-web/src/main/resources/application-prd.yml


Vissa filer visades inte eftersom för många filer har ändrats