1、注册微信公众订阅号
2、服务器配置:
URL(服务器地址):rest/portal/getWeixinTokenToken
(令牌):XXX
EncodingAESKey(消息加解密密钥):VzfRmFPyc7BNm84OzNHIY5EwfTkbGmgodF58OW0ZouW
消息加解密方式:明文模式
3、微信公众号发送消息到服务器首先会访问get方法验证token,然后访问post方法将消息推送到服务器
URL:用Java编写,部署到服务器
第一步,访问get方法,验证token
import java.io.IOException; import java.io.PrintWriter; @Path("/getWeixinToken") @GET @Description("微信token验证") public void listSchoolHotMessageByPage(@Context HttpServletRequest request, @Context HttpServletResponse response) throws IOException { 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 (WeiXinSignUtil.checkSignature(signature, timestamp, nonce)) { out.print(echostr); } out.close(); out = null; }
package com.mashang.xlb.modules.portalmanage.util; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; public class WeiXinSignUtil { // 与接口配置信息中的Token要一致 private static String token = "weixinCourse"; /** * 验证签名 * * @param signature * @param timestamp * @param nonce * @return */ public static boolean checkSignature(String signature, String timestamp, String nonce) { String[] arr = new String[] { token, timestamp, nonce }; // 将token、timestamp、nonce三个参数进行字典序排序 Arrays.sort(arr); StringBuilder content = new StringBuilder(); for (int i = 0; i < arr.length; i++) { content.append(arr[i]); } MessageDigest md = null; String tmpStr = null; try { md = MessageDigest.getInstance("SHA-1"); // 将三个参数字符串拼接成一个字符串进行sha1加密 byte[] digest = md.digest(content.toString().getBytes()); tmpStr = byteToStr(digest); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } content = null; // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信 return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false; } /** * 将字节数组转换为十六进制字符串 * * @param byteArray * @return */ private static String byteToStr(byte[] byteArray) { String strDigest = ""; for (int i = 0; i < byteArray.length; i++) { strDigest += byteToHexStr(byteArray[i]); } return strDigest; } /** * 将字节转换为十六进制字符串 * * @param mByte * @return */ private static String byteToHexStr(byte mByte) { char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; char[] tempArr = new char[2]; tempArr[0] = Digit[(mByte >>> 4) & 0X0F]; tempArr[1] = Digit[mByte & 0X0F]; String s = new String(tempArr); return s; } }
2、访问post方法,并将消息发送到服务器:
@Path("/getWeixinToken") @POST @Description("微信token验证") @Consumes(MediaType.TEXT_XML) public void getWeixinTokenReceiveMsg(@Context HttpServletRequest request, @Context HttpServletResponse response) throws IOException, IllegalArgumentException, IllegalAccessException, DOMException { WeiXinReceiveMsgDTO wxrmDto = parseXml(request); LogUtil.debug(log, wxrmDto.toString()); response.getWriter().write("成功!"); } private WeiXinReceiveMsgDTO parseXml(HttpServletRequest request) throws IllegalArgumentException, IllegalAccessException, DOMException{ WeiXinReceiveMsgDTO wxrmDto = new WeiXinReceiveMsgDTO(); try { InputStream is = request.getInputStream(); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document document = db.parse(is); NodeList employees = document.getChildNodes(); for (int i = 0; i < employees.getLength(); i++) { Node employee = employees.item(i); NodeList employeeInfo = employee.getChildNodes(); for (int j = 0; j < employeeInfo.getLength(); j++) { Node node = employeeInfo.item(j); NodeList employeeMeta = node.getChildNodes(); for (int k = 0; k < employeeMeta.getLength(); k++) { this.setOjectFieldValue(wxrmDto,node.getNodeName(),employeeMeta.item(k).getTextContent()); } } } } catch (IOException | ParserConfigurationException | SAXException e) { e.printStackTrace(); } return wxrmDto; } /** * 给对象的属性赋值 * @param obj 对象 * @param name 需要赋值属性名称 * @param value 需要的赋值 * @throws IllegalArgumentException * @throws IllegalAccessException * @throws NoSuchMethodException * @throws SecurityException */ private void setOjectFieldValue(Object obj, String name , String value){ try { Field[] flds = obj.getClass().getDeclaredFields(); for (int k2 = 0; k2 < flds.length; k2++) { String foeldName = flds[k2].getName().replaceFirst(flds[k2].getName().substring(0, 1), flds[k2].getName().substring(0, 1).toUpperCase()); if(foeldName.equals(name)){ //关键。。。可访问私有变量 flds[k2].setAccessible(true); //对属性赋值 flds[k2].set(obj, value); } } } catch (IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); } }
相关推荐
主要介绍了C#微信公众号开发之接收事件推送与消息排重的方法,详细分析了事件推送与消息排重的使用技巧,对微信开发有一定参考借鉴价值,需要的朋友可以参考下
微信公众号开发-接收消息+模板消息。包含所有源代码、工具类、JAR包,MyEclipse开发的,其他软件开发的可以参考着修改。
当普通微信用户向公众号发送消息或者与微信公众号进行互动触发某些事件时,微信服务器将会把这些消息或者事件以XML数据包格式POST到开发者在微信公众号管理平台中配置的服务器地址URL上,本工程对消息与事件处理进行...
DotNET Core 实现微信公众号被关注时推送消息 (push messages to wechat)
微信公众号使用fastapi对接werobot框架的视图生成源代码,自己编写的原创代码,100%可用!
nodejs开发微信公众号
采用.net开发的webapi程序,用户与微信公众号交互。包括接收用户信息,主动推送信息(图文)到指定用户。完整的程序,可直接运行。注释详尽。已在实际项目中使用。
C#版的微信公众号开发SDK Senparc.Weixin.MP几个关键类介绍如下: Entities/Request*.cs 用于接收微信平台自动发送到服务器的实体(发送过来的是XML),包括文本、位置、图片三类 Entities/Response*.cs 用于反馈...
1、本系统是微信公众平台系统,系统立意不在于完全开发完成,而是将微信核心的开发全部无保留的设计并编写完成。 2、对于开发者而言这套后台系统UI也是非常不错的一款,在二次开发扩展的时候只要将自己做的页面指向...
hcWechat微信公众号后台框架,使用PHP语言作为后端,集合了MySQL数据库操作、分页、对接微信公众号官方接口、IP地址获取、微信支付接口等功能。只需简单配置,即可上手使用。...基本能满足微信公众号的日常开发。
以下是对微信公众号开发文档的主要内容和特点的概述: 一、开发文档概述 目的:为开发者提供全面的指导,使其能够充分利用微信公众平台的各项功能,创建出富有创新性和实用性的应用。 内容:包括开发规则与指南、...
5.4 微信发送功能 (1) 群发微信。 (2) 向指定群组发送微信。 (3) 向指定人员发送微信。...(2) 第三方应用程序通过约定接口,获取微信公众号的通讯录信息。 (3) 第三方应用程序通过约定接口,获取微信模板信息。
微信公众平台开发教程(java版本含代码),包含消息接收与发送、自定义菜单等。
服务器端采用springBoot开发微信公众号功能,实现与用户的交互,返回用户输入的内容
内容概要: 服务器适配对接:消息接收入口-消息处理 1、微信端接入检测; 2、接收用户消息;...博主独立完成了多个微信公众号项目的开发,关于微信公众号开发的全流程内容,有需要了解的朋友也可以私聊博主。
java 微信公众号 全部源码 jar包 功能有 access_token获取,自动回复,消息的接收与响应,自定义菜单,图片回复,音乐回复、菜单时间推送等功能
本文件旨在提供一个用于微信公众号消息加密解密的 Python 代码,帮助开发者简化加密解密流程,降低开发难度,同时保证消息传输的安全性。 二、文件内容 加密算法库:该文件包含了实现微信公众号消息加密解密所需的...
功能(获取access_token,消息接收,文字消息回复,自定义菜单,模板消息发送,二维码生成,网页授权) 没连数据库的那种demo
微信公众号已经成为企业和个人进行品牌推广、内容营销、客户服务等工作的重要渠道。开发微信公众号需要掌握相关的技术知识和开发流程,以下是一些说明: 1. 微信公众号类型及功能 微信公众号分为订阅号和服务号两种...
长春理工大学课程设计微信公众号后台开发,C#实现,主要功能包括了接收普通用户消息,回复图文消息等功能