Java微信公众号开发(附源码!!!)

笔者最近在为一个艺考服务团队开发手机端的服务,由于开发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

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

                                        

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

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/37876.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java微信公众号发送消息-保姆级教程附源码

目录 1. 概念说明&#xff1a; 2. 开发准备&#xff1a; 3. 测试demo&#xff08;更改配置信息即可使用&#xff09; 3.1. 服务器配置 3.1.1.配置填写说明 3.1.2.校验服务器有效性: 3.1.3.URL后端接口代码和校验代码&#xff08;servlet) 3.1.4.配置内网穿透&#xff0c;…

最新PHP微信扫码关注公众号并授权登录源码

正文: PHP微信扫码登录看起来简单&#xff0c;但做起来有点麻烦&#xff0c;开发起来就会浪费很多的时间。 PHP判断是否首次关注公众号&#xff0c;扫码关注公众号获取微信用户头像、openid和省市等信息源码。 第一步&#xff1a;获取关注二维码ticket,并且传参二维码qrcode…

大模型“涌现”的思维链,究竟是一种什么能力?

听说最近AI大厂的开发人员和高校的NLP研究人员&#xff0c;都在琢磨&#xff0c;怎么让大模型“涌现”。那画面莫名就让我想到了程序员给服务器上香来保佑不宕机&#xff0c;都有种求诸于天的玄学。 所谓“涌现”,在大模型领域指的是当模型突破某个规模时&#xff0c;性能显著提…

云原生是什么?细数云原生的5大特征

云原生是什么&#xff1f;细数云原生的5大特征 00 云原生是什么&#xff1f;01 轻、快、不变的基础设施02 弹性服务编排03 开发运营一体化04 微服务架构05 无服务模型小结 来源&#xff1a;大数据DT 导读&#xff1a;随着公有云和私有云的广泛部署&#xff0c;云计算基础设施成…

1分钟快速了解芝数云“大数据”实训场景!

点击蓝字&#xff0c;关注我们 大数据集群搭建耗时长&#xff1f;电脑挂机后中断&#xff0c;无法恢复进度怎么办&#xff1f;大数据集群搭建循环反复&#xff0c;永远停留在第一步&#xff1f;大数据实训过程中&#xff0c;一步错步步错&#xff0c;只能从头开始... ... 芝诺数…

产品更新 | 芝数云全新升级 打造线上教学新体验!

点击蓝字 关注我们 - The World AIDS Day - - 芝 数 云 升 级 啦 - 为了教师更加方便的开展教学工作&#xff0c;学生更加便捷的进行上课&#xff0c;数字素养与技能提升平台于12月12日晚全面升级&#xff0c;从页面以及性能方面进行了优化&#xff0c;整体焕然一新。 焕…

推动数云融合,神州数码要做企业领先的数字化转型合作伙伴

众所周知&#xff0c;伴随着数字经济的蓬勃发展&#xff0c;各种数字技术创新正在给传统行业带来颠覆式的变革&#xff0c;数字化转型也成为了广大企业未来发展的必经之路。 那么问题就来了&#xff1a;面对新时代的数字化大潮&#xff0c;企业应该选择一条怎样的数字化转型之路…

数云运维总监陈延宗:基于阿里云计算巢,数云CRM一键云上交付

12月21日&#xff0c;在弹性计算年度峰会上&#xff0c;数云CRM运维总监陈延宗发表了主题为《计算巢最佳实践--数云CRM一键云上交付》的演讲&#xff0c;介绍了数云CRM在阿里云计算巢平台的最佳实践。 图&#xff1a;数云CRM运维总监陈延宗 01 传统交付的四个痛点 数云目前已发…

校历第九周 cf+数云图杯 做题笔记

CF1754 A. Technical Support &#xff08;思维、模拟、贪心&#xff09; https://codeforces.com/contest/1754/problem/A /** Author: xiao-p* Date: 2022-10-27 20:31:41* LastEditors: wzp 304535326qq.com* LastEditTime: 2022-10-27 20:46:10* Description: 304535326q…

百数云最新功能webAPI推送数据样例

