微信公众平台的Java的开发详解(工程代码+解析)

合集下载

微信公众号开启服务器配置JAVA

微信公众号开启服务器配置JAVA

微信公众号开启服务器配置JAVA第⼀步:了解配置(建议先不要⽴即配,完成步骤⼆后再配置)URL 是⽤来接收公众号的消息回调和事件回调的;Token 由开发者可以任意填写,只⽤于⾸次微信校验服务器⽤,校验通过后就没⽤了;EncodingAESKey 由开发者⼿动填写或随机⽣成,将⽤作回调消息体加解密密钥,如果设置了兼容模式(明⽂密⽂共存)=> 可以⽤EncodingAESKey 来加密明⽂得到密⽂,和微信的密⽂⽐较来校验接收数据的安全性;安全模式(只有密⽂,需要解密),⽤EncodingAESKey 解密得到微信的消息体;第⼆步:验证消息来⾃微信服务器在微信公众平台配置好服务器信息后,微信服务器将⽴即发送GET请求到填写的服务器地址URL上(其他的消息回调都是POST),我们要校验微信的信息,并按⽂档规定返回;⾄此我们配置的服务器就配置成功了;此步骤具体代码:public String weChatOffiaccountCheckCallback(String echostr, String signature, String timestamp, String nonce) {String[] valueArray = new String[]{"配置的Token", timestamp, nonce};Arrays.sort(valueArray);String s = StringUtils.join(valueArray);String encode = DigestUtils.sha1Hex(s);return signature.equals(encode) ? echostr : "fail";}第三步:在微信公众平台配置服务器信息(就是第⼀步的三个配置项)。

微信公众平台的Java的开发详解(工程代码+解析)

微信公众平台的Java的开发详解(工程代码+解析)

公众平台的Java的开发详解(工程代码+解析) 公众平台的Java的开发详解(工程代码+解析)本文档旨在提供一个详细的指南,以帮助开发人员了解并使用Java开发公众平台。

文档将涵盖各种主题,从准备工作到最终部署,涵盖了整个开发过程的方方面面。

以下是本文档的章节内容:1、简介1.1 公众平台概述1.2 Java开发环境搭建2、接入公众平台2.1 注册公众号2.2 开发模式选择2.3 消息管理2.4 事件管理2.5 接口调用3、开发工具和框架3.1 使用SpringBoot快速开发公众平台应用3.2 使用SpringMVC和MyBatis开发公众平台应用3.3 使用其他Java框架进行开发4、实现功能模块4.1 用户管理4.2 消息管理4.3 自定义菜单4.4 素材管理4.5 数据统计5、部署和调试5.1 本地部署5.2 远程部署5.3 调试技巧6、性能优化和安全防护6.1 缓存优化6.2 请求合并6.3 安全配置6.4 防护策略7、注意事项和常见问题7.1 开发注意事项7.2 常见问题解答8、附录8.1 附录A: 示例代码8.2 附录B: API文档说明8.3 附录C: 数据库设计本文涉及附件包括示例代码、API文档说明和数据库设计等,可通过以下获取:[附件]本文所涉及的法律名词及注释:1、公众号:指通过公众平台创建的账号,用于向用户提供服务。

2、开发模式:指公众号的运作模式,包括订阅号、服务号和企业号等。

3、消息管理:指对公众号接收和发送的消息进行处理和管理的功能。

4、事件管理:指对用户与公众号的交互事件进行处理和管理的功能。

5、接口调用:指通过公众平台提供的API接口进行数据的获取和操作。

感谢您阅读本文档,希望能为您的公众平台Java开发提供帮助。

如有任何疑问或建议,请随时与我们联系。

微信公众平台发送模板消息(Java接口开发)

微信公众平台发送模板消息(Java接口开发)

微信公众平台发送模板消息(Java接⼝开发)前⾔:最近⼀直再弄微信扫码推送图⽂消息和模板消息发送,感觉学习到了不少东西。

今天先总结⼀下微信公众平台模板消息的发送。

因为这个⾃⼰弄了很久,开始很多地⽅不明⽩,所以今天好好总结⼀下。

微信公众平台技术⽂档:⼀、概述模板消息仅⽤于公众号向⽤户发送重要的服务通知,只能⽤于符合其要求的服务场景中,如信⽤卡刷卡通知,商品购买成功通知等。

不⽀持⼴告等营销类消息以及其它所有可能对⽤户造成骚扰的消息。

关于使⽤规则,请注意:1、所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的⼊⼝,但只有认证后的服务号才可以申请模板消息的使⽤权限并获得该权限;2、需要选择公众账号服务所处的2个⾏业,每⽉可更改1次所选⾏业;3、在所选择⾏业的模板库中选⽤已有的模板进⾏调⽤;4、每个账号可以同时使⽤25个模板。

5、当前每个账号的模板消息的⽇调⽤上限为10万次,单个模板没有特殊限制。

【2014年11⽉18⽇将接⼝调⽤频率从默认的⽇1万次提升为⽇10万次,可在MP登录后的开发者中⼼查看】。

当账号粉丝数超过10W/100W/1000W时,模板消息的⽇调⽤上限会相应提升,以公众号MP后台开发者中⼼页⾯中标明的数字为准。

关于接⼝⽂档,请注意:1、模板消息调⽤时主要需要模板ID和模板中各参数的赋值内容;2、模板中参数内容必须以”.DATA”结尾,否则视为保留字;3、模板保留符号”{{ }}”。

看微信公众平台接⼝⽂档最开始我的内⼼是崩溃的,因为⽬录列表⼀开始就是设置所属⾏业,获取所属⾏业信息等。

后来整理思路,我们主要负责的功能的实现,就不去考虑那么多其他的内容,直接弄模板消息的发送。

但是发送模板之前有⼀个很重要的步骤,就是模板ID(template_id)。

微信公众平台发送模板消息有严格的要求,参考。

⼆、模板消息的设计这⾥是依靠微信公众平台测试公众号的模板消息接⼝来设计消息模板,通过⾏业类型来获取模板的同学还是参考微信公众平台的官⽅⽂档来学习。

微信公众平台的Java的开发详解工程代码解析

微信公众平台的Java的开发详解工程代码解析

说明:本次的教程主要是对微信公众平台开发者模式的讲解,网络上很多类似文章,但很多都让初学微信开发的人一头雾水,所以总结自己的微信开发经验,将微信开发的整个过程系统的列出,并对主要代码进行讲解分析,让初学者尽快上手。

在阅读本文之前,应对微信公众平台的官方开发文档有所了解,知道接收和发送的都是xml格式的数据。

另外,在做内容回复时用到了,这是一个自然语言解析的开放平台,可以帮我们解决整个微信开发过程中最困难的问题,此处不多讲,下面会有其详细的调用方式。

