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

合集下载

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

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

微信公众平台的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中的配置。

微信公众平台自定义菜单创建代码实现—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第⼀步:了解配置(建议先不要⽴即配,完成步骤⼆后再配置)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.}相应的配置信息如下,在生成的同时,可自动生成中的配置。

微信公众平台的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接口开发的详细步骤

微信小程序后端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协议进行通信,保证数据传输的安全性。

微信公众平台开发教程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实现]微信公众号⽹页授权登录⽹上搜资料时,⽹友都说官⽅⽂档太垃圾了不易看懂,如何如何的。

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

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

然后获取⽤户信息代码只需三步:获取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开发小程序

Java微信小程序开发指南使用Java开发小程序

Java微信小程序开发指南使用Java开发小程序使用Java开发微信小程序是一种强大的方式,可为开发人员提供广泛的工具和功能,以创建功能丰富、高性能的小程序。

本文将向您介绍Java微信小程序开发的指南,包括开发环境的设置、常用的开发工具和技术,以及一些开发中常见的问题和解决方法。

一、开发环境设置在开始Java微信小程序开发之前,您需要进行一些必要的开发环境设置。

首先,您需要安装Java开发工具包(JDK),并配置Java开发环境。

您可以从Oracle官方网站下载JDK安装包,并按照安装向导进行安装和设置。

安装完成后,您可以通过命令行工具(如Windows的命令提示符或Mac OS的终端)来验证您的Java环境是否已正确配置。

接下来,您需要安装开发集成工具(IDE),如Eclipse、IntelliJ IDEA等。

这些IDE提供了丰富的功能和插件,以帮助您更高效地进行Java开发。

您可以根据个人喜好选择适合自己的IDE,并按照安装向导进行设置。

二、常用的开发工具和技术在Java微信小程序开发中,有一些常用的开发工具和技术可以帮助您更好地进行开发。

以下是其中几个常用的工具和技术:1. Maven:Maven是一个项目管理工具,它可以用于构建、依赖管理和部署项目。

您可以使用Maven来管理项目的依赖库和构建过程,以提高项目的可维护性和可扩展性。

2. Spring Boot:Spring Boot是一个开发框架,它可以帮助您快速构建Java应用程序。

使用Spring Boot,您可以通过简单的配置和约定,减少繁琐的配置步骤,快速搭建起一个可运行的微信小程序。

3. MyBatis:MyBatis是一个持久化框架,它可以帮助您完成与数据库的交互。

使用MyBatis,您可以通过编写简单的SQL语句,实现对数据库的查询和修改操作。

4. 微信开发者工具:微信开发者工具是微信官方提供的一款集成开发环境,可以帮助您进行小程序的开发和调试。

使用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>标签,这也就对应着一条到多条图文消息。

java实现微信公众平台发送模板消息的示例代码

java实现微信公众平台发送模板消息的示例代码

java实现微信公众平台发送模板消息的⽰例代码最近开发公众号项⽬,前端采⽤vue开发,后台使⽤java开发,由于业务需求,需要实现公众号向⽤户发送重要的服务通知,提醒⼯作⼈员进⾏业务审核。

这时候就需要⽤到微信平台的模板消息,为了保证⽤户不受到骚扰,在开发者出现需要主动提醒、通知⽤户时,才允许开发者在公众平台⽹站中模板消息库中选择模板,选择后获得模板ID,再根据模板ID向⽤户主动推送提醒、通知消息。

常⽤的服务场景,如信⽤卡刷卡通知,商品下单成功、购买成功通知等。

获取template_id(注意:仅微信开放平台同事可获取)通过向微信公众平台申请模板,来获取模板id,模板消息调⽤时主要需要模板ID和模板中各参数的赋值内容。

