提交 889088e3 编写于 作者: yongbo.wang's avatar yongbo.wang

Merge branch 'release' into 'master'

Release



See merge request !7
......@@ -56,7 +56,7 @@ buildNumber.properties
*.ipr
*.bak
/server/src/main/resources/mybatis-generator.xml
# IntelliJ
/out/
......
......@@ -21,6 +21,19 @@
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.3.1</version>
</dependency>
</dependencies>
<distributionManagement>
<repository>
<id>nexus</id>
......
package com.pica.cloud.wechat.common;
public class App
{
public static void main( String[] args )
{
}
}
package com.pica.cloud.wechat.yunqueyilian.common;
import com.pica.cloud.wechat.yunqueyilian.common.req.TextMessage;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.core.util.QuickWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XppDriver;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletRequest;
import java.io.InputStream;
import java.io.Writer;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Auther wangyongbo
* @Date 2018/6/8 下午7:10
*/
public class CommonUtils {
private static Logger logger = LoggerFactory.getLogger(CommonUtils.class);
/**
* 验证签名
*
* @param signature
* @param timestamp
* @param nonce
* @return
*/
public static boolean checkSignature(String signature, String timestamp, String nonce) {
String[] arr = new String[] { Constants.WECHAT_YQYL_TOKEN, timestamp, nonce };
// 将token、timestamp、nonce三个参数进行字典序排序
Arrays.sort(arr);
StringBuilder content = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
content.append(arr[i]);
}
MessageDigest md = null;
String tmpStr = null;
try {
md = MessageDigest.getInstance("SHA-1");
// 将三个参数字符串拼接成一个字符串进行sha1加密
byte[] digest = md.digest(content.toString().getBytes());
tmpStr = byteToStr(digest);
} catch (NoSuchAlgorithmException e) {
logger.error("异常抛出exception ", e);
}
content = null;
// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
return tmpStr != null ? tmpStr.toUpperCase().equals(signature.toUpperCase()) : false;
}
/**
* 将字节数组转换为十六进制字符串
*
* @param byteArray
* @return
*/
private static String byteToStr(byte[] byteArray) {
String strDigest = "";
for (int i = 0; i < byteArray.length; i++) {
strDigest += byteToHexStr(byteArray[i]);
}
return strDigest;
}
/**
* 将字节转换为十六进制字符串
*
* @param mByte
* @return
*/
private static String byteToHexStr(byte mByte) {
char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
char[] tempArr = new char[2];
tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
tempArr[1] = Digit[mByte & 0X0F];
String s = new String(tempArr);
return s;
}
/**
* 解析微信发来的请求(XML)
*
* @param request
* @return
* @throws Exception
*/
public static Map<String, String> parseXml(HttpServletRequest request) throws Exception {
// 将解析结果存储在HashMap中
Map<String, String> map = new HashMap<String, String>();
// 从request中取得输入流
InputStream inputStream = request.getInputStream();
// 读取输入流
SAXReader reader = new SAXReader();
Document document = reader.read(inputStream);
// 得到xml根元素
Element root = document.getRootElement();
// 得到根元素的所有子节点
List<Element> elementList = root.elements();
// 遍历所有子节点
for (Element e : elementList)
map.put(e.getName(), e.getText());
// 释放资源
inputStream.close();
inputStream = null;
return map;
}
/**
* 扩展xstream,使其支持CDATA块
*
* @date 2014-12-03
*/
private static XStream xstream = new XStream(new XppDriver() {
public HierarchicalStreamWriter createWriter(Writer out) {
return new PrettyPrintWriter(out) {
// 对所有xml节点的转换都增加CDATA标记
boolean cdata = true;
protected void writeText(QuickWriter writer, String text) {
if (cdata) {
writer.write("<![CDATA[");
writer.write(text);
writer.write("]]>");
} else {
writer.write(text);
}
}
};
}
});
/**
* 文本消息对象转换成xml
*
* @param textMessage 文本消息对象
* @return xml
*/
public static String textMessageToXml(TextMessage textMessage) {
xstream.alias("xml", textMessage.getClass());
return xstream.toXML(textMessage);
}
}
package com.pica.cloud.wechat.yunqueyilian.common;
/**
//考试相关常量
//@author andong
//@create 2018/7/4
*/
@SuppressWarnings("unused")
public class Constants {
// 与接口配置信息中的Token要一致
public static String WECHAT_YQYL_TOKEN = "tokenPicaHealth";
//微信公众号简称
public static Integer WECHAT_NAME_YQYL= 1;//微信类型 1、云鹊医联 5、云鹊健康 10、基层大众版 15、云鹊医 20、基层医生版
//返回消息类型:文本
public static final String RESP_MESSAGE_TYPE_TEXT = "text";
//返回消息类型:音乐
public static final String RESP_MESSAGE_TYPE_MUSIC = "music";
//返回消息类型:图文
public static final String RESP_MESSAGE_TYPE_NEWS = "news";
//请求消息类型:文本
public static final String REQ_MESSAGE_TYPE_TEXT = "text";
//请求消息类型:图片
public static final String REQ_MESSAGE_TYPE_IMAGE = "image";
//请求消息类型:链接
public static final String REQ_MESSAGE_TYPE_LINK = "link";
//请求消息类型:地理位置
public static final String REQ_MESSAGE_TYPE_LOCATION = "location";
//请求消息类型:音频
public static final String REQ_MESSAGE_TYPE_VOICE = "voice";
//请求消息类型:推送
public static final String REQ_MESSAGE_TYPE_EVENT = "event";
//事件类型:subscribe(订阅)
public static final String EVENT_TYPE_SUBSCRIBE = "subscribe";
//事件类型:unsubscribe(取消订阅)
public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe";
//事件类型:CLICK(自定义菜单点击事件)
public static final String EVENT_TYPE_CLICK = "CLICK";
//事件类型:VIEW(自定义菜单点击事件)
public static final String EVENT_TYPE_VIEW = "VIEW";
//事件类型:LOCATION(自定义菜单点击事件)
public static final String EVENT_TYPE_LOCATION = "LOCATION";
//事件类型:LOCATION_SELECT(自定义菜单点击事件)
public static final String EVENT_TYPE_LOCATION_SELECT = "LOCATION_SELECT";
//事件类型:SCAN(扫描二维码事件)
public static final String EVENT_TYPE_SCAN = "SCAN";
}
package com.pica.cloud.wechat.yunqueyilian.common.aop;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.pica.cloud.foundation.utils.utils.StringUtil;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author: zhehao.chen
* @version: V1.0
* @Description:
* @date: 2018/8/21 10:55
*/
@Aspect
@Component
public class PicaLogAspectForXml {
private static final Logger logger = LoggerFactory.getLogger(PicaLogAspectForXml.class);
ThreadLocal<Long> startTime = new ThreadLocal();
ThreadLocal<HttpServletRequest> request = new ThreadLocal();
ThreadLocal<String> contentType = new ThreadLocal();
@Pointcut("execution(public * com.pica.cloud..*Controller.*(..))")
public void weblog() {
}
@Around("weblog()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
RequestAttributes ra = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes sra = (ServletRequestAttributes) ra;
HttpServletRequest request = sra.getRequest();
this.request.set(request);
this.contentType.set(StringUtil.isNotNull(request.getHeader("Content-Type")) ? request.getHeader("Content-Type") : "");
String url = request.getRequestURL().toString();
String method = request.getMethod();
String uri = request.getRequestURI();
String queryString;
if ("GET".equalsIgnoreCase(method)) {
queryString = request.getQueryString();
} else if (!this.parseMultipart()) {
Gson g = new Gson();
queryString = g.toJson(this.getBeanFromJsonBody());
} else {
queryString = "";
}
this.startTime.set(System.currentTimeMillis());
logger.info("request start, controller params==>, url: {}, method: {}, uri: {}, params: {}", new Object[]{url, method, uri, queryString});
Object result = pjp.proceed();
String res = "";
if ("text/xml".equals(this.contentType.get())) {
if (StringUtil.isNotNull(result)) {
res = result.toString();
}
} else {
Gson gson = new Gson();
res = gson.toJson(result);
}
logger.info("request spent time milliSeconds ==>" + (System.currentTimeMillis() - (Long) this.startTime.get()));
if (this.parseMultipart()) {
res = "upload/download";
}
logger.info("request over,controller result ==> " + res);
return result;
}
protected Map<String, Object> getBeanFromJsonBody() throws Exception {
if ("text/xml".equals(this.contentType.get())) {
// 读取输入流
SAXReader reader = new SAXReader();
org.dom4j.Document document = reader.read(this.request.get().getInputStream());
// 得到xml根元素
Element root = document.getRootElement();
List<Element> elementList = root.elements();
// 遍历所有子节点
Map<String, Object> map = new HashMap<String, Object>();
for (Element e : elementList)
map.put(e.getName(), e.getText());
return map;
} else {
Gson gson = new Gson();
return (Map) gson.fromJson(IOUtils.toString(new InputStreamReader(((HttpServletRequest) this.request.get()).getInputStream(), "utf-8")), (new TypeToken<Map<String, Object>>() {
}).getType());
}
}
protected boolean parseMultipart() throws Exception {
return ServletFileUpload.isMultipartContent((HttpServletRequest) this.request.get());
}
public static String getBodyString(BufferedReader br) {
String str = "";
try {
String inputLine;
while ((inputLine = br.readLine()) != null) {
str = str + inputLine;
}
br.close();
} catch (IOException var4) {
System.out.println("IOException: " + var4);
}
return str;
}
public static String getHeaderString(HttpServletRequest request) {
JSONObject jsonObject = new JSONObject();
Enumeration enu = request.getHeaderNames();
String str;
while (enu.hasMoreElements()) {
str = (String) enu.nextElement();
String headerValue = request.getHeader(str);
jsonObject.put(str, headerValue);
System.out.println(str + ":" + headerValue);
}
str = jsonObject.toJSONString();
return str;
}
}
package com.pica.cloud.wechat.yunqueyilian.common.constants;
import com.pica.cloud.wechat.yunqueyilian.common.util.CloudPropertiesUtil;
public class WeChatConstants {
public static String WECHAT_URL = CloudPropertiesUtil.getValue("wechat_url");
// 第三方用户唯一凭证
public static String APP_ID = CloudPropertiesUtil.getValue("AppID");
// 第三方用户唯一凭证密钥
public static String APP_SECRET = CloudPropertiesUtil.getValue("AppSecret");
// 与接口配置信息中的Token要一致
public static String TOKEN = "tokenPicaHealth";
public static String EncodingAESKey = "5MXFOzFXcoA4t6tUIOP8C0N19NyWZIDiuKXKBRvUBEN";
/** access_token过期时间 */
public static int EXPIRES_PERIOD_DATE = 7200;
// 获取access_token的接口地址(GET) 限200(次/天)
public final static String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
// 菜单创建(POST) 限100(次/天)
public static String MENU_CREATE_URL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
// 通过code获取openid、access_token信息
public static String AUTH_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
// 检验授权凭证(access_token)是否有效
public static String VERIFY_AUTH_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID";
// 获取用户的基本信息
public static String GET_USER_INFO_URL = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
/** 网页授权 拉取用户信息(需scope为 snsapi_userinfo) */
public static final String GET_SNS_USER_INFO_URL = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN ";
// 检验授权凭证(access_token)是否有效
public static String VERIFY_SNS_USER_INFO_URL = "https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID";
// 获取签名算法
public static String GET_JSAPI_TICKET = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
/** 设置模版消息所属行业 */
public static String GET_INDUSTRY = "https://api.weixin.qq.com/cgi-bin/template/get_industry?access_token=ACCESS_TOKEN";
/** 获取设置的行业信息 */
public static String API_SET_INDUSTRY = "https://api.weixin.qq.com/cgi-bin/template/api_set_industry?access_token=ACCESS_TOKEN";
/** 获得模板ID */
public static String API_ADD_TEMPLATE = "https://api.weixin.qq.com/cgi-bin/template/api_add_template?access_token=ACCESS_TOKEN";
/** 获取模板列表 */
public static String GET_ALL_PRIVATE_TEMPLATE = "https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token=ACCESS_TOKEN";
/** 发送模版消息 */
public static String SEND_TEMPLATE = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";
}
package com.pica.cloud.wechat.yunqueyilian.common.enums;
/**
* @Auther chenzhehao
* @Date 2018/8/10 下午1:54
* 云鹊医联微服务 204501-205000
*/
public enum YunQueYiLianResultCode {
XXXX("","");
private String code;
private String message;
private YunQueYiLianResultCode(String code, String message) {
this.code = code;
this.message = message;
}
public String code() {
return this.code;
}
public String message() {
return this.message;
}
public static String getMessage(String name) {
YunQueYiLianResultCode[] var1 = values();
int var2 = var1.length;
for(int var3 = 0; var3 < var2; ++var3) {
YunQueYiLianResultCode item = var1[var3];
if (item.name().equals(name)) {
return item.message;
}
}
return name;
}
public static String getCode(String name) {
YunQueYiLianResultCode[] var1 = values();
int var2 = var1.length;
for(int var3 = 0; var3 < var2; ++var3) {
YunQueYiLianResultCode item = var1[var3];
if (item.name().equals(name)) {
return item.code;
}
}
return null;
}
public static YunQueYiLianResultCode parse(String code) {
YunQueYiLianResultCode[] var1 = values();
int var2 = var1.length;
for(int var3 = 0; var3 < var2; ++var3) {
YunQueYiLianResultCode result = var1[var3];
if (result.code().equals(code)) {
return result;
}
}
return null;
}
}
package com.pica.cloud.wechat.yunqueyilian.common.req;
/**
* 消息基类(公众帐号 -> 普通用户)
*
* @author bo.dang
* @date 2014-12-03
*/
public class BaseMessage {
// 接收方帐号(收到的OpenID)
private String ToUserName;
// 开发者微信号
private String FromUserName;
// 消息创建时间 (整型)
private long CreateTime;
// 消息类型(text/music/news)
private String MsgType;
// 位0x0001被标志时,星标刚收到的消息
//private int FuncFlag;
public String getToUserName() {
return ToUserName;
}
public void setToUserName(String toUserName) {
ToUserName = toUserName;
}
public String getFromUserName() {
return FromUserName;
}
public void setFromUserName(String fromUserName) {
FromUserName = fromUserName;
}
public long getCreateTime() {
return CreateTime;
}
public void setCreateTime(long createTime) {
CreateTime = createTime;
}
public String getMsgType() {
return MsgType;
}
public void setMsgType(String msgType) {
MsgType = msgType;
}
}
package com.pica.cloud.wechat.yunqueyilian.common.req;
/**
* 文本消息
*
* @author bo.dang
* @date 2014-12-03
*/
public class TextMessage extends BaseMessage {
// 回复的消息内容
private String Content;
public String getContent() {
return Content;
}
public void setContent(String content) {
Content = content;
}
}
\ No newline at end of file
package com.pica.cloud.wechat.yunqueyilian.common.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* @author: zhehao.chen
* @version: V1.0
* @Description:
* @date: 2018/8/13 9:57
*/
public class CloudPropertiesUtil {
private static Properties proper = new Properties();
public CloudPropertiesUtil() {
}
public static void read(String env) throws IOException {
if (env.equals("dev")) {
load("bootstrap-dev.properties");
} else if (env.equals("test1")) {
load("bootstrap-test1.properties");
} else if (env.equals("test2")) {
load("bootstrap-test2.properties");
} else if (env.equals("uat")) {
load("bootstrap-uat.properties");
} else if (env.equals("pro")) {
load("bootstrap-prod.properties");
}
}
public static void load(String file) throws IOException {
InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream(file);
proper.load(stream);
}
public static String getValue(String key) {
return proper.getProperty(key);
}
public static Integer getIntValue(String key) {
return Integer.valueOf(proper.getProperty(key));
}
public static void updateProperties(String key, String value) {
proper.setProperty(key, value);
}
}
package com.pica.cloud.wechat.yunqueyilian.common.util;
import com.alibaba.fastjson.JSON;
import net.sf.json.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
/**
* @ClassName:HttpclientUtil.java
* @Description: Httpclient处理类
* @author bo.dang
* @date 2016年1月26日 下午2:45:52
* @version V1.0
*/
public class HttpClientUtil {
private static final Logger logger = LoggerFactory.getLogger(HttpClientUtil.class);
private static final CloseableHttpClient hc;
static {
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setDefaultMaxPerRoute(20);
cm.setMaxTotal(200);
hc = HttpClients.custom().setConnectionManager(cm).build();
}
public static int postForm(String url, Map<String, String> params, HttpEntity entity) throws IOException {
HttpPost post = new HttpPost(url);
for(Map.Entry<String, String> param : params.entrySet()) {
post.setHeader(param.getKey(), param.getValue());
}
post.setEntity(entity);
CloseableHttpResponse resp = null;
try {
resp = hc.execute(post);
return resp.getStatusLine().getStatusCode();
} catch(Exception e){
logger.error("异常抛出exception ", e);
} finally {
if(resp != null) {
try {
resp.close();
} catch (IOException e1) {
logger.error("异常抛出exception ", e1);
}
}
}
return 0;
}
public static String httpExecute(String url, String data){
String result = "";
CloseableHttpClient httpClient = null;
CloseableHttpResponse response = null;
try {
httpClient = HttpClients.createDefault();
HttpPost postRequest = new HttpPost(url);
postRequest.setHeader("Content-Type","application/json;charset=utf-8");
postRequest.setHeader("Accept", "application/json");
//StringEntity input = new StringEntity("{\"token\":\"08b7377d22a88a8951e66ce97f4a06f6\"}");
StringEntity input = new StringEntity(data, ContentType.APPLICATION_JSON);
logger.info("data:" + data);
postRequest.setEntity(input);
response = httpClient.execute(postRequest);
if (response.getStatusLine().getStatusCode() != 201) {
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == HttpStatus.SC_OK) {
result = EntityUtils.toString(response.getEntity(), "utf-8");
} else {
logger.warn("调用失败,param:{}, result:{}", JSON.toJSONString(data), JSON.toJSONString(response));
}
}
logger.info("response:" + response);
} catch (Exception e) {
logger.error("获取session出错:" + e);
} finally {
try {
if(response != null) {
response.close();
}
} catch (Exception e){
logger.warn("CloseableHttpResponse关闭异常");
}
}
return result;
}
public static String httpExecute(String url, String data,Map map){
String result = "";
CloseableHttpClient httpClient = null;
CloseableHttpResponse response = null;
try {
httpClient = HttpClients.createDefault();
HttpPost postRequest = new HttpPost(url);
postRequest.setHeader("Content-Type","application/json;charset=utf-8");
postRequest.setHeader("Accept", "application/json");
StringEntity input = new StringEntity(data, ContentType.APPLICATION_JSON);
logger.warn("{}-{} data:{}", map.get("module"),map.get("type"), data);
postRequest.setEntity(input);
response = httpClient.execute(postRequest);
if (response.getStatusLine().getStatusCode() != 201) {
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == HttpStatus.SC_OK) {
result = EntityUtils.toString(response.getEntity(), "utf-8");
} else {
logger.warn("{}-{} 调用失败,param:{}, result:{}", map.get("module"),map.get("type"), JSON.toJSONString(data), JSON.toJSONString(response));
}
}
logger.warn("{}-{} response:{}", map.get("module"),map.get("type"), JSON.toJSONString(response));
} catch (Exception e) {
logger.error("{}-{} 获取session出错:", map.get("module"), map.get("type"), e);
} finally {
try {
if(response != null) {
response.close();
}
} catch (Exception e){
logger.warn("{}-{} CloseableHttpResponse关闭异常", map.get("module"), map.get("type"), e);
}
}
return result;
}
/**
* 发起http请求并获取结果
*
* @param requestUrl 请求地址
* @param requestMethod 请求方式(GET、POST)
* @param outputStr 提交的数据
* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
*/
public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {
JSONObject jsonObject = null;
StringBuffer buffer = new StringBuffer();
HttpURLConnection httpUrlConn = null;
BufferedReader bufferedReader = null;
InputStream inputStream = null;
InputStreamReader inputStreamReader = null;
try {
URL url = new URL(requestUrl);
httpUrlConn = (HttpURLConnection) url.openConnection();
httpUrlConn.setDoOutput(true);
httpUrlConn.setDoInput(true);
httpUrlConn.setUseCaches(false);
// 设置请求方式(GET/POST)
httpUrlConn.setRequestMethod(requestMethod);
if ("GET".equalsIgnoreCase(requestMethod)) {
httpUrlConn.connect();
}
// 当有数据需要提交时
if (null != outputStr) {
OutputStream outputStream = httpUrlConn.getOutputStream();
// 注意编码格式,防止中文乱码
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}
// 将返回的输入流转换成字符串
inputStream = httpUrlConn.getInputStream();
inputStreamReader = new InputStreamReader(inputStream, "utf-8");
bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
logger.info(buffer.toString());
jsonObject = JSONObject.fromObject(buffer.toString());
} catch (ConnectException ce) {
logger.error("Weixin server connection timed out.");
} catch (Exception e) {
logger.error("https request error:{}", e);
} finally {
try {
if(bufferedReader != null){
bufferedReader.close();
}
if(inputStreamReader != null) {
inputStreamReader.close();
}
if(inputStream != null) {
inputStream.close();
}
if(httpUrlConn != null) {
httpUrlConn.disconnect();
}
} catch (Exception e){
logger.warn("httpUrlConn关闭异常");
}
}
return jsonObject;
}
}
package com.pica.cloud.wechat.yunqueyilian.common.util;
import javax.net.ssl.X509TrustManager;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
/**
* 证书信任管理器(用于https请求)
*
* @author bo.dang
* @date 2014-12-04
*/
public class MyX509TrustManager implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
\ No newline at end of file
package com.pica.cloud.wechat.yunqueyilian.common.util;
import com.pica.cloud.foundation.utils.utils.JsonUtil;
import com.pica.cloud.foundation.utils.utils.StringUtil;
import com.pica.cloud.foundation.utils.utils.date.DateTimeUtils;
import com.pica.cloud.wechat.yunqueyilian.common.constants.WeChatConstants;
import com.pica.cloud.wechat.yunqueyilian.common.wechat.pojo.AccessToken;
import com.pica.cloud.wechat.yunqueyilian.common.wechat.pojo.JsapiTicket;
import com.pica.cloud.wechat.yunqueyilian.common.wechat.pojo.Menu;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.URL;
import java.util.Date;
/**
* 公众平台通用接口工具类
*
* @author bo.dang
* @date 2013-08-09
*/
public class WeChatToolUtil {
private static Logger logger = LoggerFactory.getLogger(WeChatToolUtil.class);
/**
* access_token
*/
public static String access_token;
public static AccessToken accessToken;
/**
* 获取access_token的时间
*/
public static Date get_access_token_time;
/**
* 权限签名
*/
public static JsapiTicket jsapiTicket = null;
/**
* 发起https请求并获取结果
*
* @param requestUrl 请求地址
* @param requestMethod 请求方式(GET、POST)
* @param outputStr 提交的数据
* @return JSONObject(通过JSONObject.get ( key)的方式获取json对象的属性值)
*/
public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {
JSONObject jsonObject = null;
StringBuffer buffer = new StringBuffer();
try {
// 创建SSLContext对象,并使用我们指定的信任管理器初始化
TrustManager[] tm = {new MyX509TrustManager()};
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
// 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();
URL url = new URL(requestUrl);
HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
httpUrlConn.setSSLSocketFactory(ssf);
httpUrlConn.setDoOutput(true);
httpUrlConn.setDoInput(true);
httpUrlConn.setUseCaches(false);
// 设置请求方式(GET/POST)
httpUrlConn.setRequestMethod(requestMethod);
if ("GET".equalsIgnoreCase(requestMethod))
httpUrlConn.connect();
// 当有数据需要提交时
if (null != outputStr) {
OutputStream outputStream = httpUrlConn.getOutputStream();
// 注意编码格式,防止中文乱码
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}
// 将返回的输入流转换成字符串
InputStream inputStream = httpUrlConn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
bufferedReader.close();
inputStreamReader.close();
// 释放资源
inputStream.close();
inputStream = null;
httpUrlConn.disconnect();
logger.info(buffer.toString());
jsonObject = JSONObject.fromObject(buffer.toString());
} catch (ConnectException ce) {
logger.error("Weixin server connection timed out.");
} catch (Exception e) {
logger.error("https request error:{}", e);
}
return jsonObject;
}
/**
* 获取access_token
*
* @param appid 凭证
* @param appsecret 密钥
* @return
*/
public static AccessToken getAccessToken(String appid, String appsecret) {
AccessToken accessToken = null;
String requestUrl = WeChatConstants.ACCESS_TOKEN_URL.replace("APPID", appid).replace("APPSECRET", appsecret);
JSONObject jsonObject = httpRequest(requestUrl, "GET", null);
// 如果请求成功
if (null != jsonObject) {
try {
access_token = jsonObject.getString("access_token");
if (!StringUtil.isEmpty(access_token)) {
get_access_token_time = new Date();
accessToken = JsonUtil.toGsonBean(jsonObject.toString(), AccessToken.class);
logger.info("获取token成功 accessToken:{}", jsonObject.toString());
} else {
get_access_token_time = new Date();
logger.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
}
} catch (JSONException e) {
accessToken = null;
// 获取token失败
logger.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
}
} else {
// 获取token失败
logger.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
}
WeChatToolUtil.accessToken = accessToken;
return accessToken;
}
/**
* 校验accessToken是否过期
*
* @param access_token
* @return
*/
public static AccessToken checkAccessToken(String access_token) {
AccessToken accessToken = WeChatToolUtil.accessToken;
if (WeChatToolUtil.isExpired() || StringUtil.isEmpty(access_token)) {
logger.info("access_token已过期,重新获取 start");
accessToken = WeChatToolUtil.getAccessToken(WeChatConstants.APP_ID, WeChatConstants.APP_SECRET);
}
return accessToken;
}
/**
* 获得jsapi_ticket
*
* @return
*/
public static JsapiTicket getJsapi_ticket() {
String requestUrl = WeChatConstants.GET_JSAPI_TICKET.replace("ACCESS_TOKEN", access_token);
JSONObject jsonObject = httpRequest(requestUrl, "GET", null);
JsapiTicket jsapiTicket = null;
if (StringUtil.isNotNull(jsonObject)) {
jsapiTicket = JsonUtil.toGsonBean(jsonObject.toString(), JsapiTicket.class);
}
return jsapiTicket;
}
/**
* 创建菜单
*
* @param menu 菜单实例
* @param accessToken 有效的access_token
* @return 0表示成功,其他值表示失败
*/
public static Boolean createMenu(Menu menu, String accessToken) {
Boolean flag = true;
// 拼装创建菜单的url
String url = WeChatConstants.MENU_CREATE_URL.replace("ACCESS_TOKEN", accessToken);
// 将菜单对象转换成json字符串
String jsonMenu = JSONObject.fromObject(menu).toString();
// 调用接口创建菜单
JSONObject jsonObject = httpRequest(url, "POST", jsonMenu);
if (null != jsonObject) {
if (0 != jsonObject.getInt("errcode")) {
flag = false;
logger.error("创建菜单失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
} else {
logger.info("创建菜单成功! errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
}
}
return flag;
}
/**
* 判断access_token是否过期
*/
public static Boolean isExpired() {
if (null != get_access_token_time) {
logger.info("判断access_token是否过期 get_access_token_time:{} currentTime:{}", DateTimeUtils.DateTimeFormater.format(get_access_token_time), DateTimeUtils.currentDateTime());
return DateTimeUtils.compare2Date(new Date(), DateTimeUtils.addDateSeconds(get_access_token_time, (7200 - 60) * 1000));
} else {
return true;
}
}
}
\ No newline at end of file
package com.pica.cloud.wechat.yunqueyilian.common.wechat.pojo;
/**
* 微信通用接口凭证
*
* @author bo.dang
* @date 2014-12-04
*/
public class AccessToken {
/** 获取到的凭证 */
private String access_token;
/** 凭证有效时间,单位:秒 */
private int expires_in;
/** 用户刷新access_token */
private String refresh_token;
/** 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID */
private String openid;
/** 用户授权的作用域,使用逗号(,)分隔 */
private String scope;
/**
* @return the access_token
*/
public String getAccess_token() {
return access_token;
}
/**
* @param access_token the access_token to set
*/
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
/**
* @return the expires_in
*/
public int getExpires_in() {
return expires_in;
}
/**
* @param expires_in the expires_in to set
*/
public void setExpires_in(int expires_in) {
this.expires_in = expires_in;
}
public String getRefresh_token() {
return refresh_token;
}
public void setRefresh_token(String refresh_token) {
this.refresh_token = refresh_token;
}
public String getOpenid() {
return openid;
}
public void setOpenid(String openid) {
this.openid = openid;
}
public String getScope() {
return scope;
}
public void setScope(String scope) {
this.scope = scope;
}
}
package com.pica.cloud.wechat.yunqueyilian.common.wechat.pojo;
import com.pica.cloud.foundation.utils.utils.date.DateAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.util.Date;
/**
* Created by wangxinxu on 16/9/25.
*/
public class BaseEntity {
private Integer delete_flag;
private Integer creat_id;
@XmlJavaTypeAdapter(DateAdapter.class)
protected Date creat_time;
private Integer modify_id;
@XmlJavaTypeAdapter(DateAdapter.class)
protected Date modify_time;
public Integer getDelete_flag() {
return delete_flag;
}
public void setDelete_flag(Integer delete_flag) {
this.delete_flag = delete_flag;
}
public Integer getCreat_id() {
return creat_id;
}
public void setCreat_id(Integer creat_id) {
this.creat_id = creat_id;
}
public Date getCreat_time() {
return creat_time;
}
public void setCreat_time(Date creat_time) {
this.creat_time = creat_time;
}
public Integer getModify_id() {
return modify_id;
}
public void setModify_id(Integer modify_id) {
this.modify_id = modify_id;
}
public Date getModify_time() {
return modify_time;
}
public void setModify_time(Date modify_time) {
this.modify_time = modify_time;
}
}
package com.pica.cloud.wechat.yunqueyilian.common.wechat.pojo;
/**
* 按钮的基类
*
* @author bo.dang
* @date 2014-12-04
*/
public class Button {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.pica.cloud.wechat.yunqueyilian.common.wechat.pojo;
/**
* 普通按钮(子按钮)
*
* @author bo.dang
* @date 2014-12-04
*/
public class CommonButton extends Button {
private String type;
private String key;
private String url;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
package com.pica.cloud.wechat.yunqueyilian.common.wechat.pojo;
/**
* 复杂按钮(父按钮)
*
* @author bo.dang
* @date 2014-12-04
*/
public class ComplexButton extends Button {
private Button[] sub_button;
public Button[] getSub_button() {
return sub_button;
}
public void setSub_button(Button[] sub_button) {
this.sub_button = sub_button;
}
}
\ No newline at end of file
package com.pica.cloud.wechat.yunqueyilian.common.wechat.pojo;
/**
* Created by Vino on 2016/12/22.
*/
public class Industry {
private String industry_id1;
private String industry_id2;
public String getIndustry_id1() {
return industry_id1;
}
public void setIndustry_id1(String industry_id1) {
this.industry_id1 = industry_id1;
}
public String getIndustry_id2() {
return industry_id2;
}
public void setIndustry_id2(String industry_id2) {
this.industry_id2 = industry_id2;
}
}
package com.pica.cloud.wechat.yunqueyilian.common.wechat.pojo;
public class JsapiTicket {
/** 状态码 */
private Integer errcode;
/** 状态 */
private String errmsg;
/** 签名 */
private String ticket;
/** 有效期 */
private Integer expires_in;
public Integer getErrcode() {
return errcode;
}
public void setErrcode(Integer errcode) {
this.errcode = errcode;
}
public String getErrmsg() {
return errmsg;
}
public void setErrmsg(String errmsg) {
this.errmsg = errmsg;
}
public String getTicket() {
return ticket;
}
public void setTicket(String ticket) {
this.ticket = ticket;
}
public Integer getExpires_in() {
return expires_in;
}
public void setExpires_in(Integer expires_in) {
this.expires_in = expires_in;
}
}
package com.pica.cloud.wechat.yunqueyilian.common.wechat.pojo;
/**
* 菜单
*
* @author bo.dang
* @date 2014-12-04
*/
public class Menu {
private Button[] button;
public Button[] getButton() {
return button;
}
public void setButton(Button[] button) {
this.button = button;
}
}
\ No newline at end of file
package com.pica.cloud.wechat.yunqueyilian.common.wechat.pojo;
/**
* Created by Vino on 2016/12/22.
*/
public class SendTemplate {
private String touser;
private String template_id;
private String url;
private TemplateData data;
public String getTouser() {
return touser;
}
public void setTouser(String touser) {
this.touser = touser;
}
public String getTemplate_id() {
return template_id;
}
public void setTemplate_id(String template_id) {
this.template_id = template_id;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public TemplateData getData() {
return data;
}
public void setData(TemplateData data) {
this.data = data;
}
}
package com.pica.cloud.wechat.yunqueyilian.common.wechat.pojo;
/**
* Created by Vino on 2016/12/22.
*/
public class Template {
private String template_id;
public String getTemplate_id() {
return template_id;
}
public void setTemplate_id(String template_id) {
this.template_id = template_id;
}
}
package com.pica.cloud.wechat.yunqueyilian.common.wechat.pojo;
/**
* Created by Vino on 2016/12/22.
*/
public class TemplateData {
private TemplateKeynote first;
private TemplateKeynote keynote1;
private TemplateKeynote keynote2;
private TemplateKeynote keynote3;
private TemplateKeynote subject;
private TemplateKeynote sender;
private TemplateKeynote remark;
public TemplateKeynote getFirst() {
return first;
}
public void setFirst(TemplateKeynote first) {
this.first = first;
}
public TemplateKeynote getKeynote1() {
return keynote1;
}
public void setKeynote1(TemplateKeynote keynote1) {
this.keynote1 = keynote1;
}
public TemplateKeynote getKeynote2() {
return keynote2;
}
public void setKeynote2(TemplateKeynote keynote2) {
this.keynote2 = keynote2;
}
public TemplateKeynote getKeynote3() {
return keynote3;
}
public void setKeynote3(TemplateKeynote keynote3) {
this.keynote3 = keynote3;
}
public TemplateKeynote getRemark() {
return remark;
}
public void setRemark(TemplateKeynote remark) {
this.remark = remark;
}
public TemplateKeynote getSubject() {
return subject;
}
public void setSubject(TemplateKeynote subject) {
this.subject = subject;
}
public TemplateKeynote getSender() {
return sender;
}
public void setSender(TemplateKeynote sender) {
this.sender = sender;
}
}
package com.pica.cloud.wechat.yunqueyilian.common.wechat.pojo;
/**
* Created by Vino on 2016/12/22.
*/
public class TemplateKeynote {
private String value;
private String color;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
package com.pica.cloud.wechat.yunqueyilian.common.wechat.pojo;
public class User {
/** 是否订阅该公众号标识 */
private String subscribe;
/** 用户标识 */
private String openid;
/** 昵称 */
private String nickname;
/** 性别 */
private String sex;
/** 用户所在城市 */
private String city;
/** 用户所在省份 */
private String province;
/** 用户的语言 */
private String language;
/** 用户头像 */
private String headimgrul;
/** 用户关注时间 */
private String subscribe_time;
/** 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段 */
private String unionid;
/** 纬度 */
private String latitude;
/** 经度 */
private String longitude;
/**
* @return the subscribe
*/
public String getSubscribe() {
return subscribe;
}
/**
* @param subscribe the subscribe to set
*/
public void setSubscribe(String subscribe) {
this.subscribe = subscribe;
}
/**
* @return the openid
*/
public String getOpenid() {
return openid;
}
/**
* @param openid the openid to set
*/
public void setOpenid(String openid) {
this.openid = openid;
}
/**
* @return the nickname
*/
public String getNickname() {
return nickname;
}
/**
* @param nickname the nickname to set
*/
public void setNickname(String nickname) {
this.nickname = nickname;
}
/**
* @return the sex
*/
public String getSex() {
return sex;
}
/**
* @param sex the sex to set
*/
public void setSex(String sex) {
this.sex = sex;
}
/**
* @return the city
*/
public String getCity() {
return city;
}
/**
* @param city the city to set
*/
public void setCity(String city) {
this.city = city;
}
/**
* @return the province
*/
public String getProvince() {
return province;
}
/**
* @param province the province to set
*/
public void setProvince(String province) {
this.province = province;
}
/**
* @return the language
*/
public String getLanguage() {
return language;
}
/**
* @param language the language to set
*/
public void setLanguage(String language) {
this.language = language;
}
/**
* @return the headimgrul
*/
public String getHeadimgrul() {
return headimgrul;
}
/**
* @param headimgrul the headimgrul to set
*/
public void setHeadimgrul(String headimgrul) {
this.headimgrul = headimgrul;
}
/**
* @return the subscribe_time
*/
public String getSubscribe_time() {
return subscribe_time;
}
/**
* @param subscribe_time the subscribe_time to set
*/
public void setSubscribe_time(String subscribe_time) {
this.subscribe_time = subscribe_time;
}
/**
* @return the unionid
*/
public String getUnionid() {
return unionid;
}
/**
* @param unionid the unionid to set
*/
public void setUnionid(String unionid) {
this.unionid = unionid;
}
public String getLatitude() {
return latitude;
}
public void setLatitude(String latitude) {
this.latitude = latitude;
}
public String getLongitude() {
return longitude;
}
public void setLongitude(String longitude) {
this.longitude = longitude;
}
}
package com.pica.cloud.wechat.yunqueyilian.common.wechat.pojo;
public class WSLocation extends BaseEntity {
/** openid */
private String openid;
/** 纬度 */
private String latitude;
/** 经度 */
private String longitude;
/** 精度 */
private String precision;
/**
* @return the latitude
*/
public String getLatitude() {
return latitude;
}
/**
* @param latitude the latitude to set
*/
public void setLatitude(String latitude) {
this.latitude = latitude;
}
/**
* @return the longitude
*/
public String getLongitude() {
return longitude;
}
/**
* @param longitude the longitude to set
*/
public void setLongitude(String longitude) {
this.longitude = longitude;
}
/**
* @return the openid
*/
public String getOpenid() {
return openid;
}
/**
* @param openid the openid to set
*/
public void setOpenid(String openid) {
this.openid = openid;
}
/**
* @return the precision
*/
public String getPrecision() {
return precision;
}
/**
* @param precision the precision to set
*/
public void setPrecision(String precision) {
this.precision = precision;
}
}
package com.pica.cloud.wechat.yunqueyilian.common.wechat.pojo;
import java.util.Date;
public class WSUser extends BaseEntity {
/**
* 是否订阅该公众号标识
*/
private Integer subscribe;
/**
* 用户标识
*/
private String openid;
/**
* 昵称
*/
private String nickname;
/**
* 性别
*/
private String sex;
/**
* 用户所在城市
*/
private String city;
/**
* 用户所在省份
*/
private String province;
/**
* 用户的语言
*/
private String language;
/**
* 用户头像
*/
private String headimgurl;
/**
* 用户关注时间
*/
private Date subscribe_time;
/**
* 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段
*/
private String unionid;
/**
* @return the subscribe
*/
public Integer getSubscribe() {
return subscribe;
}
/**
* @param subscribe the subscribe to set
*/
public void setSubscribe(Integer subscribe) {
this.subscribe = subscribe;
}
/**
* @return the sex
*/
public String getSex() {
return sex;
}
/**
* @param sex the sex to set
*/
public void setSex(String sex) {
this.sex = sex;
}
/**
* @return the city
*/
public String getCity() {
return city;
}
/**
* @param city the city to set
*/
public void setCity(String city) {
this.city = city;
}
/**
* @return the province
*/
public String getProvince() {
return province;
}
/**
* @param province the province to set
*/
public void setProvince(String province) {
this.province = province;
}
/**
* @return the language
*/
public String getLanguage() {
return language;
}
/**
* @param language the language to set
*/
public void setLanguage(String language) {
this.language = language;
}
/**
* @return the subscribe_time
*/
public Date getSubscribe_time() {
return subscribe_time;
}
/**
* @param subscribe_time the subscribe_time to set
*/
public void setSubscribe_time(Date subscribe_time) {
this.subscribe_time = subscribe_time;
}
public String getOpenid() {
return openid;
}
public void setOpenid(String openid) {
this.openid = openid;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
/**
* @return the headimgurl
*/
public String getHeadimgurl() {
return headimgurl;
}
/**
* @param headimgurl the headimgurl to set
*/
public void setHeadimgurl(String headimgurl) {
this.headimgurl = headimgurl;
}
/**
* @return the unionid
*/
public String getUnionid() {
return unionid;
}
/**
* @param unionid the unionid to set
*/
public void setUnionid(String unionid) {
this.unionid = unionid;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.pica.cloud.wechat</groupId>
......@@ -8,25 +9,18 @@
<packaging>pom</packaging>
<name>pica-cloud-yunqueyilian</name>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.pica.cloud.foundation</groupId>
<artifactId>pica-cloud-utils</artifactId>
<version>1.0.7-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
<modules>
<module>server</module>
<module>common</module>
<module>client</module>
</modules>
<modules>
<module>server</module>
<module>common</module>
<module>client</module>
</modules>
</project>
\ No newline at end of file
......@@ -25,6 +25,12 @@
</properties>
<dependencies>
<dependency>
<groupId>com.pica.cloud.wechat</groupId>
<artifactId>pica-cloud-yunqueyilian-common</artifactId>
<version>1.0.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
......@@ -96,12 +102,6 @@
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>com.pica.cloud.foundation</groupId>
<artifactId>pica-cloud-utils</artifactId>
<version>1.0.7-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
......@@ -216,15 +216,15 @@
<version>1.3.2</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<phase>package</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<!--<executions>-->
<!--<execution>-->
<!--<id>Generate MyBatis Artifacts</id>-->
<!--<phase>package</phase>-->
<!--<goals>-->
<!--<goal>generate</goal>-->
<!--</goals>-->
<!--</execution>-->
<!--</executions>-->
<configuration>
<verbose>true</verbose>
<overwrite>true</overwrite>
......
package com.pica.cloud.wechat.yunqueyilian.server;
import com.pica.cloud.wechat.yunqueyilian.server.configuration.MyTypeExcludeFilterApplicationContextInitializer;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
......@@ -9,14 +10,15 @@ import org.springframework.cloud.netflix.feign.EnableFeignClients;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@EnableCircuitBreaker
@SpringBootApplication
@SpringBootApplication(scanBasePackages = "com.pica.cloud")
@EnableDiscoveryClient
@EnableSwagger2
@EnableFeignClients
@MapperScan("com.pica.cloud.wechat.yunqueyilian.server.mapper")
public class App {
public static void main( String[] args )
{
SpringApplication.run(App.class, args);
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(App.class);
springApplication.addInitializers(new MyTypeExcludeFilterApplicationContextInitializer());
springApplication.run(args);
}
}
package com.pica.cloud.wechat.yunqueyilian.server.client;
import com.pica.cloud.foundation.entity.PicaResponse;
import com.pica.cloud.wechat.yunqueyilian.server.client.impl.WechatsServiceFailFactory;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Map;
/**
* @author: zhehao.chen
* @version: V1.0
* @Description:
* @date: 2018/8/9 13:15
*/
@FeignClient(value = "10102-PICA-CLOUD-WECHAT", fallbackFactory = WechatsServiceFailFactory.class)
@RequestMapping(value = "/wechats", headers = "sysCode=21", produces = "application/json;charset=UTF-8")
public interface IWechatsServiceClient {
@RequestMapping(method = RequestMethod.GET, value = "/users")
PicaResponse<Map<String, Object>> users(@RequestParam(value = "type") Integer type, @RequestParam(value = "openId") String openId);
}
package com.pica.cloud.wechat.yunqueyilian.server.client.impl;
import com.pica.cloud.foundation.entity.PicaResponse;
import com.pica.cloud.foundation.entity.PicaResultCode;
import com.pica.cloud.wechat.yunqueyilian.server.client.IWechatsServiceClient;
import feign.hystrix.FallbackFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* @author: zhehao.chen
* @version: V1.0
* @Description:
* @date: 2018/8/10 10:57
*/
@Component
public class WechatsServiceFailFactory implements FallbackFactory<IWechatsServiceClient> {
public static final Logger logger = LoggerFactory.getLogger(WechatsServiceFailFactory.class);
@Override
public IWechatsServiceClient create(Throwable cause) {
PicaResponse response = (new PicaResponse.Builder<Map<String, Object>>()).build();
response.setCode(PicaResultCode.INTERFACE_INVOKE_ERROR.code());
response.setMessage(PicaResultCode.INTERFACE_INVOKE_ERROR.message());
return new IWechatsServiceClient() {
@Override
public PicaResponse users(Integer type, String openId) {
logger.error("service:IWechatsServiceClient interface:users 触发熔断机制fallback", cause);
return response;
}
};
}
}
package com.pica.cloud.wechat.yunqueyilian.server.configuration;
import org.springframework.boot.context.TypeExcludeFilter;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
/**
* @author: zhehao.chen
* @version: V1.0
* @Description:自定义bean过滤
* @date: 2018/8/20 18:12
*/
public class MyTypeExcludeFilter extends TypeExcludeFilter {
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) {
//common包中的PicaLogAspect过滤掉,使用自定义的PicaLogAspectForXml
if ("com.pica.cloud.foundation.utils.aop.PicaLogAspect".equals(metadataReader.getClassMetadata().getClassName())) {
return true;
}
return false;
}
}
package com.pica.cloud.wechat.yunqueyilian.server.configuration;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.Ordered;
import org.springframework.core.PriorityOrdered;
/**
* @author: zhehao.chen
* @version: V1.0
* @Description:
* @date: 2018/8/20 18:25
*/
public class MyTypeExcludeFilterApplicationContextInitializer
implements ApplicationContextInitializer<ConfigurableApplicationContext>, Ordered {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
applicationContext.addBeanFactoryPostProcessor(new MyTypeExcludeFilterPostProcessor());
}
@Override
public int getOrder() {
return 0;
}
private static class MyTypeExcludeFilterPostProcessor
implements PriorityOrdered, BeanDefinitionRegistryPostProcessor {
public static final String BEAN_NAME = "com.pica.cloud.wechat.yunqueyilian.server.configuration.myTypeExcludeFilter";
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
RootBeanDefinition definition = new RootBeanDefinition(
MyTypeExcludeFilter.class);
registry.registerBeanDefinition(BEAN_NAME, definition);
}
}
}
\ No newline at end of file
package com.pica.cloud.wechat.yunqueyilian.server.controller;
import com.pica.cloud.foundation.utils.controller.BaseController;
import com.pica.cloud.wechat.yunqueyilian.server.service.CoreService;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
/**
* @author: zhehao.chen
* @version: V1.0
* @Description:
* @date: 2018/8/9 10:08
*/
@RestController
@RequestMapping("/core")
public class CoreController extends BaseController {
private static Logger logger = LoggerFactory.getLogger(CoreController.class);
@Autowired
private CoreService coreService;
@ApiOperation(value = "微信验证接口", response = String.class)
@RequestMapping(method = RequestMethod.GET, produces = "text/xml;charset=UTF-8")
// @RequestMapping
public String check(final HttpServletRequest request) throws Exception {
// 创建一个ResponseBuilder
return coreService.requestCheck(request);// 返回Response
}
@ApiOperation(value = "微信推送事件接口", response = String.class)
@RequestMapping(method = RequestMethod.POST, produces = "text/xml;charset=UTF-8")
// @RequestMapping
public String msg(final HttpServletRequest request) throws Exception {
// 创建一个ResponseBuilder
return coreService.processRequest(request);// 返回Response
}
}
package com.pica.cloud.wechat.yunqueyilian.server.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.pica.cloud.wechat.yunqueyilian.server.client.IConfigServiceClient;
import com.pica.cloud.wechat.yunqueyilian.server.configuration.PropertiesConfiguration;
import com.pica.cloud.wechat.yunqueyilian.server.mapper.HospitalMapper;
import com.pica.cloud.wechat.yunqueyilian.server.entity.Hospital;
import com.pica.cloud.foundation.entity.PicaResponse;
import com.pica.cloud.foundation.redis.RedisClient;
@RestController
@RequestMapping("/demo")
@Api(value = "冒烟测试", description = "测试 db,redis,读取自定义配置 以及使用 feign 调用微服务")
public class DemoController {
@Autowired
private HospitalMapper personMapper;
@Autowired
private RedisClient redisClient;
@Autowired
private PropertiesConfiguration properties;
@Autowired
private LoadBalancerClient slb;
@Autowired
private IConfigServiceClient client;
@ApiOperation(value = "DB连接测试:更新Person对象", response = PicaResponse.class)
@RequestMapping(value = "/db", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
public PicaResponse<Hospital> saveToDB() {
// 创建一个ResponseBuilder
PicaResponse.Builder<Hospital> builder = new PicaResponse.Builder<>();
builder.setData(personMapper.selectByPrimaryKey(1008));
// 返回Response
return builder.build();
}
@ApiOperation(value = "Redis连接测试:插入一个Person对象到Redis", response = PicaResponse.class)
@RequestMapping(value = "/redis", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
public PicaResponse<String> saveToCache() {
PicaResponse.Builder<String> builder = new PicaResponse.Builder<>();
redisClient.set("keyname", personMapper.selectByPrimaryKey(1008));
return builder.setData(redisClient.get("keyname")).build();
}
@ApiOperation(value = "读取配置测试", response = PicaResponse.class)
@RequestMapping(value = "/config", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
public PicaResponse<String> readFromConfiguration() {
PicaResponse.Builder<String> builder = new PicaResponse.Builder<>();
builder.setData(properties.toString());
return builder.build();
}
@ApiOperation(value = "Feign调用微服务", response = PicaResponse.class)
@RequestMapping(value = "/beans", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
public String beans() {
return client.beans();
}
}
package com.pica.cloud.wechat.yunqueyilian.server.entity;
import java.util.Date;
public class Hospital {
private Integer id;
private Integer provinceId;
private String provinceName;
private Long cityId;
private String cityName;
private Long countyId;
private String countyName;
private Long townId;
private String townName;
private Long villageId;
private String villageName;
private String name;
private String hospitalAddress;
private Integer type;
private Integer deleteFlag;
private Integer creatId;
private Date creatTime;
private Integer modifyId;
private Date modifyTime;
private Integer hospitalStatisticsType;
private Integer hospitalRank;
private String hospitalAlias;
private Integer parentId;
private String hospitalClass;
private String hospitalLevel;
private String hospitalGrade;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getProvinceId() {
return provinceId;
}
public void setProvinceId(Integer provinceId) {
this.provinceId = provinceId;
}
public String getProvinceName() {
return provinceName;
}
public void setProvinceName(String provinceName) {
this.provinceName = provinceName == null ? null : provinceName.trim();
}
public Long getCityId() {
return cityId;
}
public void setCityId(Long cityId) {
this.cityId = cityId;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName == null ? null : cityName.trim();
}
public Long getCountyId() {
return countyId;
}
public void setCountyId(Long countyId) {
this.countyId = countyId;
}
public String getCountyName() {
return countyName;
}
public void setCountyName(String countyName) {
this.countyName = countyName == null ? null : countyName.trim();
}
public Long getTownId() {
return townId;
}
public void setTownId(Long townId) {
this.townId = townId;
}
public String getTownName() {
return townName;
}
public void setTownName(String townName) {
this.townName = townName == null ? null : townName.trim();
}
public Long getVillageId() {
return villageId;
}
public void setVillageId(Long villageId) {
this.villageId = villageId;
}
public String getVillageName() {
return villageName;
}
public void setVillageName(String villageName) {
this.villageName = villageName == null ? null : villageName.trim();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name == null ? null : name.trim();
}
public String getHospitalAddress() {
return hospitalAddress;
}
public void setHospitalAddress(String hospitalAddress) {
this.hospitalAddress = hospitalAddress == null ? null : hospitalAddress.trim();
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
public Integer getDeleteFlag() {
return deleteFlag;
}
public void setDeleteFlag(Integer deleteFlag) {
this.deleteFlag = deleteFlag;
}
public Integer getCreatId() {
return creatId;
}
public void setCreatId(Integer creatId) {
this.creatId = creatId;
}
public Date getCreatTime() {
return creatTime;
}
public void setCreatTime(Date creatTime) {
this.creatTime = creatTime;
}
public Integer getModifyId() {
return modifyId;
}
public void setModifyId(Integer modifyId) {
this.modifyId = modifyId;
}
public Date getModifyTime() {
return modifyTime;
}
public void setModifyTime(Date modifyTime) {
this.modifyTime = modifyTime;
}
public Integer getHospitalStatisticsType() {
return hospitalStatisticsType;
}
public void setHospitalStatisticsType(Integer hospitalStatisticsType) {
this.hospitalStatisticsType = hospitalStatisticsType;
}
public Integer getHospitalRank() {
return hospitalRank;
}
public void setHospitalRank(Integer hospitalRank) {
this.hospitalRank = hospitalRank;
}
public String getHospitalAlias() {
return hospitalAlias;
}
public void setHospitalAlias(String hospitalAlias) {
this.hospitalAlias = hospitalAlias == null ? null : hospitalAlias.trim();
}
public Integer getParentId() {
return parentId;
}
public void setParentId(Integer parentId) {
this.parentId = parentId;
}
public String getHospitalClass() {
return hospitalClass;
}
public void setHospitalClass(String hospitalClass) {
this.hospitalClass = hospitalClass == null ? null : hospitalClass.trim();
}
public String getHospitalLevel() {
return hospitalLevel;
}
public void setHospitalLevel(String hospitalLevel) {
this.hospitalLevel = hospitalLevel == null ? null : hospitalLevel.trim();
}
public String getHospitalGrade() {
return hospitalGrade;
}
public void setHospitalGrade(String hospitalGrade) {
this.hospitalGrade = hospitalGrade == null ? null : hospitalGrade.trim();
}
}
\ No newline at end of file
package com.pica.cloud.wechat.yunqueyilian.server.entity;
import java.util.Date;
public class PWechatUser {
private Integer id;
private String openid;
private Integer patientId;
private Integer type;
private Integer sex;
private String nickname;
private String province;
private String city;
private String country;
private String headimgurl;
private String privilege;
private String unionid;
private Integer subscribe;
private String language;
private Date subscribeTime;
private String remark;
private String groupid;
private String tagidList;
private Integer deleteFlag;
private Integer creatId;
private Date creatTime;
private Integer modifyId;
private Date modifyTime;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getOpenid() {
return openid;
}
public void setOpenid(String openid) {
this.openid = openid == null ? null : openid.trim();
}
public Integer getPatientId() {
return patientId;
}
public void setPatientId(Integer patientId) {
this.patientId = patientId;
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname == null ? null : nickname.trim();
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province == null ? null : province.trim();
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city == null ? null : city.trim();
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country == null ? null : country.trim();
}
public String getHeadimgurl() {
return headimgurl;
}
public void setHeadimgurl(String headimgurl) {
this.headimgurl = headimgurl == null ? null : headimgurl.trim();
}
public String getPrivilege() {
return privilege;
}
public void setPrivilege(String privilege) {
this.privilege = privilege == null ? null : privilege.trim();
}
public String getUnionid() {
return unionid;
}
public void setUnionid(String unionid) {
this.unionid = unionid == null ? null : unionid.trim();
}
public Integer getSubscribe() {
return subscribe;
}
public void setSubscribe(Integer subscribe) {
this.subscribe = subscribe;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language == null ? null : language.trim();
}
public Date getSubscribeTime() {
return subscribeTime;
}
public void setSubscribeTime(Date subscribeTime) {
this.subscribeTime = subscribeTime;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark == null ? null : remark.trim();
}
public String getGroupid() {
return groupid;
}
public void setGroupid(String groupid) {
this.groupid = groupid == null ? null : groupid.trim();
}
public String getTagidList() {
return tagidList;
}
public void setTagidList(String tagidList) {
this.tagidList = tagidList == null ? null : tagidList.trim();
}
public Integer getDeleteFlag() {
return deleteFlag;
}
public void setDeleteFlag(Integer deleteFlag) {
this.deleteFlag = deleteFlag;
}
public Integer getCreatId() {
return creatId;
}
public void setCreatId(Integer creatId) {
this.creatId = creatId;
}
public Date getCreatTime() {
return creatTime;
}
public void setCreatTime(Date creatTime) {
this.creatTime = creatTime;
}
public Integer getModifyId() {
return modifyId;
}
public void setModifyId(Integer modifyId) {
this.modifyId = modifyId;
}
public Date getModifyTime() {
return modifyTime;
}
public void setModifyTime(Date modifyTime) {
this.modifyTime = modifyTime;
}
}
\ No newline at end of file
package com.pica.cloud.wechat.yunqueyilian.server.mapper;
import com.pica.cloud.wechat.yunqueyilian.server.entity.Hospital;
public interface HospitalMapper {
int deleteByPrimaryKey(Integer id);
int insert(Hospital record);
int insertSelective(Hospital record);
Hospital selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(Hospital record);
int updateByPrimaryKey(Hospital record);
}
\ No newline at end of file
package com.pica.cloud.wechat.yunqueyilian.server.mapper;
import com.pica.cloud.wechat.yunqueyilian.server.entity.PWechatUser;
import java.util.Map;
public interface PWechatUserMapper {
PWechatUser queryByOpenId(Map map);
int insert(PWechatUser user);
int updateById(PWechatUser user);
int updateSubscribeById(PWechatUser user);
}
\ No newline at end of file
package com.pica.cloud.wechat.yunqueyilian.server.service;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
* @author: zhehao.chen
* @version: V1.0
* @Description:
* @date: 2018/8/9 10:08
*/
public interface CoreService {
public String requestCheck(HttpServletRequest request);
public String processRequest(HttpServletRequest request);
}
package com.pica.cloud.wechat.yunqueyilian.server.service.impl;
import com.pica.cloud.foundation.entity.PicaException;
import com.pica.cloud.foundation.entity.PicaResponse;
import com.pica.cloud.foundation.entity.PicaResultCode;
import com.pica.cloud.foundation.utils.utils.JsonUtil;
import com.pica.cloud.foundation.utils.utils.StringUtil;
import com.pica.cloud.wechat.yunqueyilian.common.CommonUtils;
import com.pica.cloud.wechat.yunqueyilian.common.Constants;
import com.pica.cloud.wechat.yunqueyilian.common.req.TextMessage;
import com.pica.cloud.wechat.yunqueyilian.server.client.IWechatsServiceClient;
import com.pica.cloud.wechat.yunqueyilian.server.entity.PWechatUser;
import com.pica.cloud.wechat.yunqueyilian.server.mapper.PWechatUserMapper;
import com.pica.cloud.wechat.yunqueyilian.server.service.CoreService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.util.*;
/**
* @author: zhehao.chen
* @version: V1.0
* @Description:
* @date: 2018/8/9 10:09
*/
@Service
public class CoreServiceImpl implements CoreService {
private static Logger logger = LoggerFactory.getLogger(CoreServiceImpl.class);
@Autowired
IWechatsServiceClient userServiceClient;
@Autowired
PWechatUserMapper wechatUserMapper;
@Override
public String requestCheck(HttpServletRequest request) {
// 微信加密签名
String signature = request.getParameter("signature");
// 时间戳
String timestamp = request.getParameter("timestamp");
// 随机数
String nonce = request.getParameter("nonce");
// 随机字符串
String echostr = request.getParameter("echostr");
logger.info("微信验证接口信息signature:" + signature + " timestamp:" + timestamp + " nonce:" + nonce + " echostr:" + echostr);
// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
if (CommonUtils.checkSignature(signature, timestamp, nonce)) {
return echostr;
}
logger.error("微信验证接口异常");
return null;
}
@Override
public String processRequest(HttpServletRequest request) {
String respMessage = null;
try {
// 默认返回的文本消息内容
String respContent = "";
Map<String, String> requestMap = CommonUtils.parseXml(request);// xml请求解析
// 发送方帐号(open_id)
String fromUserName = requestMap.get("FromUserName");
// 公众帐号
String toUserName = requestMap.get("ToUserName");
// 消息类型
String msgType = requestMap.get("MsgType");
String MsgId = requestMap.get("MsgId");
String Content = requestMap.get("Content");
logger.info("requestMap:" + requestMap.toString());
if (msgType.equals(Constants.REQ_MESSAGE_TYPE_EVENT)) {// 事件推送
// 事件类型
String eventType = requestMap.get("Event");
logger.info("eventType:" + eventType);
//关注、取消关注流程处理
if (eventType.equals(Constants.EVENT_TYPE_SUBSCRIBE) || eventType.equals(Constants.EVENT_TYPE_UNSUBSCRIBE)) {
String openId = fromUserName;//获得openId
Map mapIn = new HashMap();
mapIn.put("type", 1);//1云鹊医联
mapIn.put("openId", openId);
PWechatUser userGet = wechatUserMapper.queryByOpenId(mapIn);//从wechat表中获取数据
PicaResponse<Map<String, Object>> response = userServiceClient.users(Constants.WECHAT_NAME_YQYL, openId); //调用微信的接口,获取微信用户的详细信息
logger.info("调用微信接口获取用户信息:" + response);
if (!PicaResultCode.SUCCESS.code().equals(response.getCode())) {
throw new PicaException(response.getCode(), response.getMessage());
}
//1.首先处理p_wechat_user表,存在信息就补全,不存在就新增
respContent = insertOrUpdataWechatUser(requestMap, response.getData(), userGet);
}
}
if (!StringUtil.isEmpty(respContent)) {
// 回复消息
TextMessage textMessage = new TextMessage();
textMessage.setToUserName(fromUserName);
textMessage.setFromUserName(toUserName);
textMessage.setCreateTime(new Date().getTime());
textMessage.setMsgType(Constants.RESP_MESSAGE_TYPE_TEXT);
textMessage.setContent(respContent);
respMessage = CommonUtils.textMessageToXml(textMessage);
logger.info("textMessage:" + JsonUtil.toJSONString(textMessage));
}
} catch (Exception e) {
logger.error("微信消息处理流程异常", e);
}
return respMessage;
}
private String insertOrUpdataWechatUser(Map<String, String> requestMap, Map map, PWechatUser wechatUser) throws UnsupportedEncodingException{
String eventType = requestMap.get("Event");
if (eventType.equals(Constants.EVENT_TYPE_SUBSCRIBE)) {//关注
boolean newFlag = false;
if (StringUtil.isNull(wechatUser)) {//新增
wechatUser = new PWechatUser();
newFlag = true;
}
wechatUser.setOpenid((String) map.get("openid"));
wechatUser.setType(1);//1、云鹊医联
wechatUser.setSex((Integer) map.get("sex"));
wechatUser.setNickname((String) map.get("nickname"));
wechatUser.setProvince((String) map.get("province"));
wechatUser.setCity((String) map.get("city"));
wechatUser.setCountry((String) map.get("country"));
wechatUser.setHeadimgurl((String) map.get("headimgurl"));
wechatUser.setPrivilege((String) map.get("privilege"));
wechatUser.setUnionid((String) map.get("unionid"));
wechatUser.setSubscribe((Integer) map.get("subscribe"));
wechatUser.setLanguage((String) map.get("language"));
Integer subscribe_time = (Integer) map.get("subscribe_time");
wechatUser.setSubscribeTime(StringUtil.isNull(subscribe_time) ? new Date() : new Date((long) subscribe_time * 1000));
wechatUser.setRemark((String) map.get("remark"));
wechatUser.setGroupid(String.valueOf(map.get("groupid")));
List tagid_list = (ArrayList) map.get("tagid_list");
wechatUser.setTagidList(StringUtil.isNull(tagid_list) ? "" : tagid_list.toString());
wechatUser.setDeleteFlag(1);
wechatUser.setCreatId(0);
wechatUser.setModifyId(0);
if (newFlag) {//新增
wechatUserMapper.insert(wechatUser);
} else {//更新
wechatUserMapper.updateById(wechatUser);
}
String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx1ee39338694703b0"
+ "&redirect_uri=https://test1-yunqueyilian.yunqueyi.com/goBind"
+ "&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect";
String resContent = "您好!欢迎关注云鹊医联公众号。\n绑定个人资料后可以预约挂号、查看随访记录;还可以收到公众号推送患教和通知。\n<a href='" + url + "'>立即去绑定</a>";
return resContent;
} else if (eventType.equals(Constants.EVENT_TYPE_UNSUBSCRIBE)) {//取消关注
if (StringUtil.isNull(wechatUser)) {//新增
logger.error("取消关注未能从数据库中获取到用户信息异常");
return "";
}
wechatUser.setSubscribe(0);
wechatUserMapper.updateSubscribeById(wechatUser);
}
return "";
}
}
package com.pica.cloud.wechat.yunqueyilian.server.service.impl;
import com.pica.cloud.wechat.yunqueyilian.common.constants.WeChatConstants;
import com.pica.cloud.wechat.yunqueyilian.common.util.CloudPropertiesUtil;
import com.pica.cloud.wechat.yunqueyilian.common.util.WeChatToolUtil;
import com.pica.cloud.wechat.yunqueyilian.common.wechat.pojo.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
/**
* @author: zhehao.chen
* @version: V1.0
* @Description:菜单管理器类
* @date: 2018/8/10 18:12
*/
public class MenuManagerServiceImpl {
private static Logger log = LoggerFactory.getLogger(MenuManagerServiceImpl.class);
public static void main(String[] args) throws IOException {
// CloudPropertiesUtil.read("dev");
CloudPropertiesUtil.read("test1");
AccessToken accessToken = WeChatToolUtil.getAccessToken(CloudPropertiesUtil.getValue("AppID"), CloudPropertiesUtil.getValue("AppSecret"));
Boolean flag = WeChatToolUtil.createMenu(getMenu(), accessToken.getAccess_token());
if (flag) {
System.out.println("菜单创建成功");
} else {
System.out.println("菜单创建失败");
}
}
/**
* 组装菜单数据
*
* @return
*/
private static Menu getMenu() throws UnsupportedEncodingException {
//test1
String btn11Url = "https://test1-yunqueyilian.yunqueyi.com/message";
String btn21Url = "http://mp.weixin.qq.com/mp/homepage?__biz=MzIzNjM5NDA1OQ==&hid=2&sn=f52aa8659aa75f32aae5ea62d23e64ca&scene=18#wechat_redirect";
String btn31Url = "https://test1-yunqueyilian.yunqueyi.com/goBind";
String btn32Url = "https://test1-yunqueyilian.yunqueyi.com/applyIndex";
String btn33Url = "https://test1-yunqueyilian.yunqueyi.com/followUp";
//pro
// String btn11Url = "https://yunqueyilian.yunqueyi.com/message";
// String btn21Url = "http://mp.weixin.qq.com/mp/homepage?__biz=MzIzNjM5NDA1OQ==&hid=2&sn=f52aa8659aa75f32aae5ea62d23e64ca&scene=18#wechat_redirect";
// String btn31Url = "https://yunqueyilian.yunqueyi.com/goBind";
// String btn32Url = "https://yunqueyilian.yunqueyi.com/applyIndex";
// String btn33Url = "https://yunqueyilian.yunqueyi.com/followUp";
String utl_end = "&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect";
CommonButton btn11 = new CommonButton();
btn11.setName("消息");
btn11.setType("view");
String url11 = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + WeChatConstants.APP_ID + "&redirect_uri=" + URLEncoder.encode(btn11Url, "UTF-8");
btn11.setUrl(url11 + utl_end);
CommonButton btn21 = new CommonButton();
btn21.setName("健康漫画");
btn21.setType("view");
String h_knowledge_redirect_uri = btn21Url;
btn21.setUrl(h_knowledge_redirect_uri);
CommonButton btn31 = new CommonButton();
btn31.setName("个人信息");
btn31.setType("view");
String url31 = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + WeChatConstants.APP_ID + "&redirect_uri=" + URLEncoder.encode(btn31Url, "UTF-8");
btn31.setUrl(url31 + utl_end);
CommonButton btn32 = new CommonButton();
btn32.setName("门诊预约");
btn32.setType("view");
String url32 = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + WeChatConstants.APP_ID + "&redirect_uri=" + URLEncoder.encode(btn32Url, "UTF-8");
btn32.setUrl(url32 + utl_end);
CommonButton btn33 = new CommonButton();
btn33.setName("随访记录");
btn33.setType("view");
String url33 = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + WeChatConstants.APP_ID + "&redirect_uri=" + URLEncoder.encode(btn33Url, "UTF-8");
btn33.setUrl(url33 + utl_end);
ComplexButton mainBtn3 = new ComplexButton();
mainBtn3.setName("我的");
mainBtn3.setSub_button(new CommonButton[]{btn31, btn32, btn33});
/**
* 这是公众号xiaoqrobot目前的菜单结构,每个一级菜单都有二级菜单项<br>
*
* 在某个一级菜单下没有二级菜单的情况,menu该如何定义呢?<br>
* 比如,第三个一级菜单项不是“更多体验”,而直接是“幽默笑话”,那么menu应该这样定义:<br>
* menu.setButton(new Button[] { mainBtn1, mainBtn2, btn33 });
*/
Menu menu = new Menu();
menu.setButton(new Button[]{btn11, btn21, mainBtn3});
return menu;
}
}
\ No newline at end of file
server.port=8080
server.port=10601
server.context-path=/yunqueyilian
spring.application.name=${server.port}-pica-cloud-yunqueyilian
#config server settings
......@@ -23,11 +24,25 @@ spring.rabbitmq.port=5672
spring.rabbitmq.username=appuser
spring.rabbitmq.password=AqLfvyWOvLQEUzdI
#\u5FAE\u4FE1\u767B\u5F55\u4FE1\u606F
AppID=wx1ee39338694703b0
AppSecret=69e2c741d0cf8fd7eb8877ab9f3a236b
#local settings
feign.hystrix.enabled=true
#\u5F00\u542Fhystrix\u8BF7\u6C42\u8D85\u65F6\u673A\u5236
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000
#\u8BF7\u6C42\u8FDE\u63A5\u7684\u8D85\u65F6\u65F6\u95F4
ribbon.ConnectTimeout=6000
#\u8BF7\u6C42\u5904\u7406\u7684\u8D85\u65F6\u65F6\u95F4
ribbon.ReadTimeout=6000
management.security.enabled=false
spring.zipkin.base-url=http://192.168.110.124:7895
spring.sleuth.sampler.percentage=1.0
logging.config=classpath:log4j2-dev.xml
wechat_url=https://test1-yunqueyilian.yunqueyi.com
\ No newline at end of file
server.port=8080
server.port=10601
server.context-path=/yunqueyilian
spring.application.name=${server.port}-pica-cloud-yunqueyilian
#config server settings
......@@ -23,11 +24,24 @@ spring.rabbitmq.port=5672
spring.rabbitmq.username=appuser
spring.rabbitmq.password=AqLfvyWOvLQEUzdI
#local setting
#\u5FAE\u4FE1\u767B\u5F55\u4FE1\u606F
AppID=wxcf79dbdc24cb684b
AppSecret=febe33eec4d0c05d62a2393be35c35c4
#local settings
feign.hystrix.enabled=true
#\u5F00\u542Fhystrix\u8BF7\u6C42\u8D85\u65F6\u673A\u5236
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000
#\u8BF7\u6C42\u8FDE\u63A5\u7684\u8D85\u65F6\u65F6\u95F4
ribbon.ConnectTimeout=6000
#\u8BF7\u6C42\u5904\u7406\u7684\u8D85\u65F6\u65F6\u95F4
ribbon.ReadTimeout=6000
management.security.enabled=true
spring.zipkin.base-url=http://172.19.137.19:7895
spring.sleuth.sampler.percentage=1.0
logging.config=classpath:log4j2-prod.xml
\ No newline at end of file
logging.config=classpath:log4j2-prod.xml
wechat_url=https://yunqueyilian.yunqueyi.com
\ No newline at end of file
server.port=8080
server.port=10601
server.context-path=/yunqueyilian
spring.application.name=${server.port}-pica-cloud-yunqueyilian
#config server settings
......@@ -23,11 +24,24 @@ spring.rabbitmq.port=5672
spring.rabbitmq.username=appuser
spring.rabbitmq.password=AqLfvyWOvLQEUzdI
#\u5FAE\u4FE1\u767B\u5F55\u4FE1\u606F
AppID=wx1ee39338694703b0
AppSecret=69e2c741d0cf8fd7eb8877ab9f3a236b
#local settings
feign.hystrix.enabled=true
#\u5F00\u542Fhystrix\u8BF7\u6C42\u8D85\u65F6\u673A\u5236
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000
#\u8BF7\u6C42\u8FDE\u63A5\u7684\u8D85\u65F6\u65F6\u95F4
ribbon.ConnectTimeout=6000
#\u8BF7\u6C42\u5904\u7406\u7684\u8D85\u65F6\u65F6\u95F4
ribbon.ReadTimeout=6000
management.security.enabled=false
spring.zipkin.base-url=http://192.168.110.133:7895
spring.sleuth.sampler.percentage=1.0
logging.config=classpath:log4j2-test1.xml
\ No newline at end of file
logging.config=classpath:log4j2-test1.xml
wechat_url=https://test1-yunqueyilian.yunqueyi.com
\ No newline at end of file
server.port=8080
server.port=10601
server.context-path=/yunqueyilian
spring.application.name=${server.port}-pica-cloud-yunqueyilian
#config server settings
......@@ -23,11 +24,24 @@ spring.rabbitmq.port=5672
spring.rabbitmq.username=appuser
spring.rabbitmq.password=AqLfvyWOvLQEUzdI
#\u5FAE\u4FE1\u767B\u5F55\u4FE1\u606F
AppID=wx1ee39338694703b0
AppSecret=69e2c741d0cf8fd7eb8877ab9f3a236b
#local settings
feign.hystrix.enabled=true
#\u5F00\u542Fhystrix\u8BF7\u6C42\u8D85\u65F6\u673A\u5236
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000
#\u8BF7\u6C42\u8FDE\u63A5\u7684\u8D85\u65F6\u65F6\u95F4
ribbon.ConnectTimeout=6000
#\u8BF7\u6C42\u5904\u7406\u7684\u8D85\u65F6\u65F6\u95F4
ribbon.ReadTimeout=6000
management.security.enabled=false
spring.zipkin.base-url=http://192.168.110.133:7895
spring.sleuth.sampler.percentage=1.0
logging.config=classpath:log4j2-test1.xml
\ No newline at end of file
logging.config=classpath:log4j2-test1.xml
wechat_url=https://test2-yunqueyilian.yunqueyi.com
\ No newline at end of file
server.port=8080
server.port=10601
server.context-path=/yunqueyilian
spring.application.name=${server.port}-pica-cloud-yunqueyilian
#config server settings
......@@ -23,11 +24,24 @@ spring.rabbitmq.port=5672
spring.rabbitmq.username=picacloud
spring.rabbitmq.password=123456
#\u5FAE\u4FE1\u767B\u5F55\u4FE1\u606F
AppID=wx1ee39338694703b0
AppSecret=69e2c741d0cf8fd7eb8877ab9f3a236b
#local settings
feign.hystrix.enabled=true
#\u5F00\u542Fhystrix\u8BF7\u6C42\u8D85\u65F6\u673A\u5236
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000
#\u8BF7\u6C42\u8FDE\u63A5\u7684\u8D85\u65F6\u65F6\u95F4
ribbon.ConnectTimeout=6000
#\u8BF7\u6C42\u5904\u7406\u7684\u8D85\u65F6\u65F6\u95F4
ribbon.ReadTimeout=6000
management.security.enabled=false
spring.zipkin.base-url=http://192.168.110.141:7895
spring.sleuth.sampler.percentage=1.0
logging.config=classpath:log4j2-uat.xml
\ No newline at end of file
logging.config=classpath:log4j2-uat.xml
wechat_url=https://uat-yunqueyilian.yunqueyi.com
\ No newline at end of file
......@@ -6,7 +6,8 @@
<generatorConfiguration>
<!-- 数据库驱动:选择你的本地硬盘上面的数据库驱动包-->
<classPathEntry location="D:/maven/repository/mysql/mysql-connector-java/5.1.39/mysql-connector-java-5.1.39.jar"/>
<classPathEntry location="C:\Users\DELL\.m2\repository\mysql\mysql-connector-java\5.1.39\mysql-connector-java-5.1.39.jar"/>
<!--<classPathEntry location="D:/maven/repository/mysql/mysql-connector-java/5.1.39/mysql-connector-java-5.1.39.jar"/>-->
<context id="tableEntity" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressDate" value="true"/>
......@@ -18,8 +19,8 @@
</commentGenerator>
<!--数据库链接URL,用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://192.168.110.60:3306/pica"
userId="pica_test" password="pkv#sqvSGn@O1@tg">
connectionURL="jdbc:mysql://192.168.130.200:3306/pica"
userId="pica" password="Joa5@73&amp;8yAYJ2fe">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
......@@ -38,7 +39,8 @@
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<table tableName="pica.p_hospital" domainObjectName="Hospital" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
<!--<table tableName="pica.p_hospital" domainObjectName="Hospital" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>-->
<table tableName="pica.p_wechat_user" domainObjectName="PWechatUser" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
</context>
</generatorConfiguration>
......
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.pica.cloud.wechat.yunqueyilian.server.mapper.PWechatUserMapper">
<resultMap id="BaseResultMap" type="com.pica.cloud.wechat.yunqueyilian.server.entity.PWechatUser">
<id column="id" property="id" jdbcType="INTEGER"/>
<result column="openid" property="openid" jdbcType="VARCHAR"/>
<result column="patient_id" property="patientId" jdbcType="INTEGER"/>
<result column="type" property="type" jdbcType="INTEGER"/>
<result column="sex" property="sex" jdbcType="INTEGER"/>
<result column="nickname" property="nickname" jdbcType="VARCHAR"/>
<result column="province" property="province" jdbcType="VARCHAR"/>
<result column="city" property="city" jdbcType="VARCHAR"/>
<result column="country" property="country" jdbcType="VARCHAR"/>
<result column="headimgurl" property="headimgurl" jdbcType="VARCHAR"/>
<result column="privilege" property="privilege" jdbcType="VARCHAR"/>
<result column="unionid" property="unionid" jdbcType="VARCHAR"/>
<result column="subscribe" property="subscribe" jdbcType="INTEGER"/>
<result column="language" property="language" jdbcType="VARCHAR"/>
<result column="subscribe_time" property="subscribeTime" jdbcType="TIMESTAMP"/>
<result column="remark" property="remark" jdbcType="VARCHAR"/>
<result column="groupid" property="groupid" jdbcType="VARCHAR"/>
<result column="tagid_list" property="tagidList" jdbcType="VARCHAR"/>
<result column="delete_flag" property="deleteFlag" jdbcType="INTEGER"/>
<result column="created_id" property="creatId" jdbcType="INTEGER"/>
<result column="created_time" property="creatTime" jdbcType="TIMESTAMP"/>
<result column="modified_id" property="modifyId" jdbcType="INTEGER"/>
<result column="modified_time" property="modifyTime" jdbcType="TIMESTAMP"/>
</resultMap>
<sql id="Base_Column_List">
id, openid, patient_id, type, sex, nickname, province, city, country, headimgurl,
privilege, unionid, subscribe, language, subscribe_time, remark, groupid, tagid_list,
delete_flag, created_id, created_time, modified_id, modified_time
</sql>
<insert id="insert" parameterType="com.pica.cloud.wechat.yunqueyilian.server.entity.PWechatUser">
insert into pat_wechat_user (openid, patient_id,
type, sex, nickname,
province, city, country,
headimgurl, privilege, unionid,
subscribe, language, subscribe_time,
remark, groupid, tagid_list,
delete_flag, created_id, created_time,
modified_id, modified_time)
values (#{openid,jdbcType=VARCHAR}, #{patientId,jdbcType=INTEGER},
#{type,jdbcType=INTEGER}, #{sex,jdbcType=INTEGER}, #{nickname,jdbcType=VARCHAR},
#{province,jdbcType=VARCHAR}, #{city,jdbcType=VARCHAR}, #{country,jdbcType=VARCHAR},
#{headimgurl,jdbcType=VARCHAR}, #{privilege,jdbcType=VARCHAR}, #{unionid,jdbcType=VARCHAR},
#{subscribe,jdbcType=INTEGER}, #{language,jdbcType=VARCHAR}, #{subscribeTime,jdbcType=TIMESTAMP},
#{remark,jdbcType=VARCHAR}, #{groupid,jdbcType=VARCHAR}, #{tagidList,jdbcType=VARCHAR},
#{deleteFlag,jdbcType=INTEGER}, #{creatId,jdbcType=INTEGER}, now(),
#{modifyId,jdbcType=INTEGER}, now())
</insert>
<update id="updateById" parameterType="com.pica.cloud.wechat.yunqueyilian.server.entity.PWechatUser">
update pat_wechat_user
<set>
<if test="openid != null">
openid = #{openid,jdbcType=VARCHAR},
</if>
<if test="patientId != null">
patient_id = #{patientId,jdbcType=INTEGER},
</if>
<if test="type != null">
type = #{type,jdbcType=INTEGER},
</if>
<if test="sex != null">
sex = #{sex,jdbcType=INTEGER},
</if>
<if test="nickname != null">
nickname = #{nickname,jdbcType=VARCHAR},
</if>
<if test="province != null">
province = #{province,jdbcType=VARCHAR},
</if>
<if test="city != null">
city = #{city,jdbcType=VARCHAR},
</if>
<if test="country != null">
country = #{country,jdbcType=VARCHAR},
</if>
<if test="headimgurl != null">
headimgurl = #{headimgurl,jdbcType=VARCHAR},
</if>
<if test="privilege != null">
privilege = #{privilege,jdbcType=VARCHAR},
</if>
<if test="unionid != null">
unionid = #{unionid,jdbcType=VARCHAR},
</if>
<if test="subscribe != null">
subscribe = #{subscribe,jdbcType=INTEGER},
</if>
<if test="language != null">
language = #{language,jdbcType=VARCHAR},
</if>
<if test="subscribeTime != null">
subscribe_time = #{subscribeTime,jdbcType=TIMESTAMP},
</if>
<if test="remark != null">
remark = #{remark,jdbcType=VARCHAR},
</if>
<if test="groupid != null">
groupid = #{groupid,jdbcType=VARCHAR},
</if>
<if test="tagidList != null">
tagid_list = #{tagidList,jdbcType=VARCHAR},
</if>
<if test="deleteFlag != null">
delete_flag = #{deleteFlag,jdbcType=INTEGER},
</if>
<if test="creatId != null">
created_id = #{creatId,jdbcType=INTEGER},
</if>
<if test="creatTime != null">
created_time = #{creatTime,jdbcType=TIMESTAMP},
</if>
<if test="modifyId != null">
modified_id = #{modifyId,jdbcType=INTEGER},
</if>
modified_time = now()
</set>
where id = #{id,jdbcType=INTEGER}
</update>
<select id="queryByOpenId" resultMap="BaseResultMap" parameterType="java.util.Map">
select
<include refid="Base_Column_List"/>
from pat_wechat_user
where type = #{type} and openid = #{openId}
</select>
<update id="updateSubscribeById" parameterType="com.pica.cloud.wechat.yunqueyilian.server.entity.PWechatUser">
update pat_wechat_user set subscribe = #{subscribe},modified_time = now() where id = #{id,jdbcType=INTEGER}
</update>
</mapper>
\ No newline at end of file
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册