• 目前我这篇博客就是讲微信公众号开发如何接入开发者模式 第一步:首先我们看下文档:他这里有四个参数,还需要进行字典排序,sha1加密 文档这里挺简单的,我们配置下Java代码: 然后这里的令牌是我们配置

    近期自己在研究微信公众号的开发,所以写下来以便日后自己可以观看。当然也会有很多不足,观看时如果发现有什么问题可以私我,错误的地方我会及时改正,但是目前贴上来的代码是没有问题的,执行OK


    目前我这篇博客就是讲微信公众号开发如何接入开发者模式

    第一步:

    首先我们看下文档:他这里有四个参数,还需要进行字典排序,sha1加密
    这里写图片描述
    文档这里挺简单的,我们配置下Java代码:
    然后这里的令牌是我们配置的令牌,比如我们在配置令牌的时候写的是abcd 那么我们这里就写abcd
    下面这是一个工具类,进行排序,和sha1加密

    package com.util;
    
    import java.security.MessageDigest;
    import java.util.Arrays;
    
    public class CheckUtil {
        private static final String token = "令牌";
        public static boolean checkSignature(String signature,String timestamp,String nonce){
            String[] arr = new String[]{token,timestamp,nonce};
            //排序
            Arrays.sort(arr);
    
            //生成字符串
            StringBuffer content = new StringBuffer();
            for(int i=0;i<arr.length;i++){
                content.append(arr[i]);
            }
    
            //sha1加密
            String temp = getSha1(content.toString());
    
            return temp.equals(signature);
        }
    
        /**
         * Sha1加密方法
         * @param str
         * @return
         */
        public static String getSha1(String str) {
            if (str == null || str.length() == 0) {
                return null;
            }
            char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                    'a', 'b', 'c', 'd', 'e', 'f' };
    
            try {
                MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
                mdTemp.update(str.getBytes("UTF-8"));
    
                byte[] md = mdTemp.digest();
                int j = md.length;
                char buf[] = new char[j * 2];
                int k = 0;
                for (int i = 0; i < j; i++) {
                    byte byte0 = md[i];
                    buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
                    buf[k++] = hexDigits[byte0 & 0xf];
                }
                return new String(buf);
            } catch (Exception e) {
                return null;
            }
        }
    }
    

    然后配置servlet;调用我们的工具类,
    然后运行起来,记住外网要能够访问,外网要能够访问,外网要能够访问
    内网穿透就行,然后工具也很多:花生壳,NATAPP,目前我用的是两个,花生壳会花个6块钱

    package com.servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.util.CheckUtil;
    
    @WebServlet("/wx")
    public class WeixinServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
            String signature = req.getParameter("signature");
            String timestamp = req.getParameter("timestamp");
            String nonce = req.getParameter("nonce");
            String echostr = req.getParameter("echostr");
    
            PrintWriter out = resp.getWriter();
            if(CheckUtil.checkSignature(signature, timestamp, nonce)){
                out.print(echostr);
            }
        }
    
    
        /**
         * 消息的接收与响应
         */
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp){
            }
    }


    第二步:

    因为我已经配置过了,要是没有配置过得话,旁边会有一个启用的按钮吧,好像是的

    我们后台配好了,然后我们在来基本配置,这里挺简单的,但是这里有一个坑,因为目前我们只是接入开发者模式,这里不说这个坑是什么了,后面会提出来
    服务器URL:这里就是我们刚刚写的代码,将URL写到这里,比如我的:http://56i7y7.cn/weixin/wx 我就会将这个URL放到服务器地址这一栏
    令牌:上面我提起过这个令牌,就是在工具类里面会写的这个令牌,这个令牌随意写就好,比如abcd
    然后我们点击提交,就可以了,我选的是明文模式(当然前提是我们刚刚写的代码运行起来了)

    这里写图片描述

    以上代码亲测,是没有问题的

    注意点:
    URL的配置

    Java微信公众号–2–微信菜单和消息管理

    Java微信公众号–3–网页授权的一些问题

    展开全文
  • 微信公众号

    微信官方接入指南

    一、环境准备

    1、申请一个公众号,公众号接口权限说明如下:
    这里写图片描述
    这里写图片描述
    根据不同的需求申请不同的公众号。

    个人只能申请订阅号,而且不能进行微信认证,但是可以申请公众平台测试账号,拥有全部的权限,(首页—>开发者工具—>公众平台测试账号)

    2、准备一台外网服务器(腾讯云、阿里云、百度云)

    二、接入微信公众平台开发
    第一步:填写服务器配置
    登录微信公众平台官网后,在公众平台官网的开发-基本设置页面,勾选协议成为开发者,点击“修改配置”按钮,填写服务器地址(URL)、Token和EncodingAESKey。

    URL是开发者用来接收微信消息和事件的接口URL。
    Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。
    EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。
    这里写图片描述

    如果是测试账号:
    这里写图片描述

    第二步:验证消息的确来自微信服务器
    开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上。
    在外网服务器上用Java写后台,所以我们用到了Servlet来接受GET和POST请求,上一步中的URL地址就是Servlet的访问地址

    GET请求携带参数如下表所示:

    参数 描述
    signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
    timestamp 时间戳
    nonce 随机数
    echostr 随机字符串

    验证步骤:
    1、在外网服务器上建好Servlet,并填写好配置信息后,点击提交,外网服务器上会收到Get请求,并收到以下参数:

    signature=63603f83cb6f12d376a5460779c8a3f59d150990&echostr=12631531042608380285&timestamp=1517668717&nonce=3442480512

    2、将token(之前服务器配置中所填写)、timestamp、nonce三个参数进行字典序排序

    3、将三个参数字符串拼接成一个字符串进行 sha1加密

    public static String CheckSignature(String str){
            String[] content=str.split("&");
            String signature=content[0].split("=")[1];
            String timestamp=content[2].split("=")[1];
            String nonce=content[3].split("=")[1];
            //第一步中填写的token一致
            String token="wxsxw";
    
            ArrayList<String> list=new ArrayList<String>();
            list.add(nonce);
            list.add(timestamp);
            list.add(token);
    
            //字典序排序
            Collections.sort(list);
            //SHA1加密
            String checksignature=SHA1Util.encode(list.get(0)+list.get(1)+list.get(2));
            System.out.println(signature);
            System.out.println(checksignature);
    
            if(checksignature.equals(signature)){
                return content[1].split("=")[1];
            }
            return null;    
        }

    4、开发者获得加密后的字符串可与signature对比,如果两者一致,确认此次GET请求来自微信服务器,原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //获取Get请求携带参数
            String content=request.getQueryString();
            System.out.println(content);
            if(content.startsWith("signature")){
                //检查消息是否来自微信服务器
                String echostr=WechatUtil.CheckSignature(content);
    
                //返回echostr给微信服务器
                OutputStream os=response.getOutputStream();
                os.write(URLEncoder.encode(echostr,"UTF-8").getBytes());
                os.flush();
                os.close();
            }
    
        }

    交互过程:
    这里写图片描述

    三、获取access_token
    官方文档

    3.1、access_token简介

    1、access_token是公众号接口调用的全局唯一票据,每次主动调用接口时必须携带的参数。
    2、目前Access_token的有效期通过返回的expire_in来传达,目前是7200秒之内的值
    3、公众号可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在“微信公众平台-开发-基本配置”页中获得(需要已经成为开发者,且帐号没有异常状态)。调用接口时,请登录“微信公众平台-开发-基本配置”提前将服务器IP地址添加到IP白名单中,点击查看设置方法,否则将无法调用成功。

    3.2、接口调用请求说明

    https请求方式: GET
    https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

    参数说明:

    参数 是否必须 说明
    grant_type 获取access_token填写client_credential
    appid 第三方用户唯一凭证
    secret 第三方用户唯一凭证密钥,即appsecret

    返回说明:

    {"access_token":"ACCESS_TOKEN","expires_in":7200}

    参数说明:

    参数 说明
    access_token 获取到的凭证
    expires_in 凭证有效时间,单位:秒



    Java代码:

        public static String getToken(){
            HttpURLConnection conn=null;
            if(access_token==null||access_token.equals("")
                    ||(new Date().getTime()-access_token_date.getTime())>((accessTokenInvalidTime-200L)*1000L)){
                try{
                    String Strurl="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+AppID+"&secret="+AppSecret;
                    URL url = new URL(Strurl);
                    conn = (HttpURLConnection) url.openConnection();
                    conn.setConnectTimeout(5000);
                    conn.setRequestMethod("GET");
                    if (HttpURLConnection.HTTP_OK == conn.getResponseCode()){
                        access_token_date=new Date();
                        InputStream in=conn.getInputStream();
                        String backcontent= IOUtil.readString(in);
                        backcontent= URLDecoder.decode(backcontent,"UTF-8");
    
                        JSONObject json = JSONObject.fromObject(backcontent);
                        access_token=json.getString("access_token");
                        if(access_token!=null){
                            System.out.println("获取token成功:"+access_token);
                        }  
                    }
                }catch(Exception e){
                    e.printStackTrace();
                }finally {
                    conn.disconnect();
                }
            }else{
                System.out.println("token获取失败或尚未失效:"+access_token);
            }
            return access_token;
        }
    展开全文
  • 微信开发者接入官方文档 :https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319 一、微信公共号通讯机制 作为开发者,我们需要面对的主要有两个对象:微信服务器和应用程序(网站)服务器。 ...

    微信开发者接入官方文档 : https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319

    一、微信公共号通讯机制

    作为开发者,我们需要面对的主要有两个对象:微信服务器和应用程序(网站)服务器。 
    当微信用户向你的公众平台发送一条消息,实际上这条消息首先发送到微信服务器,由微信服务器向网站服务器(我们开发的后台服务)发起另外一个请求,网站服务器返回这个请求的结果,再由微信服务器发送到微信客户端。

    整个消息通讯流程如下图: 
    这里写图片描述

    具体请求流程见下图:

     

    二、 外网映射工具(开发调试)

    1、 外网映射工具介绍

    微信公众平台在访问后台时,必须提供能够正确访问的外网地址,因为我们在本地开发,IP:127.0.0.1 ,所以要通过内网穿透,提供给外网的微信公众平台正确访问,微信平台对后台URL的要求有两点:

    要求:① 必须能够用公网访问    ② 必须使用80端口

    (1)natapp (很稳定,极力首推) 

     官网 :https://natapp.cn/

    (2)ngrok

     官网:https://www.ngrok.cc/

    (3)nat123

     官网:http://www.nat123.com/

    (4)花生壳

    花生壳服务网址:价格地址直达地址

    使用花生壳外网映射的可以参考这篇博客:http://www.souvc.com/?p=2272   

    (5)uTools(完全免费,推荐)

      地址:https://www.u.tools/

      

     

    2、我这里选择的是ngrok外网映射工具  

    使用ngrok:

    (1). ngrok下载: 链接:https://pan.baidu.com/s/1PeVRF2lfNoQYro3YJW_7JQ 密码:s7bm

    (2).进入ngrok安装文件所在的目录执行:ngrok -config ngrok.cfg -subdomain mywx 8080,之后出现如下图说明配置成功。(成功的前提是本地服务已经部署到Tomcat并且正常开启,访问本地服务正常)

     a.ngrok所在目录

      

    b、切换到该目录下执行上述命令

    c、本地服务映射成到外网成功效果图

     

    二、填写服务器配置信息的介绍

    1、登录微信公众平台官网后,进入到公众平台后台管理页面。

    选择 公众号基本设置-》基本配置 ,点击“修改配置”按钮,填写服务器地址(URL)、Token和EncodingAESKey。

    微信公众号配置界面:

     

    服务器配置:

     URL:是开发者用来接收微信消息和事件 的接口URL。(http://公网地址/项目名称/请求路径

      Token:可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。注意必须为英文或数字,长度为3-32字符,在校验的时候需要用到,随便输入一个字符串就可以了。

    EncodingAESKey:由开发者手动填写或随机生成,将用作消息体加解密密钥。(消息加密密钥由43位字符组成,可随机修改,字符范围为A-Z,a-z,0-9。)

         开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带四个参数 
        参数 描述 
    signature :微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 
    timestamp :时间戳 
    nonce: 随机数 

       echostr: 随机字符串

     

     

    2、编写相应的Controller(采用spring MVC)

    package com.thinkgem.jeesite.modules.app.api;
    
    import java.io.IOException;
    import java.security.MessageDigest;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    /**
     * 
     * @ClassName: WeiXinController
     * @Description: TODO(对微信请求校验,成为开发者)
     * @author CaoWenCao
     * @date 2018年6月6日 下午2:09:38
     */
    @Controller
    @RequestMapping(value = "weixin")
    public class WeiXinController {
    
        private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
    
        @RequestMapping(value = "getWeiXinMethod", method = RequestMethod.GET)
        @ResponseBody
        public void getWeiXinMethod(HttpServletRequest request, HttpServletResponse response) throws IOException {
            boolean validate = validate(request);
            if (validate) {
                response.getWriter().write(request.getParameter("echostr"));
                response.getWriter().close();
            }
    
        }
    
        private boolean validate(HttpServletRequest req) throws IOException {
            String signature = req.getParameter("signature");// 微信加密签名
            String timestamp = req.getParameter("timestamp");// 时间戳
            String nonce = req.getParameter("nonce");// 随机数
            List<String> list = new ArrayList<String>();
            list.add("caowencao");
            list.add(timestamp);
            list.add(nonce);
            Collections.sort(list);// 字典排序
            String str = "";
            for (int i = 0; i < list.size(); i++) {
                str += (String) list.get(i);
            }
            if (encode("SHA1", str).equalsIgnoreCase(signature)) {
                return true;
            }
            else {
                return false;
            }
        }
    
        public static String encode(String algorithm, String str) {
            if (str == null) {
                return null;
            }
            try {
                // Java自带的加密类
                MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
                // 转为byte
                messageDigest.update(str.getBytes());
                return getFormattedText(messageDigest.digest());
            }
            catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
        private static String getFormattedText(byte[] bytes) {
            int len = bytes.length;
            StringBuilder buf = new StringBuilder(len * 2);
            // 把密文转换成十六进制的字符串形式
            for (int j = 0; j < len; j++) {
                buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
                buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
            }
            return buf.toString();
        }
    }

    3、点击提交按钮,此时验证和调用没问题,已经成功接入开发者模式。

     

    展开全文
  • 微信官方文档: https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html 直接上Code(请忽略不规范????): import org.apache.commons.lang.StringUtils; import org.slf4j...

    微信官方文档:

    https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html

     

    Demo:

    import org.apache.commons.lang.StringUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    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.PrintWriter;
    import java.io.UnsupportedEncodingException;
    
    @RestController
    @RequestMapping(value = "/weChat/callback")
    public class WeChatCallBackController {
    
        private static final Logger LOG = LoggerFactory.getLogger(WeChatCallBackController.class);
    
        /**
         * 校验信息是否是从微信服务器发出
         *
         * @param request
         * @param response
         */
        @GetMapping
        public void get(HttpServletRequest request, HttpServletResponse response) {
            try {
                request.setCharacterEncoding("UTF-8");
                response.setCharacterEncoding("UTF-8");
            } catch (UnsupportedEncodingException e) {
                LOG.error("UnsupportedEncodingException", e);
            }
    
            // 微信加密签名
            String signature = request.getParameter("signature");
            // 时间戳
            String timestamp = request.getParameter("timestamp");
            // 随机数
            String nonce = request.getParameter("nonce");
            // 随机字符串
            String echostr = request.getParameter("echostr");
            // 微信开发者模式配置Token
            String token = "Token";
    
            try (PrintWriter writer = response.getWriter()) {
                // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
                if (WeChatPayUtil.checkSignature(token, signature, timestamp, nonce)) {
                    writer.write(echostr);
                }else {
                    // 回复消息为空,必须做出下述回复,这样微信服务器才不会对此作任何处理,
                    // 并且不会发起重试,否则,将出现严重的错误提示。直接回复success(推荐方式)
                    writer.write("success");
                }
            } catch (AesException e) {
                LOG.error("AesException", e);
            } catch (IOException e) {
                LOG.error("IOException", e);
            }
        }
    
        /**
         * 微信服务器处理消息
         *
         * @param request
         * @param response
         */
        @PostMapping
        public void post(HttpServletRequest request, HttpServletResponse response) {
            try {
                request.setCharacterEncoding("UTF-8");
                response.setCharacterEncoding("UTF-8");
            } catch (UnsupportedEncodingException e) {
                LOG.error("UnsupportedEncodingException", e);
            }
    
            // 加密 response
            String respMessage = "加密response";
            try (PrintWriter writer = response.getWriter()) {
                if (StringUtils.isNotBlank(respMessage)) {
                    writer.write(respMessage);
                } else {
                    writer.write("success");
                }
            } catch (Exception e) {
                LOG.error("Exception", e);
            }
        }
    
    }
    

     

       /**
        * 验证微信开发者模式回调Token
        *
        * @param token        Token(令牌)
        * @param msgSignature 签名串,对应URL参数的signature
        * @param timeStamp    时间戳,对应URL参数的timestamp
        * @param nonce        随机串,对应URL参数的nonce
        * @return 是否为安全签名
        * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息
        */
       public static boolean checkSignature(String token, String msgSignature, String timeStamp, String nonce) 
               throws AesException {
          String signature = SHA1.getSHA1(token, timeStamp, nonce);
          if (!signature.equals(msgSignature)) {
             throw new AesException(AesException.ValidateSignatureError);
          }
          return true;

    微信后台配置接口URL,若提交成功即OK啦!

     

    微信公众号和微信小程序通用

    展开全文
  • 请问,微信公众开发平台的开发者文档接口,应该如何使用,能否请教JAVA开发的高手编写一段程序示范一下啊?谢谢。我看到网上有高手用JSON数据写了一段JAVA文件,不知道,是不是还需要配置web.xml等配置文件才能使用...
  • 最近在搞微信开发者模式,对于第一次接触这东西的人来说还真是没有头绪,因为需要跟微信进行交互,难免会碰到一些问题,不像我们在本机开发那样,很快就能把逻辑代码写完。今天主要是让测试耽误了时间,由于微信...

    最近在搞微信的开发者模式,对于第一次接触这东西的人来说还真是没有头绪,因为需要跟微信进行交互,难免会碰到一些问题,不像我们在本机开发那样,很快就能把逻辑代码写完。今天主要是让测试耽误了时间,由于微信只能绑定域名,不能使用ip地址,但是在公司中域名直接解析到线上服务器,但是线上服务器该域名下已经有服务在运行,所以不能使用线上服务器直接进行开发测试,也不能把已有的服务号打开开发者模式,因为打开开发者模式之后好多已有的自动回复就不能使用了,总之遇到了各种问题,记录下开发过程。


    申请测试账号

    进入申请地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

    点击登录按钮,会弹出一个二维码,使用手机微信扫描即可

    登录成功之后会出现下面的界面


    appID和appsecret在调用微信接口的时候会用到,这里是微信自动给我们生成好的,直接使用就可以。

    URL:是我们自己服务器的URL,用户微信推送用户消息和事件用的。这里只能配置域名,不能使用IP。这个URL是用来接收微信的token认证和消息事件用的,我们自己的服务器要能对这个url的请求进行处理并相应,所以要求该域名必须是外网可以访问的,否则在点“提交”按钮的时候会报token异常。

    Token:是验证签名用的,此处填写的要与代码中的Token保持一致否则验证不过。

    URL和Token都填好之后点击提交按钮,若验证通过,会返回配置成功,否则返回配置失败。

    配置失败的原因可能有几个:

    1、URL地址不能访问

    2、Token填写错误

    注意:在点击提交按钮之前一定要先把服务端的代码写好,否则会返回配置失败,具体实现代码在后面演示。

    到此为止,我们的接口配置信息就算完成了。

    扫描测试号二维码就可以来测试我们的功能了


    Token认证

    我配置的URL是,http://www.xxx.com/XX/wxProcess/service,所以微信会把所有的请求都发到我的/service路径上,包括Token认证和事件处理,我使用两个方法来处理的,但是请求类型不同,Token认证是用的GET请求,事件处理使用的是POST请求。演示代码如下:

    /**
         * 打开开发者模式签名认证
         * @param signature
         * @param timestamp
         * @param nonce
         * @param echostr
         * @return
         */
        @ResponseBody
        @RequestMapping(value = "/service", method = RequestMethod.GET)
        public Object defaultView(String signature, String timestamp, String nonce, String echostr) {
            if (echostr == null || echostr.isEmpty()) {
                return nonce;
            }
            if (SignUtil.checkSignature(signature, timestamp, nonce)) {
                return echostr;
            }
            return nonce;
        }
    
        /**
         * 事件处理
         * @param signature
         * @param timestamp
         * @param nonce
         * @param message
         * @return
         */
        @ResponseBody
        @RequestMapping(value = "/service", method = RequestMethod.POST, consumes = "text/xml", produces = "text/xml;charset=UTF-8")
        public String defaultViewHandler(String signature, String timestamp, String nonce, @RequestBody String message) {
            String result = "";
            if (SignUtil.checkSignature(signature, timestamp, nonce)) {
                result = coreService.processRequest(message);
            }
            return result;
        }

    做签名认证的时候会调用我的defaultView方法,其他的事件都走defaultViewHandler方法。

    coreService.processRequest(): 是对所有的请求事件进行处理

    CoreService.java主要代码实现如下:

    @Override
        public String processRequest(String msg) {
            String respMessage = null;
            try {
                // 默认返回的文本消息内容
                String respContent = "";
    
                // xml请求解析
                Map<String, String> requestMap = MessageUtil.parseXml(msg);
    
                // 发送方帐号(open_id)
                String fromUserName = requestMap.get("FromUserName");
                // 公众帐号
                String toUserName = requestMap.get("ToUserName");
                // 消息类型
                String msgType = requestMap.get("MsgType");
                String eventType = requestMap.get("Event");
    
                // 存在事件类型且类型有效 或者 消息类型可以处理,才需要进行身份处理,防止没有意义的事件引起发送大量绑定消息
                if ((!StringUtils.isEmpty(eventType) && !eventArrays.contains(eventType)) || !msgArrays.contains(msgType)) {
                    return "";
                }
    
                respMessage = handleWxMessage(requestMap);
            } catch (Exception e) {
                LOGGER.error("error", e);
                e.printStackTrace();
            }
            return respMessage;
        }
    
        @Override
        public String handleWxMessage(Map<String, String> requestMap) {
            // 发送方帐号(open_id)
            String fromUserName = requestMap.get("FromUserName");
            // 公众帐号
            String toUserName = requestMap.get("ToUserName");
            // 消息类型
            String msgType = requestMap.get("MsgType");
            // 回复文本消息
            String respContent = "";
            BaseMessage textMessage = new TextMessage();
            textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
            switch (msgType) {
                case MessageUtil.REQ_MESSAGE_TYPE_TEXT:
                    // 文本类型消息,暂时设置成用户发什么就回复什么
                    String content = requestMap.get("Content");
                    respContent = "";
                    break;
                case MessageUtil.REQ_MESSAGE_TYPE_VOICE:
                    // 使用语音识别功能需要开启微信公众号相关权限
                    // 语音识别结果
                    String recognizeText = requestMap.get("Recognition");
                    respContent = "";
                    break;
                case MessageUtil.REQ_MESSAGE_TYPE_EVENT:
                    // 事件类型
                    String eventType = requestMap.get("Event");
                    // 事件KEY值,qrscene_为前缀,后面为二维码的参数值
                    String eventKey = requestMap.get("EventKey");
                    // 自定义事件
                    switch (eventType) {
                        // 用户未关注时,进行关注后的事件推送
                        case MessageUtil.EVENT_TYPE_SUBSCRIBE:
                            if (isUserBuyLastActivity(fromUserName)) {
                                textMessage = getAddClassTextMessage(fromUserName);
                            } else {
                                textMessage = getDefaultTextMessage(fromUserName);
                            }
                            Integer eventKeyValue = 1;// 带参数的情景值
                            if (!StringUtils.isEmpty(eventKey) && eventKey.contains("qrscene_")) {
                                eventKey = eventKey.replace("qrscene_", "");
                                // 渠道ID
                                eventKeyValue = Integer.parseInt(eventKey);
                            }
                            subscribeAction(fromUserName, eventKeyValue);
                            break;
                        // 取消关注
                        case MessageUtil.EVENT_TYPE_UNSUBSCRIBE:
                            unSubscribeAction(fromUserName);
                            break;
                        // 用户已关注时的事件推送
                        case MessageUtil.EVENT_TYPE_SCAN:
                            textMessage = getDefaultTextMessage(fromUserName);
                            break;
                        default:
                            respContent = "";
                            break;
                    }
                    break;
                default:
                    respContent = "";
                    break;
            }
    
            if (textMessage instanceof TextMessage) {
                // 文本内容为空且是文本消息返回空字符串,防止微信发送异常消息
                String content = ((TextMessage) textMessage).getContent();
                if (StringUtils.isEmpty(respContent) && StringUtils.isEmpty(content)) {
                    return "";
                }
                if (org.apache.commons.lang.StringUtils.isBlank(content)) {
                    ((TextMessage) textMessage).setContent(respContent);
                }
            }
            textMessage.setToUserName(fromUserName);
            textMessage.setFromUserName(toUserName);
            textMessage.setCreateTime(new Date().getTime());
            String xmlString = MessageUtil.messageToXml(textMessage);
            return xmlString;
        }

    上面只是展示了部分核心代码,具体代码可以去我的GitHub下载,地址:https://github.com/liuyanmin/wxDemo

    下面是微信开发相关的链接:

    申请个人测试账号:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

    微信被动回复消息开发文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543

    微信错误码文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543


    展开全文
  • 本次案例采用的weixin4j版本是weixin4j-0.1.0版本,采用的是SpringBoot做了一个微信开发者接入的示例。 开发步骤 1.新建项目 本次项目名称为:weixin4j-demo-jieru pom.xml,仅列出了主要部分: &lt;...
  • 进入微信公众平台注册账号:https://mp.weixin.qq.com/ 个人建议注册订阅号
  • 接入必须的参数 URL服务器地址用于接受微信消息和事件(http://…….aliapp.com/servlet/MyServlet servlet/MyServlet为web.xml中你配置的url-pattern) <servlet-name>MyServlet <servlet-class>servlet.My...
  • Java实现微信开发–”接入” 使用Java开发语言,进行微信接入”,有如下要求: 1、有一定Java基础 2、对微信公众号有一定了解 3、了解测试号、订阅号、公众号区别 4、本文只是进行简单”接入”教程(公众号以...
  • Java公众号开发环境搭建 需要准备的东西: 一个微信公众号,参考:微信公众号申请及介绍 内网穿透工具,参考:使用natapp开启内网穿透之旅 数据交互 编辑模式和开发模式的关系: 编辑模式和开发模式是互斥的关系...
  • 原先的网页需要分享到微信,可是转发时,分享的缩略图没有显示,标题和描述都不能自定义现在想让分享显示缩略图。又可以自定义标题和描述,就要用到微信js_sdk。后台基于javaweb,微信的分享流程大致如下,详细见...
  • Java调用微信支付接口

    2018-01-19 22:20:58
    二、API:使用微信开放平台的接入微信支付  -扫码支付。微信支付开发者平台链接 三、分析: 接入扫码支付(包含PC网站支付)包含三个阶段,问这里只讲使用,也就是第2阶段的《启动设计和开发》。点击查看...
  • 没有公众号的可以使用微信测试号进行开发 申请测试号地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 微信开发文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&amp;id=mp...
  • 从零接入微信公众号 一、微信测试号的申请与关注 1.申请 2.访问域名配置 3.关注 二、测试号快速生成底部导航栏 1.获取 access_token 2.自定义菜单 三、微信公众号网页授权 1.网页授权原理 2.代码实现 1...
  • Android微信支付接入

    2018-06-04 01:00:53
    前言:本文主要说明如何在Android项目中接入微信支付,介绍微信支付在项目中的配置,分析微信支付数据与其交互流程,分享个人遇到的坑,以帮助有需要的朋友能更快的在项目中进行微信支付的接入。 正文: 1,开发...
  • java做带薪开发,首先就要先通过微信接入配置,大概原理就是微信往服务器发送一些数据,然后在服务器端做一些数据的处理,再返回数据就行了。 微信官方的名称是: 验证服务器地址的有效性 下面是微信官方的...
  • 1.成为开发者? 需要填写接口配置信息,需要自己的服务器资源,一般自己没有服务器,所以可以采用云服务器,例如BAE,SAE,阿里云服务器。...填写工程相关信息,应用名称自定义,类型选择java-tomcat
  • 一、注册微信公众平台 微信公众平台官网 https://mp.weixin.qq.com/,点击注册 ... ... 如果对公众号没特别要求直接操作公众平台就可以了,这里主要介绍java后台开发者调用微信接口的操作。 ...
  • 相关文档:微信公众号开发-实现服务端回复消息为空   xstream简单使用(wx消息体处理)   XStream-bean转换为xml是,携带CDATA  controller中直接...首先,按照微信公众号开发文档提示,进行公众号申请: ...
1 2 3 4 5 ... 20
收藏数 11,036
精华内容 4,414