package com.lyms.talkonlineweb.util;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.service.IService;
import com.lyms.talkonlineweb.domain.LymsPatient;
import com.lyms.talkonlineweb.domain.LymsPushMessages;
import com.lyms.talkonlineweb.domain.PatientInfo;
import com.lyms.talkonlineweb.result.BaseResponse;
import com.lyms.talkonlineweb.service.LymsPatientService;
import com.lyms.talkonlineweb.service.PatientInfoService;
import com.lyms.talkonlineweb.service.impl.LymsPatientServiceImpl;
import com.lyms.talkonlineweb.service.impl.PatientInfoServiceImpl;
import com.lyms.talkonlineweb.task.AccessTokenServlet;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
/**
* @ProjectName: talkonline
* @Package: com.lyms.talkonlineweb.util
* @ClassName: WeiXinUtil
* @Author: lqy
* @Description: 微信接口调用
* @Date: 2021-09-13 18:10
* @Version:
*/
@Component
@Log4j2
public class WeiXinUtil {
/**
* 微信返回的key定义
*/
private static final String OPEN_ID_KEY = "openid";
/**
* 获取微信用户的openid
*
* @param code 登录时获取的code
* @return 微信方获取openid
*/
public static String getWxOpenId(String code) {
if (StringUtil.isEmpty(code)) {
return null;
}
try {
StringBuilder reqUrl = new StringBuilder();
reqUrl.append("/sns/jscode2session?appid=").append(Constant.PAT_APP_ID).
append("&secret="). append(Constant.WX_SECRET).append("&js_code=").append(code).
append("&grant_type=").append(Constant.GRANT_TYPE);
log.info("getWxOpenId url : {}",reqUrl);
String response = HttpUtil.getData(Constant.WEIXIN_SERVER + reqUrl);
log.info("getWxOpenId jscode2session response : {}" , response);
if (StringUtil.isNotEmpty(response))
{
Map<String, Object> result = JsonUtil.str2Map(response, HashMap.class);
if (result.containsKey(OPEN_ID_KEY))
{
return result.get(OPEN_ID_KEY).toString();
}
}
} catch (Exception e) {
log.error("getWxOpenId by code: {}", code, e);
}
return null;
}
/***
* 发送消息
*
* @param openid 关注公众号的微信id
* @param template_id 公众号消息模板id
* @param dataMap 推送内容消息主题显示相关map
*/
public static Integer SendWeChatMsg(String openid, String template_id, Map<String,Object> dataMap, Map<String,Object> mapInfo)throws Exception {
//整体参数map
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("touser", openid);
paramMap.put("template_id", template_id);
//跳转到小程序用到miniprogram集合参数
paramMap.put("url", "http://weixin.qq.com");
TreeMap<String, String> miniprogram = new TreeMap<String, String>();
miniprogram.put("appid",Constant.PAT_APP_ID);
//登录数据
if(CollectionUtils.isNotEmpty(mapInfo) && null!=mapInfo.get("plogin") && null!=mapInfo.get("passwd")){
if(null==mapInfo.get("type") || 1==(int) mapInfo.get("type")) {//null是正常推送状态。 有值是亲属关注时的状态
miniprogram.put("pagepath", "pages/news/news?plogin=" + mapInfo.get("plogin") + "&passwd=" + mapInfo.get("passwd"));// 注意,这里是支持传参的!!!
}else {
miniprogram.put("pagepath","pages/concernList/concernList?plogin="+mapInfo.get("plogin")+"&passwd="+mapInfo.get("passwd"));// 没有病例跳转地址
}
}else {
//意外情况自行登录
miniprogram.put("pagepath","pages/enroll/enroll");// 注意,这里是支持传参的!!!
}
paramMap.put("miniprogram", miniprogram);
paramMap.put("data", dataMap);
// 接口地址
//处理access_token失效报40001
Integer code=null;
for(int i=0;i<3;i++) {
String sendMsgApi = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + AccessTokenServlet.accessToken;
String result = repeatDoGetPost(sendMsgApi, "POST", paramMap);
if (StringUtil.isEmpty(result)) {
break;
}
Map<String, Object> resultMap = JSON.parseObject(result, HashMap.class);
code=Integer.parseInt(resultMap.get("errcode").toString());
if(!code.equals(40001)){
break;
}
Thread.sleep(1000 * 1);//解决access_token替换时间差保证access_token长期有效
}
return code;
}
/**
* 获取微信用户的公众号openid
*
* @param code 登录时获取的code
* @return 微信方获取openid
*/
public static String getWxGzOpenId(String code)
{
if (StringUtils.isEmpty(code)) {
log.info("code:null");
return null;
}
try {
// 接口地址
String reqUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + Constant.GZ_APP_ID + "&secret=" + Constant.GZ_SECRET + "&code=" + code + "&grant_type="+Constant.GZ_AUTH;
log.info(reqUrl);
String result = repeatDoGetPost(reqUrl,"GET",null);
log.info("result :" + result);
if (StringUtils.isEmpty(result)) {
log.info("取微信用户的公众号openid : 请求返回null..." );
return null;
}
Map<String, Object> resultMap = JSON.parseObject(result, HashMap.class);
if (resultMap.containsKey(OPEN_ID_KEY)) {
return resultMap.get(OPEN_ID_KEY).toString();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 检查用户是否关注了公众号
*
* @param openId 登录时获取的code
* @return 微信方获取openid
*/
public static String getIsWxGZH(String openId)
{
if (StringUtils.isEmpty(openId)) {
log.info("openId:null");
return null;
}
if (StringUtils.isEmpty(AccessTokenServlet.accessToken)) {
log.info("accessToken:null");
return null;
}
try {
// 接口地址
String reqUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + AccessTokenServlet.accessToken + "&openid=" + openId + "&lang=zh_CN";
log.info(reqUrl);
String result = repeatDoGetPost(reqUrl,"GET",null);
log.info("result :" + result);
if (StringUtils.isEmpty(result)) {
log.info("检查用户是否关注了公众号请求 : 返回null..." );
return null;
}
Map<String, Object> resultMap = JSON.parseObject(result, HashMap.class);
if (resultMap.containsKey("subscribe")) {
return resultMap.get("subscribe").toString();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 网络超时-重新发送3次
*/
public static String repeatDoGetPost(String sendMsgApi,String type,Map<String,Object> paramMap) {
for (int i = 1; i <= 3; i++) {
String result=HttpUtil.doGetPost(sendMsgApi,type,paramMap);
if (StringUtil.isEmpty(result)) {
try{
Thread.sleep(1000);
} catch (Exception e){
e.printStackTrace();
}
continue;
} else {
return result;
}
}
return null;
}
/**
* 获取公众号的openid
*
* @param code 登录时获取的code
* @return 微信方获取openid
*/
public static String getGzOpenId(String code) {
if (StringUtil.isEmpty(code)) {
return null;
}
try {
StringBuilder reqUrl = new StringBuilder();
reqUrl.append("/sns/jscode2session?appid=").append(Constant.PAT_APP_ID).
append("&secret="). append(Constant.WX_SECRET).append("&js_code=").append(code).
append("&grant_type=").append(Constant.GRANT_TYPE);
log.info("getWxOpenId url : {}",reqUrl);
String response = HttpUtil.getData(Constant.WEIXIN_SERVER + reqUrl);
log.info("getWxOpenId jscode2session response : {}" , response);
if (StringUtil.isNotEmpty(response))
{
Map<String, Object> result = JsonUtil.str2Map(response, HashMap.class);
if (result.containsKey(OPEN_ID_KEY))
{
return result.get(OPEN_ID_KEY).toString();
}
}
} catch (Exception e) {
log.error("getWxOpenId by code: {}", code, e);
}
return null;
}
}