在登录微信官方平台之后,开启开发者模式,此时需要我们填写url和token,所谓url就是我们自己服务器的接口,用来实现,相关解释已经在注释中说明,代码如下:[java]1.package;2.3.import4.import5.import6.import7.import8.9.import10.import11.import12.import13.14.import15./**16.*微信服务端收发消息接口17.*18.*@authorpamchen-119.*20.*/21.publicclass WechatServlet extends HttpServlet{22.23./**24.*ThedoGetmethodoftheservlet.<br>25.*26.*Thismethodiscalledwhenaformhasitstagvaluemethodequalstoget.27.*28.*@paramrequest29.*therequestsendbytheclienttotheserver30.*@paramresponse31.*theresponsesendbytheservertotheclient32.*@throwsServletException33.*ifanerroroccurred34.*@throwsIOException35.*ifanerroroccurred36.*/37.publicvoid doGet(HttpServletRequestrequest,HttpServletResponseresponse)38.throws ServletException,IOException{39.("UTF-8");40.("UTF-8");41.42./**读取接收到的xml消息*/43.StringBuffersb=new StringBuffer();44.InputStreamis=();45.InputStreamReaderisr=new InputStreamReader(is,"UTF-8");46.BufferedReaderbr=new BufferedReader(isr);47.Strings="";48.while((s=())!=null){49.(s);50.}51.Stringxml=();rocessWechatMag(xml);52.}53.54.try{55.OutputStreamos=();56.("UTF-8"));57.();58.();59.}catch(Exceptione){60.();61.}62.}63.64./**65.*ThedoPostmethodoftheservlet.<br>66.*67.*Thismethodiscalledwhenaformhasitstagvaluemethodequalsto68.*post.69.*70.*@paramrequest71.*therequestsendbytheclienttotheserver72.*@paramresponse73.*theresponsesendbytheservertotheclient74.*@throwsServletException75.*ifanerroroccurred76.*@throwsIOException77.*ifanerroroccurred78.*/79.publicvoid doPost(HttpServletRequestrequest,HttpServletResponseresponse)80.throws ServletException,IOException{81.doGet(request,response);82.}83.84.}相应的配置信息如下,在生成的同时,可自动生成中的配置。

wxjava用法

wxjava用法

wxjava用法
wxJava 是一个基于Java 语言的微信开发框架,可以帮助开发者快速开发微信小程序、公众号等。

下面是wxJava 的基本用法:
1.引入wxJava 库:将wxJava 库引入到项目中,可以通过Maven
或Gradle 等依赖管理工具进行引入。

2.创建wxJava 对象:在Java 代码中创建wxJava 对象,用于进行
微信操作。

3.登录微信:使用wxJava 对象的登录方法,获取登录凭证,用于
调用微信接口。

4.调用微信接口:使用登录凭证调用微信接口,获取用户信息、发
送消息、获取菜单等。

5.处理微信事件:通过监听器或回调接口处理微信事件,例如用户
点击菜单、发送消息等。

6.实现业务逻辑:根据具体业务需求,实现相应的业务逻辑。

7.返回结果给微信:将业务处理结果返回给微信,完成一次请求-
响应循环。

需要注意的是,使用wxJava 进行微信开发时需要遵循微信开放平台的相关规定和开发规范,确保接口调用合法、数据安全可靠。

同时,也需要根据具体业务需求进行定制化开发,以满足用户需求。

微信小程序后端Java接口开发的详细步骤

微信小程序后端Java接口开发的详细步骤

微信⼩程序后端Java接⼝开发的详细步骤⽬录1、搭建⼀个springboot项⽬并引⼊依赖2、编写controller层3、创建微信⼩程序项⽬微信⼩程序使⽤wx.request(OBJECT)来调⽤后端接⼝。