请注意:1.模板中参数内容必须以".DATA"结尾,否则视为保留字;2.模板保留符号"{{ }}"下图是在微信测试公众号申请模板请求模板消息接⼝1)微信⽹页授权//前端发请请求this.axios.get('/wx/get_code_num').then((res) => {window.location.href = res.data;}).catch((error) => {console.log(error)});/*** 1.⽤户同意授权,获取code*/@RequestMapping(value = "/get_code_num", method = RequestMethod.GET)public String getCode() throws UnsupportedEncodingException {return "https:///connect/oauth2/authorize?appid=" + Constants.APPID + "&redirect_uri="+ URLEncoder.encode("http://192.168.0.152:8085/wx/send_wx_msg", "UTF-8") + "&response_type=code&scope="+ Constants.GRANTSCOPE + "&state=STATE#wechat_redirect";}2)获取⽤户openid/*** 2.通过code换取⽹页授权access_token及openid*/@RequestMapping(value = "/send_wx_msg", method = RequestMethod.GET)public String sendWxMsg(String code) {String access_token_url = "https:///sns/oauth2/access_token";String accessTokenObj = HttpClientUtil.sendGet(access_token_url, "appid=" + Constants.APPID + "&secret="+ Constants.APPSECRET + "&code=" + code + "&grant_type=authorization_code");JSONObject jsonToken = JSONObject.fromObject(accessTokenObj);String openId = null;if (StringUtils.isNotBlank(String.valueOf(jsonToken))) {openId = jsonToken.getString("openid");}("获取openid,微信平台接⼝返回{}", openId);return openId;}3)组装、发送模板消息import java.util.TreeMap;public class WechatTemplate {private String touser;//⽤⼾openidprivate String template_id;//模板IDprivate String url;//URL置空,则在发送后,点击模板消息会进⼊⼀个空⽩页⾯(ios),或⽆法点击(android)private TreeMap<String, TreeMap<String, String>> data; //data数据public static TreeMap<String, String> item(String value, String color) {TreeMap<String, String> params = new TreeMap<String, String>();params.put("value", value);params.put("color", color);return params;}public TreeMap<String, TreeMap<String, String>> getData() {return data;}public void setData(TreeMap<String, TreeMap<String, String>> data) {this.data = data;}public String getTouser() {return touser;}public void setTouser(String touser) {this.touser = touser;}public String getTemplate_id() {return template_id;}public void setTemplate_id(String template_id) {this.template_id = template_id;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}@Overridepublic String toString() {return "WechatTemplate{" +"touser='" + touser + '\'' +", template_id='" + template_id + '\'' +", url='" + url + '\'' +", data=" + data +'}';}}//微信模板接⼝private final String SEND_TEMPLATE_MESSAGE_URL = "https:///cgi-bin/message/template/send"; //模板消息详情跳转URLprivate static String url = "https:///";String access_token_url = "https:///sns/oauth2/access_token";String accessTokenObj = HttpClientUtil.sendGet(access_token_url, "appid=" + Constants.APPID + "&secret="+ Constants.APPSECRET + "&code=" + code + "&grant_type=authorization_code");JSONObject jsonToken = JSONObject.fromObject(accessTokenObj);String openId = null;if (StringUtils.isNotBlank(String.valueOf(jsonToken))) {openId = jsonToken.getString("openid");}("获取openid,微信平台接⼝返回{}", openId);String urlToken = "https:///cgi-bin/token";String tokenObj = HttpClientUtil.sendGet(urlToken, "grant_type=client_credential" + "&secret=" + Constants.APPSECRET + "&appid=" + Constants.APPID); JSONObject retToken = JSONObject.fromObject(tokenObj);String accessToken = String.valueOf(retToken.get("access_token"));("获取access_token,微信平台接⼝返回{}", accessToken);TreeMap<String, TreeMap<String, String>> params = new TreeMap<String, TreeMap<String, String>>();//根据具体模板参数组装params.put("first", WechatTemplate.item("您的户外旅⾏活动订单已经⽀付完成,可在我的个⼈中⼼中查看", "#000000"));params.put("keyword1", WechatTemplate.item("发现尼泊尔—⼈⽂与⾃然的旅⾏圣地", "#000000"));params.put("keyword2", WechatTemplate.item("5000元", "#000000"));params.put("keyword3", WechatTemplate.item("2019.09.04", "#000000"));params.put("keyword4", WechatTemplate.item("5", "#000000"));params.put("remark", WechatTemplate.item("请届时携带好⾝份证件准时到达集合地点,若临时退改将产⽣相应损失,敬请谅解,谢谢!", "#000000"));WechatTemplate wechatTemplate = new WechatTemplate();wechatTemplate.setTemplate_id(Constants.TEMPLATEID);wechatTemplate.setTouser(openId);wechatTemplate.setUrl(url);wechatTemplate.setData(params);JSONObject json = JSONObject.fromObject(wechatTemplate);//将java对象转换为json对象String sendData = json.toString();//将json对象转换为字符串("板参数组装{}", sendData);TreeMap<String, String> treeMap = new TreeMap<String, String>();treeMap.put("access_token", accessToken);String retInfo = HttpUtil.doPost(SEND_TEMPLATE_MESSAGE_URL, treeMap, sendData);("消息模板返回{}", retInfo);return retInfo;}请求的数据格式{"data": {"first": {"color": "#000000","value": "您的户外旅⾏活动订单已经⽀付完成,可在我的个⼈中⼼中查看"},"keyword1": {"color": "#000000","value": "发现尼泊尔—⼈⽂与⾃然的旅⾏圣地"},"keyword2": {"color": "#000000","value": "5000元"},"keyword3": {"color": "#000000","value": "2019.09.04"},"keyword4": {"color": "#000000","value": "5"},"remark": {"color": "#000000","value": "请届时携带好⾝份证件准时到达集合地点,若临时退改将产⽣相应损失,敬请谅解,谢谢!"}},"template_id": "ZUMTnYtG0O4vZSv4bPTtWTOFZ2zirOjaM50GYywRRnA","touser": "olv_asx8nmggCQEmAFNbQstx3xd0","url": "https:///"}微信平台返回的结果:微信公众号通知消息⼯具类:import mons.collections.MapUtils;import mons.io.IOUtils;import ng3.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import .ssl.*;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import .HttpURLConnection;import .URL;import .URLEncoder;import java.nio.charset.StandardCharsets;import java.security.SecureRandom;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import java.util.Map;public class HttpUtil {private static Logger logger = LoggerFactory.getLogger(HttpUtil.class);protected static final String POST_METHOD = "POST";private static final String GET_METHOD = "GET";static {TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {@Overridepublic void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { logger.debug("ClientTrusted");}@Overridepublic void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { logger.debug("ServerTrusted");}@Overridepublic X509Certificate[] getAcceptedIssuers() {return new X509Certificate[]{};}}};HostnameVerifier doNotVerify = (s, sslSession) -> true;try {SSLContext sc = SSLContext.getInstance("SSL", "SunJSSE");sc.init(null, trustAllCerts, new SecureRandom());HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());HttpsURLConnection.setDefaultHostnameVerifier(doNotVerify);} catch (Exception e) {logger.error("Initialization https impl occur exception : {}", e);}/*** 默认的http请求执⾏⽅法** @param url url 路径* @param method 请求的⽅法 POST/GET* @param map 请求参数集合* @param data 输⼊的数据允许为空* @return result*/private static String HttpDefaultExecute(String url, String method, Map<String, String> map, String data) { String result = "";try {url = setParmas(url, map, null);result = defaultConnection(url, method, data);} catch (Exception e) {logger.error("出错参数 {}", map);}return result;}public static String httpGet(String url, Map<String, String> map) {return HttpDefaultExecute(url, GET_METHOD, map, null);}public static String httpPost(String url, Map<String, String> map, String data) {return HttpDefaultExecute(url, POST_METHOD, map, data);}/*** 默认的https执⾏⽅法,返回** @param url url 路径* @param method 请求的⽅法 POST/GET* @param map 请求参数集合* @param data 输⼊的数据允许为空* @return result*/private static String HttpsDefaultExecute(String url, String method, Map<String, String> map, String data) { try {url = setParmas(url, map, null);(data);return defaultConnection(url, method, data);} catch (Exception e) {logger.error("出错参数 {}", map);}return "";}public static String doGet(String url, Map<String, String> map) {return HttpsDefaultExecute(url, GET_METHOD, map, null);}public static String doPost(String url, Map<String, String> map, String data) {return HttpsDefaultExecute(url, POST_METHOD, map, data);}/*** @param path 请求路径* @param method ⽅法* @param data 输⼊的数据允许为空* @return* @throws Exception*/private static String defaultConnection(String path, String method, String data) throws Exception {if (StringUtils.isBlank(path)) {throw new IOException("url can not be null");}String result = null;URL url = new URL(path);HttpURLConnection conn = getConnection(url, method);if (StringUtils.isNotEmpty(data)) {OutputStream output = conn.getOutputStream();output.write(data.getBytes(StandardCharsets.UTF_8));output.flush();output.close();if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {InputStream input = conn.getInputStream();result = IOUtils.toString(input, StandardCharsets.UTF_8);input.close();conn.disconnect();}// (result);return result;}/*** 根据url的协议选择对应的请求⽅式** @param url 请求路径* @param method ⽅法* @return conn* @throws IOException 异常*///待改进protected static HttpURLConnection getConnection(URL url, String method) throws IOException { HttpURLConnection conn;if (StringUtils.equals("https", url.getProtocol())) {conn = (HttpsURLConnection) url.openConnection();} else {conn = (HttpURLConnection) url.openConnection();}if (conn == null) {throw new IOException("connection can not be null");}conn.setRequestProperty("Pragma", "no-cache");// 设置不适⽤缓存conn.setRequestProperty("Cache-Control", "no-cache");conn.setRequestProperty("Connection", "Close");// 不⽀持Keep-Aliveconn.setUseCaches(false);conn.setDoOutput(true);conn.setDoInput(true);conn.setInstanceFollowRedirects(true);conn.setRequestMethod(method);conn.setConnectTimeout(8000);conn.setReadTimeout(8000);return conn;}/*** 根据url** @param url 请求路径* @return isFile* @throws IOException 异常*///待改进protected static HttpURLConnection getConnection(URL url, boolean isFile) throws IOException { HttpURLConnection conn = (HttpURLConnection) url.openConnection();if (conn == null) {throw new IOException("connection can not be null");}//设置从httpUrlConnection读⼊conn.setDoInput(true);conn.setDoOutput(true);conn.setUseCaches(false);//如果是上传⽂件,则设为POSTif (isFile) {conn.setRequestMethod(POST_METHOD); //GET和 POST都可以⽂件略⼤改成POST}// 设置请求头信息conn.setRequestProperty("Connection", "Keep-Alive");conn.setRequestProperty("Charset", String.valueOf(StandardCharsets.UTF_8));conn.setConnectTimeout(8000);conn.setReadTimeout(8000);return conn;}/*** 拼接参数** @param charset 编码格式* @return 拼接完成后的url*/public static String setParmas(String url, Map<String, String> map, String charset) throws Exception {String result = StringUtils.EMPTY;boolean hasParams = false;if (StringUtils.isNotEmpty(url) && MapUtils.isNotEmpty(map)) {StringBuilder builder = new StringBuilder();for (Map.Entry<String, String> entry : map.entrySet()) {String key = entry.getKey().trim();String value = entry.getValue().trim();if (hasParams) {builder.append("&");} else {hasParams = true;}if (StringUtils.isNotEmpty(charset)) {builder.append(key).append("=").append(URLEncoder.encode(value, charset));} else {builder.append(key).append("=").append(value);}}result = builder.toString();}URL u = new URL(url);if (StringUtils.isEmpty(u.getQuery())) {if (url.endsWith("?")) {url += result;} else {url = url + "?" + result;}} else {if (url.endsWith("&")) {url += result;} else {url = url + "&" + result;}}logger.debug("request url is {}", url);return url;}}遇到的问题1)"errcode":40001,"errmsg":"invalid credential, access_token is invalid or not latest hint: [Ua2IXa0080sz47!]"获取的access_token不对,这边的token不是授权的token,是公众号调⽤各接⼝时使⽤的access_token以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

