笔者最近在为一个艺考服务团队开发手机端的服务,由于开发app需要的时间较长,所以选择开发微信公众号。本人比较擅长Java开发,所以本文是基于Java语言的公众号开发。话不多说,直接进入正题。

准备工作:

一、在微信公众平台申请账号

百度搜索微信公众平台,点击注册,通过邮箱注册成功后会看到如下画面。

在这里,选择类型时要注意下。如果你是个人开发的话只能选择订阅号,订阅号没有自定义菜单等接口,具体接口权限你可以登录公众平台后在开发--->接口权限中看到。如果你想拥有自定义菜单等接口,需要注册服务号,但是服务号只能企业、组织等注册。本人想做的公众号是要求有自定义菜单的,并且委托我开发的团队是一家公司,所以注册的服务号。无论你是订阅号还是服务号都不影响本文的阅读。

注册完登录进入公众平台,微信会给你分配属于你的AppID和AppSecret,在开发--->基本配置中可以看到。有了这两个ID和密钥你就可以开发你的公众号了。以上为准备工作。

代码编写

一、创建自定义菜单(不需要自定义菜单的读者可以跳过该节)

本文中没有使用Java框架,采用的是原生jdbc和servlet,这样可以确保在云服务器配置有限的情况下提升公众号的响应速度。

新建CreateMenuServlet,该servlet用于创建自定义菜单。doGet方法中的代码如下:

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

// 第三方用户唯一凭证  
        String appId = "你的APPID";  
        // 第三方用户唯一凭证密钥  
        String appSecret = "你的appSecret";  
  
        // 调用接口获取access_token  
        AccessToken at = WeixinUtil.getAccessToken(appId, appSecret);  
  
        if (null != at) {  
            // 调用接口创建菜单  
            int result = WeixinUtil.createMenu(getMenu(), at.getToken());  
  
            // 判断菜单创建结果  
            if (0 == result){
            response.setContentType("text/html;charset=UTF-8");  
            PrintWriter pw = response.getWriter();  
           pw.println("菜单创建成功!");  
           pw.flush();     
            }else{
            response.setContentType("text/html;charset=UTF-8");  
            PrintWriter pw = response.getWriter();  
           pw.println("菜单创建失败,错误码:" + result);  
           pw.flush();     
            }   
        }
}

AccessToken类代码如下:

public class AccessToken {
// 获取到的凭证  
    private String token;  
    // 凭证有效时间,单位:秒  
    private int expiresIn;  
  
    public String getToken() {  
        return token;  
    }  
  
    public void setToken(String token) {  
        this.token = token;  
    }  
  
    public int getExpiresIn() {  
        return expiresIn;  
    }  
  
    public void setExpiresIn(int expiresIn) {  
        this.expiresIn = expiresIn;  
    }  
}

WeixinUtil类主要功能是用于调用微信提供的接口来创建菜单,因全部代码过长,不便贴出,会在后面的源码中给出。

getMenu方法代码如下,其中Menu、CommonButton等是我自定义的类,它可以实现一级菜单、二级菜单等效果。每一个按钮都有它自己的Type和key,type用于说明该按钮的类型,即点击之后回复消息还是跳转网页;key用于唯一定义该按钮,后面会通过这个key来判断哪个按钮被点击了。

private static Menu getMenu() {  
        CommonButton btn11 = new CommonButton();  
        btn11.setName("个人信息查看");  
        btn11.setType("click");  
        btn11.setKey("stuInfoView");  
  
        CommonButton btn12 = new CommonButton();  
        btn12.setName("个人信息修改");  
        btn12.setType("click");  
        btn12.setKey("stuInfoEdit"); 
  
        CommonButton btn21 = new CommonButton();  
        btn21.setName("行程查看");  
        btn21.setType("click");  
        btn21.setKey("stuTravelView");  
  
        CommonButton btn22 = new CommonButton();  
        btn22.setName("行程添加");  
        btn22.setType("click");  
        btn22.setKey("stuTravelAdd");  
  
        CommonButton btn23 = new CommonButton();  
        btn23.setName("行程修改");  
        btn23.setType("click");  
        btn23.setKey("stuTravelEdit");  
  
        ComplexButton mainBtn1 = new ComplexButton();  
        mainBtn1.setName("个人信息");  
        mainBtn1.setSub_button(new Button[] { btn11, btn12});  
  
        Menu menu = new Menu();  
        menu.setButton(new Button[] { mainBtn1, mainBtn2, mainBtn3 });  
  
        return menu;  
    }

在浏览器中运行localhost:8080/WechatDemo/CreateMenuServlet,如果页面显示“菜单创建成功!"说明菜单已创建,在公众号中效果如下图:

二、接收消息并作出响应

新建EastnetServlet,该Servlet用于公众号接收用户的消息并作出响应返回给用户。

doGet方法代码如下:

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("接口测试开始!!!");
//微信加密签名
String signature = request.getParameter("signature");
//时间戳
String timestamp = request.getParameter("timestamp");
//随机数
String nonce = request.getParameter("nonce");
//随机字符串
String echostr = request.getParameter("echostr");

