微信开放平台第三方应用发布时全网检测

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>";



    }

}
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;

/**
 * @author seven
 * @date 2017/10/23 下午1:05
 */

@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(); //获取登录的计算机域名,如果没有域名就得到IP
        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";
        }
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值