configMap = new HashMap<>();
+ configMap.put("my-redis-cache1", config);
+ configMap.put("my-redis-cache2", config.entryTtl(Duration.ofSeconds(120)));
+
+ RedisCacheManager cacheManager = RedisCacheManager.builder(connectionFactory) // 使用自定义的缓存配置初始化一个cacheManager
+ .initialCacheNames(cacheNames) // 注意这两句的调用顺序,一定要先调用该方法设置初始化的缓存名,再初始化相关的配置
+ .withInitialCacheConfigurations(configMap)
+ .build();
+ return cacheManager;
+ }
+
+}
diff --git a/mlToutiaoOpen/src/main/java/com/iformall/config/RestFilter.java b/mlToutiaoOpen/src/main/java/com/iformall/config/RestFilter.java
new file mode 100644
index 0000000..4f92984
--- /dev/null
+++ b/mlToutiaoOpen/src/main/java/com/iformall/config/RestFilter.java
@@ -0,0 +1,58 @@
+package com.iformall.config;
+
+import java.io.IOException;
+import java.util.Optional;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * 前后端分离RESTful接口过滤器
+ *
+ * @author xuguoqin
+ *
+ */
+public class RestFilter implements Filter {
+
+ @Override
+ public void init(FilterConfig filterConfig) throws ServletException {
+
+ }
+
+ @Override
+ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+ throws IOException, ServletException {
+ HttpServletRequest req = null;
+ if (request instanceof HttpServletRequest) {
+ req = (HttpServletRequest) request;
+ }
+ HttpServletResponse res = null;
+ if (response instanceof HttpServletResponse) {
+ res = (HttpServletResponse) response;
+ }
+ if (req != null && res != null) {
+ //设置允许传递的参数
+ res.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
+ //设置允许带上cookie
+ res.setHeader("Access-Control-Allow-Credentials", "true");
+ String origin = Optional.ofNullable(req.getHeader("Origin")).orElse(req.getHeader("Referer"));
+ //设置允许的请求来源
+ res.setHeader("Access-Control-Allow-Origin", origin);
+ //设置允许的请求方法
+ res.setHeader("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, DELETE, OPTIONS");
+ }
+ chain.doFilter(request, response);
+ }
+
+ @Override
+ public void destroy() {
+
+ }
+
+}
\ No newline at end of file
diff --git a/mlToutiaoOpen/src/main/java/com/iformall/config/RestTemplateConfig.java b/mlToutiaoOpen/src/main/java/com/iformall/config/RestTemplateConfig.java
new file mode 100644
index 0000000..560a77c
--- /dev/null
+++ b/mlToutiaoOpen/src/main/java/com/iformall/config/RestTemplateConfig.java
@@ -0,0 +1,24 @@
+package com.iformall.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.client.ClientHttpRequestFactory;
+import org.springframework.http.client.SimpleClientHttpRequestFactory;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration
+public class RestTemplateConfig {
+
+ @Bean
+ public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
+ return new RestTemplate(factory);
+ }
+
+ @Bean
+ public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
+ SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
+ factory.setReadTimeout(5000);//ms
+ factory.setConnectTimeout(10000);//ms
+ return factory;
+ }
+}
\ No newline at end of file
diff --git a/mlToutiaoOpen/src/main/java/com/iformall/config/ShiroConfig.java b/mlToutiaoOpen/src/main/java/com/iformall/config/ShiroConfig.java
new file mode 100644
index 0000000..7e5d2f3
--- /dev/null
+++ b/mlToutiaoOpen/src/main/java/com/iformall/config/ShiroConfig.java
@@ -0,0 +1,305 @@
+package com.iformall.config;
+
+import com.iformall.service.MallPermissionService;
+import com.iformall.shiro.MyRetryLimitCredentialsMatcher;
+import com.iformall.shiro.MyShiroRealm;
+import org.apache.shiro.mgt.SecurityManager;
+import org.apache.shiro.spring.LifecycleBeanPostProcessor;
+import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
+import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
+import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
+import org.apache.shiro.web.servlet.SimpleCookie;
+import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
+import org.crazycake.shiro.RedisCacheManager;
+import org.crazycake.shiro.RedisManager;
+import org.crazycake.shiro.RedisSessionDAO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.servlet.Filter;
+import javax.servlet.ServletRequest;
+import javax.servlet.http.HttpServletRequest;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+
+/**
+ * Created by yangqj on 2017/4/23.
+ */
+@Configuration
+public class ShiroConfig {
+ @Autowired(required = false)
+ private MallPermissionService resourcesService;
+
+ @Value("${spring.redis.host}")
+ private String host;
+
+ @Value("${spring.redis.port}")
+ private int port;
+
+ @Value("${spring.redis.timeout}")
+ private int timeout;
+
+ @Value("${spring.redis.expire}")
+ private int expire;
+
+ @Value("${spring.redis.password}")
+ private String password;
+
+ @Bean
+ public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
+ return new LifecycleBeanPostProcessor();
+ }
+
+ /**
+ * ShiroDialect,为了在thymeleaf里使用shiro的标签的bean
+ * @return
+ */
+// @Bean
+// public ShiroDialect shiroDialect() {
+// return new ShiroDialect();
+// }
+
+ /**
+ * ShiroFilterFactoryBean 处理拦截资源文件问题。
+ * 注意:单独一个ShiroFilterFactoryBean配置是或报错的,因为在
+ * 初始化ShiroFilterFactoryBean的时候需要注入:SecurityManager
+ *
+ * Filter Chain定义说明
+ * 1、一个URL可以配置多个Filter,使用逗号分隔
+ * 2、当设置多个过滤器时,全部验证通过,才视为通过
+ * 3、部分过滤器可指定参数,如perms,roles
+ */
+ @Bean
+ public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
+ System.out.println("ShiroConfiguration.shirFilter()");
+ ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
+ // 必须设置 SecurityManager
+ shiroFilterFactoryBean.setSecurityManager(securityManager);
+ Map filters = new LinkedHashMap();
+ filters.put("token", new ShiroLoginFilter());
+ filters.put("corsFilter", new RestFilter());
+ //filters.put("authc", new MyFormAuthenticationFilter());
+ shiroFilterFactoryBean.setFilters(filters);
+ // 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
+ shiroFilterFactoryBean.setLoginUrl("/#/");
+ // 登录成功后要跳转的链接
+
+ shiroFilterFactoryBean.setSuccessUrl("/usersPage");
+ //未授权界面;
+ shiroFilterFactoryBean.setUnauthorizedUrl("/403");
+ //拦截器.
+ Map filterChainDefinitionMap = new LinkedHashMap();
+
+ //配置退出 过滤器,其中的具体的退出代码Shiro已经替我们实现了
+
+ //filterChainDefinitionMap.put("/ue/**", "anon");
+ //filterChainDefinitionMap.put("/config.json", "anon");
+
+ // 静态文件
+ filterChainDefinitionMap.put("/css/**", "anon");
+ filterChainDefinitionMap.put("/js/**", "anon");
+ filterChainDefinitionMap.put("/img/**", "anon");
+ filterChainDefinitionMap.put("/font-awesome/**", "anon");
+ //:这是一个坑呢,一不小心代码就不好使了;
+ //
+ //自定义加载权限资源关系
+// Map map = new HashMap<>();
+// List resourcesList = resourcesService.list(map);
+// for(SysPermission resources:resourcesList){
+//
+// if (StringUtil.isNotEmpty(resources.getUrl())) {
+// String permission = "perms[" + resources.getUrl()+ "]";
+// filterChainDefinitionMap.put(resources.getUrl(),permission);
+// }
+// }
+
+ // 登录
+ filterChainDefinitionMap.put("/captcha.jpg", "anon");
+ filterChainDefinitionMap.put("/doLogin/**", "anon");
+ filterChainDefinitionMap.put("/version", "anon");
+
+ /// swagger-ui.html
+ filterChainDefinitionMap.put("/swagger-ui.html", "anon");
+ filterChainDefinitionMap.put("/v2/**", "anon");
+ filterChainDefinitionMap.put("/swagger-resources/**", "anon");
+ filterChainDefinitionMap.put("/webjars/**", "anon");
+
+ // 第三方平台
+ filterChainDefinitionMap.put("/wxOpen/**", "anon");
+ filterChainDefinitionMap.put("/wx/**", "anon");
+ filterChainDefinitionMap.put("/wxCardIO/**", "anon");
+
+
+// filterChainDefinitionMap.put("/role/**", "corsFilter,token");
+ filterChainDefinitionMap.put("/**", "corsFilter,token,authc");
+// filterChainDefinitionMap.put("/**", "anon");
+
+
+ shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
+ return shiroFilterFactoryBean;
+ }
+
+
+ public static boolean isAjax(ServletRequest request) {
+ String header = ((HttpServletRequest) request).getHeader("X-Requested-With");
+ if ("XMLHttpRequest".equalsIgnoreCase(header)) {
+ System.out.println("当前请求为Ajax请求");
+ return Boolean.TRUE;
+ }
+ System.out.println("当前请求非Ajax请求");
+ return Boolean.FALSE;
+ }
+
+ @Bean
+ public SecurityManager securityManager(@Qualifier("retryLimitCredentialsMatcher") MyRetryLimitCredentialsMatcher matcher) {
+ DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
+ //设置realm.
+ securityManager.setRealm(myShiroRealm(matcher));
+ // 自定义缓存实现 使用redis
+ //securityManager.setCacheManager(cacheManager());
+ // 自定义session管理 使用redis
+ securityManager.setSessionManager(sessionManager());
+ return securityManager;
+ }
+
+ @Bean
+ public MyShiroRealm myShiroRealm(MyRetryLimitCredentialsMatcher matcher) {
+ MyShiroRealm myShiroRealm = new MyShiroRealm();
+ myShiroRealm.setCredentialsMatcher(matcher);
+ return myShiroRealm;
+ }
+
+
+ /**
+ * 密码匹配凭证管理器 凭证匹配器
+ * (由于我们的密码校验交给Shiro的SimpleAuthenticationInfo进行处理了
+ * 所以我们需要修改下doGetAuthenticationInfo中的代码;
+ * )
+ *
+ * @return
+ */
+ @Bean(name = "retryLimitCredentialsMatcher")
+ public MyRetryLimitCredentialsMatcher hashedCredentialsMatcher() {
+ MyRetryLimitCredentialsMatcher hashedCredentialsMatcher = new MyRetryLimitCredentialsMatcher();
+
+ hashedCredentialsMatcher.setHashAlgorithmName("md5");//散列算法:这里使用MD5算法;
+ hashedCredentialsMatcher.setHashIterations(2);//散列的次数,比如散列两次,相当于 md5(md5(""));
+
+ return hashedCredentialsMatcher;
+ }
+
+
+ /**
+ * 开启shiro aop注解支持.
+ * 使用代理方式;所以需要开启代码支持;
+ *
+ * @param securityManager
+ * @return
+ */
+ @Bean
+ public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
+ AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
+ authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
+ return authorizationAttributeSourceAdvisor;
+ }
+
+ /**
+ * 配置shiro redisManager
+ * 使用的是shiro-redis开源插件
+ *
+ * @return
+ */
+ public RedisManager redisManager() {
+ RedisManager redisManager = new RedisManager();
+ redisManager.setHost(host);
+ redisManager.setPort(port);
+ //redisManager.setExpire(expire);// 配置缓存过期时间
+ redisManager.setTimeout(timeout);
+ redisManager.setPassword(password);
+ return redisManager;
+ }
+
+ /**
+ * cacheManager 缓存 redis实现
+ * 使用的是shiro-redis开源插件
+ *
+ * @return
+ */
+ public RedisCacheManager cacheManager() {
+ RedisCacheManager redisCacheManager = new RedisCacheManager();
+ redisCacheManager.setRedisManager(redisManager());
+ return redisCacheManager;
+ }
+
+
+ /**
+ * RedisSessionDAO shiro sessionDao层的实现 通过redis
+ * 使用的是shiro-redis开源插件
+ */
+ @Bean
+ public RedisSessionDAO redisSessionDAO() {
+ RedisSessionDAO redisSessionDAO = new RedisSessionDAO();
+ redisSessionDAO.setRedisManager(redisManager());
+ return redisSessionDAO;
+ }
+
+ /**
+ * shiro session的管理
+ */
+ @Bean
+ public DefaultWebSessionManager sessionManager() {
+ DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
+ //设置session过期时间为1小时(单位:毫秒),默认为30分钟
+ sessionManager.setGlobalSessionTimeout(60 * 60 * 1000);
+ sessionManager.setSessionValidationSchedulerEnabled(true);
+ sessionManager.setSessionIdUrlRewritingEnabled(false);
+
+ sessionManager.setSessionDAO(redisSessionDAO());
+ sessionManager.setSessionIdCookie(simpleCookie());
+ return sessionManager;
+ }
+
+ @Bean
+ public SimpleCookie simpleCookie() {
+ SimpleCookie simpleCookie = new SimpleCookie("SSID");
+ simpleCookie.setDomain("");
+ return simpleCookie;
+ }
+
+// @Bean
+// public SimpleCookie rememberMeCookie(){
+// //System.out.println("ShiroConfiguration.rememberMeCookie()");
+// //这个参数是cookie的名称,对应前端的checkbox的name = rememberMe
+// SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
+// //
+// simpleCookie.setMaxAge(60*30);
+// return simpleCookie;
+// }
+
+// @Bean
+// public CookieRememberMeManager rememberMeManager(){
+// //System.out.println("ShiroConfiguration.rememberMeManager()");
+// CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
+// cookieRememberMeManager.setCookie(rememberMeCookie());
+// //rememberMe cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位)
+// cookieRememberMeManager.setCipherKey(Base64.decodeBytes("2AvVhdsgUs0FSA3SDFAdag=="));
+// return cookieRememberMeManager;
+// }
+
+// @Bean(name = "securityManager")
+// public DefaultWebSecurityManager defaultWebSecurityManager(MyShiroRealm realm){
+// DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
+// //设置realm
+// securityManager.setRealm(realm);
+// //用户授权/认证信息Cache, 采用EhCache缓存
+// securityManager.setCacheManager(cacheManager());
+// //注入记住我管理器
+// securityManager.setRememberMeManager(rememberMeManager());
+// return securityManager;
+// }
+
+}
diff --git a/mlToutiaoOpen/src/main/java/com/iformall/config/ShiroLoginFilter.java b/mlToutiaoOpen/src/main/java/com/iformall/config/ShiroLoginFilter.java
new file mode 100644
index 0000000..30d8fe4
--- /dev/null
+++ b/mlToutiaoOpen/src/main/java/com/iformall/config/ShiroLoginFilter.java
@@ -0,0 +1,31 @@
+package com.iformall.config;
+
+import com.alibaba.fastjson.JSON;
+import com.iformall.common.ResultData;
+import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+
+public class ShiroLoginFilter extends FormAuthenticationFilter {
+
+ @Override
+ protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
+ response.setCharacterEncoding("UTF-8");
+ response.setContentType("application/json");
+ ResultData resultData = new ResultData(ResultData.UNLOGIN,"用户未登录");
+ response.getWriter().write(JSON.toJSONString(resultData));
+ return false;
+ }
+
+ /**
+ * 判断ajax请求
+ * @param request
+ * @return
+ */
+ boolean isAjax(HttpServletRequest request){
+ return (request.getHeader("X-Requested-With") != null && "XMLHttpRequest".equals( request.getHeader("X-Requested-With").toString()) ) ;
+ }
+
+}
\ No newline at end of file
diff --git a/mlToutiaoOpen/src/main/java/com/iformall/config/WebConfig.java b/mlToutiaoOpen/src/main/java/com/iformall/config/WebConfig.java
new file mode 100644
index 0000000..dab30ed
--- /dev/null
+++ b/mlToutiaoOpen/src/main/java/com/iformall/config/WebConfig.java
@@ -0,0 +1,89 @@
+package com.iformall.config;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.DeserializationConfig;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.iformall.interceptor.HttpServletRequestWrapperFilter;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.text.SimpleDateFormat;
+import java.util.List;
+
+@Configuration
+@EnableWebMvc
+public class WebConfig implements WebMvcConfigurer {
+
+ @Override
+ public void addResourceHandlers(ResourceHandlerRegistry registry) {
+ registry.addResourceHandler("swagger-ui.html")
+ .addResourceLocations("classpath:/META-INF/resources/");
+ registry.addResourceHandler("/webjars/**")
+ .addResourceLocations("classpath:/META-INF/resources/webjars/");
+ //registry.addResourceHandler("/app/**").addResourceLocations("classpath:/app/");
+
+ }
+
+ @Override
+ public void addCorsMappings(CorsRegistry registry) {
+ registry.addMapping("/**")
+ .allowedOrigins("*")
+ .allowCredentials(true)
+ .allowedMethods("GET", "POST", "DELETE", "PUT")
+ .maxAge(3600);
+ }
+
+ @Override
+ public void configureMessageConverters(List> converters) {
+ MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
+ //ObjectMapper 是Jackson库的主要类。它提供一些功能将转换成Java对象匹配JSON结构,反之亦然
+ ObjectMapper objectMapper = new ObjectMapper();
+ SimpleModule simpleModule = new SimpleModule();
+
+ //不显示为null的字段
+ objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+
+ DeserializationConfig dc = objectMapper.getDeserializationConfig();
+ // 设置反序列化日期格式、忽略不存在get、set的属性
+ objectMapper.setConfig(
+ dc.with(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"))
+ .without(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
+ );
+
+ //序列化将Long转String类型
+ simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
+ simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
+ SimpleModule bigIntegerModule = new SimpleModule();
+ //序列化将BigInteger转String类型
+ bigIntegerModule.addSerializer(BigInteger.class, ToStringSerializer.instance);
+ SimpleModule bigDecimalModule = new SimpleModule();
+ //序列化将BigDecimal转String类型
+ bigDecimalModule.addSerializer(BigDecimal.class, ToStringSerializer.instance);
+ objectMapper.registerModule(simpleModule);
+ objectMapper.registerModule(bigDecimalModule);
+ objectMapper.registerModule(bigIntegerModule);
+ jackson2HttpMessageConverter.setObjectMapper(objectMapper);
+ converters.add(jackson2HttpMessageConverter);
+ }
+
+ @Bean
+ public FilterRegistrationBean Filters() {
+ FilterRegistrationBean registrationBean = new FilterRegistrationBean();
+ registrationBean.setFilter(new HttpServletRequestWrapperFilter());
+ registrationBean.addUrlPatterns("/*");
+ registrationBean.setName("koalaSignFilter");
+ return registrationBean;
+ }
+}
diff --git a/mlToutiaoOpen/src/main/java/com/iformall/controller/HomeController.java b/mlToutiaoOpen/src/main/java/com/iformall/controller/HomeController.java
new file mode 100644
index 0000000..b370a68
--- /dev/null
+++ b/mlToutiaoOpen/src/main/java/com/iformall/controller/HomeController.java
@@ -0,0 +1,124 @@
+package com.iformall.controller;
+
+import com.google.code.kaptcha.Constants;
+import com.google.code.kaptcha.Producer;
+import com.iformall.common.ErrorCode;
+import com.iformall.common.ResultData;
+import com.iformall.controller.base.BaseController;
+import com.iformall.domain.po.MallUserInfo;
+import com.iformall.exception.MallinkException;
+import com.iformall.shiro.UserSession;
+import com.iformall.utils.ShiroUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authc.UsernamePasswordToken;
+import org.apache.shiro.subject.Subject;
+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.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.imageio.ImageIO;
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletResponse;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+
+
+@RestController
+@Api(description = "登录相关接口")
+public class HomeController extends BaseController {
+ private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+ @Value("${version}")
+ private String version;
+
+ @Autowired
+ private Producer producer;
+
+
+ @GetMapping("/captcha.jpg")
+ public void captcha(HttpServletResponse response)throws ServletException, IOException {
+ logger.debug("[" + getIpAddr() + "] HomeController::captcha");
+ response.setHeader("Cache-Control", "no-store, no-cache");
+ response.setContentType("image/jpeg");
+
+ //生成文字验证码
+ String text = producer.createText();
+ //生成图片验证码
+ BufferedImage image = producer.createImage(text);
+ //保存到shiro session
+ ShiroUtils.setSessionAttribute(Constants.KAPTCHA_SESSION_KEY, text);
+
+ ServletOutputStream out = response.getOutputStream();
+ ImageIO.write(image, "jpg", out);
+ IOUtils.closeQuietly(out);
+ }
+
+ @ApiOperation("登录")
+ @PostMapping("/doLogin")
+ public ResultData login(@RequestBody MallUserInfo user, HttpServletResponse response) {
+ logger.debug("[" + getIpAddr() + "] HomeController::login");
+
+ try {
+ String kaptcha = ShiroUtils.getKaptcha(Constants.KAPTCHA_SESSION_KEY);
+ if(!user.getCaptcha().equalsIgnoreCase(kaptcha)){
+ return new ResultData(ErrorCode.KAPCHA_NOT_EQUAL);
+ }
+ } catch (MallinkException e) {
+ logger.error("验证码" + e.getMessage());
+ return new ResultData(ErrorCode.KAPCHA_NOT_VALID.getCode(), e.getMessage());
+ }
+
+
+ ResultData data = new ResultData();
+ if (StringUtils.isBlank(user.getUsername()) || StringUtils.isBlank(user.getPassword())) {
+// throw new SystemException(ErrorCode.LOGIN_USER_OR_PWD_ERROR);
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
+ }
+ try {
+ Subject subject = SecurityUtils.getSubject();
+ UsernamePasswordToken token = new UsernamePasswordToken(user.getUsername(), user.getPassword());
+ subject.login(token);
+ MallUserInfo info = (MallUserInfo) SecurityUtils.getSubject().getSession().getAttribute(UserSession.userInfo);
+ info.setPassword("保密");
+ info.setBopenId("保密");
+ if(StringUtils.isNotBlank(info.getWebOpenId())) {
+ info.setWebOpenId("保密");
+ }
+
+ Cookie unameCookie = new Cookie("uname", info.getUsername());
+ unameCookie.setMaxAge(60);
+ response.addCookie(unameCookie);
+
+ data.data = info;
+ } catch (Exception e) {
+ return new ResultData(ErrorCode.USER_PASSWD_ERR);
+ }
+ return data;
+ }
+
+ @ApiOperation("登出")
+ @GetMapping("/logout")
+ public ResultData logout() {
+ logger.debug("[" + getIpAddr() + "] HomeController::logout");
+ ResultData data = new ResultData();
+ SecurityUtils.getSubject().logout();
+ return data;
+ }
+
+ @ApiOperation("获取后端版本号")
+ @GetMapping("/version")
+ public ResultData version() {
+ return new ResultData(version);
+ }
+}
\ No newline at end of file
diff --git a/mlToutiaoOpen/src/main/java/com/iformall/controller/WechatAuthController.java b/mlToutiaoOpen/src/main/java/com/iformall/controller/WechatAuthController.java
new file mode 100644
index 0000000..e3da84e
--- /dev/null
+++ b/mlToutiaoOpen/src/main/java/com/iformall/controller/WechatAuthController.java
@@ -0,0 +1,106 @@
+package com.iformall.controller;
+
+import com.iformall.domain.po.WxAuthorizerInfo;
+import com.iformall.enums.EnumWxAuthorizationStatus;
+import com.iformall.service.WxAuthorizerInfoService;
+import com.iformall.service.wechat.FmOpenService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.open.bean.result.WxOpenAuthorizerInfoResult;
+import me.chanjar.weixin.open.bean.result.WxOpenQueryAuthResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.Date;
+
+/**
+ * Stormeye Wu
+ */
+@Controller
+@RequestMapping("/wt_auth")
+@Api(description = "微信第三方开放平台授权相关接口")
+public class WechatAuthController {
+ private final Logger logger = LoggerFactory.getLogger(getClass());
+ @Autowired
+ private FmOpenService openService;
+
+ @Autowired
+ private WxAuthorizerInfoService authorizerInfoService;
+
+ @ApiOperation(value = "获取授权跳转页", notes = "")
+ @GetMapping("/goto_auth_url_show")
+ @ResponseBody
+ public String gotoPreAuthUrlShow() {
+ return "" +
+ "" +
+ "go" +
+ "" +
+ "";
+ }
+
+ @ApiOperation(value = "授权跳转页", notes = "")
+ @GetMapping("/goto_auth_url")
+ public void gotoPreAuthUrl(HttpServletRequest request, HttpServletResponse response) {
+ String host = request.getHeader("host");
+ String url = "https://" + host + "/O/wt_auth/jump";
+ try {
+ url = openService.getWxOpenComponentService().getPreAuthUrl(url);
+ response.sendRedirect(url);
+ } catch (WxErrorException | IOException e) {
+ logger.error("gotoPreAuthUrl", e);
+ throw new RuntimeException(e);
+ }
+ }
+
+ @ApiOperation(value = "授权", notes = "")
+ @GetMapping("/jump")
+ @ResponseBody
+ public void jump(@RequestParam("auth_code") String authorizationCode) {
+ try {
+ WxOpenQueryAuthResult queryAuthResult = openService.getWxOpenComponentService().getQueryAuth(authorizationCode);
+ logger.info("getQueryAuth", queryAuthResult);
+ WxOpenAuthorizerInfoResult openAuthorizerInfoResult = openService.getWxOpenComponentService().getAuthorizerInfo(
+ queryAuthResult.getAuthorizationInfo().getAuthorizerAppid());
+ logger.info(openAuthorizerInfoResult.toString());
+ // save auth info
+ authorizerInfoService.saveOrUpdate(new WxAuthorizerInfo(){
+ {
+ setAuthorizerAppid(openAuthorizerInfoResult.getAuthorizationInfo().getAuthorizerAppid());
+ setAlias(openAuthorizerInfoResult.getAuthorizerInfo().getAlias());
+ setHeadImg(openAuthorizerInfoResult.getAuthorizerInfo().getHeadImg());
+ setQrcodeUrl(openAuthorizerInfoResult.getAuthorizerInfo().getQrcodeUrl());
+ setRefreshToken(openAuthorizerInfoResult.getAuthorizationInfo().getAuthorizerRefreshToken());
+ setAccessToken(openAuthorizerInfoResult.getAuthorizationInfo().getAuthorizerAccessToken());
+ setAccessTokenExpire(new Date(Long.valueOf(System.currentTimeMillis() + openAuthorizerInfoResult.getAuthorizationInfo().getExpiresIn()*1000)));
+ setAuthorizationStatus(EnumWxAuthorizationStatus.AUTHORIZED.getCode());
+ setAuthTime(new Date());
+ }
+ });
+ } catch (WxErrorException e) {
+ logger.error("gotoPreAuthUrl", e);
+ throw new RuntimeException(e);
+ }
+ }
+
+ @ApiOperation(value = "手机跳转链接url", notes = "")
+ @GetMapping("/getMobilePreAuthUrl")
+ @ResponseBody
+ public String getMobilePreAuthUrl(HttpServletRequest request, HttpServletResponse response) {
+ String host = request.getHeader("host");
+ String url = "https://" + host + "/O/wt_auth/jump";
+ try {
+ url = openService.getWxOpenComponentService().getMobilePreAuthUrl(url);
+ return url;
+ } catch (WxErrorException e) {
+ logger.error("getMobilePreAuthUrl", e);
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/mlToutiaoOpen/src/main/java/com/iformall/controller/WechatCalllbackController.java b/mlToutiaoOpen/src/main/java/com/iformall/controller/WechatCalllbackController.java
new file mode 100644
index 0000000..484e14c
--- /dev/null
+++ b/mlToutiaoOpen/src/main/java/com/iformall/controller/WechatCalllbackController.java
@@ -0,0 +1,415 @@
+package com.iformall.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.iformall.common.Result;
+import com.iformall.common.ResultData;
+import com.iformall.controller.base.BaseController;
+import com.iformall.domain.po.*;
+import com.iformall.enums.*;
+import com.iformall.service.*;
+import com.iformall.service.wechat.FmOpenService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
+import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
+import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
+import me.chanjar.weixin.open.bean.WxOpenCreateResult;
+import me.chanjar.weixin.open.bean.WxOpenGetResult;
+import me.chanjar.weixin.open.bean.message.WxOpenXmlMessage;
+import me.chanjar.weixin.open.bean.result.*;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.nio.charset.Charset;
+import java.util.Date;
+import java.util.Map;
+
+@Controller
+@RequestMapping("/wxOpen")
+@Api(description = "微信第三方开放平台回调相关接口")
+public class WechatCalllbackController extends BaseController {
+ private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+ @Autowired
+ protected FmOpenService openService;
+
+ @Autowired
+ private WxComponentVerifyTicketService componentVerifyTicketService;
+
+ @Autowired
+ private WxAuthorizerInfoService authorizerInfoService;
+
+ @PostMapping(value = "/notify")
+ @ApiOperation("接收ticket回调")
+ @ResponseBody
+ public String receiveTicket(HttpServletRequest request) throws IOException {
+ logger.info("[" + getIpAddr() + "]接收微信回调 /wxOpen/notify");
+
+ String timestamp = request.getParameter("timestamp");
+ String nonce = request.getParameter("nonce");
+ String signature = request.getParameter("signature");
+ String encType = request.getParameter("encrypt_type");
+ String msgSignature = request.getParameter("msg_signature");
+
+ if (!StringUtils.equalsIgnoreCase("aes", encType)
+ || !openService.getWxOpenComponentService().checkSignature(timestamp, nonce, signature)) {
+ throw new IllegalArgumentException("非法请求,可能属于伪造的请求!");
+ }
+
+ String resultxml = getRequestXML(request);
+
+ logger.info("\n接收微信回调:[signature=[{}], encType=[{}], msgSignature=[{}],"
+ + " timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ",
+ signature, encType, msgSignature, timestamp, nonce, resultxml);
+
+ // aes加密的消息, 解密
+ WxOpenXmlMessage inMessage = WxOpenXmlMessage.fromEncryptedXml(resultxml,
+ openService.getWxOpenConfigStorage(), timestamp, nonce, msgSignature);
+ this.logger.info("接收微信回调,消息解密后内容为:{} ", inMessage.toString());
+
+ // 处理
+ handleTicket(inMessage);
+ return "success";
+ }
+
+ /**
+ * 处理ticket消息
+ * @param inMessage
+ * @return
+ */
+ private void handleTicket(WxOpenXmlMessage inMessage) {
+ try {
+ String out = openService.getWxOpenComponentService().route(inMessage);
+ this.logger.info("组装回复信息:{}", out);
+ } catch (WxErrorException e) {
+ this.logger.error("notify", e);
+ }
+ if (inMessage.getInfoType().equalsIgnoreCase(EnumWxAuthorizationInfoType.COMPONENT_VERIFY_TICKET.getMessage())) {
+ // 保存component_verify_ticket
+ componentVerifyTicketService.saveOrUpdate(new WxComponentVerifyTicket() {
+ {
+ setComponentVerifyTicket(inMessage.getComponentVerifyTicket());
+ setCreateTime(new Date(Long.valueOf(inMessage.getCreateTime() * 1000)));
+ setComponentAppid(inMessage.getAppId());
+ setDeadline(new Date(Long.valueOf(System.currentTimeMillis() + (60 * 60 * 1000))));
+ }
+ });
+ } else if (inMessage.getInfoType().equalsIgnoreCase(EnumWxAuthorizationInfoType.AUTHORIZED.getMessage()) ||
+ inMessage.getInfoType().equalsIgnoreCase(EnumWxAuthorizationInfoType.UPDATEAUTHORIZED.getMessage())) {
+ // 审核通过
+ handleWeappAuditedMessage(inMessage);
+ } else if (inMessage.getInfoType().equals(EnumWxAuthorizationInfoType.UNAUTHORIZED.getMessage())) {
+ // 授权取消
+ authorizerInfoService.saveOrUpdate(new WxAuthorizerInfo() {
+ {
+ setAuthorizerAppid(inMessage.getAuthorizerAppid());
+ setAuthorizationStatus(EnumWxAuthorizationStatus.UNAUTHORIZED.getCode());
+ setAuthTime(new Date());
+ }
+ });
+ }
+ }
+
+ /**
+ * 处理小程序审核消息
+ * @param inMessage
+ * @return
+ */
+ private boolean handleWeappAuditedMessage(WxOpenXmlMessage inMessage) {
+ // 审核通过
+ try {
+ WxOpenQueryAuthResult queryAuthResult = openService.getWxOpenComponentService().getQueryAuth(inMessage.getAuthorizationCode());
+ logger.info("getQueryAuth", queryAuthResult);
+
+ WxOpenAuthorizerInfoResult openAuthorizerInfoResult = openService.getWxOpenComponentService().getAuthorizerInfo(
+ queryAuthResult.getAuthorizationInfo().getAuthorizerAppid());
+ logger.info(openAuthorizerInfoResult.toString());
+ // save auth info
+ authorizerInfoService.saveOrUpdate(new WxAuthorizerInfo() {
+ {
+ setAuthorizerAppid(openAuthorizerInfoResult.getAuthorizationInfo().getAuthorizerAppid());
+ setAlias(openAuthorizerInfoResult.getAuthorizerInfo().getAlias());
+ setHeadImg(openAuthorizerInfoResult.getAuthorizerInfo().getHeadImg());
+ setQrcodeUrl(openAuthorizerInfoResult.getAuthorizerInfo().getQrcodeUrl());
+ setRefreshToken(openAuthorizerInfoResult.getAuthorizationInfo().getAuthorizerRefreshToken());
+ setAccessToken(openAuthorizerInfoResult.getAuthorizationInfo().getAuthorizerAccessToken());
+ setAccessTokenExpire(new Date(Long.valueOf(System.currentTimeMillis() + openAuthorizerInfoResult.getAuthorizationInfo().getExpiresIn()*1000)));
+ setAuthorizationStatus(EnumWxAuthorizationStatus.AUTHORIZED.getCode());
+ setAuthTime(new Date());
+ }
+ });
+ return true;
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ }
+ return false;
+ }
+
+ @RequestMapping(value = "/{appId}/callback")
+ @ApiOperation("消息回调")
+ public void callback(@PathVariable("appId") String appId, HttpServletRequest request, HttpServletResponse response) throws IOException {
+ logger.info("[" + getIpAddr() + "]接收微信APP回调 /{appId}/callback");
+ String timestamp = request.getParameter("timestamp");
+ String nonce = request.getParameter("nonce");
+ String signature = request.getParameter("signature");
+ String encType = request.getParameter("encrypt_type");
+ String openid = request.getParameter("openid");
+ String msgSignature = request.getParameter("msg_signature");
+
+ // 第三方平台一定接收的是加密的消息
+ if (!StringUtils.equalsIgnoreCase("aes", encType)
+ || !openService.getWxOpenComponentService().checkSignature(timestamp, nonce, signature)) {
+ throw new IllegalArgumentException("非法请求,可能属于伪造的请求!");
+ }
+
+ String resultxml = getRequestXML(request);
+
+ logger.info("接收微信APP回调:[appId=[{}], openid=[{}], signature=[{}], encType=[{}], msgSignature=[{}],"
+ + " timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ",
+ appId, openid, signature, encType, msgSignature, timestamp, nonce, resultxml);
+
+
+ String out = "";
+ // aes加密的消息, 解密
+ WxMpXmlMessage inMessage = WxOpenXmlMessage.fromEncryptedMpXml(resultxml,
+ openService.getWxOpenConfigStorage(), timestamp, nonce, msgSignature);
+ logger.info("接收微信APP回调,消息解密后内容为:\n{}", inMessage.toString());
+
+ // 全网发布测试用例
+ if (StringUtils.equalsAnyIgnoreCase(appId, "wx570bc396a51b8ff8", "wxd101a85aa106f53e")) {
+ handleWechatTest(appId, response, inMessage);
+ PrintWriter printWriter = response.getWriter();
+ wechatWriteSuccess(printWriter);
+ return;
+ }
+
+ // 实际 消息 处理
+ //handleCallbackMessage(appId, response, inMessage);
+ WxMpXmlOutMessage outMessage = openService.getWxOpenMessageRouter().route(inMessage, appId);
+ if(outMessage == null) {
+ PrintWriter printWriter = response.getWriter();
+ wechatWriteSuccess(printWriter);
+ }
+ PrintWriter printWriter = response.getWriter();
+ wechatWriteSuccess(printWriter);
+ }
+
+ private void wechatWriteSuccess(PrintWriter printWriter) {
+ printWriter.print("success");
+ printWriter.flush();
+ printWriter.close();
+ }
+
+ /**
+ * 测试账号特殊处理
+ * @param appId
+ * @param response
+ * @param inMessage
+ * @throws IOException
+ */
+ private void handleWechatTest(@PathVariable("appId") String appId, HttpServletResponse response, WxMpXmlMessage inMessage) throws IOException {
+ String out;
+ try {
+ if (StringUtils.equals(inMessage.getMsgType(), "text")) {
+ if (StringUtils.equals(inMessage.getContent(), "TESTCOMPONENT_MSG_TYPE_TEXT")) {
+ out = WxOpenXmlMessage.wxMpOutXmlMessageToEncryptedXml(
+ WxMpXmlOutMessage.TEXT().content("TESTCOMPONENT_MSG_TYPE_TEXT_callback")
+ .fromUser(inMessage.getToUser())
+ .toUser(inMessage.getFromUser())
+ .build(),
+ openService.getWxOpenConfigStorage()
+ );
+ } else if (StringUtils.startsWith(inMessage.getContent(), "QUERY_AUTH_CODE:")) {
+ String msg = inMessage.getContent().replace("QUERY_AUTH_CODE:", "") + "_from_api";
+ WxMpKefuMessage kefuMessage = WxMpKefuMessage.TEXT().content(msg).toUser(inMessage.getFromUser()).build();
+ openService.getWxOpenComponentService().getWxMpServiceByAppid(appId).getKefuService().sendKefuMessage(kefuMessage);
+ }
+ } else if (StringUtils.equals(inMessage.getMsgType(), "event")) {
+ WxMpKefuMessage kefuMessage = WxMpKefuMessage.TEXT().content(inMessage.getEvent() + "from_callback").toUser(inMessage.getFromUser()).build();
+ openService.getWxOpenComponentService().getWxMpServiceByAppid(appId).getKefuService().sendKefuMessage(kefuMessage);
+ }
+ } catch (WxErrorException e) {
+ logger.error("callback", e);
+ }
+ }
+
+ private String getRequestXML(HttpServletRequest request) throws IOException {
+ InputStream inStream = request.getInputStream();
+ ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
+ byte[] buffer = new byte[1024];
+ int len = 0;
+ while ((len = inStream.read(buffer)) != -1) {
+ outSteam.write(buffer, 0, len);
+ }
+ String resultxml = new String(outSteam.toByteArray(), Charset.forName("UTF-8"));
+ logger.info(resultxml);
+
+ outSteam.close();
+ inStream.close();
+ return resultxml;
+ }
+
+ private void getThreadCount( int i) {
+ ThreadGroup group = Thread.currentThread().getThreadGroup();
+ ThreadGroup topGroup = group;
+ // 遍历线程组树,获取根线程组
+ while (group != null) {
+ topGroup = group;
+ group = group.getParent();
+ }
+ // 激活的线程数加倍
+ int activeCount = topGroup.activeCount();
+ // copy into a list that is the exact size
+ logger.info("Thread list size == " + i + " : " + activeCount);
+
+ }
+
+
+ @GetMapping(value = "/createOpenPlatform")
+ @ApiOperation("创建微信开放平台")
+ public ResultData createOpenPlatform(@RequestParam(value = "appId") String appId) {
+ Gson gson = new GsonBuilder().create();
+ try {
+ WxOpenCreateResult ret = openService.getWxOpenComponentService().createOpenAccount(appId);
+ logger.info(ret.toString());
+ if (ret.isSuccess()) {
+ WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId);
+ if (authorizerInfo != null) {
+ authorizerInfo.setId(authorizerInfo.getId());
+ authorizerInfo.setOpenAppid(ret.getOpenAppid());
+ authorizerInfoService.updateOpenAppid(authorizerInfo);
+ }
+ }
+ return new ResultData(ret.toString());
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+ }
+
+ @GetMapping(value = "/bindOpenPlatform")
+ @ApiOperation("绑定微信开放平台")
+ public ResultData bindOpenPlatform(@RequestParam(value = "appId") String appId, @RequestParam(value = "openAppId") String openAppId) {
+ Gson gson = new GsonBuilder().create();
+ try {
+ Boolean ret = openService.getWxOpenComponentService().bindOpenAccount(appId, openAppId);
+ if (ret) {
+ WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId);
+ if (authorizerInfo != null) {
+ authorizerInfo.setId(authorizerInfo.getId());
+ authorizerInfo.setOpenAppid(openAppId);
+ authorizerInfoService.updateOpenAppid(authorizerInfo);
+ }
+ return new ResultData();
+ }
+ return new ResultData(Result.ERROR, ret.toString());
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+ }
+
+ @GetMapping(value = "/unbindOpenPlatform")
+ @ApiOperation("解绑微信开放平台")
+ public ResultData unbindOpenPlatform(@RequestParam(value = "appId") String appId, @RequestParam(value = "openAppId") String openAppId) {
+ Gson gson = new GsonBuilder().create();
+ try {
+ Boolean ret = openService.getWxOpenComponentService().unbindOpenAccount(appId, openAppId);
+ if (ret) {
+ WxAuthorizerInfo authorizerInfo = new WxAuthorizerInfo();
+ authorizerInfo.setAuthorizerAppid(appId);
+ authorizerInfoService.removeOpenAppid(authorizerInfo);
+ return new ResultData();
+ }
+ return new ResultData(Result.ERROR, ret.toString());
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+ }
+
+ @GetMapping(value = "/getOpenPlatform")
+ @ApiOperation("获取微信开放平台appId")
+ public ResultData getOpenPlatform(@RequestParam(value = "appId") String appId) {
+ Gson gson = new GsonBuilder().create();
+ try {
+ WxOpenGetResult ret = openService.getWxOpenComponentService().getOpenAccount(appId);
+ logger.info(ret.toString());
+ if (ret.isSuccess()) {
+ WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId);
+ if (authorizerInfo != null) {
+ if(StringUtils.isBlank(authorizerInfo.getOpenAppid()) && StringUtils.isNotBlank(ret.getOpenAppid())) {
+ authorizerInfo.setId(authorizerInfo.getId());
+ authorizerInfo.setOpenAppid(ret.getOpenAppid());
+ authorizerInfoService.updateOpenAppid(authorizerInfo);
+ }
+ }
+ return new ResultData(ret.getOpenAppid());
+ }
+ return new ResultData(Result.ERROR, ret.toString());
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+ }
+
+ @GetMapping(value = "/clearQuota")
+ @ApiOperation("代公众号清零quota,每个公众号每个月有10次清零机会,包括在微信公众平台上的清零以及调用API进行清零")
+ public ResultData clearQuota(@RequestParam(value = "appId") String appId) {
+ try {
+ openService.getWxOpenComponentService().getWxMpServiceByAppid(appId).clearQuota(appId);
+ return new ResultData();
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+ }
+
+ @GetMapping(value = "/getAuthorizerList")
+ @ApiOperation("拉取当前所有已授权的帐号基本信息")
+ public ResultData getAuthorizerList() {
+ try {
+ WxOpenAuthorizerListResult authorizerListResult = openService.getWxOpenComponentService().getAuthorizerList(0, 100);
+ logger.info("getAuthorizerList: " + authorizerListResult);
+ if(authorizerListResult.getTotalCount() > 0) {
+ for (Map data : authorizerListResult.getList()) {
+ String appId = data.get("authorizer_appid");
+ String refreshToken = data.get("refresh_token");
+ Long authTime = Long.valueOf(data.get("auth_time"));
+ Date authDate = new Date(authTime*1000);
+
+ if(StringUtils.isBlank(refreshToken)) {
+ continue;
+ }
+
+ WxAuthorizerInfo authorizerInfo = new WxAuthorizerInfo();
+ authorizerInfo.setAuthorizerAppid(appId);
+ authorizerInfo.setRefreshToken(refreshToken);
+ authorizerInfo.setAuthTime(authDate);
+ authorizerInfoService.updateAuthAppidInfo(authorizerInfo);
+
+ openService.getWxOpenComponentService().getWxOpenConfigStorage().setAuthorizerRefreshToken(appId, refreshToken);
+ }
+ }
+ return new ResultData(authorizerListResult.toString());
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+ }
+}
diff --git a/mlToutiaoOpen/src/main/java/com/iformall/controller/WechatMediaController.java b/mlToutiaoOpen/src/main/java/com/iformall/controller/WechatMediaController.java
new file mode 100644
index 0000000..db61792
--- /dev/null
+++ b/mlToutiaoOpen/src/main/java/com/iformall/controller/WechatMediaController.java
@@ -0,0 +1,133 @@
+package com.iformall.controller;
+
+import com.iformall.common.ResultData;
+import com.iformall.controller.base.BaseController;
+import com.iformall.service.WxAuthorizerInfoService;
+import com.iformall.service.wechat.FmOpenService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.bean.material.WxMediaImgUploadResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+
+/**
+ * Stormeye Wu
+ */
+@Controller
+@RequestMapping("/material")
+@Api(description = "微信第三方开放平台素材文件")
+public class WechatMediaController extends BaseController {
+ private final Logger logger = LoggerFactory.getLogger(getClass());
+ @Autowired
+ private String fmUploadDir;
+ @Autowired
+ private FmOpenService openService;
+
+ @Autowired
+ private WxAuthorizerInfoService authorizerInfoService;
+
+ @ApiOperation(value = "获取永久素材", notes = "")
+ @GetMapping("/getMedia")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "appId", value = "appId", dataType = "String", paramType = "query", required = true),
+ @ApiImplicitParam(name = "mediaId", value = "mediaId", dataType = "String", paramType = "query", required = true)})
+ public void getMediaInfo(String appId, String mediaId, HttpServletRequest req, HttpServletResponse response) {
+ InputStream inputStream = null;
+ String filename = mediaId;
+ try {
+ WxMpService mpService = openService.getWxOpenComponentService().getWxMpServiceByAppid(appId);
+ inputStream = mpService.getMaterialService().materialImageOrVoiceDownload(mediaId);
+ } catch (WxErrorException e) {
+ logger.error("获取永久素材失败", e);
+ throw new RuntimeException(e);
+ }
+
+ try {
+ response.reset();
+ response.setContentType("application/octet-stream");
+ String agent = req.getHeader("user-agent");
+ if (agent.contains("Firefox")) {
+ response.setHeader("Content-disposition",
+ "attachment; filename="
+ + new String(filename.getBytes("GB2312"), "ISO-8859-1"));
+ } else {
+ response.setHeader("Content-disposition",
+ "attachment; filename="
+ + java.net.URLEncoder.encode(filename, "UTF-8"));
+ }
+ // 循环取出流中的数据
+ byte[] b = new byte[1024];
+ int len;
+ while ((len = inputStream.read(b)) > 0)
+ response.getOutputStream().write(b, 0, len);
+ inputStream.close();
+ } catch (Exception e) {
+ logger.error(e.getMessage());
+ }
+ }
+
+ /**
+ * 图片上传
+ *
+ * @param multiReq
+ * @return
+ * @throws Exception
+ */
+ @PostMapping(value = "/imgUpload/{appId}", consumes = "multipart/*", headers = "content-type=multipart/form-data")
+ @ApiOperation("上传图片")
+ public ResultData imgUpload(
+ @PathVariable("appId") String appId,
+ @RequestParam("file") MultipartFile multiReq) throws Exception {
+ logger.info("[" + getIpAddr() + "] WechatMediaController::imgUpload");
+
+ String fileName = multiReq.getOriginalFilename();
+ System.out.println(fileName);
+
+ // 本地保存
+ FileOutputStream fos = null;
+ String localImgFileName = fmUploadDir + fileName;
+ BufferedInputStream fs = null;
+ File localFile = new File(localImgFileName);
+ fos = new FileOutputStream(localFile);
+ fs = (BufferedInputStream) multiReq.getInputStream();
+ byte[] buffer = new byte[1024];
+ int len = 0;
+ while ((len = fs.read(buffer)) != -1) {
+ fos.write(buffer, 0, len);
+ }
+ fos.close();
+ fs.close();
+
+ // 上传 微信
+ try {
+ WxMpService mpService = openService.getWxOpenComponentService().getWxMpServiceByAppid(appId);
+ WxMediaImgUploadResult openResult = mpService.getMaterialService().mediaImgUpload(localFile);
+ if(openResult != null) {
+ return new ResultData(openResult.getUrl());
+ }
+ } catch (WxErrorException e) {
+ logger.error("获取永久素材失败", e);
+ throw new RuntimeException(e);
+ }
+
+ // 删除本地缓存
+ localFile.delete();
+
+ return new ResultData();
+ }
+}
diff --git a/mlToutiaoOpen/src/main/java/com/iformall/controller/WechatWeappCodeController.java b/mlToutiaoOpen/src/main/java/com/iformall/controller/WechatWeappCodeController.java
new file mode 100644
index 0000000..8d97ccc
--- /dev/null
+++ b/mlToutiaoOpen/src/main/java/com/iformall/controller/WechatWeappCodeController.java
@@ -0,0 +1,703 @@
+package com.iformall.controller;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.reflect.TypeToken;
+import com.iformall.common.ErrorCode;
+import com.iformall.common.Result;
+import com.iformall.common.ResultData;
+import com.iformall.controller.base.BaseController;
+import com.iformall.domain.dto.WxWeappCodeAuditDto;
+import com.iformall.domain.po.*;
+import com.iformall.domain.vo.WxWeappCodeStatusVo;
+import com.iformall.enums.*;
+import com.iformall.service.*;
+import com.iformall.service.wechat.FmOpenService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.open.api.WxOpenMaService;
+import me.chanjar.weixin.open.bean.ma.WxMaOpenCommitExtInfo;
+import me.chanjar.weixin.open.bean.message.WxOpenMaSubmitAuditMessage;
+import me.chanjar.weixin.open.bean.result.*;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URLEncoder;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Stormeye Wu
+ */
+@RestController
+@RequestMapping("/weappCode")
+@Api(description = "微信第三方开发平台-小程序-代码管理")
+public class WechatWeappCodeController extends BaseController {
+ private final Logger logger = LoggerFactory.getLogger(getClass());
+ @Autowired
+ private FmOpenService openService;
+
+ @Autowired
+ private WxWeappCodeStatusService weappCodeStatusService;
+
+ @Autowired
+ private WxWeappAuditStatusService weappAuditStatusService;
+
+ @Autowired
+ private WxWeappReleaseStatusService weappReleaseStatusService;
+
+ @Autowired
+ private WxAppinfoService appinfoService;
+
+ @Autowired
+ private WxAuthorizerInfoService authorizerInfoService;
+
+ @Autowired
+ private WxWeappExtSetService weappExtSetService;
+
+
+ @ApiOperation(value = "为授权的小程序帐号上传小程序代码", notes = "extInfo参考https://mp.weixin.qq.com/debug/wxadoc/dev/framework/config.html")
+ @PostMapping("/codeCommit")
+ public ResultData codeCommit(Long templateId, String userVersion, String userDesc, String extInfoStr) {
+ Gson gson = new GsonBuilder().create();
+ WxMaOpenCommitExtInfo extInfo = gson.fromJson(extInfoStr, new TypeToken() {}.getType());
+ String appId = extInfo.getExtAppid();
+
+ // 检查appId是否已授权
+ WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId);
+ if(authorizerInfo == null) {
+ return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
+ }
+ if(!authorizerInfo.getAuthorizationStatus().equals(EnumWxAuthorizationStatus.AUTHORIZED.getCode())) {
+ return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
+ }
+
+ WxWeappCodeStatus codeStatus = weappCodeStatusService.getByAppId(appId);
+
+ WxAppinfo appinfo = appinfoService.getByAppId(appId);
+
+ int iAppType = 0;
+ String appTypeStr = userVersion.substring(0, 1);
+ if(appTypeStr.equalsIgnoreCase("C"))
+ iAppType = EnumAppType.C.getCode();
+ else if(appTypeStr.equalsIgnoreCase("B"))
+ iAppType = EnumAppType.B.getCode();
+
+ try {
+ // code提交
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ logger.info(extInfo.toString());
+ WxOpenResult openRet = openMaService.codeCommit(templateId, userVersion, userDesc, extInfo);
+ logger.info(openRet.toString());
+ boolean codeCommitStatus = false;
+ if (openRet.isSuccess()) {
+ codeCommitStatus = true;
+ }
+ if (codeStatus == null) {
+ codeStatus = new WxWeappCodeStatus();
+ codeStatus.setAppId(appId);
+ if (appinfo != null) {
+ codeStatus.setTenantId(appinfo.getTenantId());
+ codeStatus.setType(appinfo.getType());
+ }
+ codeStatus.setUserVersion(userVersion);
+ codeStatus.setVersionDesc(userDesc);
+ if(codeCommitStatus) {
+ codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.SUCCESS.getCode());
+ } else {
+ codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.FAIL.getCode());
+ codeStatus.setCodeErrCode(gson.toJson(openRet));
+ }
+ codeStatus.setCodeTime(new Date());
+ weappCodeStatusService.saveStatus(codeStatus);
+ } else {
+ codeStatus.setUserVersion(userVersion);
+ codeStatus.setVersionDesc(userDesc);
+ if(codeCommitStatus) {
+ codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.SUCCESS.getCode());
+ } else {
+ codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.FAIL.getCode());
+ codeStatus.setCodeErrCode(gson.toJson(openRet));
+ }
+ codeStatus.setCodeTime(new Date());
+ weappCodeStatusService.updateStatus(codeStatus);
+ }
+ return new ResultData(openRet);
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ if (codeStatus == null) {
+ codeStatus = new WxWeappCodeStatus();
+ codeStatus.setAppId(appId);
+ if (appinfo != null) {
+ codeStatus.setTenantId(appinfo.getTenantId());
+ codeStatus.setType(appinfo.getType());
+ }
+ codeStatus.setUserVersion(userVersion);
+ codeStatus.setVersionDesc(userDesc);
+ codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.FAIL.getCode());
+ codeStatus.setCodeErrCode(e.getMessage());
+ codeStatus.setCodeTime(new Date());
+ weappCodeStatusService.saveStatus(codeStatus);
+ } else {
+ codeStatus.setUserVersion(userVersion);
+ codeStatus.setVersionDesc(userDesc);
+ codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.FAIL.getCode());
+ codeStatus.setCodeErrCode(e.getMessage());
+ codeStatus.setCodeTime(new Date());
+ weappCodeStatusService.updateStatus(codeStatus);
+ }
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+ }
+
+ @ApiOperation("获取体验小程序的体验二维码")
+ @GetMapping("/getQrcode")
+ public void getQrcode(@RequestParam(value = "appId") String appId, @RequestParam(value = "pagePath") String pagePath,
+ @RequestParam(value = "params", required = false) Map params,
+ HttpServletResponse response, HttpServletRequest req) {
+ try {
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ File file = openMaService.getTestQrcode(pagePath, params);
+ ServletOutputStream out = response.getOutputStream();
+
+ response.reset();
+ response.setContentType("image/jpeg");
+ String agent = req.getHeader("user-agent");
+ String filename = "QRCode.jpg";
+ if (agent.contains("Firefox")) {
+ response.setHeader("Content-disposition",
+ "attachment; filename=" + new String(filename.getBytes("GB2312"),"ISO-8859-1"));
+ } else {
+ response.setHeader("Content-disposition",
+ "attachment; filename=" + URLEncoder.encode(filename,"UTF-8"));
+ }
+ // 循环取出流中的数据
+ byte[] b = new byte[1024];
+ int len;
+ InputStream inStream = new FileInputStream(file);
+ while ((len = inStream.read(b)) > 0)
+ response.getOutputStream().write(b, 0, len);
+ inStream.close();
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ } catch (IOException e) {
+ logger.error(e.getMessage());
+ }
+ }
+
+ @ApiOperation("获取授权小程序帐号已设置的类目")
+ @GetMapping("/getCategory")
+ public ResultData getCategory(String appId) {
+ try {
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ WxOpenMaCategoryListResult openRet = openMaService.getCategoryList();
+ logger.info(openRet.toString());
+ return new ResultData(openRet);
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+ }
+
+ @ApiOperation("获取小程序的第三方提交代码的页面配置")
+ @GetMapping("/getPage")
+ public ResultData getPage(String appId) {
+ try {
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ WxOpenMaPageListResult openRet = openMaService.getPageList();
+ logger.info(openRet.toString());
+ return new ResultData(openRet);
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+ }
+
+ @ApiOperation("将第三方提交的代码包提交审核 -- 即将废弃")
+ @GetMapping("/submitAudit")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "appId", value = "appId", dataType = "String", paramType = "query", required = true),
+ @ApiImplicitParam(name = "version", value = "version", dataType = "String", paramType = "query")})
+ public ResultData submitAudit(String appId, String version) {
+ Gson gson = new GsonBuilder().create();
+ WxWeappExtSet extSetQ = new WxWeappExtSet();
+ extSetQ.setAppId(appId);
+ WxWeappExtSet extSet = weappExtSetService.getByObj(extSetQ);
+ if(StringUtils.isBlank(extSet.getReleaseJson())) {
+ logger.error("Release JSON is null");
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
+ }
+
+ WxWeappCodeStatusVo codeQ = new WxWeappCodeStatusVo();
+ codeQ.setAppId(appId);
+ if(StringUtils.isNotBlank(version)) {
+ codeQ.setUserVersion(version);
+ }
+ List codeStatusList = weappCodeStatusService.getList(codeQ);
+ if(codeStatusList.size() == 1) {
+ WxWeappCodeStatusVo codeStatus = codeStatusList.get(0);
+ WxOpenMaSubmitAuditMessage subMessage = gson.fromJson(extSet.getReleaseJson(), new TypeToken() {}.getType());
+ if(codeStatus != null && codeStatus.getCodeStatus().equals(EnumWeappCodeCommitStatus.SUCCESS.getCode())) {
+ WxWeappAuditStatus auditStatus = weappAuditStatusService.getByAppId(appId);
+ boolean submitStatus = false;
+ String codeErrCode = "";
+ Long auditId = null;
+ try {
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ WxOpenMaSubmitAuditResult openRet = openMaService.submitAudit(subMessage);
+ logger.info(openRet.toString());
+ if(openRet.isSuccess()) {
+ submitStatus = true;
+ codeErrCode = gson.toJson(openRet);
+ auditId = openRet.getAuditId();
+ } else {
+ submitStatus = false;
+ codeErrCode = gson.toJson(openRet);
+ }
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ submitStatus = false;
+ codeErrCode = e.getMessage();
+ }
+
+ if (auditStatus == null) {
+ auditStatus = new WxWeappAuditStatus();
+ auditStatus.setId(codeStatus.getId());
+ auditStatus.setTenantId(codeStatus.getTenantId());
+ auditStatus.setAppId(codeStatus.getAppId());
+ auditStatus.setType(codeStatus.getType());
+ auditStatus.setUserVersion(codeStatus.getUserVersion());
+ auditStatus.setVersionDesc(codeStatus.getVersionDesc());
+ if(submitStatus) {
+ auditStatus.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode());
+ } else {
+ auditStatus.setAuditStatus(EnumWeappAuditStatus.FAIL.getCode());
+ }
+ auditStatus.setAuditErrCode(codeErrCode);
+ auditStatus.setAuditTime(new Date());
+ weappAuditStatusService.saveStatus(auditStatus);
+ } else {
+ if(!submitStatus) {
+ if(!auditStatus.getUserVersion().equals(codeStatus.getUserVersion())
+ && auditStatus.getAuditStatus().equals(EnumWeappAuditStatus.AUDITING.getCode())) {
+ // 提交审核失败不替换当前审核中的数据
+ return new ResultData(ErrorCode.WEAPP_HAD_AUDITING);
+ }
+ codeStatus.setCodeStatus(EnumWeappAuditStatus.FAIL.getCode());
+ codeStatus.setCodeErrCode(codeErrCode);
+ } else {
+ codeStatus.setCodeStatus(EnumWeappAuditStatus.AUDITING.getCode());
+ }
+ auditStatus.setUserVersion(codeStatus.getUserVersion());
+ auditStatus.setVersionDesc(codeStatus.getVersionDesc());
+ auditStatus.setAuditTime(new Date());
+ weappAuditStatusService.updateStatus(auditStatus);
+ }
+ if(submitStatus) {
+ return new ResultData(codeErrCode);
+ } else {
+ return new ResultData(ErrorCode.WEAPP_AUDIT_ERR);
+ }
+ } else {
+ logger.error(ErrorCode.WEAPP_CODE_COMMIT_ERR.getMessage());
+ return new ResultData(ErrorCode.WEAPP_CODE_COMMIT_ERR);
+ }
+ }
+ return new ResultData(ErrorCode.WEAPP_CODE_COMMIT_ERR);
+ }
+
+ @ApiOperation("查询服务商的当月提审限额(quota)和加急次数")
+ @GetMapping("/queryQuota")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "appId", value = "appId", dataType = "String", paramType = "query", required = true)})
+ public ResultData queryQuota(String appId) {
+ logger.debug("[" + getIpAddr() + "] WechatWeappCodeController::queryQuota");
+ try {
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ WxOpenMaQueryQuotaResult openRet = openMaService.queryQuota();
+ logger.info(openRet.toString());
+ return new ResultData(openRet.toString());
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(e.getMessage());
+ }
+ }
+
+ @ApiOperation("将第三方提交的代码包提交审核")
+ @PostMapping("/submitAuditWithFeedBack")
+ public ResultData submitAudit(@RequestBody WxWeappCodeAuditDto codeAuditDto) {
+ Gson gson = new GsonBuilder().create();
+ WxWeappExtSet extSetQ = new WxWeappExtSet();
+ extSetQ.setAppId(codeAuditDto.getAppId());
+ WxWeappExtSet extSet = weappExtSetService.getByObj(extSetQ);
+ if(StringUtils.isBlank(extSet.getReleaseJson())) {
+ logger.error("Release JSON is null");
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
+ }
+
+ WxWeappCodeStatusVo codeQ = new WxWeappCodeStatusVo();
+ codeQ.setAppId(codeAuditDto.getAppId());
+ if(StringUtils.isNotBlank(codeAuditDto.getVersion())) {
+ codeQ.setUserVersion(codeAuditDto.getVersion());
+ }
+ List codeStatusList = weappCodeStatusService.getList(codeQ);
+ if(codeStatusList.size() == 1) {
+ WxWeappCodeStatusVo codeStatus = codeStatusList.get(0);
+ WxOpenMaSubmitAuditMessage subMessage = gson.fromJson(extSet.getReleaseJson(), new TypeToken() {}.getType());
+ if(StringUtils.isNotBlank(codeAuditDto.getFeedbackInfo())) {
+ subMessage.setFeedbackInfo(codeAuditDto.getFeedbackInfo());
+ }
+ if(StringUtils.isNotBlank(codeAuditDto.getFeedbackStuff())) {
+ subMessage.setFeedbackStuff(codeAuditDto.getFeedbackStuff());
+ }
+ if(codeStatus != null && codeStatus.getCodeStatus().equals(EnumWeappCodeCommitStatus.SUCCESS.getCode())) {
+ WxWeappAuditStatus auditStatus = weappAuditStatusService.getByAppId(codeAuditDto.getAppId());
+ boolean submitStatus = false;
+ String codeErrCode = "";
+ Long auditId = null;
+ try {
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(codeAuditDto.getAppId());
+ WxOpenMaSubmitAuditResult openRet = openMaService.submitAudit(subMessage);
+ logger.info(openRet.toString());
+ if(openRet.isSuccess()) {
+ submitStatus = true;
+ codeErrCode = gson.toJson(openRet);
+ auditId = openRet.getAuditId();
+ } else {
+ submitStatus = false;
+ codeErrCode = gson.toJson(openRet);
+ }
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ submitStatus = false;
+ codeErrCode = e.getMessage();
+ }
+
+ if (auditStatus == null) {
+ auditStatus = new WxWeappAuditStatus();
+ auditStatus.setId(codeStatus.getId());
+ auditStatus.setTenantId(codeStatus.getTenantId());
+ auditStatus.setAppId(codeStatus.getAppId());
+ auditStatus.setType(codeStatus.getType());
+ auditStatus.setUserVersion(codeStatus.getUserVersion());
+ auditStatus.setVersionDesc(codeStatus.getVersionDesc());
+ auditStatus.setAuditid(auditId);
+ if(submitStatus) {
+ auditStatus.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode());
+ } else {
+ auditStatus.setAuditStatus(EnumWeappAuditStatus.FAIL.getCode());
+ }
+ auditStatus.setAuditErrCode(codeErrCode);
+ auditStatus.setAuditTime(new Date());
+ weappAuditStatusService.saveStatus(auditStatus);
+ } else {
+ if(!submitStatus) {
+ if(!auditStatus.getUserVersion().equals(codeStatus.getUserVersion())
+ && auditStatus.getAuditStatus().equals(EnumWeappAuditStatus.AUDITING.getCode())) {
+ // 提交审核失败不替换当前审核中的数据
+ return new ResultData(ErrorCode.WEAPP_HAD_AUDITING);
+ }
+ codeStatus.setCodeStatus(EnumWeappAuditStatus.FAIL.getCode());
+ codeStatus.setCodeErrCode(codeErrCode);
+ } else {
+ codeStatus.setCodeStatus(EnumWeappAuditStatus.AUDITING.getCode());
+ }
+ auditStatus.setUserVersion(codeStatus.getUserVersion());
+ auditStatus.setVersionDesc(codeStatus.getVersionDesc());
+ auditStatus.setAuditid(auditId);
+ auditStatus.setAuditTime(new Date());
+ weappAuditStatusService.updateStatus(auditStatus);
+ }
+ if(submitStatus) {
+ return new ResultData(codeErrCode);
+ } else {
+ return new ResultData(ErrorCode.WEAPP_AUDIT_ERR);
+ }
+ } else {
+ logger.error(ErrorCode.WEAPP_CODE_COMMIT_ERR.getMessage());
+ return new ResultData(ErrorCode.WEAPP_CODE_COMMIT_ERR);
+ }
+ }
+ return new ResultData(ErrorCode.WEAPP_CODE_COMMIT_ERR);
+ }
+
+ @ApiOperation("加速某个指定版本的审核状态")
+ @GetMapping("/speedAudit")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "appId", value = "appId", dataType = "String", paramType = "query", required = true),
+ @ApiImplicitParam(name = "auditid", value = "auditid", dataType = "Long", paramType = "query", required = true)})
+ public ResultData speedAudit(String appId, Long auditid) {
+ logger.debug("[" + getIpAddr() + "] WechatWeappCodeController::speedAudit");
+ try {
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ Boolean ret = openMaService.speedAudit(Long.valueOf(auditid));
+ return new ResultData(ret.toString());
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(e.getMessage());
+ }
+ }
+
+ @ApiOperation("查询某个指定版本的审核状态")
+ @PostMapping("/getAuditstatus")
+ public ResultData getAuditstatus(String appId, String auditidStr) {
+ Gson gson = new GsonBuilder().create();
+ Long auditId = Long.valueOf(auditidStr);
+ WxWeappAuditStatus auditStatus = weappAuditStatusService.getByAppId(appId);
+ if(auditStatus != null && auditStatus.getAuditid().equals(auditId)) {
+ try {
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ WxOpenMaQueryAuditResult openRet = openMaService.getAuditStatus(auditId);
+ logger.info(openRet.toString());
+ if (openRet.isSuccess()) {
+ auditStatus.setAuditid(openRet.getAuditId());
+ // 审核状态,其中0为审核成功,1为审核失败,2为审核中,3已撤回
+ switch (openRet.getStatus().intValue()) {
+ case 0:
+ auditStatus.setAuditStatus(EnumWeappAuditStatus.SUCCESS.getCode());
+ break;
+ case 1:
+ auditStatus.setAuditStatus(EnumWeappAuditStatus.FAIL.getCode());
+ break;
+ case 2:
+ auditStatus.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode());
+ break;
+ case 3:
+ auditStatus.setAuditStatus(EnumWeappAuditStatus.UNDO.getCode());
+ break;
+ default:
+ auditStatus.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode());
+ break;
+ }
+ auditStatus.setAuditErrCode(gson.toJson(openRet));
+ auditStatus.setAuditTime(new Date());
+ weappAuditStatusService.updateStatus(auditStatus);
+ }
+ return new ResultData(openRet);
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+ }
+ return new ResultData(Result.ERROR, "auditid不对应");
+ }
+
+ @ApiOperation("查询最新一次提交的审核状态")
+ @GetMapping("/getLatestAuditstatus")
+ public ResultData get_latest_auditstatus(String appId) {
+ Gson gson = new GsonBuilder().create();
+ WxWeappAuditStatus auditStatus = weappAuditStatusService.getByAppId(appId);
+ if(auditStatus != null
+ && auditStatus.getAuditStatus().equals(EnumWeappAuditStatus.AUDITING.getCode())) {
+ try {
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ WxOpenMaQueryAuditResult openRet = openMaService.getLatestAuditStatus();
+ logger.info(openRet.toString());
+ if (openRet.isSuccess()) {
+ auditStatus.setAuditid(openRet.getAuditId());
+ // 审核状态,其中0为审核成功,1为审核失败,2为审核中,3已撤回
+ switch (openRet.getStatus().intValue()) {
+ case 0:
+ auditStatus.setAuditStatus(EnumWeappAuditStatus.SUCCESS.getCode());
+ break;
+ case 1:
+ auditStatus.setAuditStatus(EnumWeappAuditStatus.FAIL.getCode());
+ break;
+ case 2:
+ auditStatus.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode());
+ break;
+ case 3:
+ auditStatus.setAuditStatus(EnumWeappAuditStatus.UNDO.getCode());
+ break;
+ default:
+ auditStatus.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode());
+ break;
+ }
+ auditStatus.setAuditErrCode(gson.toJson(openRet));
+ auditStatus.setAuditTime(new Date());
+ weappAuditStatusService.updateStatus(auditStatus);
+ }
+ return new ResultData(openRet);
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+ } else {
+ return new ResultData(Result.ERROR, "审核状态不是审核中");
+ }
+ }
+
+ @ApiOperation("发布已通过审核的小程序")
+ @GetMapping("/releaseAudited")
+ public ResultData releaesAudited(String appId) {
+ if(StringUtils.isBlank(appId)) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
+ }
+ Gson gson = new GsonBuilder().create();
+ WxWeappAuditStatus auditStatus = weappAuditStatusService.getByAppId(appId);
+ if(auditStatus.getAuditStatus().equals(EnumWeappAuditStatus.SUCCESS.getCode())) {
+ boolean isUpdate = false;
+ WxWeappReleaseStatus releaseStatus = weappReleaseStatusService.getByAppId(appId);
+ if(releaseStatus != null) {
+ // 版本已发布成功,跳过
+ if(releaseStatus.getUserVersion().equals(auditStatus.getUserVersion())
+ && releaseStatus.getReleaseStatus().equals(EnumWeappReleaseStatus.SUCCESS.getCode())) {
+ return new ResultData(ErrorCode.WEAPP_APP_RELEASEED);
+ }
+ releaseStatus.setUserVersion(auditStatus.getUserVersion());
+ releaseStatus.setVersionDesc(auditStatus.getVersionDesc());
+ isUpdate = true;
+ } else {
+ releaseStatus = new WxWeappReleaseStatus();
+ releaseStatus.setId(auditStatus.getId());
+ releaseStatus.setTenantId(auditStatus.getTenantId());
+ releaseStatus.setAppId(auditStatus.getAppId());
+ releaseStatus.setType(auditStatus.getType());
+ releaseStatus.setUserVersion(auditStatus.getUserVersion());
+ releaseStatus.setVersionDesc(auditStatus.getVersionDesc());
+ }
+ try {
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ WxOpenResult openRet = openMaService.releaesAudited();
+ logger.info(openRet.toString());
+ boolean releaseSuccess = false;
+ if(openRet.isSuccess()) {
+ releaseSuccess = true;
+ }
+ if(releaseSuccess) {
+ releaseStatus.setReleaseStatus(EnumWeappReleaseStatus.SUCCESS.getCode());
+ } else {
+ if(openRet.getErrcode().equals("85052")) { // app is already released
+ releaseStatus.setReleaseStatus(EnumWeappReleaseStatus.SUCCESS.getCode());
+ } else {
+ releaseStatus.setReleaseStatus(EnumWeappReleaseStatus.FAIL.getCode());
+ }
+ }
+ releaseStatus.setReleaseErrCode(gson.toJson(openRet));
+ releaseStatus.setReleaseTime(new Date());
+ if(isUpdate) {
+ weappReleaseStatusService.updateStatus(releaseStatus);
+ } else {
+ weappReleaseStatusService.saveStatus(releaseStatus);
+ }
+ return new ResultData(openRet);
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ if(e.getError().getErrorCode() == 85052) {
+ releaseStatus.setReleaseStatus(EnumWeappReleaseStatus.SUCCESS.getCode());
+ } else {
+ releaseStatus.setReleaseStatus(EnumWeappReleaseStatus.FAIL.getCode());
+ }
+ releaseStatus.setReleaseErrCode(e.getMessage());
+ releaseStatus.setReleaseTime(new Date());
+ if(isUpdate) {
+ weappReleaseStatusService.updateStatus(releaseStatus);
+ } else {
+ weappReleaseStatusService.saveStatus(releaseStatus);
+ }
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+ } else {
+ return new ResultData(ErrorCode.WEAPP_NOT_AUDITED);
+ }
+ }
+
+ @ApiOperation("小程序版本回退")
+ @GetMapping("/revertCodeRelease")
+ public ResultData revertCodeRelease(String appId) {
+ Gson gson = new GsonBuilder().create();
+ WxWeappReleaseStatus releaseStatus = weappReleaseStatusService.getByAppId(appId);
+ try {
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ WxOpenResult openRet = openMaService.revertCodeReleaes();
+ logger.info(openRet.toString());
+ if(openRet.isSuccess()) {
+ if(releaseStatus != null) {
+ releaseStatus.setReleaseStatus(EnumWeappReleaseStatus.BACK.getCode());
+ releaseStatus.setReleaseErrCode(gson.toJson(openRet));
+ releaseStatus.setReleaseTime(new Date());
+ weappReleaseStatusService.updateStatus(releaseStatus);
+ }
+ return new ResultData();
+ }
+ return new ResultData(openRet);
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+ }
+
+ @ApiOperation("查询当前设置的最低基础库版本及各版本用户占比")
+ @GetMapping("/getSupportVersion")
+ public ResultData getSupportVersion(String appId) {
+ try {
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ String openRet = openMaService.getSupportVersion();
+ logger.info(openRet.toString());
+ return new ResultData(openRet);
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+ }
+
+ @ApiOperation("设置最低基础库版本")
+ @GetMapping("/setSupportVersion")
+ public ResultData setSupportVersion(String appId, String version) {
+ try {
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ String openRet = openMaService.setSupportVersion(version);
+ logger.info(openRet);
+ return new ResultData(openRet);
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+ }
+
+ @ApiOperation(value = "小程序审核撤回", notes = "单个帐号每天审核撤回次数最多不超过1次,一个月不超过10次。")
+ @GetMapping("/undoCodeAudit")
+ public ResultData undoCodeAudit(String appId) {
+ Gson gson = new GsonBuilder().create();
+ WxWeappAuditStatus auditStatus = weappAuditStatusService.getByAppId(appId);
+ if(auditStatus != null) {
+ try {
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ WxOpenResult openResult = openMaService.undoCodeAudit();
+ Date curDate = new Date();
+ if(openResult.isSuccess()) {
+ // 审核状态
+ auditStatus.setAuditStatus(EnumWeappAuditStatus.UNDO.getCode());
+ auditStatus.setAuditErrCode(gson.toJson(openResult));
+ auditStatus.setAuditTime(curDate);
+ weappAuditStatusService.updateStatus(auditStatus);
+ // 审核次数记入wx_authorizer_info
+ WxAuthorizerInfo authorizerInfo = new WxAuthorizerInfo();
+ authorizerInfo.setAuthorizerAppid(appId);
+ authorizerInfo.setAuditBackTime(curDate);
+ authorizerInfoService.updateAuthBackInfo(authorizerInfo);
+ return new ResultData("审核撤回成功");
+ }
+ return new ResultData(Result.ERROR, "审核撤回失败");
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+ }
+ return new ResultData(Result.ERROR, "没有审核记录,不能撤回");
+ }
+}
diff --git a/mlToutiaoOpen/src/main/java/com/iformall/controller/WechatWeappDraftTemplateController.java b/mlToutiaoOpen/src/main/java/com/iformall/controller/WechatWeappDraftTemplateController.java
new file mode 100644
index 0000000..2173ddf
--- /dev/null
+++ b/mlToutiaoOpen/src/main/java/com/iformall/controller/WechatWeappDraftTemplateController.java
@@ -0,0 +1,79 @@
+package com.iformall.controller;
+
+import com.iformall.common.Result;
+import com.iformall.common.ResultData;
+import com.iformall.service.wechat.FmOpenService;
+import io.swagger.annotations.Api;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.open.bean.WxOpenMaCodeTemplate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * Stormeye Wu
+ */
+@RestController
+@RequestMapping("/weappDraftTemplate")
+@Api(description = "微信第三方开发平台-小程序-代码模版库管理")
+public class WechatWeappDraftTemplateController {
+ private final Logger logger = LoggerFactory.getLogger(getClass());
+
+ @Autowired
+ private FmOpenService openService;
+
+
+ @GetMapping("/tempDraftList")
+ public ResultData getTempDraftList() {
+ try {
+ List list = openService.getWxOpenComponentService().getTemplateDraftList();
+ return new ResultData(list);
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+
+ }
+
+ @GetMapping("/tempList")
+ public ResultData getTempList() {
+ try {
+ List list = openService.getWxOpenComponentService().getTemplateList();
+ return new ResultData(list);
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+ }
+
+ @PostMapping("/addToTemplate")
+ public ResultData addToTemplate(@RequestBody WxOpenMaCodeTemplate template) {
+ if(template == null || template.getDraftId() == null) {
+ return new ResultData(Result.ERROR, "draftId is null");
+ }
+ try {
+ openService.getWxOpenComponentService().addToTemplate(template.getDraftId());
+ return new ResultData();
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+ }
+
+ @PostMapping("/deleteTemplate")
+ public ResultData deleteTemplate(@RequestBody WxOpenMaCodeTemplate template) {
+ if(template == null || template.getTemplateId() == null) {
+ return new ResultData(Result.ERROR, "templateId is null");
+ }
+ try {
+ openService.getWxOpenComponentService().deleteTemplate(template.getTemplateId());
+ return new ResultData();
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+ }
+}
diff --git a/mlToutiaoOpen/src/main/java/com/iformall/controller/WechatWeappMsgTemplateController.java b/mlToutiaoOpen/src/main/java/com/iformall/controller/WechatWeappMsgTemplateController.java
new file mode 100644
index 0000000..7b0ac2f
--- /dev/null
+++ b/mlToutiaoOpen/src/main/java/com/iformall/controller/WechatWeappMsgTemplateController.java
@@ -0,0 +1,175 @@
+package com.iformall.controller;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateAddResult;
+import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateLibraryGetResult;
+import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateLibraryListResult;
+import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateListResult;
+import com.iformall.common.ErrorCode;
+import com.iformall.common.Result;
+import com.iformall.common.ResultData;
+import com.iformall.domain.po.WxAppinfo;
+import com.iformall.domain.po.WxAuthorizerInfo;
+import com.iformall.domain.po.WxTemplateMsg;
+import com.iformall.enums.EnumWxAuthorizationStatus;
+import com.iformall.service.WxAppinfoService;
+import com.iformall.service.WxAuthorizerInfoService;
+import com.iformall.service.WxTemplateMsgService;
+import com.iformall.service.wechat.FmOpenService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Stormeye Wu
+ */
+@RestController
+@RequestMapping("/weappMsgTemplate")
+@Api(description = "微信第三方开发平台-小程序-消息模板设置")
+public class WechatWeappMsgTemplateController {
+ private final Logger logger = LoggerFactory.getLogger(getClass());
+ @Autowired
+ private FmOpenService openService;
+
+ @Autowired
+ private WxAuthorizerInfoService authorizerInfoService;
+
+ @Autowired
+ private WxAppinfoService appinfoService;
+
+ @Autowired
+ private WxTemplateMsgService templateMsgService;
+
+ @ApiOperation("获取小程序模板库标题列表")
+ @GetMapping("getTmpLibList")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "appId", value = "appId", dataType = "String", paramType = "query", required = true),
+ @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
+ @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
+ public ResultData getTmpLibList(String appId, Integer pageNum, Integer pageSize) {
+ try {
+ WxMaService maService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ WxMaTemplateLibraryListResult ret = maService.getTemplateService().findTemplateLibraryList(pageNum, pageSize);
+ return new ResultData(ret);
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+ }
+
+ @ApiOperation("获取模板库某个模板标题下关键词库")
+ @GetMapping("getTemplateLibraryKeywordList")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "appId", value = "appId", dataType = "String", paramType = "query", required = true),
+ @ApiImplicitParam(name = "id", value = "模板标题id", dataType = "String", paramType = "query", required = true)})
+ public ResultData findTemplateLibraryKeywordList(String appId, String id) {
+ try {
+ WxMaService maService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ WxMaTemplateLibraryGetResult ret = maService.getTemplateService().findTemplateLibraryKeywordList(id);
+ return new ResultData(ret);
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+
+ }
+
+ @ApiOperation("组合模板并添加至帐号下的个人模板库")
+ @PostMapping("addTemplate")
+ public ResultData addTemplate(String appId, String id, List keywordIdList) {
+ WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId);
+ if(authorizerInfo == null) {
+ return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
+ }
+ if(!authorizerInfo.getAuthorizationStatus().equals(EnumWxAuthorizationStatus.AUTHORIZED.getCode())) {
+ return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
+ }
+ try {
+ WxMaService maService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ WxMaTemplateAddResult ret = maService.getTemplateService().addTemplate(id, keywordIdList);
+ authorizerInfo.setTemplateStatus(0);
+ authorizerInfo.setTemplateTime(new Date());
+ authorizerInfo.setUpdateTime(new Date());
+ authorizerInfoService.updateTemplate(authorizerInfo);
+ return new ResultData(ret);
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ authorizerInfo.setTemplateStatus(1);
+ authorizerInfo.setTemplateTime(new Date());
+ authorizerInfo.setUpdateTime(new Date());
+ authorizerInfoService.updateTemplate(authorizerInfo);
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+
+ }
+
+ @ApiOperation("获取帐号下已存在的模板列表")
+ @GetMapping("getTemplateList")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "appId", value = "appId", dataType = "String", paramType = "query", required = true),
+ @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
+ @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
+ public ResultData findTemplateList(String appId, Integer pageNum, Integer pageSize) {
+ try {
+ WxMaService maService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ if(pageNum > 0) {
+ pageNum = pageNum - 1;
+ }
+ WxMaTemplateListResult ret = maService.getTemplateService().findTemplateList(pageNum, pageSize);
+ logger.info(ret.toString());
+ return new ResultData(ret);
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+
+ }
+
+ @ApiOperation("删除帐号下的某个模板")
+ @PostMapping("delTemplate")
+ public ResultData delTemplate(@RequestBody Map params) {
+ String appId = params.get("appId");
+ String templateId = params.get("templateId");
+ if(StringUtils.isBlank(appId)) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
+ }
+ if(StringUtils.isBlank(templateId)) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
+ }
+ // check app
+ WxAppinfo appinfo = appinfoService.getByAppId(appId);
+ if(appinfo == null) {
+ String msg = "此appId未纳入管理,请联系管理员";
+ logger.error(msg);
+ return new ResultData(Result.ERROR, msg);
+ }
+ WxTemplateMsg msgQ = new WxTemplateMsg();
+ msgQ.setTemplateId(templateId);
+ msgQ.setTenantId(appinfo.getTenantId());
+ WxTemplateMsg msg = templateMsgService.getByObj(msgQ);
+ if(msg != null) {
+ String msgStr = "此模板正被使用,请不要删除";
+ logger.error(msgStr);
+ return new ResultData(Result.ERROR, msgStr);
+ }
+ try {
+ WxMaService maService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ maService.getTemplateService().delTemplate(templateId);
+ return new ResultData();
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+ }
+}
diff --git a/mlToutiaoOpen/src/main/java/com/iformall/controller/WechatWeappSetController.java b/mlToutiaoOpen/src/main/java/com/iformall/controller/WechatWeappSetController.java
new file mode 100644
index 0000000..5df98e3
--- /dev/null
+++ b/mlToutiaoOpen/src/main/java/com/iformall/controller/WechatWeappSetController.java
@@ -0,0 +1,231 @@
+package com.iformall.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.iformall.common.ErrorCode;
+import com.iformall.common.Result;
+import com.iformall.common.ResultData;
+import com.iformall.domain.po.WxAuthorizerInfo;
+import com.iformall.enums.EnumEnableType;
+import com.iformall.enums.EnumWxAuthorizationStatus;
+import com.iformall.service.WxAuthorizerInfoService;
+import com.iformall.service.wechat.FmOpenService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.open.api.WxOpenMaService;
+import me.chanjar.weixin.open.bean.result.*;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Stormeye Wu
+ */
+@RestController
+@RequestMapping("/weappSet")
+@Api(description = "微信第三方开发平台-小程序设置")
+public class WechatWeappSetController {
+ private final Logger logger = LoggerFactory.getLogger(getClass());
+ @Autowired
+ private FmOpenService openService;
+
+ @Autowired
+ private WxAuthorizerInfoService authorizerInfoService;
+
+ @ApiOperation("获取小程序的信息")
+ @GetMapping("/getInfo")
+ public ResultData getAccountBasicInfo(String appId) {
+ try {
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ String openRet = openMaService.getAccountBasicInfo();
+ logger.info(openRet.toString());
+ return new ResultData(openRet);
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ }
+ return new ResultData(Result.ERROR);
+ }
+
+ @ApiOperation("获取小程序服务器域名")
+ @GetMapping("/getDomain")
+ public ResultData getDomain(String appId) {
+ try {
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ WxOpenResult openRet = openMaService.getDomain();
+ logger.info(openRet.toString());
+ return new ResultData(openRet);
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+
+ }
+
+ @ApiOperation("获取小程序服务器域名")
+ @GetMapping("/getWebDomain")
+ public ResultData getWebDomain(String appId) {
+ try {
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ String openRet = openMaService.getWebViewDomain();
+ logger.info(openRet);
+ return new ResultData(openRet);
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+ }
+
+ @ApiOperation(value = "设置小程序服务器域名", notes = "{\n" +
+ " \"action\":\"add/set/delete/get\",\n" +
+ " \"requestdomain\":[\"https://www.qq.com\",\"https://www.qq.com\"],\n" +
+ " \"wsrequestdomain\":[\"wss://www.qq.com\",\"wss://www.qq.com\"],\n" +
+ " \"uploaddomain\":[\"https://www.qq.com\",\"https://www.qq.com\"],\n" +
+ " \"downloaddomain\":[\"https://www.qq.com\",\"https://www.qq.com\"],\n" +
+ " }")
+ @PostMapping("/modifyDomain")
+ public ResultData modifyDomain(String appId, String action,
+ List requestDomain, List wsrequestdomain,
+ List uploaddomain, List downloaddomain) {
+ WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId);
+ if(authorizerInfo == null) {
+ return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
+ }
+ if(!authorizerInfo.getAuthorizationStatus().equals(EnumWxAuthorizationStatus.AUTHORIZED.getCode())) {
+ return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
+ }
+ try {
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ WxOpenMaDomainResult openRet = openMaService.modifyDomain(action,
+ requestDomain, wsrequestdomain,
+ uploaddomain, downloaddomain);
+ logger.info(openRet.toString());
+ if(openRet.isSuccess()) {
+ logger.info("设置服务器域名成功");
+ authorizerInfo.setDomainStatus(EnumEnableType.SUCC.getCode());
+ authorizerInfo.setDomainTime(new Date());
+ authorizerInfo.setUpdateTime(new Date());
+
+ } else {
+ logger.info("设置服务器域名成功");
+ authorizerInfo.setDomainStatus(EnumEnableType.FAIL.getCode());
+ authorizerInfo.setDomainTime(new Date());
+ authorizerInfo.setUpdateTime(new Date());
+ }
+ authorizerInfoService.updateDomainUrl(authorizerInfo);
+ return new ResultData(openRet);
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ }
+ return new ResultData(Result.ERROR);
+ }
+
+ @ApiOperation(value = "设置小程序业务域名", notes = "{\n" +
+ " \"action\":\"add/set/delete/get\",\n" +
+ " \"webviewdomain\":[\"https://www.qq.com\",\"https://m.qq.com\"]\n" +
+ " }")
+ @PostMapping("/modifyWebViewDomain")
+ public ResultData modifyWebViewDomain(String appId, String action,
+ List urlList) {
+ WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId);
+ if(authorizerInfo == null) {
+ return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
+ }
+ if(!authorizerInfo.getAuthorizationStatus().equals(EnumWxAuthorizationStatus.AUTHORIZED.getCode())) {
+ return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
+ }
+ try {
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ String openRet = openMaService.setWebViewDomain(action, urlList);
+ logger.info(openRet);
+ JSONObject webRetObj = JSON.parseObject(openRet);
+ if(webRetObj.getInteger("errcode").equals(0)) {
+ logger.info("设置服务器业务域名成功");
+ authorizerInfo.setWebdomainStatus(EnumEnableType.SUCC.getCode());
+ authorizerInfo.setWebdomainTime(new Date());
+ authorizerInfo.setUpdateTime(new Date());
+ } else {
+ logger.info("设置服务器业务域名失败");
+ authorizerInfo.setWebdomainStatus(EnumEnableType.FAIL.getCode());
+ authorizerInfo.setWebdomainTime(new Date());
+ authorizerInfo.setUpdateTime(new Date());
+ }
+ authorizerInfoService.updateWebDomainUrl(authorizerInfo);
+ return new ResultData(openRet);
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ }
+ return new ResultData(Result.ERROR);
+ }
+
+ @ApiOperation(value = "绑定微信用户为小程序体验者", notes = "{\"appId\":\"string\", \"wechatId\":\"string\"}")
+ @PostMapping("/bindTester")
+ public ResultData bindTester(@RequestBody Map params) {
+ String appId = params.get("appId");
+ String wechatId = params.get("wechatId");
+ if(StringUtils.isBlank(appId)) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "appId不能为空");
+ }
+ WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId);
+ if(authorizerInfo == null) {
+ return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
+ }
+ if(!authorizerInfo.getAuthorizationStatus().equals(EnumWxAuthorizationStatus.AUTHORIZED.getCode())) {
+ return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
+ }
+ if(StringUtils.isBlank(wechatId)) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "wechatId不能为空");
+ }
+ try {
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ WxOpenResult openRet = openMaService.bindTester(wechatId);
+ logger.info(openRet.toString());
+ return new ResultData(openRet);
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(e.getMessage());
+ }
+ }
+
+ @ApiOperation(value = "解除绑定小程序的体验者", notes = "")
+ @PostMapping("/unbindTester")
+ public ResultData unbindTester(@RequestBody Map params) {
+ String appId = params.get("appId");
+ String wechatId = params.get("wechatId");
+ if(StringUtils.isBlank(appId)) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "appId不能为空");
+ }
+ if(StringUtils.isBlank(wechatId)) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "wechatId不能为空");
+ }
+ try {
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ WxOpenResult openRet = openMaService.unbindTester(wechatId);
+ logger.info(openRet.toString());
+ return new ResultData(openRet);
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(e.getMessage());
+ }
+ }
+
+ @ApiOperation(value = "获取体验者列表", notes = "")
+ @GetMapping("/getTesterList")
+ public ResultData getTesterList(@RequestParam(value = "appId") String appId) {
+ try {
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ WxOpenResult openRet = openMaService.getTesterList();
+ logger.info(openRet.toString());
+ return new ResultData(openRet);
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ }
+ return new ResultData(Result.ERROR);
+ }
+}
diff --git a/mlToutiaoOpen/src/main/java/com/iformall/controller/WxWeappBasicSetController.java b/mlToutiaoOpen/src/main/java/com/iformall/controller/WxWeappBasicSetController.java
new file mode 100644
index 0000000..cf05151
--- /dev/null
+++ b/mlToutiaoOpen/src/main/java/com/iformall/controller/WxWeappBasicSetController.java
@@ -0,0 +1,63 @@
+package com.iformall.controller;
+
+import com.github.pagehelper.PageInfo;
+import com.iformall.common.ErrorCode;
+import com.iformall.common.ResultData;
+import com.iformall.controller.base.BaseController;
+import com.iformall.domain.po.WxWeappBasicSet;
+import com.iformall.service.WxWeappBasicSetService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * Stormeye Wu
+ */
+@Controller
+@RequestMapping("/weappBasicSet")
+@Api(description = "小程序基础设置接口")
+public class WxWeappBasicSetController extends BaseController {
+ private final Logger logger = LoggerFactory.getLogger(getClass());
+
+ @Autowired
+ private Integer getFmDeploy;
+
+ @Autowired
+ private WxWeappBasicSetService weappBasicSetService;
+
+ @ApiOperation("分页列表接口")
+ @GetMapping("list")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
+ @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
+ public ResultData list(@ModelAttribute WxWeappBasicSet weappBasicSet, Integer pageNum, Integer pageSize) {
+ logger.debug("[" + getIpAddr() + "] WxWeappBasicSetController::list");
+ if (null == weappBasicSet) weappBasicSet = new WxWeappBasicSet();
+ weappBasicSet.setDeploy(getFmDeploy);
+ final PageInfo page = weappBasicSetService.listAsPage(weappBasicSet, pageNum, pageSize);
+ return new ResultData(page);
+ }
+
+ @PostMapping("add")
+ public ResultData add(WxWeappBasicSet weappBasicSet) {
+ logger.debug("[" + getIpAddr() + "] WxWeappBasicSetController::add");
+ if (null == weappBasicSet) return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
+ weappBasicSetService.saveOrUpdate(weappBasicSet);
+ return new ResultData();
+ }
+
+ @PostMapping("update")
+ public ResultData update(WxWeappBasicSet weappBasicSet) {
+ logger.debug("[" + getIpAddr() + "] WxWeappBasicSetController::update");
+ if (null == weappBasicSet) return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
+ weappBasicSetService.saveOrUpdate(weappBasicSet);
+ return new ResultData();
+ }
+
+}
diff --git a/mlToutiaoOpen/src/main/java/com/iformall/controller/WxWeappExtSetController.java b/mlToutiaoOpen/src/main/java/com/iformall/controller/WxWeappExtSetController.java
new file mode 100644
index 0000000..4fac15e
--- /dev/null
+++ b/mlToutiaoOpen/src/main/java/com/iformall/controller/WxWeappExtSetController.java
@@ -0,0 +1,138 @@
+package com.iformall.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.github.pagehelper.PageInfo;
+import com.iformall.common.ErrorCode;
+import com.iformall.common.ResultData;
+import com.iformall.controller.base.BaseController;
+import com.iformall.domain.po.WxAppinfo;
+import com.iformall.domain.po.WxWeappExtSet;
+import com.iformall.enums.EnumAppType;
+import com.iformall.service.WxAppinfoService;
+import com.iformall.service.WxWeappExtSetService;
+import com.iformall.utils.OpenConstant;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * Stormeye Wu
+ */
+@Controller
+@RequestMapping("/weappExtSet")
+@Api(description = "小程序扩展设置接口")
+public class WxWeappExtSetController extends BaseController {
+ private final Logger logger = LoggerFactory.getLogger(getClass());
+
+ @Autowired
+ private WxAppinfoService appinfoService;
+
+ @Autowired
+ private WxWeappExtSetService weappExtSetService;
+
+ @ApiOperation("分页列表接口")
+ @GetMapping("list")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
+ @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
+ public ResultData list(@ModelAttribute WxWeappExtSet weappExtSet, Integer pageNum, Integer pageSize) {
+ logger.debug("[" + getIpAddr() + "] WxWeappExtSetController::list");
+ if (null == weappExtSet) weappExtSet = new WxWeappExtSet();
+ final PageInfo page = weappExtSetService.listAsPage(weappExtSet, pageNum, pageSize);
+ return new ResultData(page);
+ }
+
+ @PostMapping("add")
+ public ResultData add(@RequestBody WxWeappExtSet weappExtSet) {
+ logger.debug("[" + getIpAddr() + "] WxWeappExtSetController::add");
+ if (null == weappExtSet) return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
+ weappExtSetService.saveOrUpdate(weappExtSet);
+ return new ResultData();
+ }
+
+ @PostMapping("update")
+ public ResultData update(@RequestBody WxWeappExtSet weappExtSet) {
+ logger.debug("[" + getIpAddr() + "] WxWeappBasicSetController::update");
+ if (null == weappExtSet) return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
+ if (StringUtils.isBlank(weappExtSet.getExtJson())) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
+ }
+ if (StringUtils.isBlank(weappExtSet.getReleaseJson())) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
+ }
+ weappExtSetService.saveOrUpdate(weappExtSet);
+ return new ResultData();
+ }
+
+ @ApiOperation("扩展模板-批量模板更新")
+ @PostMapping("batchUpdate")
+ public ResultData batchAdd(@RequestBody WxWeappExtSet weappExtSet) {
+ logger.debug("[" + getIpAddr() + "] WxWeappExtSetController::batchUpdate");
+ if (null == weappExtSet) return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
+ if(StringUtils.isBlank(weappExtSet.getExtJson())) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
+ }
+ if(weappExtSet.getType() == null) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
+ }
+ String extJson = weappExtSet.getExtJson();
+ JSONObject obj = JSON.parseObject(extJson);
+ if(obj == null) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
+ }
+ JSONObject extObj = obj.getJSONObject(OpenConstant.EXT);
+ if(extObj == null) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
+ }
+ JSONObject attrObj = extObj.getJSONObject(OpenConstant.ATTR);
+ if(attrObj == null) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
+ }
+ WxWeappExtSet extSetQ = new WxWeappExtSet();
+ extSetQ.setType(weappExtSet.getType());
+ List weappExtSetList = weappExtSetService.getList(extSetQ);
+ for(WxWeappExtSet info: weappExtSetList) {
+ WxAppinfo appinfo = appinfoService.getByAppId(info.getAppId());
+ if(appinfo == null) {
+ continue;
+ }
+ obj.put(OpenConstant.EXT_APPID, info.getAppId());
+ if(weappExtSet.getType().equals(EnumAppType.C.getCode())) {
+ if (attrObj != null) {
+ attrObj.put(OpenConstant.IF_HAVE_CAR_MODULE, String.valueOf(info.getCarSupport()));
+ attrObj.put(OpenConstant.IF_STORE_APP, String.valueOf(info.getStoreApp()));
+ }
+ }
+ if(extObj != null) {
+ extObj.put(OpenConstant.WE_APPID, info.getAppId());
+ extObj.put(OpenConstant.NAME, appinfo.getName());
+ if(weappExtSet.getType().equals(EnumAppType.C.getCode())) {
+ extObj.put(OpenConstant.ATTR, attrObj);
+ }
+ obj.put(OpenConstant.EXT, extObj);
+ }
+
+ WxWeappExtSet newInfo = new WxWeappExtSet();
+ newInfo.setExtJson(JSON.toJSONString(obj));
+ newInfo.setId(info.getId());
+
+ try {
+ weappExtSetService.saveOrUpdate(newInfo);
+ } catch (Exception e) {
+ logger.error("APPID " + info.getAppId() + ", 保存失败 " + e.getMessage());
+ }
+ }
+ return new ResultData();
+ }
+
+}
diff --git a/mlToutiaoOpen/src/main/java/com/iformall/controller/WxWeappInfoController.java b/mlToutiaoOpen/src/main/java/com/iformall/controller/WxWeappInfoController.java
new file mode 100644
index 0000000..1bd88f8
--- /dev/null
+++ b/mlToutiaoOpen/src/main/java/com/iformall/controller/WxWeappInfoController.java
@@ -0,0 +1,1047 @@
+package com.iformall.controller;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateAddResult;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.github.pagehelper.PageInfo;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.reflect.TypeToken;
+import com.iformall.common.ErrorCode;
+import com.iformall.common.Result;
+import com.iformall.common.ResultData;
+import com.iformall.controller.base.BaseController;
+import com.iformall.domain.po.*;
+import com.iformall.domain.vo.WxWeappAuditStatusVo;
+import com.iformall.domain.vo.WxWeappCodeStatusVo;
+import com.iformall.domain.vo.WxWeappInfo;
+import com.iformall.domain.vo.WxWeappReleaseStatusVo;
+import com.iformall.enums.*;
+import com.iformall.service.*;
+import com.iformall.service.wechat.FmOpenService;
+import com.iformall.utils.Constant;
+import com.iformall.utils.OpenConstant;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.open.api.WxOpenMaService;
+import me.chanjar.weixin.open.bean.ma.WxMaOpenCommitExtInfo;
+import me.chanjar.weixin.open.bean.message.WxOpenMaSubmitAuditMessage;
+import me.chanjar.weixin.open.bean.result.WxOpenMaDomainResult;
+import me.chanjar.weixin.open.bean.result.WxOpenMaQueryAuditResult;
+import me.chanjar.weixin.open.bean.result.WxOpenMaSubmitAuditResult;
+import me.chanjar.weixin.open.bean.result.WxOpenResult;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+
+/**
+ * Stormeye Wu
+ */
+@Controller
+@RequestMapping("/weapp")
+@Api(description = "小程序")
+public class WxWeappInfoController extends BaseController {
+ private final Logger logger = LoggerFactory.getLogger(getClass());
+
+ @Autowired
+ private Integer getFmDeploy;
+
+ @Autowired
+ private WxAuthorizerInfoService authorizerInfoService;
+
+ @Autowired
+ private WxWeappBasicSetService weappBasicSetService;
+
+ @Autowired
+ private WxWeappExtSetService weappExtSetService;
+
+ @Autowired
+ private WxWeappCodeStatusService weappCodeStatusService;
+
+ @Autowired
+ private WxWeappAuditStatusService weappAuditStatusService;
+
+ @Autowired
+ private WxWeappReleaseStatusService weappReleaseStatusService;
+
+ @Autowired
+ private FmOpenService openService;
+
+ @Autowired
+ private WxAppinfoService appinfoService;
+
+ @Autowired
+ private WxTemplateMsgService templateMsgService;
+
+
+ @ApiOperation(value = "小程序分页列表接口", notes = "查询支持小程序类型,名称,appid,version")
+ @GetMapping("list")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
+ @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
+ public ResultData list(@ModelAttribute WxWeappInfo weappInfo, Integer pageNum, Integer pageSize) {
+ logger.debug("[" + getIpAddr() + "] WxWeappInfoController::list");
+ if (null == weappInfo) {
+ weappInfo = new WxWeappInfo();
+ } else {
+ if(StringUtils.isBlank(weappInfo.getName())) {
+ weappInfo.setName(null);
+ }
+ }
+ weappInfo.setSortColumns(BaseEntity.SortField.TenantId_ASC,BaseEntity.SortField.Type_ASC,BaseEntity.SortField.Name_ASC);
+ final PageInfo page = authorizerInfoService.listVoAsPage(weappInfo, pageNum, pageSize);
+ return new ResultData(page);
+ }
+
+ @ApiOperation("小程序列表接口")
+ @GetMapping("allist")
+ public ResultData getList(@ModelAttribute WxWeappInfo weappInfo) {
+ logger.debug("[" + getIpAddr() + "] WxWeappInfoController::list");
+ if (null == weappInfo) {
+ weappInfo = new WxWeappInfo();
+ } else {
+ if(StringUtils.isBlank(weappInfo.getName())) {
+ weappInfo.setName(null);
+ }
+ }
+ weappInfo.setSortColumns(BaseEntity.SortField.CurrentVersion_DESC);
+ final List list = authorizerInfoService.getList(weappInfo);
+ return new ResultData(list);
+ }
+
+ @ApiOperation(value = "APPs基础设置(服务器域名、业务域名、基础版本、微信模板)", notes = "{\"apps\":\"appid,appid\",\"type\":\"String\"}")
+ @PostMapping("batchBasicSet")
+ public ResultData batchSet(@RequestBody Map params) {
+ logger.debug("[" + getIpAddr() + "] WxWeappInfoController::batchBasicSet");
+ String appsStr = params.get(OpenConstant.APPS);
+ String typeStr = params.get(OpenConstant.TYPE);
+
+ if(StringUtils.isBlank(typeStr)) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "type参数不能为空");
+ }
+
+ Integer type = 0;
+ try {
+ type = Integer.parseInt(typeStr);
+ } catch (Exception e) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_ERROR);
+ }
+ // 检查基础配置参数
+ WxWeappBasicSet weappBasicSetQ = new WxWeappBasicSet();
+ weappBasicSetQ.setType(type);
+ weappBasicSetQ.setDeploy(getFmDeploy);
+ WxWeappBasicSet weappBasicSet = weappBasicSetService.getByTypeAndDeploy(weappBasicSetQ);
+ if(weappBasicSet == null) {
+ logger.error("未找到相关的基础设置参数");
+ return new ResultData(ErrorCode.WEAPP_BASIC_SET_ERR);
+ }
+
+ JSONObject domainObj = JSON.parseObject(weappBasicSet.getDomainUrl());
+ if(domainObj == null) {
+ logger.error("未找到相关的基础设置参数");
+ return new ResultData(ErrorCode.WEAPP_BASIC_SET_DOMAIN_ERR);
+ }
+ JSONObject templeObj = JSON.parseObject(weappBasicSet.getTemplateInfo());
+ logger.info(templeObj.toJSONString());
+
+ if(StringUtils.isBlank(appsStr)) {
+ WxWeappInfo weappInfoQ = new WxWeappInfo();
+ weappInfoQ.setType(type);
+ List list = authorizerInfoService.getList(weappInfoQ);
+ for(WxWeappInfo info: list) {
+ appsStr += info.getAuthorizerAppid() + ",";
+ }
+ appsStr = appsStr.substring(0, appsStr.length() - 1);
+ }
+
+ // 逐一设置app配置
+ String [] apps = appsStr.split(",");
+ for(String appId: apps) {
+ // 检查appId是否已授权
+ WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId);
+ if(authorizerInfo == null) {
+ return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
+ }
+ if(!authorizerInfo.getAuthorizationStatus().equals(EnumWxAuthorizationStatus.AUTHORIZED.getCode())) {
+ return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
+ }
+ ResultData openRet = setBasicForAppId(appId, weappBasicSet, domainObj, templeObj);
+ if (openRet != null) return openRet;
+ }
+ return new ResultData();
+ }
+
+ @ApiOperation(value = "APP清除域名", notes = "{\"weappId\":\"weappId\",\"type\":\"String\"}")
+ @PostMapping("cleanDomain")
+ public ResultData cleanDomain(@RequestBody Map params) {
+ logger.debug("[" + getIpAddr() + "] WxWeappInfoController::cleanDomain");
+ String appId = params.get(OpenConstant.WE_APPID);
+ String typeStr = params.get(OpenConstant.TYPE);
+
+ if(StringUtils.isBlank(typeStr)) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "type参数不能为空");
+ }
+ if(StringUtils.isBlank(appId)) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "weappId参数不能为空");
+ }
+
+ Integer type = 0;
+ try {
+ type = Integer.parseInt(typeStr);
+ } catch (Exception e) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_ERROR);
+ }
+ // 检查基础配置参数
+ WxWeappBasicSet weappBasicSetQ = new WxWeappBasicSet();
+ weappBasicSetQ.setType(type);
+ weappBasicSetQ.setDeploy(getFmDeploy);
+ WxWeappBasicSet weappBasicSet = weappBasicSetService.getByTypeAndDeploy(weappBasicSetQ);
+ if(weappBasicSet == null) {
+ logger.error("未找到相关的基础设置参数");
+ return new ResultData(ErrorCode.WEAPP_BASIC_SET_ERR);
+ }
+
+ JSONObject domainObj = JSON.parseObject(weappBasicSet.getDomainUrl());
+ if(domainObj == null) {
+ logger.error("未找到相关的基础设置参数");
+ return new ResultData(ErrorCode.WEAPP_BASIC_SET_DOMAIN_ERR);
+ }
+
+ // 检查appId是否已授权
+ WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId);
+ if(authorizerInfo == null) {
+ return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
+ }
+ if(!authorizerInfo.getAuthorizationStatus().equals(EnumWxAuthorizationStatus.AUTHORIZED.getCode())) {
+ return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
+ }
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ try {
+ modifyDomainUrl(OpenConstant.DEL, domainObj, authorizerInfo, openMaService);
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+ return new ResultData();
+ }
+
+ private ResultData setBasicForAppId(String appId, WxWeappBasicSet weappBasicSet, JSONObject domainObj, JSONObject templeObj) {
+ WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId);
+ if(authorizerInfo == null) {
+ return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
+ }
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+ try {
+ setBasicVersion(weappBasicSet, authorizerInfo, openMaService);
+ modifyDomainUrl(OpenConstant.SET, domainObj, authorizerInfo, openMaService);
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+ // 设置微信模板
+ if(weappBasicSet.getType().equals(EnumAppType.C.getCode())) {
+ if(authorizerInfo.getTemplateStatus() == null ||
+ !authorizerInfo.getTemplateStatus().equals(EnumWxAuthotizationTemplateStatus.SUCCESS.getCode())) {
+ // 模板未设置或者设置失败
+ // 获取模板
+ WxAppinfo appinfo = appinfoService.getByAppId(appId);
+ WxMaService maService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId);
+
+ try {
+ setBasicTemplateMsgVerifySuccess(templeObj, appinfo, maService);
+ setBasicTemplateMsgVerifyFail(templeObj, appinfo, maService);
+ setBasicTemplateMsgPressSuccess(templeObj, appinfo, maService);
+
+ // 更新状态
+ authorizerInfo.setTemplateStatus(EnumWxAuthotizationTemplateStatus.SUCCESS.getCode());
+ authorizerInfo.setTemplateTime(new Date());
+ authorizerInfo.setUpdateTime(new Date());
+ authorizerInfoService.updateTemplate(authorizerInfo);
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ // 更新状态
+ authorizerInfo.setTemplateStatus(EnumWxAuthotizationTemplateStatus.Fail.getCode());
+ authorizerInfo.setTemplateTime(new Date());
+ authorizerInfo.setUpdateTime(new Date());
+ authorizerInfoService.updateTemplate(authorizerInfo);
+ return new ResultData(Result.ERROR, e.getMessage());
+ }
+ }
+ }
+ // 设置成功返回null
+ return null;
+ }
+
+ private void setBasicTemplateMsg(JSONObject templeObj, WxAppinfo appinfo, WxMaService maService, Integer msgCode, String msgTypeStr) throws WxErrorException {
+ JSONObject msgObj;
+ try {
+ msgObj = templeObj.getJSONObject(msgTypeStr);
+ } catch (Exception e) {
+ logger.error(e.getMessage());
+ return;
+ }
+ logger.info(msgObj.toJSONString());
+ String id = msgObj.getString(OpenConstant.ID);
+ JSONArray keyidlist = msgObj.getJSONArray(OpenConstant.KEY_ID_LIST);
+ String customParam = msgObj.getString(OpenConstant.CUSTOM_PARAM);
+ logger.info(customParam);
+ JSONObject customParamObj = JSON.parseObject(customParam);
+ List keyArr1 = getIdList(keyidlist);
+ if (appinfo != null) {
+ // wx_template_msg
+ WxTemplateMsg templateMsgQ = new WxTemplateMsg();
+ templateMsgQ.setTenantId(appinfo.getTenantId());
+ logger.info(msgCode.toString());
+ templateMsgQ.setType(msgCode);
+ WxTemplateMsg templateMsg = templateMsgService.getByObj(templateMsgQ);
+ if (templateMsg != null) {
+ templateMsg.setCustomParam(customParamObj.toJSONString());
+ templateMsgService.saveOrUpdate(templateMsg);
+ } else {
+ WxMaTemplateAddResult ret = maService.getTemplateService().addTemplate(id, keyArr1);
+ logger.info(ret.toString());
+ templateMsgQ.setTemplateId(ret.getTemplateId());
+ templateMsgQ.setCustomParam(customParamObj.toJSONString());
+ templateMsgService.saveOrUpdate(templateMsgQ);
+ }
+ }
+ }
+
+ private void setBasicTemplateMsgVerifySuccess(JSONObject templeObj, WxAppinfo appinfo, WxMaService maService) throws WxErrorException {
+ // 核销成功消息
+ setBasicTemplateMsg(templeObj, appinfo, maService, EnumTemplateType.VERIFY_SUCCESS.getCode(), OpenConstant.VERIFY_SUCC);
+ }
+
+ private void setBasicTemplateMsgVerifyFail(JSONObject templeObj, WxAppinfo appinfo, WxMaService maService) throws WxErrorException {
+ // 核销失败消息
+ setBasicTemplateMsg(templeObj, appinfo, maService, EnumTemplateType.VERIFY_FAIL.getCode(), OpenConstant.VERIFY_FAIL);
+ }
+
+ private void setBasicTemplateMsgPressSuccess(JSONObject templeObj, WxAppinfo appinfo, WxMaService maService) throws WxErrorException {
+ // 砍价成功消息
+ logger.info("setBasicTemplateMsgPressSuccess begin..");
+ /// EnumTemplateType.PRESS_PRICE_SUCCESS.getCode()
+ setBasicTemplateMsg(templeObj, appinfo, maService, 3, "press_success");
+ logger.info("setBasicTemplateMsgPressSuccess end.");
+ }
+
+ private void modifyDomainUrl(String action, JSONObject domainObj, WxAuthorizerInfo authorizerInfo, WxOpenMaService openMaService) throws WxErrorException {
+ // 服务器域名
+ JSONObject urlObj = domainObj.getJSONObject(OpenConstant.URL);
+ List requestDomain = getUrlList(urlObj.getJSONArray(OpenConstant.REQ_DOMAIN));
+ List wsrequestDomain = getUrlList(urlObj.getJSONArray(OpenConstant.WS_DOMAIN));
+ List uploadDomain = getUrlList(urlObj.getJSONArray(OpenConstant.UPLOAD_DOMAIN));
+ List downloadDomain = getUrlList(urlObj.getJSONArray(OpenConstant.DOWNLOAD_DOMAIN));
+ logger.info(downloadDomain.toString());
+ WxOpenMaDomainResult openRet = openMaService.modifyDomain(action,
+ requestDomain, wsrequestDomain,
+ uploadDomain, downloadDomain);
+ logger.info(openRet.toString());
+ if(openRet.isSuccess()) {
+ logger.info("设置服务器域名成功");
+ authorizerInfo.setDomainStatus(EnumEnableType.SUCC.getCode());
+ authorizerInfo.setDomainTime(new Date());
+ authorizerInfo.setUpdateTime(new Date());
+
+ } else {
+ logger.info("设置服务器域名成功");
+ authorizerInfo.setDomainStatus(EnumEnableType.FAIL.getCode());
+ authorizerInfo.setDomainTime(new Date());
+ authorizerInfo.setUpdateTime(new Date());
+ }
+ authorizerInfoService.updateDomainUrl(authorizerInfo);
+ // 业务域名
+ JSONObject webObj = domainObj.getJSONObject(OpenConstant.WEB);
+ List urlList = getUrlList(webObj.getJSONArray(OpenConstant.WEB_DOMAIN));
+ String openRet1 = openMaService.setWebViewDomain(action, urlList);
+ logger.info(openRet1);
+ JSONObject webRetObj = JSON.parseObject(openRet1);
+ if(webRetObj.getInteger(OpenConstant.ERRCODE).equals(0)) {
+ logger.info("设置服务器业务域名成功");
+ authorizerInfo.setWebdomainStatus(EnumEnableType.SUCC.getCode());
+ authorizerInfo.setWebdomainTime(new Date());
+ authorizerInfo.setUpdateTime(new Date());
+ } else {
+ logger.info("设置服务器业务域名失败");
+ authorizerInfo.setWebdomainStatus(EnumEnableType.FAIL.getCode());
+ authorizerInfo.setWebdomainTime(new Date());
+ authorizerInfo.setUpdateTime(new Date());
+ }
+ authorizerInfoService.updateWebDomainUrl(authorizerInfo);
+ }
+
+ private void setBasicVersion(WxWeappBasicSet weappBasicSet, WxAuthorizerInfo authorizerInfo, WxOpenMaService openMaService) throws WxErrorException {
+ // 设置基础版本
+ String versionRet = openMaService.setSupportVersion(weappBasicSet.getVersion());
+ logger.info(versionRet);
+ JSONObject verObj = JSON.parseObject(versionRet);
+ if(verObj.getInteger(OpenConstant.ERRCODE).equals(OpenConstant.SUCC)) {
+ authorizerInfo.setBaseStatus(EnumEnableType.SUCC.getCode());
+ } else {
+ authorizerInfo.setBaseStatus(EnumEnableType.FAIL.getCode());
+ }
+ authorizerInfo.setBaseTime(new Date());
+ authorizerInfo.setUpdateTime(new Date());
+ authorizerInfoService.updateBaseVersion(authorizerInfo);
+ }
+
+ private List getIdList(JSONArray keyidlist) {
+ List keyArr = new ArrayList();
+ for (int i = 0; i < keyidlist.size(); i++) {
+ keyArr.add(keyidlist.getIntValue(i));
+ }
+ return keyArr;
+ }
+
+ private List getUrlList(JSONArray urlList) {
+ List keyArr = new ArrayList();
+ for (int i = 0; i < urlList.size(); i++) {
+ keyArr.add(urlList.getString(i));
+ }
+ return keyArr;
+ }
+
+ @ApiOperation(value = "批量授权的小程序code提交", notes = "{\"apps\":\"appid,appid\",\"templateId\":\"String\",\"type\":\"String\",\"userVersion\":\"String\",\"userDesc\":\"String\"}")
+ @PostMapping("batchCodeCommit")
+ public ResultData batchCodeCommit(@RequestBody Map params) {
+ logger.debug("[" + getIpAddr() + "] WxWeappInfoController::batchExtSet");
+ String appsStr = params.get(OpenConstant.APPS);
+ String templateIdStr = params.get(OpenConstant.TEMPLATE_ID);
+ String typeStr = params.get(OpenConstant.TYPE);
+ String userVersion = params.get(OpenConstant.USER_VERSION);
+ String userDesc = params.get(OpenConstant.USER_DESC);
+
+ Integer type = null;
+ Long templateId = null;
+ try {
+ templateId = Long.parseLong(templateIdStr);
+ } catch (Exception e) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_ERROR);
+ }
+
+ try {
+ type = Integer.parseInt(typeStr);
+ } catch (Exception e) {
+ logger.error("type为null");
+ }
+ if(StringUtils.isBlank(appsStr)) {
+ if(type == null) {
+ logger.error("type为null");
+ return new ResultData(ErrorCode.SYS_PARAMETER_ERROR);
+ }
+ WxWeappInfo authQ = new WxWeappInfo();
+ authQ.setType(type);
+ List appList = authorizerInfoService.getList(authQ);
+ appsStr = "";
+ StringBuilder sb = new StringBuilder();
+ boolean bfirst = true;
+ for(WxWeappInfo app: appList) {
+ if(bfirst) {
+ sb.append(app.getAuthorizerAppid());
+ bfirst = false;
+ } else {
+ sb.append(app.getAuthorizerAppid()).append(",");
+ }
+ }
+ }
+ String [] apps = appsStr.split(",");
+ // 逐一检查app的设置
+ for(String appId: apps) {
+ WxWeappExtSet extSetQ = new WxWeappExtSet();
+ extSetQ.setAppId(appId);
+ WxWeappExtSet extSet = weappExtSetService.getByObj(extSetQ);
+ if(extSet == null) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
+ }
+ if(StringUtils.isBlank(extSet.getExtJson())) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
+ }
+ if(StringUtils.isBlank(extSet.getReleaseJson())) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
+ }
+ }
+ // 逐一设置app配置
+ for(String appId: apps) {
+ // 检查appId是否已授权
+ WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId);
+ if(authorizerInfo == null) {
+ return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
+ }
+ if(!authorizerInfo.getAuthorizationStatus().equals(EnumWxAuthorizationStatus.AUTHORIZED.getCode())) {
+ return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
+ }
+ codeCommit(appId, userVersion, userDesc, templateId);
+ }
+ return new ResultData();
+ }
+
+ private void codeCommit(String appId, String userVersion, String userDesc, Long templateId) {
+ WxAppinfo appinfo = appinfoService.getByAppId(appId);
+
+ int iAppType = 0;
+ String appTypeStr = userVersion.substring(0, 1);
+ if(appTypeStr.equalsIgnoreCase(Constant.C))
+ iAppType = EnumAppType.C.getCode();
+ else if(appTypeStr.equalsIgnoreCase(Constant.B))
+ iAppType = EnumAppType.B.getCode();
+
+ if(!appinfo.getType().equals(iAppType)) {
+ // 如果版本号与小程序的类型不一致,不提交版本
+ return;
+ }
+
+ // get ext json
+ WxWeappExtSet extSetQ = new WxWeappExtSet();
+ extSetQ.setAppId(appId);
+ WxWeappExtSet extSet = weappExtSetService.getByObj(extSetQ);
+ WxWeappCodeStatus codeStatus = weappCodeStatusService.getByAppId(appId);
+ if(extSet != null) {
+ boolean codeCommitStatus = false;
+ if(codeStatus != null && codeStatus.getCodeStatus().equals(0) && codeStatus.getUserVersion().equals(userVersion)) {
+ codeCommitStatus = true;
+ }
+ if(!codeCommitStatus) {
+ codeCommitStatus = doCodeCommit(userVersion, userDesc, templateId, appinfo, extSet, codeStatus);
+ }
+ }
+ }
+
+ @ApiOperation(value = "小程序批量提交审核", notes = "{\"type\":\"String\",\"userVersion\":\"String\",\"apps\":\"appid,appid\"}")
+ @PostMapping("batchCodeAudit")
+ public ResultData batchCodeAudit(@RequestBody Map params) {
+ logger.debug("[" + getIpAddr() + "] WxWeappInfoController::batchExtSet");
+ String appsStr = params.get(OpenConstant.APPS);
+ String typeStr = params.get(OpenConstant.TYPE);
+ String userVersion = params.get(OpenConstant.USER_VERSION);
+ Integer type = null;
+ try {
+ type = Integer.parseInt(typeStr);
+ } catch (Exception e) {
+ logger.error("小程序类型");
+ }
+ if(StringUtils.isBlank(appsStr)) {
+ if(type == null) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
+ }
+ WxWeappInfo authQ = new WxWeappInfo();
+ authQ.setType(type);
+ List appList = authorizerInfoService.getList(authQ);
+ appsStr = "";
+ StringBuilder sb = new StringBuilder();
+ boolean bfirst = true;
+ for(WxWeappInfo app: appList) {
+ if(bfirst) {
+ sb.append(app.getAuthorizerAppid());
+ bfirst = false;
+ } else {
+ sb.append(app.getAuthorizerAppid()).append(",");
+ }
+ }
+ }
+ String [] apps = appsStr.split(",");
+ // 逐一检查app的设置
+ for(String appId: apps) {
+ WxWeappExtSet extSetQ = new WxWeappExtSet();
+ extSetQ.setAppId(appId);
+ WxWeappExtSet extSet = weappExtSetService.getByObj(extSetQ);
+ if(extSet == null) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
+ }
+ if(StringUtils.isBlank(extSet.getExtJson())) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
+ }
+ if(StringUtils.isBlank(extSet.getReleaseJson())) {
+ return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
+ }
+ }
+ // 逐一设置app配置
+ for(String appId: apps) {
+ // 检查appId是否已授权
+ WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId);
+ if(authorizerInfo == null) {
+ return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
+ }
+ if(!authorizerInfo.getAuthorizationStatus().equals(EnumWxAuthorizationStatus.AUTHORIZED.getCode())) {
+ return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
+ }
+ codeAudit(appId, userVersion);
+ }
+ return new ResultData();
+ }
+
+ private void codeAudit(String appId, String userVersion) {
+ // get ext json
+ WxWeappExtSet extSetQ = new WxWeappExtSet();
+ extSetQ.setAppId(appId);
+ WxWeappExtSet extSet = weappExtSetService.getByObj(extSetQ);
+ WxWeappCodeStatus codeStatus = weappCodeStatusService.getByAppId(appId);
+ if(extSet != null) {
+ boolean codeCommitStatus = false;
+ if(codeStatus != null
+ && codeStatus.getCodeStatus().equals(EnumWeappCodeCommitStatus.SUCCESS.getCode())
+ && codeStatus.getUserVersion().equals(userVersion)) {
+ codeCommitStatus = true;
+ }
+ if(codeCommitStatus) {
+ WxWeappAuditStatus auditStatus = weappAuditStatusService.getByAppId(appId);
+ if(auditStatus != null && auditStatus.getAuditStatus().equals(EnumWeappAuditStatus.AUDITING.getCode())) {
+ logger.error("审核中不能再提交审核");
+ return;
+ }
+ doCodeAudit(codeStatus, auditStatus, extSet);
+ } else {
+ logger.error("CODE提交失败");
+ }
+ }
+ }
+
+ private boolean doCodeCommit(String userVersion, String userDesc, Long templateId, WxAppinfo appinfo, WxWeappExtSet extSet, WxWeappCodeStatus codeStatus) {
+ Gson gson = new GsonBuilder().create();
+ // code提交
+ boolean codeCommitStatus = false;
+ String codeErrCode = "";
+ try {
+ WxMaOpenCommitExtInfo extInfo = gson.fromJson(extSet.getExtJson(), new TypeToken() {}.getType());
+ logger.info("OLD: " + extInfo.toString());
+ // 自动修改提交的版本
+ if(extInfo.getExtMap().containsKey(OpenConstant.APP_VERSION)) {
+ extInfo.getExtMap().put(OpenConstant.APP_VERSION, userVersion);
+ }
+ logger.info("NEW: " + extInfo.toString());
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appinfo.getAppId());
+ WxOpenResult openRet = openMaService.codeCommit(templateId, userVersion, userDesc, extInfo);
+ logger.info(openRet.toString());
+ if (openRet.isSuccess()) {
+ codeCommitStatus = true;
+ }
+ codeErrCode = gson.toJson(openRet);
+ } catch (WxErrorException e) {
+ codeCommitStatus = false;
+ codeErrCode = e.getMessage();
+ logger.error(codeErrCode);
+ }
+
+ if (codeStatus == null) {
+ codeStatus = new WxWeappCodeStatus();
+ codeStatus.setId(appinfo.getId());
+ codeStatus.setTenantId(appinfo.getTenantId());
+ codeStatus.setAppId(appinfo.getAppId());
+ if (appinfo != null) {
+ codeStatus.setType(appinfo.getType());
+ }
+ codeStatus.setUserVersion(userVersion);
+ codeStatus.setVersionDesc(userDesc);
+ if(codeCommitStatus) {
+ codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.SUCCESS.getCode());
+ } else {
+ codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.FAIL.getCode());
+ }
+ codeStatus.setCodeErrCode(codeErrCode);
+ codeStatus.setCodeTime(new Date());
+ weappCodeStatusService.saveStatus(codeStatus);
+ } else {
+ codeStatus.setUserVersion(userVersion);
+ codeStatus.setVersionDesc(userDesc);
+ if(codeCommitStatus) {
+ codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.SUCCESS.getCode());
+ } else {
+ codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.FAIL.getCode());
+ }
+ codeStatus.setCodeErrCode(codeErrCode);
+ codeStatus.setCodeTime(new Date());
+ weappCodeStatusService.updateStatus(codeStatus);
+ }
+ return codeCommitStatus;
+ }
+
+ private void doCodeAudit(WxWeappCodeStatus codeStatus, WxWeappAuditStatus auditStatus, WxWeappExtSet extSet) {
+ Gson gson = new GsonBuilder().create();
+ boolean submitStatus = false;
+ Long auditid = null;
+ String codeErrCode = "";
+ try {
+ WxOpenMaSubmitAuditMessage subMessage = gson.fromJson(extSet.getReleaseJson(), new TypeToken() {}.getType());
+ logger.info(subMessage.toString());
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(codeStatus.getAppId());
+ WxOpenMaSubmitAuditResult openRet = openMaService.submitAudit(subMessage);
+ logger.info(openRet.toString());
+ if(openRet.isSuccess()) {
+ submitStatus = true;
+ auditid = openRet.getAuditId();
+ } else {
+ submitStatus = false;
+ }
+ codeErrCode = gson.toJson(openRet);
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ submitStatus = false;
+ codeErrCode = e.getMessage();
+ }
+
+ if (auditStatus == null) {
+ auditStatus = new WxWeappAuditStatus();
+ auditStatus.setId(codeStatus.getId());
+ auditStatus.setTenantId(codeStatus.getTenantId());
+ auditStatus.setAppId(codeStatus.getAppId());
+ auditStatus.setType(codeStatus.getType());
+ auditStatus.setUserVersion(codeStatus.getUserVersion());
+ auditStatus.setVersionDesc(codeStatus.getVersionDesc());
+ auditStatus.setAuditid(auditid);
+ if(submitStatus) {
+ auditStatus.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode());
+ } else {
+ auditStatus.setAuditStatus(EnumWeappAuditStatus.FAIL.getCode());
+ }
+ auditStatus.setAuditErrCode(codeErrCode);
+ auditStatus.setAuditTime(new Date());
+ weappAuditStatusService.saveStatus(auditStatus);
+ } else {
+ auditStatus.setAuditid(auditid);
+ if(!submitStatus) {
+ if(!auditStatus.getUserVersion().equals(codeStatus.getUserVersion())
+ && auditStatus.getAuditStatus().equals(EnumWeappAuditStatus.AUDITING.getCode())) {
+ // 当前审核中的数据不能替换
+ return;
+ }
+ auditStatus.setAuditStatus(EnumWeappAuditStatus.FAIL.getCode());
+ } else {
+ auditStatus.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode());
+ }
+ auditStatus.setUserVersion(codeStatus.getUserVersion());
+ auditStatus.setVersionDesc(codeStatus.getVersionDesc());
+ auditStatus.setAuditErrCode(codeErrCode);
+ auditStatus.setAuditTime(new Date());
+ weappAuditStatusService.updateStatus(auditStatus);
+ }
+ }
+
+
+ @ApiOperation(value = "批量审核查询", notes = "{\"type\":\"string\",\"version\":\"string\"}")
+ @PostMapping("batchAuditQuery")
+ public ResultData batchAuditQuery(@RequestBody Map params) {
+ logger.debug("[" + getIpAddr() + "] WxWeappInfoController::batchAuditQuery");
+ Gson gson = new GsonBuilder().create();
+ String typeStr = params.get(OpenConstant.TYPE);
+ String version = params.get(OpenConstant.VERSION);
+ Integer type = null;
+ try {
+ type = Integer.parseInt(typeStr);
+ } catch (Exception e) {
+ logger.error(e.getMessage());
+ }
+ WxWeappAuditStatusVo queryVo = new WxWeappAuditStatusVo();
+ if(StringUtils.isNotBlank(typeStr)) {
+ queryVo.setType(type);
+ }
+ if(StringUtils.isNotBlank(version)) {
+ queryVo.setUserVersion(version);
+ }
+ queryVo.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode());
+ List apps = weappAuditStatusService.getList(queryVo);
+ apps.stream().forEach( auditStatus -> {
+ // 审核中,可以发起审核查询
+ try {
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(auditStatus.getAppId());
+ WxOpenMaQueryAuditResult openResult = openMaService.getLatestAuditStatus();
+ logger.info(openResult.toString());
+ if (openResult.isSuccess()) {
+ // 审核状态,其中0为审核成功,1为审核失败,2为审核中,3已撤回
+ switch (openResult.getStatus().intValue()) {
+ case 0:
+ auditStatus.setAuditStatus(EnumWeappAuditStatus.SUCCESS.getCode());
+ break;
+ case 1:
+ auditStatus.setAuditStatus(EnumWeappAuditStatus.FAIL.getCode());
+ break;
+ case 2:
+ auditStatus.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode());
+ break;
+ case 3:
+ auditStatus.setAuditStatus(EnumWeappAuditStatus.UNDO.getCode());
+ break;
+ default:
+ auditStatus.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode());
+ break;
+ }
+ auditStatus.setAuditErrCode(gson.toJson(openResult));
+ auditStatus.setAuditid(openResult.getAuditId());
+ auditStatus.setAuditTime(new Date());
+ weappAuditStatusService.updateStatus(auditStatus);
+ }
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ }
+ });
+ return new ResultData();
+ }
+
+ @ApiOperation(value = "批量审核撤回", notes = "{\"type\":\"string\",\"version\":\"string\"}")
+ @PostMapping("batchAuditCancel")
+ public ResultData batchAuditCancel(@RequestBody Map params) {
+ logger.debug("[" + getIpAddr() + "] WxWeappInfoController::batchAuditCancel");
+ Gson gson = new GsonBuilder().create();
+ String typeStr = params.get(OpenConstant.TYPE);
+ String version = params.get(OpenConstant.VERSION);
+ Integer type = null;
+ try {
+ type = Integer.parseInt(typeStr);
+ } catch (Exception e) {
+ logger.error(e.getMessage());
+ }
+ WxWeappAuditStatusVo queryVo = new WxWeappAuditStatusVo();
+ if(StringUtils.isNotBlank(typeStr)) {
+ queryVo.setType(type);
+ }
+ if(StringUtils.isNotBlank(version)) {
+ queryVo.setUserVersion(version);
+ }
+ queryVo.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode());
+ List apps = weappAuditStatusService.getList(queryVo);
+ apps.stream().forEach( auditStatus -> {
+ // 审核通过,已发布不可撤回
+ try {
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(auditStatus.getAppId());
+ WxOpenResult openResult = openMaService.undoCodeAudit();
+ logger.info(openResult.toString());
+ if(openResult.isSuccess()) {
+ auditStatus.setAuditStatus(EnumWeappAuditStatus.UNDO.getCode());
+ auditStatus.setAuditErrCode(gson.toJson(openResult));
+ auditStatus.setAuditTime(new Date());
+ weappAuditStatusService.updateStatus(auditStatus);
+ }
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ }
+ });
+ return new ResultData();
+ }
+
+ @ApiOperation(value = "批量发布", notes = "{\"type\":\"string\", \"version\":\"string\"}")
+ @PostMapping("batchRelease")
+ public ResultData batchRelease(@RequestBody Map params) {
+ logger.debug("[" + getIpAddr() + "] WxWeappInfoController::batchRelease");
+ Gson gson = new GsonBuilder().create();
+ String typeStr = params.get(OpenConstant.TYPE);
+ String version = params.get(OpenConstant.VERSION);
+ Integer type = null;
+ try {
+ type = Integer.parseInt(typeStr);
+ } catch (Exception e) {
+ logger.error(e.getMessage());
+ }
+ WxWeappAuditStatusVo queryVo = new WxWeappAuditStatusVo();
+ if(StringUtils.isNotBlank(typeStr)) {
+ queryVo.setType(type);
+ }
+ if(StringUtils.isNotBlank(version)) {
+ queryVo.setUserVersion(version);
+ }
+ queryVo.setAuditStatus(EnumWeappAuditStatus.SUCCESS.getCode());
+ List apps = weappAuditStatusService.getList(queryVo);
+ apps.stream().forEach( auditStatus -> {
+ boolean isUpdate = false;
+ WxWeappReleaseStatus releaseStatus = weappReleaseStatusService.getByAppId(auditStatus.getAppId());
+ if(releaseStatus != null) {
+ // 当前版本已发布成功,跳过
+ if(releaseStatus.getUserVersion().equals(version)
+ && releaseStatus.getReleaseStatus().equals(EnumWeappReleaseStatus.SUCCESS.getCode())) {
+ return;
+ }
+ releaseStatus.setUserVersion(auditStatus.getUserVersion());
+ releaseStatus.setVersionDesc(auditStatus.getVersionDesc());
+ isUpdate = true;
+ } else {
+ releaseStatus = new WxWeappReleaseStatus();
+ releaseStatus.setId(auditStatus.getId());
+ releaseStatus.setTenantId(auditStatus.getTenantId());
+ releaseStatus.setAppId(auditStatus.getAppId());
+ releaseStatus.setType(auditStatus.getType());
+ releaseStatus.setUserVersion(auditStatus.getUserVersion());
+ releaseStatus.setVersionDesc(auditStatus.getVersionDesc());
+ }
+
+ try {
+ WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(auditStatus.getAppId());
+ WxOpenResult openRet = openMaService.releaesAudited();
+ logger.info(openRet.toString());
+ boolean releaseSuccess = false;
+ if(openRet.isSuccess()) {
+ releaseSuccess = true;
+ }
+ if(releaseSuccess) {
+ releaseStatus.setReleaseStatus(EnumWeappReleaseStatus.SUCCESS.getCode());
+ } else {
+ if(openRet.getErrcode().equals(OpenConstant.ERR_CODE_APP_IS_RELEASED)) {
+ releaseStatus.setReleaseStatus(EnumWeappReleaseStatus.SUCCESS.getCode());
+ } else {
+ releaseStatus.setReleaseStatus(EnumWeappReleaseStatus.FAIL.getCode());
+ }
+ }
+ releaseStatus.setReleaseErrCode(gson.toJson(openRet));
+ releaseStatus.setReleaseTime(new Date());
+ if(isUpdate) {
+ weappReleaseStatusService.updateStatus(releaseStatus);
+ } else {
+ weappReleaseStatusService.saveStatus(releaseStatus);
+ }
+ } catch (WxErrorException e) {
+ logger.error(e.getMessage());
+ if(e.getError().getErrorCode() == OpenConstant.ERR_APP_IS_RELEASED) {
+ releaseStatus.setReleaseStatus(EnumWeappReleaseStatus.SUCCESS.getCode());
+ } else {
+ releaseStatus.setReleaseStatus(EnumWeappReleaseStatus.FAIL.getCode());
+ }
+ releaseStatus.setReleaseErrCode(e.getMessage());
+ releaseStatus.setReleaseTime(new Date());
+ if(isUpdate) {
+ weappReleaseStatusService.updateStatus(releaseStatus);
+ } else {
+ weappReleaseStatusService.saveStatus(releaseStatus);
+ }
+ }
+ });
+ return new ResultData();
+ }
+
+ @ApiOperation(value = "小程序code提交状态分页列表接口", notes = "查询支持小程序类型,名称,appid,version")
+ @GetMapping("codeStatusList")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
+ @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
+ public ResultData codeStatusList(@ModelAttribute WxWeappCodeStatusVo weappCodeStatusVo, Integer pageNum, Integer pageSize) {
+ logger.debug("[" + getIpAddr() + "] WxWeappInfoController::codeStatusList");
+ if (null == weappCodeStatusVo) {
+ weappCodeStatusVo = new WxWeappCodeStatusVo();
+ } else {
+ if(StringUtils.isBlank(weappCodeStatusVo.getAppId())) {
+ weappCodeStatusVo.setAppId(null);
+ }
+ if(StringUtils.isBlank(weappCodeStatusVo.getName())) {
+ weappCodeStatusVo.setName(null);
+ }
+ }
+ weappCodeStatusVo.setSortColumns(BaseEntity.SortField.CodeTime_DESC, BaseEntity.SortField.TenantId_ASC, BaseEntity.SortField.Type_ASC, BaseEntity.SortField.UserVersion_DESC);
+ final PageInfo page = weappCodeStatusService.listAsPage(weappCodeStatusVo, pageNum, pageSize);
+ return new ResultData(page);
+ }
+
+ @ApiOperation(value = "小程序审核状态分页列表接口", notes = "查询支持小程序类型,名称,appid,version")
+ @GetMapping("auditStatusList")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
+ @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
+ public ResultData auditStatusList(@ModelAttribute WxWeappAuditStatusVo weappAuditStatusVo, Integer pageNum, Integer pageSize) {
+ logger.debug("[" + getIpAddr() + "] WxWeappInfoController::auditStatusList");
+ if (null == weappAuditStatusVo) {
+ weappAuditStatusVo = new WxWeappAuditStatusVo();
+ } else {
+ if(StringUtils.isBlank(weappAuditStatusVo.getAppId())) {
+ weappAuditStatusVo.setAppId(null);
+ }
+ if(StringUtils.isBlank(weappAuditStatusVo.getName())) {
+ weappAuditStatusVo.setName(null);
+ }
+ }
+ weappAuditStatusVo.setSortColumns(BaseEntity.SortField.AuditTime_DESC, BaseEntity.SortField.TenantId_ASC, BaseEntity.SortField.Type_ASC, BaseEntity.SortField.UserVersion_DESC);
+ final PageInfo page = weappAuditStatusService.listAsPage(weappAuditStatusVo, pageNum, pageSize);
+ return new ResultData(page);
+ }
+
+ @ApiOperation(value = "小程序发布状态分页列表接口", notes = "查询支持小程序类型,名称,appid,version")
+ @GetMapping("releaseStatusList")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
+ @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
+ public ResultData releaseStatusList(@ModelAttribute WxWeappReleaseStatusVo weappReleaseStatusVo, Integer pageNum, Integer pageSize) {
+ logger.debug("[" + getIpAddr() + "] WxWeappInfoController::releaseStatusList");
+ if (null == weappReleaseStatusVo) {
+ weappReleaseStatusVo = new WxWeappReleaseStatusVo();
+ } else {
+ if(StringUtils.isBlank(weappReleaseStatusVo.getAppId())) {
+ weappReleaseStatusVo.setAppId(null);
+ }
+ if(StringUtils.isBlank(weappReleaseStatusVo.getName())) {
+ weappReleaseStatusVo.setName(null);
+ }
+ }
+ weappReleaseStatusVo.setSortColumns(BaseEntity.SortField.ReleaseTime_DESC, BaseEntity.SortField.TenantId_ASC, BaseEntity.SortField.Type_ASC,BaseEntity.SortField.UserVersion_DESC);
+ final PageInfo page = weappReleaseStatusService.listAsPage(weappReleaseStatusVo, pageNum, pageSize);
+ return new ResultData(page);
+ }
+
+ @ApiOperation("小程序code提交版本列表")
+ @GetMapping("codeVersionList")
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "type", value = "小程序类型", dataType = "int", paramType = "query", required = true)})
+ public ResultData getCodeVersionList(Integer type) {
+ logger.debug("[" + getIpAddr() + "] WxWeappInfoController::getCodeVersionList");
+ final List