微信公众号开发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)。

Java微信公众平台之群发接口(高级群发)

Java微信公众平台之群发接口(高级群发)

Java微信公众平台之群发接⼝(⾼级群发)再次吐槽下,微信素材管理和群发这块⽂档对Java很不友好,此⽂需要结合我和。

测试号调试群发只需看是否群发消息是否能组装成功,不需要看结果如何(反正不会发送成功的),因为微信还没开放这个功能(估计也不会开放的)。

⼀、群发说明在公众平台⽹站上,为订阅号提供了每天⼀条的群发权限,为服务号提供每⽉(⾃然⽉)4条的群发权限。

1、对于认证订阅号,群发接⼝每天可成功调⽤1次,此次群发可选择发送给全部⽤户或某个标签;2、对于认证服务号虽然开发者使⽤⾼级群发接⼝的每⽇调⽤限制为100次,但是⽤户每⽉只能接收4条,⽆论在公众平台⽹站上,还是使⽤接⼝群发,⽤户每⽉只能接收4条群发消息,多于4条的群发将对该⽤户发送失败;3、开发者可以主动设置 clientmsgid 来避免重复推送。

4、群发接⼝每分钟限制请求60次,超过限制的请求会被拒绝。

5、图⽂消息正⽂中插⼊⾃⼰帐号和其他公众号已群发⽂章链接的能⼒。