PrintWriter out = response.getWriter();
//通过校验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
if(SignUtil.checkSignature(signature,timestamp,nonce)){
out.print(echostr);
}
out.close();
out = null;
}

SignUtil类中checkSignature方法代码如下:

private static String token  = "你的token";

public static boolean checkSignature(String signature, String timestamp,
String nonce) {
String[] arra = new String[]{token,timestamp,nonce};
//将signature,timestamp,nonce组成数组进行字典排序
Arrays.sort(arra);
StringBuilder sb = new StringBuilder();
for(int i=0;i<arra.length;i++){
sb.append(arra[i]);
}
MessageDigest md = null;
String stnStr = null;
try {
md = MessageDigest.getInstance("SHA-1");
byte[] digest = md.digest(sb.toString().getBytes());
stnStr = byteToStr(digest);
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//释放内存
sb = null;
//将sha1加密后的字符串与signature对比,标识该请求来源于微信
return stnStr!=null?stnStr.equals(signature.toUpperCase()):false;
}

token设置在开发--->基本配置中有Token(令牌),上面的token要和公众号中设置的token一致。

以上doGet方法中的代码是用于确认请求来源于微信服务器,满足微信API。

doPost方法中代码如下:

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//消息的接受、处理、响应
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
//调用核心业务类型接受消息、处理消息
String respMessage = EastnetService.processRequest(request);

//响应消息
PrintWriter out = response.getWriter();
out.print(respMessage);
out.close();
}

doPost中用于处理接收到的消息,其中EastnetService为业务层,专门用于处理消息并作出响应。

EastnetService中processRequest方法部分代码如下:

public static String processRequest(HttpServletRequest request) {
String respMessage = null;
//默认返回的文本消息类容
String respContent = "请求处理异常,请稍后尝试!";
String fromUserName="";
String toUserName ="";
String msgType ="";
try {
//xml请求解析
Map<String,String> requestMap = MessageUtil.pareXml(request);

//发送方账号(open_id)
fromUserName = requestMap.get("FromUserName");
//公众账号
toUserName = requestMap.get("ToUserName");
//消息类型
msgType = requestMap.get("MsgType");
// String eventType = requestMap.get("Event");
String fromContent=requestMap.get("Content");
String userName="";
if((MessageUtil.REQ_MESSSAGE_TYPE_EVENT).equals(msgType)){
// 事件类型
String eventType = requestMap.get("Event");
if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {
// 事件KEY值,与创建自定义菜单时指定的KEY值对应
String eventKey = requestMap.get("EventKey");
if ("stuInfoEdit".equals(eventKey)) {//个人信息修改
respContent=new OperatorUtil().editStuInfo(fromUserName);
}else if("stuInfoView".equals(eventKey)){
respContent=new OperatorUtil().viewStuInfo(fromUserName);
}else if("stuTravelView".equals(eventKey)){//行程查看
respContent=new OperatorUtil().viewTravel(fromUserName);
}else if("stuTravelAdd".equals(eventKey)){//行程添加
respContent=new OperatorUtil().addTravel(fromUserName);
}else if("stuTravelEdit".equals(eventKey)){//行程修改
respContent=new OperatorUtil().editTravel(fromUserName);
}else{
respContent="请求失败";
}
}
}
//订阅
String eventTypeSub = requestMap.get("Event");
if((MessageUtil.EVENT_TYPE_SUBSCRIBE).equals(eventTypeSub)){
respContent = "景程教育欢迎您的到来! \n 回复\"用户名绑定\"+登录用户名  如:用户名绑定fangw  可完成账号绑定!\n 只有绑定账号后才可以实现接下来的操作";
}
//回复文本消息
TextMessage textMessage = new TextMessage();
textMessage.setToUserName(toUserName);
textMessage.setFromUserName(fromUserName);
textMessage.setCreateTime(new Date().getTime());
textMessage.setMsgType(MessageUtil.RESP_MESSSAGE_TYPE_TEXT);
textMessage.setFuncFlag(0);
StringBuffer sb=new StringBuffer();
respMessage=("<xml><ToUserName><![CDATA["+requestMap.get("FromUserName")+
"]]></ToUserName>"+"<FromUserName><![CDATA["+requestMap.get("ToUserName")
+"]]></FromUserName><CreateTime>"+System.currentTimeMillis()+"</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA["+respContent+"]]></Content></xml>");
} catch (Exception e) {
respMessage=("<xml><ToUserName><![CDATA["+fromUserName+
"]]></ToUserName>"+"<FromUserName><![CDATA["+toUserName
+"]]></FromUserName><CreateTime>"+System.currentTimeMillis()+"</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA["+respContent+"]]></Content></xml>");
}
return respMessage;
}

上面代码中MessageUtil.pareXml用于解析request中携带的内容,将fromUserName、toUserName、msgType等内容解析出来,用于公众号对消息作出响应。OperatorUtil类用于操作数据库,暂且不用管。respMessage是公众号发送给用户的响应消息,要满足微信api要求的xml格式。

以上就是基于Java的微信公众号开发实例,具体效果如下:

源码地址:http://download.csdn.net/detail/fanguoddd/9746510