⾸先我们来⼀个简单案例 —— helloworld实现1、搭建⼀个springboot项⽬并引⼊依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>2、编写controller层@RestControllerpublic class HelloWorldController {@GetMapping("/helloWorld")public String helloWorld(Integer id){return "helloworld"+id;}}server:port: 80servlet:context-path: /tomcat:uri-encoding: utf-8运⾏成功3、创建微信⼩程序项⽬helloworld.js/*** 页⾯的初始数据*/data: {result:'请求后台中.....'},/*** ⽣命周期函数--监听页⾯加载*/onLoad: function (options) {var that=this;this.getData(that);},getData(that){wx.request({url: 'http://localhost:8080/helloWorld',method:'GET',data:{id:666},header:{'content-type':'application/json' //默认值 },success(res){console.log(res.data);console.log(that);that.setData({result:res.data})}})},helloworld.wxml<text>后端返回的数据:{{result}}</text>注意:这⾥记得设置如下图否则会报错:访问后端成功如下图到此这篇关于微信⼩程序后端Java接⼝开发的详细步骤的⽂章就介绍到这了,更多相关⼩程序后端Java接⼝开发内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。

微信公众平台技术方案java

微信公众平台技术方案java

微信公众平台技术方案java公众平台技术方案(Java版)随着的普及和广泛使用,公众平台成为了企业、个人和组织与用户进行互动和信息传播的重要渠道。

为了满足广大用户的需求,本文将介绍一种基于Java的公众平台技术方案,帮助大家快速搭建自己的公众平台。

一、技术选型1、后端技术:Java作为后端开发语言,具有稳定、安全、高效等优点,适合用于构建高并发、高性能的应用。

在Java生态圈中,Spring Boot是一个广泛使用的框架,它可以帮助我们快速搭建应用程序,减少开发成本。

2、前端技术:前端开发采用React框架,具有良好的跨平台性和可维护性。

同时,Ant Design等UI组件库可以快速搭建美观、易用的界面。

3、数据库技术:MySQL是一个成熟、稳定的开源关系型数据库,可以满足大多数应用场景的需求。

使用MySQL可以保证数据的一致性和可靠性。

4、消息队列:使用RabbitMQ作为消息队列中间件,可以保证消息的可靠传输和处理,提高系统的稳定性和可扩展性。

二、系统架构设计1、后端架构设计:后端采用微服务架构,将系统拆分为多个独立的服务,每个服务负责一部分功能。

这种架构可以提高系统的可维护性和可扩展性。

使用Spring Boot框架进行开发,每个服务都可以独立部署,方便进行弹性伸缩。

2、前端架构设计:前端采用React框架和Ant Design组件库进行开发。

使用Webpack等工具进行打包和构建,生成静态资源文件。

前端代码可以通过CDN进行分发,提高加载速度和用户体验。

3、数据库设计:数据库采用MySQL,根据业务需求设计表结构,保证数据的一致性和完整性。

使用索引优化可以提高查询效率,使用事务可以保证数据的一致性。

4、消息队列设计:使用RabbitMQ作为消息队列中间件,负责处理异步任务和消息传输。

RabbitMQ具有高可用性、可扩展性和可靠性等特点,可以保证消息的可靠传输和处理。

三、安全策略1、身份验证:使用HTTPS协议进行通信,保证数据传输的安全性。

【IT专家】第二篇 :微信公众平台开发实战Java版之开启开发者模式,接入微信公众平台开发

【IT专家】第二篇 :微信公众平台开发实战Java版之开启开发者模式,接入微信公众平台开发

第二篇:微信公众平台开发实战Java版之开启开发者模式,接入微
信公众平台开发
2017/07/08 0 一、填写服务器配置信息的介绍
 登录微信公众平台官网后,进入到公众平台后台管理页面。

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

 微信公众号配置界面:
 以上配置需要认证后才会得到相应的权限。

如果开发阶段,我们可以申请开发者测试账号。

 为什么要申请测试账号?
 主要是因为测试账号比我们没有认证的微信账号权限大一点。

足够测试我们的接口了。

 以下是微信测试号的一些配置选项:
 服务器配置:
URL:是开发者用来接收微信消息和事件的接口URL。

(必须以开头,目前支持80端口)
 Token:可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。

注意必须为英文或数字,长度为3-32字符。

 EncodingAESKey:由开发者手动填写或随机生成,将用作消息体加解密密钥。

(消息加密密钥由43位字符组成,可随机修改,字符范围为A-Z,a-z,0-9。


 同时,开发者可选择消息加解密方式:明文模式、兼容模式和安全模式。

 明文模式:不使用消息体加解密功能,安全系数较低。

微信公众号开发java框架:wx4j(MenuUtils篇)

微信公众号开发java框架:wx4j(MenuUtils篇)

微信公众号开发java框架:wx4j(MenuUtils篇)wx4j-MenuUtils使⽤
函数说明:发送http请求到微信服务器,完成菜单创建
参数:构造菜单对象
返回值:微信响应的json字符串
public static String createMenu(Menu m)
函数说明:获得⼀个⽰例菜单对象,可直接⽤于createMenu();
返回值:Menu对象
public static Menu getSampleMenu()
函数说明:发送http请求到微信服务器,完成菜单删除
返回值:微信响应的json字符串
public static String deleteMenu()
函数说明:获取开发者模式下⾃定义菜单内容
返回值:微信响应的json字符串
public static String getMenu()
函数说明:添加个性菜单
参数:构造个性菜单对象
返回值:微信响应的json字符串
public static String addConditionalMenu(ConditionalMenu menu)
函数说明:移除个性菜单
返回值:微信响应的json字符串
public static String removeConditionalMenu()
函数说明:匹配测试个性菜单
参数:传⼊粉丝微信号 or OpenId
返回值:微信响应的json字符串
public static String tryMatchConditionalMenu(String userId)。

微信公众平台开发(二) 微信公众平台示例代码分析

微信公众平台开发(二) 微信公众平台示例代码分析

微信公众平台开发(二)微信公众平台示例代码分析来源:David Camp 时间:2013-09-09 18:33:03 阅读数:5985分享到:0[导读]一、摘要微信公众平台提供了一个简单的php示例代码,在做进一步开发之前,我们有必要将其详细了解一下。

二、获取代码微信官网:http: mp weixin qq com mpres htmledition res wx_sample zip三、分析代码完整代一、摘要微信公众平台提供了一个简单的php示例代码,在做进一步开发之前,我们有必要将其详细了解一下。

二、获取代码微信官网:/mpres/htmledition/res/wx_sample.zip三、分析代码完整代码如下:view sourceprint?01.<?php02./**03. * wechat php test04. */05.06.//define your token07.define("TOKEN", "weixin");08.$wechatObj= new wechatCallbackapiTest();09.$wechatObj->valid();10.11.class wechatCallbackapiTest12.{13. public function valid()14. {15. $echoStr= $_GET["echostr"];16.17. //valid signature , option18. if($this->checkSignature()){19. echo$echoStr;20. exit;21. }23.24. public function responseMsg()25. {26. //get post data, May be due to the different environments27. $postStr= $GLOBALS["HTTP_RAW_POST_DATA"];28.29. //extract post data30. if(!emptyempty($postStr)){31.32. $postObj= simplexml_load_string($postStr,'SimpleXMLElement', LIBXML_NOCDATA);33. $fromUsername= $postObj->FromUserName;34. $toUsername= $postObj->ToUserName;35. $keyword= trim($postObj->Content);36. $time= time();37. $textTpl= "<xml>38. <ToUserName><![CDATA[%s]]></ToUserName >39. <FromUserName><![CDATA[%s]]></FromUser Name>40. <CreateTime>%s</CreateTime>41. <MsgType><![CDATA[%s]]></MsgType>42. <Content><![CDATA[%s]]></Content>43. <FuncFlag>0</FuncFlag>44. </xml>";45. if(!emptyempty( $keyword))46. {47. $msgType= "text";48. $contentStr= "Welcome to wechat world!";49. $resultStr= sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);50. echo$resultStr;51. }else{52. echo"Input something...";53. }54.55. }else{56. echo"";57. exit;58. }59. }60.61. private function checkSignature()63. $signature= $_GET["signature"];64. $timestamp= $_GET["timestamp"];65. $nonce= $_GET["nonce"];66.67. $token= TOKEN;68. $tmpArr= array($token, $timestamp, $nonce);69. sort($tmpArr);70. $tmpStr= implode( $tmpArr);71. $tmpStr= sha1( $tmpStr);72.73. if( $tmpStr== $signature){74. return true;75. }else{76. return false;77. }78. }79.}80.81.?>3.1 整体分析原始示例代码大致分为四个部分:∙定义TOKEN∙声明一个类 wechatCallbackapiTest∙创建类wechatCallbackapiTest 的一个实例对象 $wechatObj∙调用类的 valid() 方法。

Java应用开发中的微信小程序开发

Java应用开发中的微信小程序开发

Java应用开发中的微信小程序开发微信小程序是一种新兴的应用开发方式,它能够在微信平台上快速开发并发布小程序,为用户提供丰富的服务和体验。

在Java应用开发领域,借助微信小程序的强大功能和用户基数,可以为企业和开发者带来巨大的商机和发展空间。

本文将介绍Java应用开发中的微信小程序开发的相关内容,包括开发环境的搭建、开发工具的选择、项目结构的设计以及常用的开发技术和注意事项等。

一、开发环境的搭建要进行Java应用开发中的微信小程序开发,首先需要搭建相应的开发环境。

以下是搭建开发环境的步骤:1. 安装Java开发工具包(JDK):在官网下载并安装最新版本的JDK,配置好环境变量。

2. 安装开发集成环境(IDE):推荐使用Eclipse或IntelliJ IDEA等常用的Java开发工具。

3. 安装微信开发者工具:微信提供了专门用于小程序开发的开发者工具,下载安装并登录微信开发者账号。

二、开发工具的选择在进行微信小程序开发时,选择合适的开发工具可以提高开发效率和代码质量。

以下是几种常用的开发工具:1. 开发IDE:使用Eclipse或IntelliJ IDEA等集成开发环境,可以提供自动补全、代码调试和版本控制等功能。

2. 调试工具:微信开发者工具提供了调试工具,可以在开发过程中进行实时调试和查看日志。

3. 代码管理工具:Git是目前最流行的代码管理工具,可以方便地进行代码版本管理和协同开发。

三、项目结构的设计在进行微信小程序开发时,良好的项目结构设计可以提高团队协作效率和代码可维护性。

以下是一个常见的项目结构设计:1. src/main/java:存放Java源代码,包括业务逻辑处理和数据访问层等。

2. src/main/resources:存放配置文件、静态资源文件和国际化资源文件等。

3. src/main/webapp:存放前端页面和样式文件等。

4. src/test:存放单元测试代码。

四、常用的开发技术和注意事项1. 后端开发技术:Java语言是后端开发的主要语言,可以使用Spring Boot、Spring MVC等框架进行开发。

微信公众平台的Java的开发详解(工程代码+解析)

微信公众平台的Java的开发详解(工程代码+解析)

公众平台的Java的开发详解(工程代码+解析) 公众平台的Java的开发详解(工程代码+解析)1.引言1.1 目的1.2 背景1.3 目标受众1.4 前置知识2.环境搭建2.1 JDK的安装与配置2.2 开发工具的选择与配置2.3 公众平台账号申请与配置3.公众号开发基础3.1 公众号的类型3.2 公众号开发流程概述3.3 公众号中的各类消息与事件3.4 公众平台接入与消息回复的基本原理4.接入公众平台4.1 开发模式与接口准备4.2 消息的接收与处理4.3 消息的回复与发送5.用户管理与授权5.1 用户信息的获取与存储5.2 用户授权流程与网页授权6.菜单与自定义菜单6.1 菜单的创建与设置6.2 菜单事件的处理与响应7.素材管理7.1 图片、音频、视频素材的与 7.2 图文素材的创建与获取7.3 素材的临时与永久存储8.1 群发消息的类型与发送9.客服功能与多客服系统9.1 客服消息的发送与接收9.2 多客服系统的搭建与使用10.数据统计与分析10.1 用户与消息分析10.2 自定义菜单与页面统计10.3 数据报表与数据导出附件:- 附件1、示例工程代码- 附件2、配置文件示例法律名词及注释:1.公众平台:指开放平台提供的一系列用于开发与管理公众号的服务及接口。

2.JDK:Java Development Kit的缩写,用于开发Java应用程序的软件包。

3.API:Application Programming Interface的缩写,用于不同软件系统之间相互通信和交流的接口。

玩玩微信公众号Java版之三:access_token及存储access_token

玩玩微信公众号Java版之三:access_token及存储access_token

玩玩微信公众号Java版之三:access_token及存储access_token微信官⽅参考⽂档:基本说明:access_token是公众号的全局唯⼀接⼝调⽤凭据,公众号调⽤各接⼝时都需使⽤access_token。

开发者需要进⾏妥善保存。

access_token 的存储⾄少要保留512个字符空间。

access_token的有效期⽬前为2个⼩时,需定时刷新,重复获取将导致上次获取的access_token失效。

调⽤⽅式:公众号可以使⽤AppID和AppSecret调⽤本接⼝来获取access_token。

AppID和AppSecret可在“微信公众平台-开发-基本配置”页中获得(需要已经成为开发者,且帐号没有异常状态)。

调⽤接⼝时,请登录“微信公众平台-开发-基本配置”提前将服务器IP地址添加到IP⽩名单中,点击查看设置⽅法,否则将⽆法调⽤成功。

特别说明:建议公众号开发者使⽤中控服务器统⼀获取和刷新Access_token,其他业务逻辑服务器所使⽤的access_token均来⾃于该中控服务器,不应该各⾃去刷新,否则容易造成冲突,导致access_token覆盖⽽影响业务;了解这些信息后,我们需要理解确定如下⼏点:1、统⼀token调⽤⽅法,其他地⽅需⽤到token均采⽤本⽅法获取;2、请求获取token信息接⼝的实现;3、token数据存储⾄本地数据库;4、判断是否需要重新获取token还是直接从本地数据库中查询;下⾯来进⾏具体的实现:⾸先看⼀下整体的类图:那么在获取token时,可以根据appid和appsecret来获取,其中判断是否需要更新的⽅法为:能否获取到当前仍有效的token:查询SQL如下:对应表结构参考如下:对应的java代码如下:如果能获取到,那么直接返回:1/**2 * 通过参数获取Token信息3 * @param appID4 * @param appSceret5 * @return6*/7public Token getToken(String appID, String appSceret)8 {9 mAppID = appID;10 mAppSceret = appSceret;1112// 1.确定是否要更新token,⽆需更新则直接直接返回获取的token13if (updateToken())1718// 2. 如需更新19if (!getTokenbyhttps(mAppID, mAppSceret))20 {21 System.out.println("获取失败!");22return null;23 }2425return mToken;26 }View Code其中明细⽅法实现为:1/**2 * 获取Token信息3 * @return4*/5private boolean updateToken()6 {7// 查询数据库数据,如果有则不⽤更新,⽆则需要更新8 Connection con = null;9 PreparedStatement stmt = null;10 ResultSet rs = null;11// 判断当前token是否在有效时间内12 String sql = " select * from token where appid ='" + mAppID + "' and appsecret ='" + mAppSceret13 + "' and ( current_timestamp -createtime) <expires_in order by createTime desc limit 0,1"; 14try15 {16// 创建数据库链接17 con = DBConnPool.getConnection();18// 创建处理器19 stmt = con.prepareStatement(sql);20// 查询Token,读取1条记录21 rs = stmt.executeQuery();22if (rs.next())23 {24 mToken.setTokenid(rs.getString("tokenid"));25 mToken.setToken(rs.getString("token"));26 mToken.setExpires_in(rs.getInt("expires_in"));27 mToken.setAppid(rs.getString("appid"));28 mToken.setAppsecret(rs.getString("appsecret"));29 }30else31 {32 System.out.println("未查询到对应token");33return false;34 }35 }36catch (Exception e)37 {38// TODO: handle exception39return false;40 }4142 System.out.println(mToken.getToken());4344return true;45 }View Code如果需要获取新的token,则:1/**2 * 通过https请求获取token3 * @param appID4 * @param appSceret5 * @return6*/7private boolean getTokenbyhttps(String appID, String appSceret)8 {9 String current_time = new Date().getTime() + "";1011try12 {1617 String strResp = WeChatUtil.doHttpsGet(path, "");18 System.out.println(strResp);1920// 解析获取的token信息21 Map<String, Object> tMap = WeChatUtil.jsonToMap(strResp);2223 System.out.println(tMap.toString());2425 mToken.setTokenid(WeChatUtil.getMaxTokenID());26 mToken.setToken((String) tMap.get("access_token"));27 mToken.setExpires_in(Integer.parseInt((String) tMap.get("expires_in")));28 mToken.setAppid(appID);29 mToken.setAppsecret(appSceret);30 mToken.setCreatetime(current_time);3132 System.out.println(mToken.getToken());3334 }35catch (HttpException e)36 {37// TODO Auto-generated catch block38 e.printStackTrace();39 }40catch (IOException e)41 {42// TODO Auto-generated catch block43 e.printStackTrace();44 }4546// 存储token⾄数据库47 saveToken(mToken);4849return true;50 }5152/**53 * 保存Token信息54 * @return55*/56private boolean saveToken(Token token)57 {58 PreparedStatement pst = null;59 Connection conn = null;60try61 {62 Token tToken = token.clone();6364 System.out.println(tToken.getTokenid() + tToken.getToken());6566 conn = DBConnPool.getConnection();67// 创建预处理器68 pst = conn.prepareStatement("insert into token(tokenid, token, expires_in,appid, appsecret,createtime) values (?,?,?,?,?,?)"); 6970 pst.setString(1, tToken.getTokenid());71 pst.setString(2, tToken.getToken());72 pst.setInt(3, tToken.getExpires_in());73 pst.setString(4, tToken.getAppid());74 pst.setString(5, tToken.getAppsecret());75long now = new Date().getTime();76 pst.setTimestamp(6, new java.sql.Timestamp(now));77 pst.execute();7879 }80catch (CloneNotSupportedException e)81 {82// TODO Auto-generated catch block83 e.printStackTrace();84return false;85 }86catch (SQLException e)87 {88// TODO Auto-generated catch block89 e.printStackTrace();90return false;91 }92catch (Exception e)93 {94// TODO: handle exception95 System.out.println("出现额外异常");96 }对于https的GET和POST调⽤,可以写2个公共⽅法,具体实现可参考:1/**2 * HTTPS请求Get⽅法调⽤3 * @param path4 * @param requestData5 * @return6 * @throws HttpException7 * @throws IOException8*/9public static String doHttpsGet(String path, String requestData) throws HttpException, IOException 10 {11// 创建https请求,未默认证书,可⾃⾏添加12// 设置编码13 HttpClient httpClient = new HttpClient();14 GetMethod getMethod = new GetMethod(path);15 httpClient.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "UTF-8"); 1617 httpClient.executeMethod(getMethod);1819// 读取内容20byte[] responseBody = getMethod.getResponseBody();21 String strResp = new String(responseBody, "UTF-8");2223 System.out.println(strResp);2425 getMethod.releaseConnection();2627return strResp;28 }2930/**31 * HTTPS请求Post⽅法调⽤32 * @param path33 * @param requestData34 * @return35 * @throws HttpException36 * @throws IOException37*/38public static String doHttpsPost(String path, String requestData) throws HttpException, IOException 39 {40// 创建https请求,未默认证书,可⾃⾏添加41 String strResp ="";42 HttpClient httpClient = new HttpClient();43 PostMethod postMethod = new PostMethod(path);44// 设置编码45 httpClient.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "UTF-8"); 4647 System.out.println("path:" + path);48 System.out.println("requestData:" + requestData);4950 postMethod.setRequestBody(requestData);5152long start = System.currentTimeMillis();53// 执⾏getMethod54int statusCode = httpClient.executeMethod(postMethod);55 System.out.println("cost:" + (System.currentTimeMillis() - start));56// 失败57if (statusCode != HttpStatus.SC_OK)58 {59 System.out.println("Method failed: " + postMethod.getStatusLine());60// 读取内容61byte[] responseBody = postMethod.getResponseBody();62// 处理内容63 strResp = new String(responseBody, "UTF-8");64 System.out.println(strResp);65 }66else67 {68// 读取内容69byte[] responseBody = postMethod.getResponseBody();70 strResp = new String(responseBody, "UTF-8");71 System.out.println("服务器返回:" + strResp);72 }7374 postMethod.releaseConnection();75需要加⼊返回是json,处理json 需要json对应的jar,另外需要⽤到httpclient 的jar包。

微信公众平台开发教程Java版

微信公众平台开发教程Java版

微信公众平台开发教程Java版一、环境准备篇准备写系列博客,记录下我的微信公众平台学习记录,也为那些摸索中的开发者提供点参考。

希望与大家共同进步。

微信3.0的时候我开始做微信公众账号,那时候没时间研究开发,先用的是编辑者模式,后用开发者模式,托管于第三方。

一直想自己写个服务端来实现个人定制化的需求。

废话不多说,进入正题。

想要开发微信公众平台需要一些环境一、申请微信公众账号这个就不用废话了。

附上地址:https:///cgi-bin/readtemplate?t=wxm2-realname-reg_tmpl &lang=zh_CN现在申请好严格的说,3.0的时候申请都不需要拍照什么的。

友情提示:1、微信公众账号的名字一旦申请,则不能更改。

取名请慎重!2、一个身份证只能申请两个公众号3、公众号分两种:订阅号和服务号订阅号可一天群发一次消息,目前不能申请自定义菜单。

发送的消息将显示在“订阅号”文件夹中,适合媒体等提供咨询服务的公众号。

服务号一个月只能群发一条消息,能申请自定义菜单,发送的消息会显示在用户的聊天列表中,并会提醒用户新消息。

适合为用户提供服务的公众号二、外网服务器你需要一台外网服务器,来发布你的代码,用于接收处理用户发送的请求。

如果没有的话,也不用担心。

可以使用百度BAE,或者是sina sae,国外比较多的是用google的gae。

google gae支持的语言很多。

但是在国内经常访问不了,不推荐使用。

百度Bae 支持java和php(完全免费,百度对于资源方面还是一向很大方的,赞一个,哈哈)sina sae 支持java,php,python(可免费使用半年,收费的,但很便宜)三、至少会一种语言java,php,asp,python等,至少得会一样!接下来的文章中我会用java做事例来做微信公众平台的开发二、接口配置微信公众账号申请完成后,默认开启的是编辑模式。

我们需要修改为开发模式。

微信公众平台自定义菜单创建代码实现—java版

微信公众平台自定义菜单创建代码实现—java版

微信公众平台⾃定义菜单创建代码实现—java版搞了两天的⾃定义菜单,终于搞定了,现在分享下⼼得,以便后来者少⾛弯路......好了,先看先微信官⽅的API官⽅写的很详细,但是我看完后很茫然,不知道你们什么感觉。

我知道是post⼀个带参数的请求给url,可是具体怎么发送呢,开始想做⼀个jsp页⾯,使⽤<form>来发送,可是种种原因不⾏,所以换种想法,于是有了java get或post访问url的想法,弄好后⼀运⾏,会提⽰“.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:PKIX path validation failed: java.security.cert.CertPathValidatorException: basic constraints check failed: pathLenConstraint violated - this cert must be the last cert in thecertification path”这种错误,查询是证书的问题,在⽹上百般折腾,后来⾼⼈⼀句话提醒我了(你的url不是公⽹,服务接⼊成功了,可以你的开发环境不能),我是在⾃⼰电脑上新建的⼯程,没有部署到⽹络上,你给腾讯发post请求了,可是腾讯接⼊不到你的本机⼯程上,所以会出现那个错误了。

所以有了下⾯的结论:把⾃⼰新建的⼯程部署到⽹络上,就是你⽹络的应⽤上,才能实现这⼀功能。

不懂的者,参考下我以前的⽂章“利⽤微信公众平台实现⾃动回复消息——java版”。

进⼊正题(我以百度云开发者中⼼为例):将⾃⼰在百度云开发者中⼼中部署的应⽤中的index.jsp修改如下:1 <%@page import="java.io.*"%>2 <%@page import=".*" %>3 <%@page import="org.json.*" %>4 <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>56 <%7final String appId = " ";8final String appSecret = " "; //⾃⼰的APPIP 和APPSECRET910 %>11 <%12class TestGetPost{1314public String getAccess_token(){ // 获得ACCESS_TOKEN1516 String url = "https:///cgi-bin/token?grant_type=client_credential&appid="+ appId + "&secret=" +appSecret;1718 String accessToken = null;19try {20 URL urlGet = new URL(url);21 HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();2223 http.setRequestMethod("GET"); //必须是get⽅式请求24 http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");25 http.setDoOutput(true);26 http.setDoInput(true);27 System.setProperty(".client.defaultConnectTimeout", "30000");//连接超时30秒28 System.setProperty(".client.defaultReadTimeout", "30000"); //读取超时30秒2930 http.connect();3132 InputStream is =http.getInputStream();33int size =is.available();34byte[] jsonBytes =new byte[size];35 is.read(jsonBytes);36 String message=new String(jsonBytes,"UTF-8");3738 JSONObject demoJson = new JSONObject(message);39 accessToken = demoJson.getString("access_token");4041 System.out.println(message);42 } catch (Exception e) {43 e.printStackTrace();44 }45return accessToken;46 }47public int createMenu() throws IOException {48 String user_define_menu = "{\"button\":[{\"type\":\"click\",\"name\":\"项⽬管理\",\"key\":\"20_PROMANAGE\"},{\"type\":\"click\",\"name\":\"机构运作\",\"key\":\"30_ORGANIZATION\"},{\"name\":\"⽇常⼯作\",\"sub_button\":[{\"type\":\"click 49//此处改为⾃⼰想要的结构体,替换即可50 String access_token= getAccess_token();5152 String action = "https:///cgi-bin/menu/create?access_token="+access_token;53try {54 URL url = new URL(action);55 HttpURLConnection http = (HttpURLConnection) url.openConnection();5657 http.setRequestMethod("POST");58 http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");59 http.setDoOutput(true);60 http.setDoInput(true);61 System.setProperty(".client.defaultConnectTimeout", "30000");//连接超时30秒62 System.setProperty(".client.defaultReadTimeout", "30000"); //读取超时30秒6364 http.connect();65 OutputStream os= http.getOutputStream();66 os.write(user_define_menu.getBytes("UTF-8"));//传⼊参数67 os.flush();68 os.close();6970 InputStream is =http.getInputStream();71int size =is.available();72byte[] jsonBytes =new byte[size];73 is.read(jsonBytes);74 String message=new String(jsonBytes,"UTF-8");75 System.out.println(message);76 } catch (MalformedURLException e) {77 e.printStackTrace();78 } catch (IOException e) {79 e.printStackTrace();80 }81return 0;82 }83 }%>84 <%85 TestGetPost tgp = new TestGetPost();8687 tgp.createMenu();88 %>index.jsp部署好后,直接在浏览器地址栏中输⼊⾃⼰百度云开发者中⼼下改应⽤的当前域名即可,然后关注微信公众账号看效果(已关注的,取消关注并重新关注,即可看到效果)。

[JAVA实现]微信公众号网页授权登录

[JAVA实现]微信公众号网页授权登录

[JAVA实现]微信公众号⽹页授权登录⽹上搜资料时,⽹友都说官⽅⽂档太垃圾了不易看懂,如何如何的。

现在个⼈整理了⼀个通俗易懂易上⼿的,希望可以帮助到刚接触微信接⼝的你。

请看流程图!看懂图,就懂了⼀半了:其实整体流程⼤体只需三步:⽤户点击登录按钮(其实就相当于⼀个链接) ---》⽤户点击授权登录 ----》实现获取⽤户信息代码。

然后获取⽤户信息代码只需三步:获取code ----》通过code获取access_token和openId ---》通过access_token和openId获取⽤户信息(包含union)。

以上便是整体套路,当然官⽹上也有,但具体如何实现呢?不着急,咱们⼀步⼀步来!第⼀步:微信登录按钮它其实就是⼀个连接,不过想得到这个链接,有⼀点点⿇烦。

& response_type=code(固定的) & scope = snsapi_userinfo(或者snsapi_base默认授权) & state=STATE#wechat_redirect这个链接中参数的具体含义,官⽅解释如下:参数是否必须说明appid是公众号的唯⼀标识redirect_uri是授权后重定向的回调链接地址,请使⽤urlencode对链接进⾏处理response_type是返回类型,请填写codescope是应⽤授权作⽤域,snsapi_base (不弹出授权页⾯,直接跳转,只能获取⽤户openid),snsapi_userinfo (弹出授权页⾯,可通过openid拿到昵称、性别、所在地。

并且,即关注的情况下,只要⽤户授权,也能获取其信息)state否重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节#wechat_redirect是⽆论直接打开还是做页⾯302重定向时候,必须带此参数第⼆步:授权确认登录这⼀步最简单,第⼀步登录链接拼好后,在⼿机微信中打开,微信便会跳转到确认授权页⾯,点击确认授权即可。

微信公众平台技术方案--java

微信公众平台技术方案--java

微信公众平台技术方案一、微信调用网站程序设计原则微信公众平台开发系统的基本原则是以系统总体目标为宗旨,为用户提供一个技术先进,成熟可靠,灵活适用,性能优秀的调用系统。

因此,系统设计将遵循如下原则:1 开放性:系统在设计时考虑到功能的可扩展性与维护的方便性,使用的操作平台类型,应用服务器、编程语言和数据库,将遵循通用性、开放性,以期达到减少后续功能增加,修改的难度,减少由于维护方、后续服务方的变更,带来系统二次开发、维护的难度。

2 先进性:采用JAVA开发,mysql作为网站后台数据库。

这个组合在测试权威e-Week的测试中显示具有最优性能。

采用这些技术是完全基于LINUX平台进行开发,降低了以后的系统运营成本,提高了系统的稳定性和易维护性!3 高性能:本系统的硬件搭配,微信公众平台能够充分胜任对大量事物处理的要求和信息量不断增长的要求。

4 实用性:微信公众平台以中心需求为目标,以方便用户为原则,在吸取先进管理经验的基础上,量身定做;在统一的用户界面下提供各种实用功能,尽可能降低使用前的培训和使用中的维护投入。

提供微信前端开发的无逢连接。

5 安全性:充分考虑系统及数据资源的容灾、备份、恢复的要求。

为系统提供强大的数据库备份工具。

充分考虑网站的安全要求,作到内外网分离,信息发布管理责任到人。

二、微信开发整体结构1、微信公众平台的建设2、微信公众平台的认证3、微信自定义菜单的开发4、微信多功能回复5、微信信息发布的开发微信公众平台工作流程如下图三、微信公众平台功能模块编号功能模块模块说明1 微信发布系统1、提供多种信息、记录入库修改方式。

2、具备能够调整记录显示先后顺序的功能。

3、对于重大新闻要能满足在指定页面的指定位置进行发布的要求。

2 自定义菜单系统1、分类层次分明,能够按方式分类,支持文件种类的增删。

2、周边服务的查询3、自定义绑定功能3 查询系统1、关注绑定以后自动推送信息2、绑定信息查询功能4 公告宣传1、具有公告宣传管理功能,管理员能够自由设[定控制不同的形式、位置、大小,支持图片、文字发布,可任意增加多张图片。

使用JAVA语言开发微信公众平台(四)——图文消息的发送与响应

使用JAVA语言开发微信公众平台(四)——图文消息的发送与响应

使用JA V A语言开发微信公众平台(四)——图文消息的发送与响应在上一篇文章中,我们实现了被关注回复与关键词回复功能。

在用户关注的时候自动推送功能菜单,并根据用户输入的关键词,回复特定信息。

但是,我们只能回复文本消息给用户,如何才回复一条图文消息呢?本周,我们一起来学习一下微信公众平台开发之【图文消息的发送与响应】一、了解图文消息XML包结构相信一直学习我们系列博文的同学,一定了解我们的“套路”了,首先,我们要来了解一下图文消息的XML包结构。

微信官方提供如下参数信息:那么,了解了图文消息的XML包结构以后,我们就需要参照文本消息的回复,在我们的Java 后台,组装我们的图文消息实体类。

但是,组装之前,我们不难发现,ToUserName、FromUserName、CreateTime、MsgType等参数,在文本消息中也出现过,而且在之后各种消息中都会出现,那么回想一下我们封装的文本消息实体类,很显然,我们需要将这些相同的内容,提取到一个父类中。

下面,我们使用代码操作一下。

二、重新封装文本消息&图文消息实体类① 提取文本消息实体类(子类)代码至消息实体类(父类)首先,打开我们之前写好的文本消息实体类textMessage:找到里面共同的属性,并将代码提取到父类中:新建一个父类,baseMessage.java,并将上述红线区域内的代码提取到父类中,让我们的textMessage类继承此父类。

接下来,我们分析一下微信的图文消息XML包结构:<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>12345678</CreateTime><MsgType><![CDATA[news]]></MsgType><ArticleCount>2</ArticleCount><Articles><item><Title><![CDATA[title1]]></Title><Description><![CDATA[description1]]></Description><PicUrl><![CDATA[picurl]]></PicUrl><Url><![CDATA[url]]></Url></item><item><Title><![CDATA[title]]></Title><Description><![CDATA[description]]></Description><PicUrl><![CDATA[picurl]]></PicUrl><Url><![CDATA[url]]></Url></item></Articles></xml>不难发现,在<Articles></Articles> 标签中,可以有一个或多个<item></item>标签,这也就对应着一条到多条图文消息。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

微信公众平台的Java开发详解(工程代码+解析)说明:本次的教程主要是对微信公众平台开发者模式的讲解,网络上很多类似文章,但很多都让初学微信开发的人一头雾水,所以总结自己的微信开发经验,将微信开发的整个过程系统的列出,并对主要代码进行讲解分析,让初学者尽快上手。

在阅读本文之前,应对微信公众平台的官方开发文档有所了解,知道接收和发送的都是xml格式的数据。

另外,在做内容回复时用到了图灵机器人的api接口,这是一个自然语言解析的开放平台,可以帮我们解决整个微信开发过程中最困难的问题,此处不多讲,下面会有其详细的调用方式。

1.1 在登录微信官方平台之后,开启开发者模式,此时需要我们填写url和token,所谓url就是我们自己服务器的接口,用WechatServlet.java来实现,相关解释已经在注释中说明,代码如下:[java]view plaincopy1.package demo.servlet;2.3.import java.io.BufferedReader;4.import java.io.IOException;5.import java.io.InputStream;6.import java.io.InputStreamReader;7.import java.io.OutputStream;8.9.import javax.servlet.ServletException;10.import javax.servlet.http.HttpServlet;11.import javax.servlet.http.HttpServletRequest;12.import javax.servlet.http.HttpServletResponse;13.14.import demo.process.WechatProcess;15./**16. * 微信服务端收发消息接口17. *18. * @author pamchen-119. *20. */21.public class WechatServlet extends HttpServlet {22.23./**24. * The doGet method of the servlet. <br>25. *26. * This method is called when a form has its tag value method equals toget.27. *28. * @param request29. * the request send by the client to the server30. * @param response31. * the response send by the server to the client32. * @throws ServletException33. * if an error occurred34. * @throws IOException35. * if an error occurred36. */37.public void doGet(HttpServletRequest request, HttpServletResponse response)38.throws ServletException, IOException {39. request.setCharacterEncoding("UTF-8");40. response.setCharacterEncoding("UTF-8");41.42./** 读取接收到的xml消息 */43. StringBuffer sb = new StringBuffer();44. InputStream is = request.getInputStream();45. InputStreamReader isr = new InputStreamReader(is, "UTF-8");46. BufferedReader br = new BufferedReader(isr);47. String s = "";48.while ((s = br.readLine()) != null) {49. sb.append(s);50. }51. String xml = sb.toString(); //次即为接收到微信端发送过来的xml数据52.53. String result = "";54./** 判断是否是微信接入激活验证,只有首次接入验证时才会收到echostr参数,此时需要把它直接返回 */55. String echostr = request.getParameter("echostr");56.if (echostr != null && echostr.length() > 1) {57. result = echostr;58. } else {59.//正常的微信处理流程60. result = new WechatProcess().processWechatMag(xml);61. }62.63.try {64. OutputStream os = response.getOutputStream();65. os.write(result.getBytes("UTF-8"));66. os.flush();67. os.close();68. } catch (Exception e) {69. e.printStackTrace();70. }71. }72.73./**74. * The doPost method of the servlet. <br>75. *76. * This method is called when a form has its tag value method equals to77. * post.78. *79. * @param request80. * the request send by the client to the server81. * @param response82. * the response send by the server to the client83. * @throws ServletException84. * if an error occurred85. * @throws IOException86. * if an error occurred87. */88.public void doPost(HttpServletRequest request, HttpServletResponse response)89.throws ServletException, IOException {90. doGet(request, response);91. }92.93.}1.2 相应的web.xml配置信息如下,在生成WechatServlet.java的同时,可自动生成web.xml中的配置。

前面所提到的url处可以填写例如:http;//服务器地址/项目名/wechat.do[html]view plaincopy1.<?xml version="1.0"encoding="UTF-8"?>2.<web-app version="2.5"3.xmlns="/xml/ns/javaee"4.xmlns:xsi="/2001/XMLSchema-instance"5.xsi:schemaLocation="/xml/ns/javaee6. /xml/ns/javaee/web-app_2_5.xsd">7.<servlet>8.<description>This is the description of my J2EE component</description>9.<display-name>This is the display name of my J2EE component</display-name>10.<servlet-name>WechatServlet</servlet-name>11.<servlet-class>demo.servlet.WechatServlet</servlet-class>12.</servlet>13.14.<servlet-mapping>15.<servlet-name>WechatServlet</servlet-name>16.<url-pattern>/wechat.do</url-pattern>17.</servlet-mapping>18.<welcome-file-list>19.<welcome-file>index.jsp</welcome-file>20.</welcome-file-list>21.</web-app>1.3 通过以上代码,我们已经实现了微信公众平台开发的框架,即开通开发者模式并成功接入、接收消息和发送消息这三个步骤。

下面就讲解其核心部分——解析接收到的xml数据,并以文本类消息为例,通过图灵机器人api接口实现智能回复。

2.1 首先看一下整体流程处理代码,包括:xml数据处理、调用图灵api、封装返回的xml数据。

[java]view plaincopy1.package demo.process;2.3.import java.util.Date;4.5.import demo.entity.ReceiveXmlEntity;6.7./**8. * 微信xml消息处理流程逻辑类9. * @author pamchen-110. *11. */12.public class WechatProcess {13./**14. * 解析处理xml、获取智能回复结果(通过图灵机器人api接口)15. * @param xml 接收到的微信数据16. * @return 最终的解析结果(xml格式数据)17. */18.public String processWechatMag(String xml){19./** 解析xml数据 */20. ReceiveXmlEntity xmlEntity = new ReceiveXmlProcess().getMsgEntity(xml);21.22./** 以文本消息为例,调用图灵机器人api接口,获取回复内容 */23. String result = "";24.if("text".endsWith(xmlEntity.getMsgType())){25. result = new TulingApiProcess().getTulingResult(xmlEntity.getContent());26. }27.28./** 此时,如果用户输入的是“你好”,在经过上面的过程之后,result为“你也好”类似的内容29. * 因为最终回复给微信的也是xml格式的数据,所有需要将其封装为文本类型返回消息30. * */31. result = new FormatXmlProcess().formatXmlAnswer(xmlEntity.getFromUserName(), xmlEntity.getToUserName(), result);32.33.return result;34. }35.}2.2 解析接收到的xml数据,此处有两个类,ReceiveXmlEntity.java和ReceiveXmlProcess.java,通过反射的机制动态调用实体类中的set方法,可以避免很多重复的判断,提高代码效率,代码如下:[java]view plaincopy1.package demo.entity;2./**3. * 接收到的微信xml实体类4. * @author pamchen-15. *6. */7.public class ReceiveXmlEntity {8.private String ToUserName="";9.private String FromUserName="";10.private String CreateTime="";11.private String MsgType="";12.private String MsgId="";13.private String Event="";14.private String EventKey="";15.private String Ticket="";16.private String Latitude="";17.private String Longitude="";18.private String Precision="";19.private String PicUrl="";20.private String MediaId="";21.private String Title="";22.private String Description="";23.private String Url="";24.private String Location_X="";25.private String Location_Y="";26.private String Scale="";27.private String Label="";28.private String Content="";29.private String Format="";30.private String Recognition="";31.32.public String getRecognition() {33.return Recognition;34. }35.public void setRecognition(String recognition) {36. Recognition = recognition;37. }38.public String getFormat() {39.return Format;40. }41.public void setFormat(String format) {42. Format = format;43. }44.public String getContent() {45.return Content;46. }47.public void setContent(String content) {48. Content = content;49. }50.public String getLocation_X() {51.return Location_X;52. }53.public void setLocation_X(String locationX) {54. Location_X = locationX;55. }56.public String getLocation_Y() {57.return Location_Y;58. }59.public void setLocation_Y(String locationY) {60. Location_Y = locationY;61. }62.public String getScale() {63.return Scale;64. }65.public void setScale(String scale) {66. Scale = scale;67. }68.public String getLabel() {69.return Label;70. }71.public void setLabel(String label) {72. Label = label;73. }74.public String getTitle() {75.return Title;76. }77.public void setTitle(String title) {78. Title = title;79. }80.public String getDescription() {81.return Description;82. }83.public void setDescription(String description) {84. Description = description;85. }86.public String getUrl() {87.return Url;88. }89.public void setUrl(String url) {90. Url = url;91. }92.public String getPicUrl() {93.return PicUrl;94. }95.public void setPicUrl(String picUrl) {96. PicUrl = picUrl;97. }98.public String getMediaId() {99.return MediaId;100. }101.public void setMediaId(String mediaId) {102. MediaId = mediaId;103. }104.public String getEventKey() {105.return EventKey;106. }107.public void setEventKey(String eventKey) { 108. EventKey = eventKey;109. }110.public String getTicket() {111.return Ticket;112. }113.public void setTicket(String ticket) {114. Ticket = ticket;115. }116.public String getLatitude() {117.return Latitude;118. }119.public void setLatitude(String latitude) {120. Latitude = latitude;121. }122.public String getLongitude() {123.return Longitude;124. }125.public void setLongitude(String longitude) { 126. Longitude = longitude;127. }128.public String getPrecision() {129.return Precision;130. }131.public void setPrecision(String precision) { 132. Precision = precision;133. }134.public String getEvent() {135.return Event;136. }137.public void setEvent(String event) {138. Event = event;139. }140.public String getMsgId() {141.return MsgId;142. }143.public void setMsgId(String msgId) {144. MsgId = msgId;145. }146.public String getToUserName() {147.return ToUserName;148. }149.public void setToUserName(String toUserName) { 150. ToUserName = toUserName;151. }152.public String getFromUserName() {153.return FromUserName;154. }155.public void setFromUserName(String fromUserName) { 156. FromUserName = fromUserName;157. }158.public String getCreateTime() {159.return CreateTime;160. }161.public void setCreateTime(String createTime) {162. CreateTime = createTime;163. }164.public String getMsgType() {165.return MsgType;166. }167.public void setMsgType(String msgType) {168. MsgType = msgType;169. }170.}[java]view plaincopy1.package demo.process;2.3.import ng.reflect.Field;4.import ng.reflect.Method;5.import java.util.Iterator;6.import org.dom4j.Document;7.import org.dom4j.DocumentHelper;8.import org.dom4j.Element;9.10.import demo.entity.ReceiveXmlEntity;11./**12. * 解析接收到的微信xml,返回消息对象13. * @author pamchen-114. *15. */16.public class ReceiveXmlProcess {17./**18. * 解析微信xml消息19. * @param strXml20. * @return21. */22.public ReceiveXmlEntity getMsgEntity(String strXml){23. ReceiveXmlEntity msg = null;24.try {25.if (strXml.length() <= 0 || strXml == null)26.return null;27.28.// 将字符串转化为XML文档对象29. Document document = DocumentHelper.parseText(strXml);30.// 获得文档的根节点31. Element root = document.getRootElement();32.// 遍历根节点下所有子节点33. Iterator<?> iter = root.elementIterator();34.35.// 遍历所有结点36. msg = new ReceiveXmlEntity();37.//利用反射机制,调用set方法38.//获取该实体的元类型39. Class<?> c = Class.forName("demo.entity.ReceiveXmlEntity");40. msg = (ReceiveXmlEntity)c.newInstance();//创建这个实体的对象41.42.while(iter.hasNext()){43. Element ele = (Element)iter.next();44.//获取set方法中的参数字段(实体类的属性)45. Field field = c.getDeclaredField(ele.getName());46.//获取set方法,field.getType())获取它的参数数据类型47. Method method = c.getDeclaredMethod("set"+ele.getName(), field.getType());48.//调用set方法49. method.invoke(msg, ele.getText());50. }51. } catch (Exception e) {52.// TODO: handle exception53. System.out.println("xml 格式异常: "+ strXml);54. e.printStackTrace();55. }56.return msg;57. }58.}2.3 调用图灵机器人api接口,获取智能回复内容:[java]view plaincopy1.package demo.process;2.3.import java.io.IOException;4.import java.io.UnsupportedEncodingException;5.import .URLEncoder;6.7.import org.apache.http.HttpResponse;8.import org.apache.http.client.ClientProtocolException;9.import org.apache.http.client.methods.HttpGet;10.import org.apache.http.impl.client.HttpClients;11.import org.apache.http.util.EntityUtils;12.import org.json.JSONException;13.import org.json.JSONObject;14.15./**16. * 调用图灵机器人api接口,获取智能回复内容17. * @author pamchen-118. *19. */20.public class TulingApiProcess {21./**22. * 调用图灵机器人api接口,获取智能回复内容,解析获取自己所需结果23. * @param content24. * @return25. */26.public String getTulingResult(String content){27./** 此处为图灵api接口,参数key需要自己去注册申请,先以11111111代替 */28. String apiUrl = "/openapi/api?key=11111111&info=";29. String param = "";30.try {31. param = apiUrl+URLEncoder.encode(content,"utf-8");32. } catch (UnsupportedEncodingException e1) {33.// TODO Auto-generated catch block34. e1.printStackTrace();35. } //将参数转为url编码36.37./** 发送httpget请求 */38. HttpGet request = new HttpGet(param);39. String result = "";40.try {41. HttpResponse response = HttpClients.createDefault().execute(request);42.if(response.getStatusLine().getStatusCode()==200){43. result = EntityUtils.toString(response.getEntity());44. }45. } catch (ClientProtocolException e) {46. e.printStackTrace();47. } catch (IOException e) {48. e.printStackTrace();49. }50./** 请求失败处理 */51.if(null==result){52.return"对不起,你说的话真是太高深了……";53. }54.55.try {56. JSONObject json = new JSONObject(result);57.//以code=100000为例,参考图灵机器人api文档58.if(100000==json.getInt("code")){59. result = json.getString("text");60. }61. } catch (JSONException e) {62.// TODO Auto-generated catch block63. e.printStackTrace();64. }65.return result;66. }67.}2.4 将结果封装为微信规定的xml格式,并返回给1.1中创建的servlet接口。

相关文档
最新文档