package com.yeahc.zyp.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.yeahc.zyp.entity.YeahcUserInfoEntity;
import com.yeahc.zyp.huaqi.ParseXmlUtil;
import com.yeahc.zyp.huaqi.TemplateData;
import com.yeahc.zyp.huaqi.WechatTemplate;
import com.yeahc.zyp.repository.UserInfoRepository;
import com.yeahc.zyp.utils.HttpRequest;
import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
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.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/weixin")
public class WXController {
protected Logger logger = LoggerFactory.getLogger(getClass());
/**秘钥**/
private static String appId = "wx595852963****";
private static String appSecret = "59aee12d9685632901a997c402e2******";
private static String erweicode="https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN";
private static String pushMsgMode= "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESSTOKEN";
private static String GET_CODE="https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";
private static String token="WXTOKEN";
private static String ticket1="gQHX8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyTlowSVl2ME1lb2wxMDAwME0wM3QAAgSjPVVbAwQAAAAA";
private static String OPENID_TOKEN="https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
private static String USERINFO="https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
private static String AESKEY="pXjIynI7DBTfMJJof5XltNO2tLscqjFR3KhToNzubee";
@Autowired
private UserInfoRepository userInfoRepository;
/**
* 接收通知接口
* 已通过
* */
@RequestMapping("/test")
public void gettoken(HttpServletRequest request, HttpServletResponse response){
System.out.println("来自微信的请求");
String signature=request.getParameter("signature");
String timestamp=request.getParameter("timestamp");
String nonce=request.getParameter("nonce");
String echostr=request.getParameter("echostr");
//首次校验
if(echostr!=null){
try {
PrintWriter printWriter=response.getWriter();
if(checkSignature(signature,timestamp,nonce)){
printWriter.print(echostr);
printWriter.close();
return;
}else {
logger.info("token签名校验失败");
}
} catch (IOException e) {
e.printStackTrace();
}
}
//接收服务器的消息
logger.info("1.收到微信服务器消息");
InputStream inputStream= null;
try {
inputStream = request.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
Map<String,String> wxdata= ParseXmlUtil.xml2Json(inputStream);
String msg=null;
if(wxdata.get("MsgType")!=null){
if("event".equals(wxdata.get("MsgType"))){
//如果有事件,判断是否有场景的区别
logger.info("2.1解析消息内容为:事件推送");
if( "subscribe".equals(wxdata.get("Event"))){
//公众号的原生二维码进来的
if(null==wxdata.get("Ticket")){
msg="用户,你好";
ParseXmlUtil. replyTextMsg(response,msg,wxdata);
}else if(ticket1.equals(wxdata.get("Ticket"))){
//自定义的二维码扫码进来的
msg="测试用户,你好";
ParseXmlUtil. replyTextMsg(response,msg,wxdata);
}
}else if("unsubscribe".equals(wxdata.get("Event"))){
logger.info("用户取消了关注");
}else if("SCAN".equals(wxdata.get("Event"))){
//原生的二维码不会有浏览事件
if(ticket1.equals(wxdata.get("Ticket"))){
//自定义的二维码扫码进来的
msg="测试用户,你好,欢迎来看看";
ParseXmlUtil. replyTextMsg(response,msg,wxdata);
}
}
}else if("text".equals(wxdata.get("MsgType"))){
logger.info("来自用户的消息:"+wxdata.get("context"));
msg="你说什么,我看不见";
ParseXmlUtil. replyTextMsg(response,msg,wxdata);
}
//判断图片视屏等功能
}
}
/**
* 网页授权获取code
*
*
* **/
@RequestMapping("/redirect")
public void retCode( HttpServletResponse response) throws IOException {
String url="https://www.baidu.com";
try {
url= URLEncoder.encode(url,"utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
GET_CODE=GET_CODE.replace("APPID",appId)
.replace("REDIRECT_URI",url)
.replace("SCOPE","snsapi_userinfo");
System.out.println(GET_CODE);
response.sendRedirect(GET_CODE);
}
/**
* 获取授权用户的信息
*
* **/
@RequestMapping("/cellBackCode")
public String cellBackCode(HttpServletRequest request,HttpServletResponse response) throws UnsupportedEncodingException {
String code=request.getParameter("code");
logger.info("code:========================="+code);
String state=request.getParameter("state");
if(code!=null){
OPENID_TOKEN=OPENID_TOKEN.replace("APPID",appId).replace("SECRET",appSecret).replace("CODE",code);
String requestResult = HttpRequest.sendGet(OPENID_TOKEN);
System.out.println(requestResult);
JSONObject json = JSON.parseObject(requestResult);
if(null==json||json.getInteger("errcode")!=null){
logger.info("网页授权获取用户信息失败json:"+json);
return "获取授权信息失败!";
}else {
String openid = json.getString("openid");
String accessToken = json.getString("access_token");
USERINFO=USERINFO.replace("ACCESS_TOKEN",accessToken).replace("OPENID",openid);
String userInfoStr = HttpRequest.sendGet(USERINFO);
System.out.println(userInfoStr);
JSONObject userJson = JSON.parseObject(userInfoStr);
WXUser user =new WXUser();
user .setOpenid(userJson.getString("openid"));
user .setNickname(userJson.getString("nickname"));
user .setSex(userJson.getString("sex"));
user .setProvince(userJson.getString("province"));
user .setCity(userJson.getString("city"));
user .setCountry(userJson.getString("country"));
user .setHeadimgurl(userJson.getString("headimgurl"));
user .setPrivilege(userJson.getJSONArray("privilege").toString());
user .setUnionid(userJson.getString("unionid"));
user .save(yeahcUserInfoEntity);
System.out.println(yeahcUserInfoEntity.toString());
}
}
return code;
}
/**
* 配置推送消息接口
*
*
* */
@RequestMapping("/pushmsg")
public void pushMsg(){
//调取接口获取accesstoken
String resultUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+ appId +"&secret="+ appSecret;
String requestResult = HttpRequest.sendGet(resultUrl);
JSONObject json = JSON.parseObject(requestResult);
String session_key=json.getString("access_token");
//todo :这里要保存session到数据库 每天只有2000次的获取数量
//推送消息模板
pushMsgMode=pushMsgMode.replace("ACCESSTOKEN",session_key);
WechatTemplate wechatTemplate = new WechatTemplate();
wechatTemplate.setTemplate_id("fK2R84GM2BN9JM2UNXzSycB_H09c0fkUv7sJyZ1u2k0");
wechatTemplate.setTouser("ompXX1XwOMB5AIn-IxO65cS-1Xdg");
wechatTemplate.setUrl("http://citi.yeahc.com/yh?id=1");
Map<String,TemplateData> mapdata = new HashMap<>();
// 封装模板数据
TemplateData first = new TemplateData();
first.setValue("您好,您已注册成为XXX平台用户。");
first.setColor("#173177");
mapdata.put("first", first);
wechatTemplate.setData(mapdata);
//实体类转json
String toString = JSONObject.toJSONString(wechatTemplate);
//post请求得到返回数据(这里是封装过的,就是普通的java post请求)
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(pushMsgMode);
httpPost.addHeader("Content-Type", "application/json");
CloseableHttpResponse response = null;
String result = null;
try {
httpPost.setEntity(new StringEntity(toString));
response = httpClient.execute(httpPost);
HttpEntity entity = response.getEntity();
result = EntityUtils.toString(entity, "UTF-8");
JSONObject json1 = JSON.parseObject(result);
System.out.println(result);
if(null!=json1){
if(json1.getInteger("errcode")==0&&json1.getString("errmsg").equals("ok")){
logger.info("推送登录消息:"+json1);
}else {
logger.info("推送登录消息失败:"+json1);
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 生成永久带参二维码
* https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN
*
*/
public static String getToken(){
String TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
TOKEN_URL= TOKEN_URL.replace("APPID",appId).replace("APPSECRET",appSecret);
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(TOKEN_URL);
CloseableHttpResponse response = null;
String requestResult=null;
JSONObject getCodeResultJson=null;
try {
response = httpClient.execute(httpGet);
HttpEntity entity = response.getEntity();
requestResult= EntityUtils.toString(entity,"UTF-8");
getCodeResultJson = JSON.parseObject(requestResult);
System.out.println(getCodeResultJson.toJSONString());
String access_token= getCodeResultJson.getString("access_token");
return access_token;
} catch (IOException e) {
e.printStackTrace();
}
return getCodeResultJson.toJSONString();
}
public static void main(String[] args) {
String ticket="gQHX8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyTlowSVl2ME1lb2wxMDAwME0wM3QAAgSjPVVbAwQAAAAA";
String erwei="https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQHX8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyTlowSVl2ME1lb2wxMDAwME0wM3QAAgSjPVVbAwQAAAAA";
String url="http://weixin.qq.com/q/02NZ0IYv0Meol10000M03t?ticket=gQHX8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyTlowSVl2ME1lb2wxMDAwME0wM3QAAgSjPVVbAwQAAAAA";
}
public static String getCode() {
erweicode=erweicode.replace("TOKEN", getToken());
//发送给微信服务器的数据
String jsonStr = "{\"action_name\": \"QR_LIMIT_SCENE\", \"action_info\":{\"scene\": {\"scene_id\": " + 1000 + "}}}";
//post请求得到返回数据(这里是封装过的,就是普通的java post请求)
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(erweicode);
httpPost.addHeader("Content-Type", "application/json");
CloseableHttpResponse response = null;
String requestResult = null;
try {
httpPost.setEntity(new StringEntity(jsonStr));
response = httpClient.execute(httpPost);
HttpEntity entity = response.getEntity();
requestResult = EntityUtils.toString(entity, "UTF-8");
System.out.println(requestResult);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static Boolean checkSignature( String signature, String timestamp,String nonce){
String arr[]=new String[]{token,timestamp,nonce};
Arrays.sort(arr);
StringBuilder builder=new StringBuilder();
for (int i=0;i<arr.length;i++){
builder.append(arr[i]);
}
String tempstr=null;
try {
MessageDigest md=MessageDigest.getInstance("SHA-1");
byte [] digest=md.digest(builder.toString().getBytes());
tempstr=byte2Str(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
if(tempstr!=null&&tempstr.equals(signature.toUpperCase())){
return true;
}else {
return false;
}
}
public static String byte2Str(byte [] bt){
StringBuilder str=new StringBuilder();
for(int i=0;i<bt.length;i++){
str.append(byte2HexStr(bt[i]));
}
return str.toString();
}
public static String byte2HexStr(byte bt){
char [] digit={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char [] temp=new char[2];
temp[0]= digit[(bt>>>4)&0X0F];
temp[1]= digit[bt&0X0F];
return new String(temp);
}
}
package com.yeahc.zyp.huaqi;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ParseXmlUtil {
public static Map<String, String> xml2Json( InputStream inputStream){
// 将解析结果存储在HashMap中
Map<String, String> map = new HashMap<String, String>();
// 从request中取得输入流
// InputStream inputStream = request.getInputStream();
// 读取输入流
// File f=new File("C:\\Users\\Administrator\\Desktop\\test1.xml");
// InputStream inputStream= null;
try {
// inputStream = new FileInputStream(f);
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();
System.out.println(map);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return map;
}
// if(isreturn == true){
// //转换XML
// String key = wxdata.get("FromUserName")+ "__"
// + wxdata.get("ToUserName")+ "__"
// + wxdata.get("MsgType") + "__"
// + wxdata.get("CreateTime");
// logger.info("3.0 进入回复 转换对象:"+key);
//
// }
public static void replyTextMsg( HttpServletResponse response,String context,Map<String,String> wxdata){
String msgType="text";
StringBuffer str = new StringBuffer();
str.append("<xml>");
str.append("<ToUserName><![CDATA[" + wxdata.get("FromUserName") + "]]></ToUserName>");
str.append("<FromUserName><![CDATA[" +wxdata.get("ToUserName")+ "]]></FromUserName>");
str.append("<CreateTime>" + System.currentTimeMillis() + "</CreateTime>");
str.append("<MsgType><![CDATA[" + msgType + "]]></MsgType>");
str.append("<Content><![CDATA["+context+"]]></Content>");
str.append("</xml>");
try {
response.setCharacterEncoding("utf-8");
PrintWriter printWriter=response.getWriter();
printWriter.print(str.toString());
printWriter.flush();
printWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class TemplateData {
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;
}
}
public class WechatTemplate {
private String touser;
private String template_id;
private String url;
private Map<String, 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 Map<String, TemplateData> getData() {
return data;
}
public void setData(Map<String, TemplateData> data) {
this.data = data;
}
}
来源:https://blog.csdn.net/u014618954/article/details/100899376