1 微信小程序
- 预定义小程序作用并开发后端服务
- 后端服务增加 HTTPS 支持
- 注册个人小程序并发布前端服务
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>29.0-jre</version>
</dependency>
1.1 common 包
package com.tzb.kafka.wechat.common;
import java.util.UUID;
import lombok.Data;
@Data
public class BaseResponseVO<M> {
private String requestId;
private M result;
public static<M> BaseResponseVO success(){
BaseResponseVO baseResponseVO = new BaseResponseVO();
baseResponseVO.setRequestId(genRequestId());
return baseResponseVO;
}
public static<M> BaseResponseVO success(M result){
BaseResponseVO baseResponseVO = new BaseResponseVO();
baseResponseVO.setRequestId(genRequestId());
baseResponseVO.setResult(result);
return baseResponseVO;
}
private static String genRequestId(){
return UUID.randomUUID().toString();
}
}
package com.tzb.kafka.wechat.common;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import org.springframework.context.annotation.Configuration;
@WebFilter(filterName = "CorsFilter")
@Configuration
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin","*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, PATCH, DELETE, PUT");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
chain.doFilter(req, res);
}
}
1.2 conf 包
package com.tzb.kafka.wechat.conf;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.List;
@Data
@Configuration
@ConfigurationProperties(prefix = "template")
public class WechatTemplateProperties {
private List<WechatTemplate> templates;
private int templateResultType;
private String templateResultFilePath;
@Data
public static class WechatTemplate{
private String templateId;
private String templateFilePath;
private boolean active;
}
}
1.3 utils 包
package com.tzb.kafka.wechat.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Optional;
import lombok.Cleanup;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class FileUtils {
public static String readFile(String filePath) throws IOException {
@Cleanup
BufferedReader reader = new BufferedReader(
new FileReader(new File(filePath))
);
String lineStr = "";
StringBuffer stringBuffer = new StringBuffer();
while ((lineStr = reader.readLine()) != null) {
stringBuffer.append(lineStr);
}
return stringBuffer.toString();
}
public static Optional<JSONObject> readFile2JsonObject(String filePath){
try {
String fileContent = readFile(filePath);
log.info("readFile2Json fileContent: [{}]" , fileContent);
return Optional.ofNullable(JSON.parseObject(fileContent));
} catch (IOException e) {
e.printStackTrace();
}
return Optional.empty();
}
public static Optional<JSONArray> readFile2JsonArray(String filePath){
try {
String fileContent = readFile(filePath);
log.info("readFile2Json fileContent: [{}]" , fileContent);
return Optional.ofNullable(JSON.parseArray(fileContent));
} catch (IOException e) {
e.printStackTrace();
}
return Optional.empty();
}
}
1.4 service
package com.tzb.kafka.wechat.service;
import com.alibaba.fastjson.JSONObject;
import com.tzb.kafka.wechat.conf.WechatTemplateProperties;
public interface WechatTemplateService {
WechatTemplateProperties.WechatTemplate getWechatTemplate();
void templateReported(JSONObject reportInfo);
JSONObject templateStatistics(String templateId);
}
package com.tzb.kafka.wechat.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.tzb.kafka.wechat.conf.WechatTemplateProperties;
import com.tzb.kafka.wechat.service.WechatTemplateService;
import com.tzb.kafka.wechat.utils.FileUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Slf4j
@Service
public class WechatTemplateServiceImpl implements WechatTemplateService {
@Autowired
private WechatTemplateProperties properties;
@Override
public WechatTemplateProperties.WechatTemplate getWechatTemplate() {
List<WechatTemplateProperties.WechatTemplate> templates = properties.getTemplates();
Optional<WechatTemplateProperties.WechatTemplate> wechatTemplate
= templates.stream().filter((template) -> template.isActive()).findFirst();
return wechatTemplate.isPresent() ? wechatTemplate.get() : null;
}
@Override
public void templateReported(JSONObject reportInfo) {
log.info("templateReported : [{}]", reportInfo);
}
@Override
public JSONObject templateStatistics(String templateId) {
if (properties.getTemplateResultType() == 0) {
return FileUtils.readFile2JsonObject(properties.getTemplateResultFilePath()).get();
}else{
}
return null;
}
}