package com.panzhihua.applets.api;
import java.io.PrintWriter;
import java.security.MessageDigest;
import java.util.Arrays;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.panzhihua.common.utlis.StringUtils;
import com.panzhihua.common.utlis.WxUtil;
import com.panzhihua.common.utlis.WxXCXTempSend;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@RestController
@RequestMapping("/wx/push/")
public class WxMessagePushApi {
private String token = "01A9CB2234D7CBD0AC61B75EB1263805";
private String url = "www.taobao.com";// 图文跳转地址
private String thumbUrl = "https://www.psciio.com//idcard/f986ba3ae7a241d9bce5cb568adec7da.jpg";// 图片地址
@Resource
private WxXCXTempSend wxXCXTempSend;
/**
* 微信接口配置信息认证接口
* 需要正确响应微信发送的Token验证。 加密/校验流程如下:
* 1. 将token、timestamp、nonce三个参数进行字典序排序
* 2. 将三个参数字符串拼接成一个字符串进行sha1加密
* 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
*/
@RequestMapping("/cgi")
public void cgi(HttpServletRequest request, HttpServletResponse response) {
boolean isGet = request.getMethod().toLowerCase().equals("get");
// 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
try {
if (isGet) {
String signature = request.getParameter("signature");
// 时间戳
String timestamp = request.getParameter("timestamp");
// 随机数
String nonce = request.getParameter("nonce");
// 随机字符串
String echostr = request.getParameter("echostr");
log.info("signature = " + signature + " , timestamp = " + timestamp + " , nonce = " + nonce
+ " , echostr = " + echostr);
String[] strArray = new String[] {token, timestamp, nonce};
Arrays.sort(strArray);
StringBuilder sb = new StringBuilder();
for (String str : strArray) {
sb.append(str);
}
// SHA1签名生成
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update(sb.toString().getBytes());
byte[] digest = md.digest();
StringBuffer hexstr = new StringBuffer();
String shaHex = "";
for (int i = 0; i < digest.length; i++) {
shaHex = Integer.toHexString(digest[i] & 0xFF);
if (shaHex.length() < 2) {
hexstr.append(0);
}
hexstr.append(shaHex);
}
if (hexstr.toString().equals(signature)) {
response.getOutputStream().write(echostr.getBytes());
}
} else {
// 进入POST聊天处理
// 将请求、响应的编码均设置为UTF-8(防止中文乱码)
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
// 接收消息并返回消息
String result = acceptMessage(request, response);
// 响应消息
PrintWriter out = response.getWriter();
out.print(result);
out.close();
}
} catch (Exception ex) {
log.error("微信帐号接口配置失败!", ex);
ex.printStackTrace();
}
}
/**
* 接受到微信接口数据
*
* @param request
* @param response
* @return
*/
private String acceptMessage(HttpServletRequest request, HttpServletResponse response) {
String respMessage = "";
String inputLine = "";
String notityXml = "";
try {
// 接收数据
while ((inputLine = request.getReader().readLine()) != null) {
notityXml += inputLine;
}
// xml请求解析
JSONObject requestJson = JSON.parseObject(notityXml);
log.info(">>>>>>>>>>>>>" + requestJson.toString());
// 发送方帐号(open_id)
String fromUserName = requestJson.get("FromUserName").toString();
// 公众帐号
String toUserName = requestJson.get("ToUserName").toString();
// 消息类型
String msgType = requestJson.get("MsgType").toString();
// String Event = requestJson.get("Event").toString(); //SCAN 为扫描信息 VIEW 公众号底部点击事件
log.info("fromUserName = " + fromUserName + " , ToUserName = " + toUserName + " , msgType = " + msgType);
String access_token = wxXCXTempSend.getAccessToken();// 获取access_token
// 公众号关注事件消息
if (msgType.equals("event")) {
// log.info("公众号被关注事件..........");
} else if (msgType.equals("text")) {
// if(StringUtils.isNotEmpty(access_token)){
// String mediaId = wxXCXTempSend.getMediaId(access_token);//获取mediaId
// WxUtil.sendKfImagesMessage(fromUserName,access_token,mediaId);
// }
// log.info("公众号接受文字..........");
} else if (msgType.equals("image")) {
// log.info("公众号接受图片..........");
} else if (msgType.equals("miniprogrampage")) {
if (StringUtils.isNotEmpty(access_token)) {
String mediaId = wxXCXTempSend.getMediaId(access_token);// 获取mediaId
WxUtil.sendKfImagesMessage(fromUserName, access_token, mediaId);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return respMessage;
}
}