百数云最新增加了webAPI数据推送的功能。 必须有数据推送的样例才能进行进一步处理,下面是我得到的推送的数据样例。 # 测试数据触发 {} # 新增数据触发 {eventType: data_create.web.one,eventData: {fieldsData

新生代采集器“易数云”--入门版教学

**背景&#xff1a;**现如今很多白领或学生一族&#xff0c;迫于工作或者学习的压力&#xff0c;经常会需要一些数据作为工作或者学习上的用途。碍于市面上常见的采集器“编写爬虫规则难又或者数据费用高”的压力&#xff0c;很多人望而兴叹。今天我们就为大家带来一款比较容易…

驭数云低代码平台简介

1.1 驭数云低代码平台简介 1.概述 编码枪代码生成器是目前国内第一家从运维到开发都在线上完成的代码生成器。通过简单的在线设计&#xff0c;便可完成70%左右的网站或APP项目的开发任务&#xff0c;编码枪使用说明书将会带你了解代码生成器的使用&#xff0c;使本产品更加易…

数云融合打造数字化新引擎!

本期作者&#xff1a;李刚 神州数码集团 副总裁 CTO 几年前&#xff0c;一颗新星在汽车制造领域可谓是“横空出世”&#xff0c;一举成为全球市值最大的车企&#xff0c;开启了世界新能源汽车的新潮流。这&#xff0c;就是特斯拉。 短短几年内取得如此卓越成就&#xff0c;特斯…

聊天机器人简要理解

聊天机器人 身边的同事或多或少都在聊ChatGPT&#xff0c;这又使得学生时代训练模型的恐惧感开始支配我。说起聊天机器人&#xff0c;我们先熟悉一下不同对话系统的概念。 一、对话系统分类 1、单轮对话 单轮与传统的问答系统相类似&#xff0c;是智能对话系统的初级应用。…

如何让ChatGPT学习销售过往文字稿,并自动分析话术的优缺点,然后修改?

该场景对应的关键词库&#xff08;13个&#xff09;&#xff1a; 产品特点、服务优势、目标客户需求和痛点、行业与市场的趋势变化、竞争对手的优劣势、销售场景的特点和要求、销售环境、销售氛围、时间、地点、客户情感需求、心理转态、个性特点、解决方案 提问模板&#xf…

chatgpt赋能python:PythonIP匹配

Python IP匹配 随着互联网的不断发展&#xff0c;IP地址已成为人们最常使用的一种网络标识。在网络分析和开发中&#xff0c;经常会用到IP地址的相关操作&#xff0c;如IP地址的匹配。Python作为一种性能比较好的语言&#xff0c;也可以很好地完成IP地址的匹配工作。本文将介绍…

chatgpt赋能python:Python查看局域网内所有IP

Python查看局域网内所有IP Python是一种流行的编程语言&#xff0c;可用于网络编程和系统管理。Python程序可以访问本地网络并查找设备。如果您需要查找局域网中的所有IP地址&#xff0c;Python是一个非常方便的工具。在本文中&#xff0c;我们将介绍如何使用Python编写程序以…

chatgpt赋能Python-python_ip摄像头

Python IP摄像头介绍 IP摄像头技术的快速发展&#xff0c;使得越来越多的人开始使用IP摄像头来保护家庭、企业和公共场所的安全。Python语言的简洁、优雅和易于学习&#xff0c;使得它成为越来越多人选择的编程语言。在本文中&#xff0c;我们将介绍如何使用Python编程来控制I…

chatgpt赋能python:Python输入IP地址

Python 输入IP地址 在网络技术中&#xff0c;IP地址是每一个网络设备在互联网中的唯一身份标识。IP地址代表Internet协议&#xff08;IP&#xff09;网络中的一个设备&#xff0c;可以是计算机或其他设备。在Python中输入IP地址时&#xff0c;通常使用.来分隔数字&#xff0c;…

chatgpt赋能Python-python_ping_ip

Python Ping IP - 介绍 Python是一种高级编程语言&#xff0c;因其简单易学、代码可读性高和可扩展性强而备受青睐。Python可以用于各种不同的应用程序和项目&#xff0c;其中之一就是网络管理和监控。在这篇结合SEO的文章中&#xff0c;我们将探讨如何使用Python ping IP地址…