package com.yz.pay.discount.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.yz.pay.discount.basic.config.WxOpenConfig;
import com.yz.pay.discount.basic.exception.WakaException;
import com.yz.pay.discount.basic.value.Global;
import com.yz.pay.discount.bean.Fan;
import com.yz.pay.discount.bean.MpFan;
import com.yz.pay.discount.bean.MpInfo;
import com.yz.pay.discount.redisDao.RedisDao;
import com.yz.pay.discount.service.AuthCallbackService;
import com.yz.pay.discount.service.AuthService;
import com.yz.pay.discount.service.MessageReceiveservice;
import com.yz.pay.discount.utils.HttpsClient;
import com.yz.pay.discount.utils.StringUtils;
import com.yz.pay.discount.utils.wxmp.AuthorizerTokenUtil;
import com.yz.pay.discount.utils.wxmp.HeadImgUtil;
import com.yz.pay.discount.utils.wxopen.ComponentTokenUtil;
import com.yz.pay.discount.utils.wxopen.XmlUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author seven
* @date 2017/10/11
*/
@Controller
@RequestMapping("/message")
public class MessageReceiveController extends SuperController {
private static Logger log = LoggerFactory.getLogger(MessageReceiveController.class);
@Autowired
private AuthService authService;
@Autowired
private MessageReceiveservice messageReceiveservice;
@Autowired
private RedisDao redisDao;
@Autowired
private WxOpenConfig config;
@Autowired
private AuthCallbackService authCallbackService;
/**
* 用户关注公众号接收推送的信息
* @param appId 公众号openid
* @param xml 用户信息
* @return
*/
@RequestMapping(value = "/{appId}", method = RequestMethod.POST)
public @ResponseBody String receive(@PathVariable(value = "appId", required = false) String appId,
@RequestParam(value = "timestamp", required = false) String timestamp,
@RequestParam(value = "encrypt_type", required = false) String encryptType,
@RequestParam(value = "msg_signature", required = false) String msgSignature,
@RequestParam(value = "nonce", required = false) String nonce,
@RequestBody(required = false) String xml)throws Exception{
log.info("appId:{},timestamp:{},encrypt_type:{},msg_signature:{},nonce:{}",appId,timestamp,encryptType,msgSignature,nonce);
log.info("xml:{}", xml);
// MpInfo mpInfo = messageReceiveservice.getMpInfoByAppId(appId);
// if(mpInfo==null){
// return "false";
// }
// String ticket = redisDao.get(Global.COMPONENT_VERIFY_TICKET_REDIS_KEY);
// String componentaccesstoken = ComponentTokenUtil.getToken(ticket);
// String token = AuthorizerTokenUtil.getToken(componentaccesstoken,
// mpInfo.getAuthorizerAppid(),mpInfo.getAuthorizerRefreshToken());
String decryptXml="";
if(!StringUtils.isEmpty(xml)){
try {
decryptXml = XmlUtil.decryptXml(xml, config.getToken(), config.getEncodingAesKey(),
config.getComponentAppid(), msgSignature, timestamp, nonce);
} catch (Exception e) {
throw new WakaException(e);
}
log.info(decryptXml);
long createTime=System.currentTimeMillis();
StringBuilder sbXML = new StringBuilder();//回复文本
String testEncryptMsg = ""; //返回加密文本
String eventField="Event";
// if(decryptXml.indexOf(eventField)>0) {
//事件类型
String event = StringUtils.getMiddleString(decryptXml,
"<Event><\\!\\[CDATA\\[", "\\]\\]></Event>");
//微信用户openid
String openid = StringUtils.getMiddleString(decryptXml,
"<FromUserName><\\!\\[CDATA\\[", "\\]\\]></FromUserName>");
String msgType=StringUtils.getMiddleString(decryptXml,
"<MsgType><\\!\\[CDATA\\[", "\\]\\]></MsgType>");
String toUserName=StringUtils.getMiddleString(decryptXml,
"<ToUserName><\\!\\[CDATA\\[", "\\]\\]></ToUserName>");
String content=StringUtils.getMiddleString(decryptXml,
"<Content><\\!\\[CDATA\\[", "\\]\\]></Content>");
//模拟粉丝触发专用测试公众号的事件
if(msgType.equals("event") && event.equals("LOCATION")){
sbXML.append("<xml>");
sbXML.append("<ToUserName><![CDATA["+openid+"]]></ToUserName>");
sbXML.append("<FromUserName><![CDATA["+toUserName+"]]></FromUserName>");
sbXML.append("<CreateTime>"+createTime+"</CreateTime>");
sbXML.append("<MsgType><![CDATA[text]]></MsgType>");
sbXML.append("<Content><![CDATA[LOCATIONfrom_callback]]></Content>");
sbXML.append("</xml>");
log.info("模拟粉丝触发专用测试公众号的事件,加密前:{}",sbXML.toString());
//加密
testEncryptMsg = XmlUtil.encryptXml(sbXML.toString(), config.getToken(), config.getEncodingAesKey(),
config.getComponentAppid(), timestamp, nonce);
return testEncryptMsg;//回复
}
//模拟粉丝发送文本消息给专用测试公众号
if(msgType.equals("text") && content.equals("TESTCOMPONENT_MSG_TYPE_TEXT")){
sbXML.append("<xml>");
sbXML.append("<ToUserName><![CDATA["+openid+"]]></ToUserName>");
sbXML.append("<FromUserName><![CDATA["+toUserName+"]]></FromUserName>");
sbXML.append("<CreateTime>"+createTime+"</CreateTime>");
sbXML.append("<MsgType><![CDATA[text]]></MsgType>");
sbXML.append("<Content><![CDATA[TESTCOMPONENT_MSG_TYPE_TEXT_callback]]></Content>");
sbXML.append("</xml>");
log.info("模拟粉丝发送文本消息给专用测试公众号,加密前:{}",sbXML.toString());
//加密
testEncryptMsg = XmlUtil.encryptXml(sbXML.toString(), config.getToken(), config.getEncodingAesKey(),
config.getComponentAppid(), timestamp, nonce);
return testEncryptMsg;//直接回复
}
//模拟粉丝发送文本消息给专用测试公众号【返回Api文本消息】
if(msgType.equals("text") && content.indexOf("QUERY_AUTH_CODE")>-1){
String query_auth_code = content.replace("QUERY_AUTH_CODE:","");
String urlFormat = "";
//调用接口:使用授权码换取公众号的授权信息
String componentAccessToken = authService.getComponentAccessToken(authCallbackService.getComponentVerifyTicket());
Map<String, String> param = new HashMap<>(2);
param.put("component_appid", config.getComponentAppid());
param.put("authorization_code",query_auth_code);
String responseStr = HttpsClient.httpsPost(config.getApiQueryAuthUrl()
+"?component_access_token="+componentAccessToken,JSON.toJSONString(param));
JSONObject authJson = JSON.parseObject(responseStr);
System.out.println(authJson.toString());
String authorization_info=authJson.getString("authorization_info");
JSONObject infoJson=JSON.parseObject(authorization_info);
// String authorizer_appid=infoJson.getString("authorizer_appid");
String authorizer_access_token=infoJson.getString("authorizer_access_token");
// String authorizer_refresh_token=infoJson.getString("authorizer_refresh_token");
// int expires_in=infoJson.getInteger("expires_in");
//发送客服消息api回复文本消息给粉丝
urlFormat="https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token="
+authorizer_access_token;
sbXML.append("{");
sbXML.append("\"touser\":\""+openid+"\",");
sbXML.append("\"msgtype\":\"text\",");
sbXML.append("\"text\":");
sbXML.append(" {");
sbXML.append(" \"content\":\""+query_auth_code+"_from_api\"");
sbXML.append(" }");
sbXML.append("}");
String query_auth_code_ret="";
query_auth_code_ret= HttpsClient.httpsPost(urlFormat,sbXML.toString());
log.info("query_auth_code_ret:"+query_auth_code_ret);
JSONObject query_auth_code_ret_json=JSON.parseObject(query_auth_code_ret);
String errorstr=query_auth_code_ret_json.get("errmsg").toString();
if(!errorstr.equals("ok")){
log.error("query_auth_code_test has error:"+errorstr);
}
return "";//第三方平台需在5秒内返回,空串表明暂时不回复
}
/*
//拉取用户信息
Map<String, String> param = new HashMap<>();
param.put("access_token", token);
param.put("openid", openid);
param.put("lang", "zh_CN");
String userStr = HttpsClient.httpsGet("https://api.weixin.qq.com/cgi-bin/user/info", param);
Fan user = JSON.parseObject(userStr, Fan.class);
int crc = new HeadImgUtil().getCrc(user.getHeadImgUrl(), config.getDownloadDir());
user.setHeadImgCrc(crc);
user.setCreateTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
if (event.equals("subscribe")) { //订阅
// List<Fan> fanList = messageReceiveservice.getAllFans();
boolean isexist = false;//是否是第一次订阅
// for (Fan fan : fanList) {
// int localcrc = new HeadImgUtil().getCrc(fan.getHeadImgUrl(), config.getDownloadDir());
// if (fan.getNickname().equals(user.getNickname()) && user.getHeadImgCrc() == localcrc) {
// isexist = true;
// }
// }
isexist=messageReceiveservice.getFanByNickNameAndCrc(user.getNickname(),user.getHeadImgCrc());
if (isexist) {
int sub = 1;
//更新fan表订阅状态
// messageReceiveservice.updateFanSub(user.getNickname(), user.getHeadImgCrc(), sub);
//更新mp_fan表订阅状态
messageReceiveservice.updateMpFanSubScribe(openid, sub);
} else {
user.setSubscribe(1);
messageReceiveservice.saveFan(user);
MpFan mpFan = new MpFan();
mpFan.setIdFan(user.getIdFan());
mpFan.setOpenId(user.getOpenid());
mpFan.setIdMp(Integer.valueOf(mpInfo.getIdMp()));
mpFan.setSubscribe(user.getSubscribe());
mpFan.setEntryIdWxplatform(0);//关注入口微信(该字段标明用户是否是我们引流的)
mpFan.setSubscribeTime(user.getSubscribeTime());
mpFan.setUnsubscribeTime("");
mpFan.setCreateTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
messageReceiveservice.saveMpFan(mpFan);
}
} else if (event.equals("unsubscribe")) {//取消订阅
int sub = 0;
// messageReceiveservice.updateFanSub(user.getNickname(), user.getHeadImgCrc(), sub);
messageReceiveservice.updateMpFanSubScribe(openid, sub);
}*/
// }
}
return "success";
}
public static void main(String[] args){
String xml="<xml>\n" +
" <ToUserName><![CDATA[gh_3c884a361561]]></ToUserName>\n" +
" <Encrypt><![CDATA[d2MVYhKqQrAkoNEnjKNIZXvCdPNgimtiai89yfQqYsbMVynvxUJPEHf5kV35uG7XxEF7nImYCDgvI/UMoKsdJPBajzfFDRhA/HXAvCqfQNv9IPJzYbVi/CLq7rA0bIUIhCPjpjKOJ/q/QF/uSg7s598SDL1dvHzNbleovULqdYz6mYV4y7lPwTIjhg6XS78No0Tf2cw2RHE+EchBsbBcIR01BnUG9Ve337W7dHqfaulfPvdExwuNjwUBBRyAgi8mwC73ZU6dCEVfckxDIYTuoUpiYfsHwFVY04EU4kakOJsvVY1dNxyywIGOguTgZCA1PGutFN3FfELwZnci00EMwqNEs0nf6ve3TdPyd3BrLwrPyPNXQ7hckKBLaWCVLdTHVVHBPRdJBhj8/CpEnyMO7PSQ1GskpoMwEb+aNAdDTgQPWlzpjYUn3zIoO9dcet2VB5DLfZLE801v5Bs1cJstYBs08P0+vbWu/YTxr4N2SINGqkLR/UMKcTlKendo62Tx23eLSBljOePufRr4g+khpyE7E7WTVCRugFVpYwhudmtZXkroESpE3AeTW0uWpAZAEqO65/KG4N1czPwW++ejuQ==]]></Encrypt>\n" +
"</xml>";
System.out.println(System.currentTimeMillis());
String str="<xml>\n" +
"<Encrypt><![CDATA[vrAZnD9Fdr0yppxXukBdSQUED9PT1tmLP/ffIexpLdJpgfRUP2eU3ez3cu4uSnMBDHhQej1zwVcXf50ZZc0vPfBnyYMmshFzBqG7hnoNU3iaorYORrVJF9UbSdpJ384m58GOO//3vA2diNLh/Dk4HGG/yJoXnVvLsM9ArAMEnHPjN9UtKTk5JFIdZE3/4aXSQ8JOkQKtZt5bEJNULIfi9JzYF3aW7YI85gmeioio8H3pBwbSK4U+WM5+7jpUSla41544iFm44HDZ3evERZFt19IQisdA80pDBKwKMG6SogM3pPI8kdbFj4UviiyjLCV2S7lpkxD+wtb0fT2sqys3QRd+0EMPDy8SLN+0qOvuGDygPzjl8voRe1u6q8KVcnZVvLWQPsTLIw7VRz44enepwA04NOWM5Sl3NzLOclNeY3o=]]></Encrypt>\n" +
"<MsgSignature><![CDATA[6b202e737d87d3e7da039bdde6f026634d8380b3]]></MsgSignature>\n" +
"<TimeStamp>1509521426</TimeStamp>\n" +
"<Nonce><![CDATA[983925804]]></Nonce>\n" +
"</xml>";
// String str="<xml>\n" +
// "<ToUserName><![CDATA[toUser]]></ToUserName>\n" +
// "<FromUserName><![CDATA[FromUser]]></FromUserName>\n" +
// "<CreateTime>123456789</CreateTime>\n" +
// "<MsgType><![CDATA[event]]></MsgType>\n" +
// "<Event><![CDATA[SCAN]]></Event>\n" +
// "<EventKey><![CDATA[SCENE_VALUE]]></EventKey>\n" +
// "<Ticket><![CDATA[TICKET]]></Ticket>\n" +
// "</xml>";
//
// String ToUserName = StringUtils.getMiddleString(str,
// "<ToUserName><\\!\\[CDATA\\[", "\\]\\]></ToUserName>");
//
// System.out.println(ToUserName);
// String ss="<xml>\n" +
// " <ToUserName><![CDATA[gh_abc1b8ed4ded]]></ToUserName>\n" +
// " <Encrypt><![CDATA[Wmz688XqSVrZTbkBp3sF9emlXx9F04fl4OqJ8LEz2tbgAyS8VzeqckrPM2LZFOoxfjG2fXvUaxtDxVC1Q0ZVD1dWJcbUnAhO3wDQzbJm1K9dX2rhGzTfS4zqh+1VseFaoGgbDmBJq12dVPDJYlOgYphCoM6ZZmeOIuphlqFKZaT2ZEkIpdmNxzjPVF+5vvzun9cUfpw4hEfq1G7xvFnCrtwOSOxDQPnRQHwmVYSMRmsP0uK3b5qrvrlGPpQnEBFwjq8wlQOjrDTT+ni4jCNkFL9Hj8kwcDUjjE2SiYkNLhya85tXyheKStIHbwsU6UcbLyDNyF0IXkkP8vZz5Lb/RL5liZY/yduolLrJmAikT+DV7DSMK/vOFqsEqWSXDVgx3p1g2i4lhF2qv/dgLlP8/qVwGSC1WYEQby9QbtuctOA=]]></Encrypt>\n" +
// "</xml>";
}
}
微信开放平台第三方应用发布时全网检测
猜你喜欢
转载自blog.csdn.net/kanglovejava/article/details/78854255
今日推荐
周排行