import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.sie.util.HttpUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;
@Component
public class WechatMessageUtils {
private static final Logger logger = LoggerFactory.getLogger(WechatMessageUtils.class);
private static String appid;
private static String appsecret;
@Autowired
private Environment environment;
@PostConstruct
public void init() {
WechatMessageUtils.appid = environment.getProperty("config.wechat.officialAccount.appid");
WechatMessageUtils.appsecret = environment.getProperty("config.wechat.officialAccount.appsecret");
}
public static JSONObject simpleData(String first, String remark, String... keywords) {
JSONObject map = new JSONObject();
Map<String, String> firstValue = new HashMap<String, String>();
firstValue.put("value", first);
map.put("first", firstValue);
//remark
Map<String, String> remarkValue = new HashMap<String, String>();
remarkValue.put("value", remark);
map.put("remark", remarkValue);
//Keyword
for (int i = 1, size = keywords.length; i <= size; i++) {
String keyword = keywords[i - 1];
Map<String, String> keywordValue = new HashMap<String, String>();
keywordValue.put("value", keyword);
map.put("keyword" + i, keywordValue);
}
return map;
}
/**
* @param openid 接收人openid
* @param templateId 模版id, 必需
* @param data
* @param pageUrl
*/
public static void sendMessage(String openid, String templateId, JSONObject data, String pageUrl) {
try {
String accessToken = WechatTokenUtils.getTokenResult(openid, appid, appsecret);
if (null != accessToken) {
String apiUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken;
JSONObject param = new JSONObject();
param.put("touser", openid); // 接收者openid "odkMN6MGj5Mtf_AnqnPk1UqFfuX0"
param.put("template_id", templateId);
param.put("url", pageUrl);
param.put("data", data);
String result = HttpUtils.postBody(apiUrl, null, "application/json", param.toJSONString());
logger.info(result);
}
} catch (Exception e) {
logger.info("消息推送失败", e);
}
}
/**
* @param openid 接收人openid, 必需
* @param templateId 模版id, 必需
* @param data 模板数据, 必需
* @param url 模板跳转链接(url和pagepath都传时,会优先跳转至小程序,微信客户端版本不支持跳小程序时,将会跳转至url)
* @param pagepath 所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar)
* @param appkey 所需跳转到小程序的appid
* @param color 模板内容字体颜色
*/
public static void sendMessage(String openid, String templateId, JSONObject data, String url, String pagepath, String appkey, String color) {
try {
String accessToken = WechatTokenUtils.getTokenResult(openid, appid, appsecret);
if (null != accessToken) {
String apiUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken;
JSONObject param = new JSONObject();
param.put("touser", openid); // 接收者openid "odkMN6MGj5Mtf_AnqnPk1UqFfuX0"
param.put("template_id", templateId); // 消息模板ID
param.put("data", data);
if (url != null) {
param.put("url", url);
}
if (pagepath != null) {
/*"miniprogram":{"appid":"xiaochengxuappid12345","pagepath":"index?foo=bar"}*/
JSONObject miniprogram = new JSONObject();
miniprogram.put("appid", appkey);
miniprogram.put("pagepath", pagepath);
param.put("miniprogram", miniprogram.toString());
}
if (color != null) {
param.put("color", color);
}
String result = HttpUtils.postBody(apiUrl, null, "application/json", param.toJSONString());
logger.info(result);
}
} catch (Exception e) {
logger.info("消息推送失败", e);
}
}
private static void createMenu(String openid) {
try {
String accessToken = WechatTokenUtils.getTokenResult(openid, appid, appsecret);
if (null != accessToken) {
String apiUrl = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + accessToken;
JSONObject param = new JSONObject();
JSONArray menus = new JSONArray();
String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=XXXXX&redirect_uri=https://XXXX.com/wechat/getOpenid&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect";
JSONObject menu2 = new JSONObject();
menu2.put("type", "view");
menu2.put("name", "用户绑定");
menu2.put("url", url);
menus.add(menu2);
JSONObject menu1 = new JSONObject();
menu1.put("type", "miniprogram");
menu1.put("name", "进入小程序");
menu1.put("appid", appid);
menu1.put("url", "http://mp.weixin.qq.com");
menu1.put("pagepath", "pages/login/index");
menus.add(menu1);
param.put("button", menus);
String result = HttpUtils.postBody(apiUrl, null, "application/json", param.toJSONString());
logger.info(result);
}
} catch (Exception e) {
logger.info("菜单添加失败", e);
}
}
private static String getNewToken(String appid, String secret) throws Exception {
String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret;
JSONObject result = (JSONObject) JSONObject.parse(HttpUtils.get(tokenUrl, null));
return result.getString("access_token");
}
public static void main(String[] args) {
String HOLIDAY_TEMPLATE = "XXXXXX"; // 模板消息ID
String appkey = "XXXXX";
WechatMessageUtils messageUtils = new WechatMessageUtils();
messageUtils.appid = "XXXXXX";
messageUtils.appsecret = "XXXXX";
// 模板消息推送
JSONObject data = messageUtils.simpleData("临时放假:", "", "学生姓名", "班级", "放假时间");
messageUtils.sendMessage("XXXXXX", HOLIDAY_TEMPLATE, data, "https://www.baidu.com");
// messageUtils.sendMessage("XXXXXXX", HOLIDAY_TEMPLATE, data,
// "https://www.baidu.com", "pages/login/index", appkey, null);
}
}
import com.alibaba.fastjson.JSONObject;
import com.kindergarten.management.util.EncryptUtils;
import com.taobao.api.internal.toplink.embedded.websocket.util.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.security.spec.AlgorithmParameterSpec;
import java.security.NoSuchAlgorithmException;
import java.util.List;
@RequestMapping("/wechat")
@Controller
public class WechatController {
private static Logger logger = LoggerFactory.getLogger(WechatController.class);
private final static String WECHAT_TOKEN = "1qazYUIOP";
@Value("${config.wechat.officialAccount.appid}")
private String appid;
@Value("${config.wechat.officialAccount.appsecret}")
private String appsecret;
@Value("${config.wechat.miniPrograms-family.appid}")
private String miniAppid;
@Value("${config.wechat.miniPrograms-family.appsecret}")
private String miniAppsecret;
/**
* 微信绑定: 微信服务号获取 openid
*/
@RequestMapping(value = {"/getOpenid"})
public String getOpenid(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
String code = request.getParameter("code");//获取微信服务器授权返回的code值
String tokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?grant_type=authorization_code";
tokenUrl = tokenUrl + "&appid=" + appid + "&secret=" + appsecret + "&code=" + code;
String openid = JSONObject.parseObject(HttpUtils.get(tokenUrl, null)).getString("openid");
model.addAttribute("openId", openid);
return "bindWechat";
}
/**
* 微信登录: 微信小程序获取openid
*/
@RequestMapping(value = "/miniPrograms/getOpenid")
@ResponseBody
public JSONObject getOpenid(HttpServletRequest request, HttpServletResponse response) throws Exception {
String code = request.getParameter("code");//获取微信服务器授权返回的code值
String tokenUrl = "https://api.weixin.qq.com/sns/jscode2session?grant_type=authorization_code";
tokenUrl = tokenUrl + "&appid=" + miniAppid + "&secret=" + miniAppsecret + "&js_code=" + code;
JSONObject result = JSONObject.parseObject(HttpUtils.get(tokenUrl, null));
return result;
}
/**
* 微信登录: 解密并且获取用户手机号码
*
* @param encrypdata
* @param ivdata
* @param sessionkey
* @param request
* @return
* @throws Exception
*/
@RequestMapping(value = "/miniPrograms/deciphering")
public String deciphering(String openid, String encrypdata, String ivdata, String sessionkey, HttpServletRequest request) {
byte[] encrypData = Base64.decode(encrypdata);
byte[] ivData = Base64.decode(ivdata);
byte[] sessionKey = Base64.decode(sessionkey);
try {
//{"phoneNumber":"176...9","purePhoneNumber":"176...9","countryCode":"86","watermark":{"timestamp":1557473619,"appid":"XXX"}}
JSONObject result = JSONObject.parseObject(decrypt(sessionKey, ivData, encrypData));
String phoneNumber = result.getString("phoneNumber");
return phoneNumber;
} catch (Exception e) {
return ResultBuilder.error("授权获取手机号失败", e).build();
}
}
}