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
@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
@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 ""
}
// }
}
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>"
}
}
package com.yz.discount.controller
import com.yz.discount.basic.config.WxOpenConfig
import com.yz.discount.common.bean.Wxauth
import com.yz.discount.common.controller.SuperController
import com.yz.discount.service.AuthCallbackService
import com.yz.discount.service.AuthService
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.RequestMapping
@Controller
@RequestMapping("/auth")
public class AuthController extends SuperController {
private static Logger log = LoggerFactory.getLogger(AuthController.class)
@Autowired
private WxOpenConfig wxOpenConfig
@Autowired
private AuthCallbackService authCallbackService
@Autowired
private AuthService authService
@RequestMapping
public String auth() throws Exception {
String yaoqianbaHost = "s.visastandards.com"
String yaoqianbaTestHost = "y.visastandards.com"
String host = request.getServerName()
log.info("公众号授权接口请求域名:{}", host)
Wxauth wxauth = authService.getWxauthByHost(host)
if (yaoqianbaTestHost.equals(host) || yaoqianbaHost.equals(host)){ //摇钱吧
String componentAccessToken = authService.getComponentAccessToken(authCallbackService.getComponentVerifyTicket())
String perAuthCode = authService.getPreAuthCode(componentAccessToken)
StringBuffer authUrl = new StringBuffer(wxOpenConfig.getAuthUrl())
authUrl.append("?").append("component_appid=").append(wxOpenConfig.getComponentAppid())
.append("&pre_auth_code=").append(perAuthCode)
.append("&redirect_uri=").append(wxOpenConfig.getAuthCallbackUrl())
request.setAttribute("authUrl", authUrl)
return "auth/openAuth"
}else { //其它第三方平台
String componentAccessToken = authService.getComponentAccessToken(authCallbackService.getComponentVerifyTicket(wxauth.getServerName()), wxauth)
String perAuthCode = authService.getPreAuthCode(componentAccessToken, wxauth)
StringBuffer authUrl = new StringBuffer(wxOpenConfig.getAuthUrl())
authUrl.append("?").append("component_appid=").append(wxauth.getComponentAppid())
.append("&pre_auth_code=").append(perAuthCode)
.append("&redirect_uri=").append(wxauth.getAuthCallbackUrl())
request.setAttribute("authUrl", authUrl)
return "auth/openAuth"
}
}
}