⼆、群发图⽂消息过程1、⾸先,预先将图⽂消息中需要⽤到的图⽚,使⽤上传图⽂消息内图⽚接⼝,上传成功并获得图⽚ URL;参考前⽂的上传图⽂消息内的图⽚获取URL⽅法2、上传图⽂消息素材,需要⽤到图⽚时,请使⽤上⼀步获取的图⽚ URL;3、使⽤对⽤户标签的群发,或对 OpenID 列表的群发,将图⽂消息群发出去,群发时微信会进⾏原创校验,并返回群发操作结果;4、在上述过程中,如果需要,还可以预览图⽂消息、查询群发状态,或删除已群发的消息等。

三、群发图⽚、⽂本等其他消息类型的过程1、如果是群发⽂本消息,则直接根据下⾯的接⼝说明进⾏群发即可;2、如果是群发图⽚、视频等消息,则需要预先通过素材管理接⼝准备好 mediaID。

四、is_to_all说明⽤于设定是否向全部⽤户发送,值为true或false,选择true该消息群发给所有⽤户,选择false可根据tag_id发送给指定群组的⽤户。

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

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

微信公众平台开发(二)微信公众平台示例代码分析来源: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

Wechat4j之Hello world使用wechat4j快速开发java版微信公众号Wechat4j是一个开源的java微信开发框架,是目前最简单易用的java微信开发框架。