没有下载积分的童鞋看这里!!!扫描公众号二维码免费获取。公众号二维码:

                                        

欢迎在评论区留言,我会尽快回复~~~

最后,打波广告。微信搜索公众号"购即省",淘宝购物领券,购物即省钱。

Java微信公众号开发(附源码!!!)相关推荐

  1. java微信公众号开发及源码分享

    java微信公众号开发源码下载 刚做完微信公众号项目,分享一下代码,经验!初写博客,格式写得不好,还请见谅.有不懂的可以留言或加qq 505281494交流下. 一. 第一步进行服务器接口配置,提交信 ...

  2. 慕课网_《Java微信公众号开发进阶》学习总结

    时间:2017年08月12日星期六 说明:本文部分内容均来自慕课网.@慕课网:http://www.imooc.com 教学源码:http://img.mukewang.com/down/... 学习 ...

  3. java微信公众号开发token验证失败的问题及解决办法

    java微信公众号开发token验证失败的问题及解决办法 参考文章: (1)java微信公众号开发token验证失败的问题及解决办法 (2)https://www.cnblogs.com/beardu ...

  4. Java微信公众号开发梳理

    Java微信公众号开发梳理 现在微信公众平台的开发已经越来越普遍,这次开发需要用到微信公众平台.因此做一个简单的记录,也算是给那些没踩过坑的童鞋一些启示吧.我将分几块来简单的描述一下,之后会做详细的说 ...

  5. 微信公众号引流源码?基本上没啥用!

    简介: 微信公众号引流源码?基本上没啥用! 这套源码可以对接微信公众号,给公众号引流也是个不错的选择 源码的bug基本上我都已经修复了,可以正常使用. 附带网盘下载地址: http://www.rry ...

  6. Java微信公众号开发微信网页授权之前端传递code方式获取用户信息

    本片博客讲解的网页授权分为两步,前端先传递backUrl(回调地址)到后台网页授权接口,该接口拿到回调地址后组装授权连接,重定向到前端页面,前端页面截取Code,传入后端获取用户信息方法,获取用户信息 ...

  7. Java微信公众号开发(一:接入平台,验证token)

    Java微信公众号开发(一:接入平台,验证token) 开发环境: 环境:JDK1.8 框架:springBoot 首先,在我们接入微信公众平台之前,我们需要注册微信公众号的开发者账号,获取开发者ID ...

  8. 分享一套微信门户应用管理系统源码 微信公众号平台开发框架源码

    微信门户开发框架源码 微信公众号平台开发框架源码 源码分享,需要源码学习可私信我获取. 微信门户应用管理系统,采用基于 MVC + Bootstrap + Ajax + Enterprise Libr ...

  9. JAVA微信公众号开发第8篇JSSDK图片上传预览

    简介 博主微信JSSDK&图片上传预览基于微信分享做拓展,所以一些配置操作请点击查阅JAVA微信公众号开发第7篇JSSDK&微信分享博文 页面 <html><head ...

最新文章

  1. PowerTip of the Day from powershell.com上周汇总(六)
  2. 4 张动图解释为什么(什么时候)使用 Redux
  3. 5分钟带你了解Kafka的技术架构 | 技术头条
  4. (48)Xilinx Adder IP核配置(九)(第10天)
  5. 0基础学python做什么工作好-零基础自学多久Python可以找什么工作
  6. AcWing 1969. 品种邻近(滑动窗口+枚举)
  7. 基于SIR模型的疫情预测 matlab
  8. MATLAB人脸识别算法
  9. windows安全中心接口
  10. C#中解决PC端程序多开的问题
  11. 【很简单的教程】如何提取模型每层的特征【以ResNet为例】
  12. python图形编程复选按钮和单选按钮详细说明_python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例...
  13. ICLR 2020 图神经学习论文汇总
  14. C#中使用正则表达式验证电话号码、手机号、身份证号、数字、邮编、时间(仅年月日)、邮箱、小数的正则表达式...
  15. Resource compilation failed. Check logs for details.
  16. ReactNative 公共脱敏处理js 包括银行卡 身份证号 手机号企业名称 营业执照 邮箱号码 等等
  17. mysql 复制frm_如何通过直接复制frm文件以实现恢复/复制innodb数据表
  18. c语言快排过程,快速排序(快排)C语言实现
  19. 普通投资者如何进行量化投资
  20. BookReader

热门文章

  1. VIRTIO 前后端驱动中 GPA,HVA 转换原理
  2. Java-Python对垒之质数计算
  3. 苹果浏览器分辨率css,苹果(Safari)浏览器的图片width设置为100%但实际显示为980px改成的问题方法...
  4. 计算机组成原理多级先行进位,计算机组成原理—最系统的算机基础知识.ppt
  5. 手机nfc的简单使用
  6. Facebook like 按钮的语言设置
  7. 微型计算机 2018 12月下,桌面CPU天梯图2018年12月最新版 十二月台式电脑处理器排名...
  8. HBuilder X 未检测到手机或模拟器(安卓端)
  9. 外地父母常住北京-医疗问题-新农合北京就医实时结算
  10. jquery解绑、绑定笔记