w3c 微信公众号开发文档api_微信 dat转jpg 3c 1b 3c - CSDN
精华内容
参与话题
  • 到了现在,必须要正视一个问题了,之前所作的都是不推荐的,为什么,因为你没...使用开源框架啊,现如今,做微信公众号开发这块也是比较成熟的,也有一些比较好的开源框架,可以说,使用了开源框架之后,很多事情...

    到了现在,必须要正视一个问题了,之前所作的都是不推荐的,为什么,因为你没发现之前咱们还在调用官方API接口吗?还在写程序去获取token机械json数据呢?而且json数据咱们还要自己拼接,这可是不行的,要知道在实际的开发中,是奔着以最快时间达成目标为主要的,所以,怎么办?

    使用开源框架啊,现如今,做微信公众号开发这块也是比较成熟的,也有一些比较好的开源框架,可以说,使用了开源框架之后,很多事情基本上一行代码搞定。

    我这里使用的开源框架是—Wx-tools

    GitHub地址:https://github.com/antgan/wx-tools

    技术文档地址:https://www.w3cschool.cn/wxtools/

    这个开源库给的文档还是相当详细的,可以看一下文档目录

    所以基本上看着文档就能实现大多数功能,这里真的要感谢这位开源作者了,偷偷告诉你,这位开源作者跟我一样年龄,唉,惭愧啊,不过人家工作早,赞!自己要加油了!

    这里简单说一下用法,首先导入项目依赖

    <!--wx-tools-->
        <dependency>
          <groupId>com.soecode.wx-tools</groupId>
          <artifactId>wx-tools</artifactId>
          <version>2.1.4-RELEASE</version>
        </dependency>

    这里还要依赖一些其他的包,这里一并给出

     <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
          <version>1.7.25</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
        <dependency>
          <groupId>ch.qos.logback</groupId>
          <artifactId>logback-classic</artifactId>
          <version>1.2.3</version>
          <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
        <dependency>
          <groupId>org.apache.httpcomponents</groupId>
          <artifactId>httpclient</artifactId>
          <version>4.5.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpmime -->
        <dependency>
          <groupId>org.apache.httpcomponents</groupId>
          <artifactId>httpmime</artifactId>
          <version>4.5.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.codehaus.jackson/jackson-mapper-asl -->
        <dependency>
          <groupId>org.codehaus.jackson</groupId>
          <artifactId>jackson-mapper-asl</artifactId>
          <version>1.9.13</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
        <dependency>
          <groupId>com.thoughtworks.xstream</groupId>
          <artifactId>xstream</artifactId>
          <version>1.4.10</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
          <groupId>commons-io</groupId>
          <artifactId>commons-io</artifactId>
          <version>2.4</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
        <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-lang3</artifactId>
          <version>3.7</version>
        </dependency>

    导入以上maven依赖之后就可以开心使用这个开源框架了。

    服务器验证

    首先从最开始的服务器验证这块,对于wx-tools这个框架,总的接口就是IService,而我们要使用的则是它的实现类WxService,很多功能都是通过它调用的,比如我们进行服务器签名验证

    这里使用开源框架来替换我们之前写的工具类,记得这里多了一个参数,看,现在使用开源框架我们一行代码就可以搞定服务器验证,而不使用框架的话我们就得自己实现验证的工具类了。

    解决token调取上限问题

    其实在之前的操作中一直隐藏着一个很大的问题,那就是AccessToken的问题,因为调用任何接口基本上都要用到AccessToken,但是每调用一次产生的AccessToken两小时后自动失效,就要重新调用,也许你会说,两个小时足够了啊,可是我们进行本地调试的时候,免不了重启服务器,这样AccessToken就会被刷新,所以很可能会出现一个AccessToken调取达到上限的问题,因为AccessToken的调用每天是有限制的,所以,这里对AccessToken采用硬编码。

    也就是将调取得到的AccessToken进行硬编码,等到两个小时之后再次获取,使用框架获取AccessToken是这样的

    String accessToken = iService.getAccessToken();

    所以我这里新建一个MyWxService去继承WxService

    /**
     * 继承自WxService以便修改响应方法
     * 比如对token的存储
     */
    public class MyWxService extends WxService {
        @Override
        public String getAccessToken() throws WxErrorException {
            /**
             * token每天调取上限位2000次
             * 为避免达到上限
             * 将获得的token以硬编码方式存储
             * 一个token的使用时长有两个小时左右
             */
            //开发测试采用,两小时过后需要调用上线采用的方法刷新获取新的token
            return "12_2sztWZDG-06oyyQ5ObBFwW1TiN3LibX7nJ1FCoxLfVpj0TOdu0YLfwQHpCvZTIgi0mavu0B9D0wPQ3DA98e2lTGTB0gQLWHftgVLk1WnKcHCeSgDluza-tUzYKxxZqWDLImTwcjg1bnuy9yqCYAbACAUQS";
    
            //正常上线采用
    //        return super.getAccessToken();
        }
    }

    需要获取AccessToken的话就是用新创建的MyWxService调用,也就是这样

    IService iService = new MyWxService();
    String accessToken = iService.getAccessToken();

    如此一来就可以解决AccessToken调取上限问题。使用了框架之后对于公众号的具体业务开发,比如接收消息,响应消息或者用户管理等都变得非常简单了,剩下的就是看你的具体需求了。

    根据你的需求,查看wx-tools的技术文档,实现具体的业务逻辑,就是你接下来要做的事了,本来想再举几个wx-tools的使用例子,可是人家的文档上已经写的很详细,所以就没必要再写了。

    所以嘞,仔细看文档,仔细看文档,仔细看文档!!!

    展开全文
  • 作为一个刚接触微信开放平台的小白,目的很简单:想把一个提供评论的网页放到别人的微信公众号上去,这个网页里想获取到用户的信息。有两种方式,第一种微信网页授权:是要人家公众号的appid、appsecret、网页授权...

    作为一个刚接触微信开放平台的小白,目的很简单:想把一个提供评论的网页放到别人的微信公众号上去,这个网页里想获取到用户的信息。有两种方式,第一微信网页授权:是要人家公众号的appid、appsecret、网页授权获取用户基本信息、加名单,这几样缺一不可(正常情况下人家当然不会给);第一种方式:就是使用微信开放平台(微信第三方平台),只要人家公众号给你这个平台授权就行。最下面附上两种方式授权的文档,可以对比一下

    首先必须搞清楚,微信公众平台和微信开放平台不是同一个平台,微信公众平台就是咱们平常说的公众号,微信开放平台是作为第三方移动程序提供接口。

    1. 微信第三方平台注册

    老一套,需要一堆认证手续以及300块。 

     

    如图,新建一个公众号第三方平台,然后通过审核即可。

     

    其中注意一下,前期测试的时候,授权测试公众号列表,网页开发域名,白名单IP地址列表这三项一定要核对无误,每次修改都会重新审核(不过很快就会通过)。因为填错所出现的报错信息文档里面是没有任何说明,甚至是有的错误码文档里也没有。可以参考一下http://blog.csdn.net/goodzyw/article/details/45191143

    2.  获取ComponentVerifyTicket

    第三方平台创建成功后,微信会定时每隔10分钟发送一次ComponentVerifyTicket,只需要在“授权事件接收URL对应的方法里接收就行,每次接收完之后记得保存和更新。具体接收代码参考:获取ComponentVerifyTicket

     

    3.  公众号给第三方开放平台扫码授权

    (1)获取第三方平台access_token

    http请求方式: POST(请使用https协议) 

    https://api.weixin.qq.com/cgi-bin/component/api_component_token

    参数:

    {
    "component_appid":"appid_value" ,#第三方平台appid
    "component_appsecret": "appsecret_value", #第三方平台appsecret
    "component_verify_ticket": "ticket_value"  #微信后台推送的ticket,此ticket会定时推送,具体请见步骤2所附的链接
    }

    返回结果:

    
     
    {
    "component_access_token":"61W3mEpU66027wgNZ_MhGHNQDHnFATkDa9-2llqrMBjUwxRSNPbVsMmyD-yq8wZETSoE5NQgecigDrSHkPtIYA", #第三方平台
    access_token
    "expires_in":7200 #有效期
    }
    
     

    (2)获取预授权码 (若已经授权跳过此步骤,直接进入(5))

     

    http请求方式: POST(请使用https协议) 

    https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token=xxx

    参数:

    {
    "component_appid":"appid_value" 
    }

    返回结果:

    {
    "pre_auth_code":"Cx_Dk6qiBE0Dmx4EmlT3oRfArPvwSQ-oa3NL_fwHM7VI08r52wazoZX2Rhpz1dEw", #预授权码
    "expires_in":600 #有效时间
    }
    
     

    (3)引导进入授权页面(若已经授权跳过此步骤,直接进入(5))

    在任何一个html或者jsp页面,加一个按钮,按钮的响应地址为:(不可以直接用代码访问)

    https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=xxxx&pre_auth_code=xxxxx&redirect_uri=xxxx
    该网址中第三方平台方需要提供第三方平台方appid、预授权码和回调URI

     

    (4)扫码授权,若在此处需要该公众号的授权信息,可以参考:获取公众号授权信息详情 (若已经授权或者不需要授权信息,跳过此步骤,直接进入(5))

    (5)代公众号发起网页授权,参考文档:获取用户信息链接

     

    参考:

    申请微信开放平台地址

    授权参考

    代公众号发起网页授权文档

    微信网页授权文档

    展开全文
  • 配置微信公众号开发环境就不赘述了。 进入正题。。。。。 首先,先理清楚微信登录的两种实现途径(这里我们先演示一种)1.微信开放平台实现,2.微信公众号(微信公众平台)实现。 因为微信登录不同与QQ登录,微信登录...

    配置微信公众号开发环境就不赘述了。

    进入正题。。。。。

    首先,先理清楚微信登录的两种实现途径(这里我们先演示一种)1.微信开放平台实现,2.微信公众号(微信公众平台)实现。

    因为微信登录不同与QQ登录,微信登录只提供扫码方式登录,并不像其他应用登录让用户输入用户名,密码。对用户并不友好。所以出现微信公众号登录,让用户授权。

    实现方式也是两种:

    1.没有自己的帐号体系,直接拉去微信用户信息来进行网站登录(我们所展示的信息全部来自于微信)

    2.有自己的账号体系,授权成功后需要绑定自己的账号,绑定成功后,下次登录所展示的信息是自己的账号体系下面的用户信息

    下面开始

    1.微信公众号,推荐使用测试账号(拥有所有权限)

    2.看微信授权登录的文档

    3.代码部分了(尽可能的加上了注释)

    工具类

    package com.wlw.util;
    import java.io.IOException;
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.util.EntityUtils;
    
    import net.sf.json.JSONObject;
    
    /**
     * 
     * 工具类
     * 用来根据接口地址进行网络请求
     * @author wlw
     *
     */
    public class AuthUtil {
    	public static final String APP_ID = "****************";     //填写自己的APPID
    	public static final String APP_SECRET = "**************";   //填写自己的APPSECRET
        public static JSONObject doGetJson(String url) throws Exception, IOException {
    		JSONObject jsonObject=null;
    		//初始化httpClient
    		DefaultHttpClient client=new DefaultHttpClient();
    		//用Get方式进行提交
    		HttpGet httpGet=new HttpGet(url);
    		//发送请求
    		HttpResponse response= client.execute(httpGet);
        	//获取数据
    		HttpEntity entity=response.getEntity();
    		//格式转换
    		if (entity!=null) {
    			String result=EntityUtils.toString(entity,"UTF-8");
    			jsonObject=JSONObject.fromObject(result);
    		}
    		//释放链接
    		httpGet.releaseConnection();
    		return jsonObject;
        }
    	   
    }
    

    组装入口地址

    package com.wlw.servlet;
    import java.io.IOException;
    import java.net.URLEncoder;
    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.wlw.util.AuthUtil;;
    
    /**
     * 组装入口地址
     * 进行授权页面的授权地址组装
     * @author wlw
     *
     */
    @WebServlet("/wxLogin")
    public class LoginServiet extends HttpServlet{
    
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		//回调地址(必须在公网进行访问)
    		String backUrl="http://w.ngrok.xiaomiqiu.cn/we/callBack";
    		String url="https://open.weixin.qq.com/connect/oauth2/authorize?appid="+AuthUtil.APP_ID
    				+ "&redirect_uri="+URLEncoder.encode(backUrl)
    				+ "&response_type=code"
    				+ "&scope=snsapi_userinfo"
    				+ "&state=STATE#wechat_redirect";
    		//重定向
    		resp.sendRedirect(url);
    	}
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		super.doPost(req, resp);
    	}
    }
    

    到这里很多人不明白回调地址到底是个啥玩意,

    回调地址是当我们用户同意授权后,程序会进行对回调地址的访问。所以回调地址必须在公网上能够进行访问的。

    还有个重点是scope(授权的作用域)。两个参数snsapi_base、snsapi_userinfo。。使用base作用域,不会弹出会话框,直接跳过,直接进入到回调地址,运行之后的程序,它默认是授权的(只能获取到openid)。。而userinfo,会弹出会话框,让用户选择,确认,才会进入回调地址(获取openID,通过openID拿到其他信息),用户取消则不进入回调地址。

    微信公众号的bug之一就出现了,如果先使用userinfo作用域,再去使用base作用域,居然也能获取到用户的其他信息。至于为什么就要去问微信的开发大佬了。

    回调地址的处理

    package com.wlw.servlet;
    import java.io.IOException;
    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.wlw.util.AuthUtil;
    import net.sf.json.JSONObject;
    
    /**
     * 回调地址
     * 
     * @author wlw
     *
     */
    @WebServlet("/callBack")
    public class CallBackServlet extends HttpServlet {
    	
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		/**
    		 * 3.获取code
    		 */
    		String code=req.getParameter("code");
    	String url="https://api.weixin.qq.com/sns/oauth2/access_token?appid="+AuthUtil.APP_ID
    			+ "&secret="+AuthUtil.APP_SECRET
    			+ "&code="+code
    			+ "&grant_type=authorization_code";
    	JSONObject jsonObject;
    	try {
    		jsonObject = AuthUtil.doGetJson(url);
    		String openid=jsonObject.getString("openid");
    		String token=jsonObject.getString("access_token");
    		/**
    		 * 4.拉取用户信息
    		 */
    		String infoUrl="https://api.weixin.qq.com/sns/userinfo?access_token="+token
    				+ "&openid="+openid
    				+ "&lang=zh_CN";
    		JSONObject userInfo=AuthUtil.doGetJson(infoUrl);
    		System.out.println(userInfo);
    		
    		//使用微信用户信息直接登录,无需注册和绑定
    		req.setAttribute("info", userInfo);
    		req.getRequestDispatcher("/index1.jsp").forward(req, resp);
    	} catch (Exception e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
    	
    	}
    
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		super.doPost(req, resp);
    	}
    
    }
    

    index.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body style="font-size:40px;text-align:center;">
        <a href="/we/wxLogin">微信公众 版权登录</a>
    </body>
    </html>

    index1.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body style="font-size:40px;text-align:center;">
       <div>登录成功!</div>
       <div>用户昵称: ${info.nickname}</div>
       <div>用户头像: <img style="vertical-align: top;" width="100" height="" alt="" src="${info.headimgurl}"></div>
       <div>登录成功!</div>
    </body>
    </html>

     

     

     

    截图配置信息

    写自己的域名。。。不要带http

    参考图2 截图配置信息  这里应该填   1afa5dc0.ngrok.io

    然后在浏览器输入地址访问,会显示需要在微信端进行访问.

    只需将地址换成二维码,扫描即可。如何换成二维码呢,我建议使用谷歌浏览器,方便,直接在地址栏右击,就会有二维码。扫一扫即可。

    微信扫描,点击授权,登录进去页面显示

    后台获取到的数据

    原理就是两个Servlet和两个JSP页面。一个是用户进入的登录页面,只不过不用输入用户名密码,直接授权登录。另外一个页面为展示用户的数据。两个Servlet配合JSP页面处理后台。

    这一次演示的是没有自己帐号体系,不需要绑定,直接登录。

    帐号体系的授权登录自行百度。

    展开全文
  • 微信公众号开发,原来这么简单?[java框架]

    万次阅读 多人点赞 2019-07-02 15:41:09
    Wx-tools是基于微信公众平台API的轻量级框架。 基于Wx-tools你可以开速开发一个订阅号/服务号的web应用后台。 博主最近终于有空!!已经更新到2.1.0啦!! GitHub仓库 下载wx-tools-2.1.0.jar wx-tools开发...

    终于有时间更新啦!!最新教程双手奉上!公众号开发之wx-tools+springboot应用实战-音乐爬虫推送[JAVA]

    下面都是旧的教程,建议参考上面最新的教程~~


    可能你不知道,有个框架叫wx-tools(小心翼翼地说)


    Wx-tools是基于微信公众平台API的轻量级框架。 基于Wx-tools你可以开速开发一个订阅号/服务号的web应用后台。
    博主最近终于有空!!已经更新到2.1.3啦!!
    GitHub仓库
    下载wx-tools-2.1.3.jar
    wx-tools开发文档及demo
    最近更新了开发文档,新增wx-tools接口代码写法。2017/4/14

    据说看到文档最后的都是真爱粉!
    不多说!讲讲使用wx-tools开发轻量级公众号到底有多简单?
    简单到哭


    就三步!

    1. 创建web工程,添加jar包及依赖
    2. 配置wx.properties
    3. 调用WxService来实现业务逻辑即可
      【WxService是实现了微信公众平台API入口所以调用非常简单】

    如果有过开发过基于微信公众平台API项目的小伙伴们,很容易上手哦!没有也没关系,戳这里看看官方文档入门


    先定个功能小目标:现在要实现一个答题小功能。

    ####一、 创建web工程,添加jar包及依赖

    我这里使用的是maven构建项目,可以在eclipse创建web项目。
    maven创建项目指令

    mvn archetype:generate -DgroupId=wxtools.demo -DartifactId=demo -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeCatalog=local
    

    注意:此指令创建的web工程版本是2.3的,比较低。可以修改web.xml,变成3.0

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
      <display-name>demo</display-name>
    </web-app>
    

    也可以直接用eclipse创建maven工程哦~

    创建完毕后,导入wx-tools-2.1.3.jar

    • 注意,导入后记得修改jar包的编码。window下默认读GBK,而框架本身是UTF-8。
      如果需要看源代码的务必手动修改编码。
      修改方式:在eclipse的工程下,对着jar包右键 –> Properties –> Encoding –> UTF-8

    建立基本的package,如图。
    [外链图片转存失败(img-xWPiv84C-1562053209917)(https://antgan.gitbooks.io/wx-tools/content/wx.jpg)]

    添加wx-tools依赖的jar包。

    如果使用maven构建项目,可以直接添加如下坐标下载依赖jar。

    <!-- 补全依赖 -->
        <!-- HttpClient -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.3.6</version>
        </dependency>
        <!-- http://mvnrepository.com/artifact/org.apache.httpcomponents/httpmime -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpmime</artifactId>
            <version>4.3.6</version>
        </dependency>
    
        <!-- JSON -->
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>
        <!-- XML -->
        <!-- http://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
        <dependency>
            <groupId>com.thoughtworks.xstream</groupId>
            <artifactId>xstream</artifactId>
            <version>1.4.7</version>
        </dependency>
        <!-- IO -->
        <!-- http://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
    

    如果不是maven构建的项目,可以自行下载相应的jar包,放在WEB-INF/lib文件夹下
    如果与项目中的jar包冲突或重复,只留一个就可以了~


    ####二、 配置wx.properties
    wx.properties是存放微信公众平台相关配置的。如AppId等。

    搭好项目基本框架后,在src/main/resources或者src/main/Java下新建wx.properties,如上图

    #配置如下,不要填错了哦!注意大小写。
    wx.appId=wxb1bff1627d37417bcc
    wx.appSecret=dd037d9b9b4eea00fba14167a9f3c75abc
    wx.token=antgan
    wx.aesKey=f82PVzQsKG5d8en3DwnZ8VVEoGInkmsWz3X3HsreEqe
    wx.mchId=
    wx.apiKey=
    

    ####三、调用WxService来实现业务逻辑
    这里有必要介绍一下wx-tools的四大组件。

    • WxMessageRouter 消息路由器
    • WxMessageMatcher(接口) 消息匹配器
    • WxMessageInterceptor (接口) 消息拦截器
    • WxMessageHandler (接口) 消息处理器

    这四大组件构成了对微信服务器发送过来的消息进行拓展性的处理。
    其中,以上三个是接口,开发者可实现并构建自己的匹配器,拦截器,处理器。
    更多的详情可以查看开发文档,对组件解释比较清楚。

    此外,还有几个类需要注意一下

    • WxConsts 类
      封装所有微信公众平台API的常量类型,包括接口请求路径,事件等。
    • WxConfig 类
      基本配置库。里面包含了AppId,AppSecret等信息。wx-tools已经提供了个基于内存管理的配置库。暂不支持自行拓展,如有需要持久化到数据库,需要自己实现。注意:配置库对于整个程序是单例的。
    • WxService 类
      微信统一的API Service入口,继承IService接口,所有接口都从这里调用。
    • WxErrorException 类
      微信异常
    • WxErrorExceptionHandler 接口
      开发者可自行实现该接口,处理微信异常

    理清了关系后,开始创建自定义匹配器Matcher


    1. 创建DemoMatcher.java 实现 WxMessageMatcher接口
    目的:拦截消息,如果是答案(答案是smart),就允许通行。否则匹配失败。不允许通过。

    /**
    * Demo 简单的匹配器,可以用于更加复杂的消息验证操作
    * @author antgan
    */
    public class DemoMatcher implements WxMessageMatcher{
      //答案是smart,如果匹配smart返回true;反之,false。
      public boolean match(WxXmlMessage message) {
          if(message.getContent().equals("smart")){
            return true;
          }
          return false;
      }
    }
    

    **2. 创建DemoInterceptor.java 实现 WxMessageInterceptor接口 **
    目的:拦截消息,验证用户条件,需要满足关注3天以上。

    /**
     * Demo 拦截器,可以做身份验证,权限验证等操作。
     * @author antgan
     */
    public class DemoInterceptor implements WxMessageInterceptor{
        public boolean intercept(WxXmlMessage wxMessage, Map<String, Object> context, IService wxService)
                throws WxErrorException {
            //可以使用wxService的微信API方法
            //可以在Handler和Interceptor传递消息,使用context上下文
            //可以实现自己的业务逻辑
    
            //这里就不编写验证关注三天以上的用户了
            if(/*用户关注时长大于3天*/){
                return true;
            }
            return false;
        }
    }
    

    **3. 创建类DemoHandler.java 实现 WxMessageHandler接口 **
    目的:如果满足以上条件的用户消息,返回字符串“恭喜你中奖了”

    /**
     * Demo 处理微信消息Handler
     * @author antgan
     */
    public class DemoHandler implements WxMessageHandler {
        //wxMessage 消息 | context 上下文 | WxService API对象
        public WxXmlOutMessage handle(WxXmlMessage wxMessage, Map<String, Object> context, IService wxService) throws WxErrorException {
            WxXmlOutMessage xmlOutMsg = null;
            //必须以build()作为结尾,否则不生效。
            if(wxMessage.getMsgType().equals(WxConsts.XML_MSG_TEXT)){
                xmlOutMsg = WxXmlOutMessage.TEXT().content("恭喜你中奖了").toUser(wxMessage.getFromUserName()).fromUser(wxMessage.getToUserName()).build();
            }
            return xmlOutMsg;
        }
    }
    

    **4. 创建servlet,名为DemoServlet.java **
    当然你也可以使用SpringMVC,是一样的。对应的是Controller【建议使用SpringMVC】
    目的:接收微信服务器发来的消息,并传入指定路由器中。

    /**
     * <pre>
     * Demo Servlet
     * 如果使用的是SpringMVC,也是类似这样的写法~
     * 
     * 注意:WxConfig请调用getInstance()
     * 因为对于全局是唯一的。采用单例模式。
     * </pre>
     * 
     * @author antgan
     * @date 2016/12/15
     *
     */
    @WebServlet("/wx")
    public class DemoServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
        // 实例化 统一业务API入口
        private IService iService = new WxService();
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // 验证服务器的有效性
            PrintWriter out = response.getWriter();
            String signature = request.getParameter("signature");
            String timestamp = request.getParameter("timestamp");
            String nonce = request.getParameter("nonce");
            String echostr = request.getParameter("echostr");
            if (iService.checkSignature(signature, timestamp, nonce, echostr)) {
                out.print(echostr);
            }
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            request.setCharacterEncoding("UTF-8");
            response.setCharacterEncoding("UTF-8");
            // 返回消息给微信服务器
            PrintWriter out = response.getWriter();
    
            // 创建一个路由器
            WxMessageRouter router = new WxMessageRouter(iService);
            try {
                // 微信服务器推送过来的是XML格式。
                WxXmlMessage wx = XStreamTransformer.fromXml(WxXmlMessage.class, request.getInputStream());
                System.out.println("消息:\n " + wx.toString());
                // 添加规则;这里的规则是所有消息都交给DemoMatcher处理,交给DemoInterceptor处理,交给DemoHandler处理
                // 注意!!每一个规则,必须由end()或者next()结束。不然不会生效。
                // end()是指消息进入该规则后不再进入其他规则。 而next()是指消息进入了一个规则后,如果满足其他规则也能进入,处理。
                router.rule().matcher(new DemoMatcher()).interceptor(new DemoInterceptor()).handler(new DemoHandler())
                        .end();
                // 把消息传递给路由器进行处理
                WxXmlOutMessage xmlOutMsg = router.route(wx);
                if (xmlOutMsg != null)
                    out.print(xmlOutMsg.toXml());// 因为是明文,所以不用加密,直接返回给用户。
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                out.close();
            }
        }
    }
    

    就是这么简单。通过可定制的Matcher,Interceptor,Handler可以实现更加复杂的业务需求。

    对于一条来自微信服务器发来的消息,Interceptor和Handler其实定义多个来同时处理。更加灵活好用。更多详情还是得看wx-tools文档。讲得详细。


    最后效果图。
    这里写图片描述


    ###博主有话说
    大学的尾巴悄悄来临,我也顺利找到了实习和工作。闲暇期间,想起wx-tools的问题还没解决。
    (舍友写项目用了我的wx-tools出现了线程爆炸,难以使用,文档不全等现象。但忙于找工作就放着wx-tools不管了)
    终于有时间了,静下心来。看看别人优秀的源代码。心想着我的wx-tools就应该是简单易用,轻量级可拓展。于是,wx-tools-2.1.0.jar又诞生了。

    相比之前的wx-tools。这个版本比较大的变化如下:

    • 更简化的配置(wx.properties文件来配置)。
    • 更加简单简约的使用方法(链式编程!酷炫!)
    • 去掉了线程池。(就是这玩意导致舍友项目爆炸了)
    • 去掉了鸡肋的重复消息检查器(Checker)。(当初为什么要加检查重复消息呢?黑人问号???)
    • jssdk的支持。(不支持微信小店)

    哎!其实对比了几个微信公众平台开发框架,wx-tools走的路线完全不同。不知道大家喜不喜欢呢~ 喜欢希望你给我star咯~wx-tools Github戳这里!!给星星!爱你么么哒!

    我也创了个QQ群(一群:570937047【已满】,二群:577984291),欢迎大家加入,讨论JAVA开发或者对酒当歌。

    最后!欢迎大家提BUG或者pull request!小弟能力不足!就这样了!


    博主建议使用最新版的jar。同时更新了开发文档–接口用法

    • 新增群发接口及模板消息接口。
    • 支付接口测试阶段。不建议使用。

    更新与2017/4/14


    啊啊啊官方把用户组变成了用便签管理了,wx-tools近期会更新。跟上组织的步伐。

    – 更新与2017/6/20

    展开全文
  • —–> 发送页面授权请求到微信后台 —–>得到code发送到 我们服务器后台的url —–> 将code参数发送到微信后台获取用户的openid返回服务器上的页面(也可以直接获取用户头像等基本信息。。需用户点击同意授权)菜单...
  • 一、开通微信公众号 1.1公众平台帐号类型 微信公众平台分为服务号、企业号、订阅号。 1、订阅号:主要偏于为用户传达资讯(类似报纸杂志),认证前后都是每天只可以群发一条消息; 2、服务号:主要偏于服务...
  • java微信公众号开发框架 微信开发框架 快速开发
  • 微信上传图文消息报错:{ errcode: 40007, errmsg: 'invalid media_id hint: [klcWoA0078ure1]' }
  • 本部分需要用到微信的JS-SDK,微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以...
  • 微信公众号开发《二》发送模板消息实现消息业务实时通知微信公众号开发《三》微信JS-SDK之地理位置的获取,集成百度地图实现在线地图搜索 本次讲解微信开发第四篇:调用微信JS-SDK实现上传手机图片到服务器,是非常...
  • 微信公众账号登陆授权开发——2

    千次阅读 2015-08-27 10:26:05
    微信公众账号登陆授权开发
  • https://www.w3cschool.cn/weixinkaifawendang/vwop1qcq.html
  • 具体代码实现如下:depositPay.jsp(/wechat/jsapisign部分的验签在这里就不讲述了,在微信公众号开发之调起微信扫一扫接口中有详细介绍)&lt;%@ page contentType="text/html;charset=UTF-8" ...
  • 微信小程序学习资料[转]

    千次阅读 2017-05-11 16:08:03
    微信小程序开发资源汇总目录 官方文档 新闻报道 社区 工具 插件 分析 讨论 教程 视频教程 文章 代码 轮子 置顶 小程序开发者社区 :100: WePY:组件化的小程序开发框架 :100: ZanUI-WeApp: 高颜值、好用、易扩展的...
  • 手机端网页-微信授权登录

    万次阅读 2017-12-20 19:31:34
    近期有一个M站微信登录需求,了解了下微信网页授权登录功能: 参考文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 1、创建j2ee项目:weixinAuth 2、增加引入jar文件。 注意:jar包的...
  • 公众号支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付。应用场景有:1、 用户在微信公众账号内进入商家公众号,打开某个主页面,完成支付2、用户的好友...
  • 在上一篇文章写了如何配置服务器:...要实现消息获取和自动回复,需要了解微信是怎么实现这个过程:接收普通消息当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。文本消息...
  • 这篇是微信公众号开发小记的第二篇,承接上一篇,此次将完成如下主要功能 对接微信服务器和自己的服务器 需要的“材料” 到这里需要梳理一下都需要什么东西,以便在整个编码的过程中方便我们自己,首先...
  • 参考微信JS-SDK说明文档 尽管作用不是很大1.首先在JSP页面引入http://res.wx.qq.com/open/js/jweixin-1.1.0.js2.通过config接口注入权限验证配置
  • 官方文档 准备工作:已通过微信认证的公众号,必须通过ICP备案域名(否则会报支付失败) 借鉴了很多大神的文章,在此先谢过了 整个支付流程,看懂就很好写了 一、设置支付目录 在微信公众平台设置您的公众号...
1 2 3 4 5 ... 20
收藏数 1,319
精华内容 527
关键字:

w3c 微信公众号开发文档api