项目地址:https:///sword-org/wechat4jWechat4j.jar下载:https:///sword-org/wechat4j/releases你也可以直接去下载需要的jar包集合,下载工具包/chengn/wechat4j-lib.rar一.你需要去申请一个公众号,并且在开发者模式之下。

二.使用eclipse创建一个web工程,添加apache支持,主要是支持web创建完成之后工程目录如下:然后下载需要的jar包。

如下导入项目之后的目录如下:创建自己的微信服务类,需要继承WechatSupport,点击“browse”之后,输入WechatSupport 即可查到。

如下图:点击“finish”之后,会生成代码,这时候没有生成构造方法,会有错误,在错误的地方查看提示之后可以自动生成构造方法,或者自己手写也行,如下图:写上构造方法之后,代码没有报错,找到onText方法,里面写上responseText("hello world!")即可,如下:此时你的微信服务类已经完成了。

下面需要配置你的微信信息。

在src目录下创建wechat4j.perperties文件(此文件你可以在wechat4j.jar/META-INF下找到wechat4j.sample.perperties文件,复制出来即可)。

内容如下:#你的urlwechat.url=#tokenwechat.token=token#encodingaeskeywechat.encodingaeskey=#wechat appidwechat.appid=appid#wechat app secretwechat.appsecret=secret这些配置信息全都是你进入微信公众平台之后在开发者模式之下能看到的。

动力节点Java微信开发入门

动力节点Java微信开发入门

微信开发入门一、微信公众平台的基本原理在开始做之前,先简单介绍了微信公众平台的基本原理。

微信服务器就相当于一个转发服务器,终端(手机、Pad等)发起请求至微信服务器,微信服务器然后将请求转发给我们的应用服务器。

应用服务器处理完毕后,将响应数据回发给微信服务器,微信服务器再将具体响应信息回复到微信App终端。

通信协议为:HTTP数据传输格式为:XML具体的流程如下图所示:来一张更加直观的图吧:我们需要做的事情,就是对微信服务器转发的HTTP请求做出响应。

具体的请求内容,我们按照特定的XML格式去解析,处理完毕后,也要按照特定的XML格式返回。

二、微信公众号接入在微信公众平台开发者文档上,关于公众号接入这一节内容在接入指南上写的比较详细的,文档中说接入公众号需要3个步骤,分别是:1、填写服务器配置2、验证服务器地址的有效性3、依据接口文档实现业务逻辑其实,第3步已经不能算做公众号接入的步骤,而是接入之后,开发人员可以根据微信公众号提供的接口所能做的一些开发。

第1步中服务器配置包含服务器地址(URL)、Token和EncodingAESKey。

服务器地址即公众号后台提供业务逻辑的入口地址,目前只支持80端口,之后包括接入验证以及任何其它的操作的请求(例如消息的发送、菜单管理、素材管理等)都要从这个地址进入。

接入验证和其它请求的区别就是,接入验证时是get 请求,其它时候是post请求;Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性);EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。

本例中全部以未加密的明文消息方式,不涉及此配置项。

第2步,验证服务器地址的有效性,当点击“提交”按钮后,微信服务器将发送一个http的get请求到刚刚填写的服务器地址,并且携带四个参数:接到请求后,我们需要做如下三步,若确认此次GET请求来自微信服务器,原样返回echostr参数内容,则接入生效,否则接入失败。

使用Java语言开发微信公众平台(六)——图片消息的回复

使用Java语言开发微信公众平台(六)——图片消息的回复

使⽤Java语⾔开发微信公众平台(六)——图⽚消息的回复在上⼀节课程中,我们来学习了微信公众平台最基础的⼀个接⼝——access_token,并且能够从微信公众平台中取到access_token。

那么,在本节课程中,我们要以上节课获取到的access_token为基础,继续进⾏微信公众平台开发中的图⽚消息的回复。

让我们开始本节课程的学习吧!系列课程回顾,请进⼊杰瑞教育微信开发专题进⾏学习。

⼀、图⽚消息数据结构按照国际惯例,在学习⼀种新的消息回复的时候,我们都需要⾸先了解这种消息的数据结构以及XML包结构。

那么,让我们进⼊微信开发帮助⽂档看⼀下:/wiki/1/6239b44c206cab9145b1d52c67e6c551.html 我们可以清晰的看到这样⼀个数据结构:从上⾯的结构可以看到,前四个在所有的消息类型中都会看到,⽽图⽚消息相对于其他的消息,多了⼀个MediaId,表⽰“通过素材管理接⼝上传多媒体⽂件,得到的id”。

那么,最关键的问题就来了,怎么通过素材管理接⼝上传多媒体⽂件?⼆、上传⽂件⾄微信平台①基础接⼝了解这⾥,我们依然需要接⼝帮助⽂档,来看⼀看怎么上传素材。

点击微信帮助⽂档左侧“素材管理”——“新增临时素材”,连接如下:/wiki/15/2d353966323806a202cd2deaafe8e557.html,我们可以看到这样的⼀段描述:图中出现的详细流程我就不再描述,简述⼀下流程就是,我们需要通过⽂件流的形式,从微信提供给我们的接⼝,上传⽂件到微信公众平台。

上传成功后微信会返回我们需要的media_id。

在此过程中,便需要⽤到我们上节课程获取到的access_token。

②代码操作了解了上传⽂件⾄微信平台的步骤后,我们开始进⾏代码的书写编辑。

进⼊我们之前⼀直使⽤的WeiXinUtil.java⼯具类⽂件,新建⼀个upload⽅法:下⾯,我们去测试类⾥⾯进⾏调⽤上传⽅法,上传⼀张照⽚。

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

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

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

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

在登录微信官方平台之后,开启开发者模式,此时需要我们填写url和token,所谓url就是我们自己服务器的接口,用来实现,相关解释已经在注释中说明,代码如下:[java]1.package;2.import3.import4.import5.import6.import7.import8.import9.import10.import11.import12./**13.*微信服务端收发消息接口14.*15.*@authorpamchen-116.*17.*/18.publicclass WechatServlet extends HttpServlet{19./**20.*ThedoGetmethodoftheservlet.<br>21.*22.*Thismethodiscalledwhenaformhasitstagvaluemethodequalstoget.23.*24.*@paramrequest25.*therequestsendbytheclienttotheserver26.*@paramresponse27.*theresponsesendbytheservertotheclient28.*@throwsServletException29.*ifanerroroccurred30.*@throwsIOException31.*ifanerroroccurred32.*/33.publicvoid doGet(HttpServletRequestrequest,HttpServletResponseresponse)34.throws ServletException,IOException{35.("UTF-8");36.("UTF-8");37./**读取接收到的xml消息*/38.StringBuffersb=new StringBuffer();39.InputStreamis=();40.InputStreamReaderisr=new InputStreamReader(is,"UTF-8");41.BufferedReaderbr=new BufferedReader(isr);42.Strings="";43.while((s=())!=null){44.(s);45.}46.Stringxml=();rocessWechatMag(xml);47.}48.try{49.OutputStreamos=();50.("UTF-8"));51.();52.();53.}catch(Exceptione){54.();55.}56.}57./**58.*ThedoPostmethodoftheservlet.<br>59.*60.*Thismethodiscalledwhenaformhasitstagvaluemethodequalsto61.*post.62.*63.*@paramrequest64.*therequestsendbytheclienttotheserver65.*@paramresponse66.*theresponsesendbytheservertotheclient67.*@throwsServletException68.*ifanerroroccurred69.*@throwsIOException70.*ifanerroroccurred71.*/72.publicvoid doPost(HttpServletRequestrequest,HttpServletResponseresponse)73.throws ServletException,IOException{74.doGet(request,response);75.}76.}相应的配置信息如下,在生成的同时,可自动生成中的配置。

前面所提到的url处可以填写例如:1.http;etMsgEntity(xml);2./**以文本消息为例,调用图灵机器人api接口,获取回复内容*/3.Stringresult="";4.if("text".endsWith())){5.result=new TulingApiProcess().getTulingResult());6.}7./**此时,如果用户输入的是“你好”,在经过上面的过程之后,result为“你也好”类似的内容8.*因为最终回复给微信的也是xml格式的数据,所有需要将其封装为文本类型返回消息9.**/10.result=new FormatXmlProcess().formatXmlAnswer(),(),result);11.return result;12.}13.}解析接收到的xml数据,此处有两个类,和,通过反射的机制动态调用实体类中的set 方法,可以避免很多重复的判断,提高代码效率,代码如下:[java]1.package;2./**3.*接收到的实体类4.*@authorpamchen-15.*6.*/7.publicclass ReceiveXmlEntity{8.private StringToUserName="";9.private StringFromUserName="";10.private StringCreateTime="";11.private StringMsgType="";12.private StringMsgId="";13.private StringEvent="";14.private StringEventKey="";15.private StringTicket="";16.private StringLatitude="";17.private StringLongitude="";18.private StringPrecision="";19.private StringPicUrl="";20.private StringMediaId="";21.private StringTitle="";22.private StringDescription="";23.private StringUrl="";24.private StringLocation_X="";25.private StringLocation_Y="";26.private StringScale="";27.private StringLabel="";28.private StringContent="";29.private StringFormat="";30.private StringRecognition="";31.public StringgetRecognition(){32.return Recognition;33.}34.publicvoid setRecognition(Stringrecognition){35.Recognition=recognition;36.}37.public StringgetFormat(){38.return Format;39.}40.publicvoid setFormat(Stringformat){41.Format=format;42.}43.public StringgetContent(){44.return Content;45.}46.publicvoid setContent(Stringcontent){47.Content=content;48.}49.public StringgetLocation_X(){50.return Location_X;51.}52.publicvoid setLocation_X(StringlocationX){53.Location_X=locationX;54.}55.public StringgetLocation_Y(){56.return Location_Y;57.}58.publicvoid setLocation_Y(StringlocationY){59.Location_Y=locationY;60.}61.public StringgetScale(){62.return Scale;63.}64.publicvoid setScale(Stringscale){65.Scale=scale;66.}67.public StringgetLabel(){68.return Label;69.}70.publicvoid setLabel(Stringlabel){bel=label;72.}73.public StringgetTitle(){74.return Title;75.}76.publicvoid setTitle(Stringtitle){77.Title=title;78.}79.public StringgetDescription(){80.return Description;81.}82.publicvoid setDescription(Stringdescription){83.Description=description;84.}85.public StringgetUrl(){86.return Url;87.}88.publicvoid setUrl(Stringurl){89.Url=url;90.}91.public StringgetPicUrl(){92.return PicUrl;93.}94.publicvoid setPicUrl(StringpicUrl){95.PicUrl=picUrl;96.}97.public StringgetMediaId(){98.return MediaId;99.}100.publicvoid setMediaId(StringmediaId){ 101.MediaId=mediaId;102.}103.public StringgetEventKey(){104.return EventKey;105.}106.publicvoid setEventKey(StringeventKey){ 107.EventKey=eventKey;108.}109.public StringgetTicket(){110.return Ticket;111.}112.publicvoid setTicket(Stringticket){113.Ticket=ticket;114.}115.public StringgetLatitude(){116.return Latitude;117.}118.publicvoid setLatitude(Stringlatitude){ titude=latitude;120.}121.public StringgetLongitude(){122.return Longitude;123.}124.publicvoid setLongitude(Stringlongitude){ 125.Longitude=longitude;126.}127.public StringgetPrecision(){128.return Precision;129.}130.publicvoid setPrecision(Stringprecision){ 131.Precision=precision;132.}133.public StringgetEvent(){134.return Event;135.}136.publicvoid setEvent(Stringevent){137.Event=event;138.}139.public StringgetMsgId(){140.return MsgId;141.}142.publicvoid setMsgId(StringmsgId){143.MsgId=msgId;144.}145.public StringgetToUserName(){146.return ToUserName;147.}148.publicvoid setToUserName(StringtoUserName){149.ToUserName=toUserName;150.}151.public StringgetFromUserName(){152.return FromUserName;153.}154.publicvoid setFromUserName(StringfromUserName){ 155.FromUserName=fromUserName;156.}157.public StringgetCreateTime(){158.return CreateTime;159.}160.publicvoid setCreateTime(StringcreateTime){161.CreateTime=createTime;162.}163.public StringgetMsgType(){164.return MsgType;165.}166.publicvoid setMsgType(StringmsgType){167.MsgType=msgType;168.}169.}[java]1.package;2.import3.import4.import5.import6.import7.import8.import9./**10.*解析接收到的,返回消息对象11.*@authorpamchen-112.*13.*/14.publicclass ReceiveXmlProcess{16.*解析消息17.*@paramstrXml18.*@return19.*/20.public ReceiveXmlEntitygetMsgEntity(StringstrXml){21.ReceiveXmlEntitymsg=null;22.try{23.if()<=0||strXml==null)24.returnnull;1.xecute(request);2.if().getStatusCode()==200){3.result=());4.}5.}catch(ClientProtocolExceptione){6.();7.}catch(IOExceptione){8.();9.}10./**请求失败处理*/11.if(null==result){12.return"对不起,你说的话真是太高深了……";13.}14.try{15.JSONObjectjson=new JSONObject(result);16.//以code=100000为例,参考图灵机器人api文档17.if(100000==("code")){18.result=("text");19.}20.}catch(JSONExceptione){21.//TODOAuto-generatedcatchblock22.();23.}24.return result;25.}26.}将结果封装为微信规定的xml格式,并返回给中创建的servlet接口。

相关文档
最新文档