微信公众号开发之微信服务器配置
接入微信公众平台开发,开发者需要按照如下步骤完成:
1、填写服务器配置
2、验证服务器地址的有效性
3、依据接口文档实现业务逻辑
通讯过程
第一步:填写服务器配置
登录微信公众平台官网后,在公众平台官网的开发-基本设置页面,勾选协议成为开发者,点击“修改配置”按钮,填写服务器地址(URL)、Token和EncodingAESKey,其中URL是开发者用来接收微信消息和事件的接口URL。Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。
第二步:验证消息的确来自微信服务器
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:
参数 | 描述 |
---|---|
signature | 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序 2)将三个参数字符串拼接成一个字符串进行sha1加密 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
第三步 代码验证
验证代码 验证完后注释
package com.china.junran.apipublic; import com.china.junran.configure.properties.WeiXinProperties;import com.china.junran.third.weixin.encrypt.WxEncrypt;import com.china.junran.third.weixin.encrypt.WxEncryptException;import com.china.junran.third.weixin.event.ComponentEventHandler;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.ResponseEntity;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import springfox.documentation.annotations.ApiIgnore; import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;import java.nio.charset.Charset;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.Arrays; /** * 接收微信推送消息 * * @author hmj */@Slf4j@Controller@RequestMapping("/weixin")public class WeiXinController { @Autowired private ComponentEventHandler<String> componentEventHandler; private WeiXinProperties properties; private WxEncrypt crypt; @Autowired public void setWeixinProperties(WeiXinProperties properties) { this.properties = properties; this.crypt = new WxEncrypt(properties.getToken(), properties.getEncodingAesKey(), properties.getAppid()); } private String decryptBody(String msgSignature, String timestamp, String nonce, String body) { try { String decBody = crypt.decryptMsg(msgSignature, timestamp, nonce, body); log.debug("Wx event body is {}", decBody); return decBody; } catch (WxEncryptException e) { log.debug("Receive message is fail, error is {}", e.getMessage()); return null; } } @ApiIgnore @RequestMapping(value = "event", method = RequestMethod.POST) public ResponseEntity<?> event( @RequestParam String signature, @RequestParam String timestamp, @RequestParam String nonce, @RequestBody byte[] bytes) { log.info("Timestamp is {}, nonce is {}, signature is {}", timestamp, nonce, signature); String body = new String(bytes, Charset.forName("UTF-8")); log.info("Body is {}", body); //todo 加密解密 return componentEventHandler.handler(body); } /* * * 微信服务器验证 * * */ /* @ApiIgnore @RequestMapping( value = {"/event"}, method = {RequestMethod.GET} ) public static void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String signature = request.getParameter("signature"); String timestamp = request.getParameter("timestamp"); String nonce = request.getParameter("nonce"); String echostr = request.getParameter("echostr"); if (check(timestamp, nonce, signature)) { System.out.println("接入成功"); PrintWriter out = response.getWriter(); out.print(echostr); out.flush(); out.close(); } else { System.out.println("接入失败"); } System.out.println(signature); System.out.println(timestamp); System.out.println(nonce); System.out.println(echostr); System.out.println("get"); } public static boolean check(String timestamp, String nonce, String signature) { String[] strs = new String[]{"junran", timestamp, nonce};//junran Arrays.sort(strs); String str = strs[0] + strs[1] + strs[2]; String mysig = sha1(str); System.out.println("mysig: " + mysig); System.out.println("signature: " + signature); return mysig.equalsIgnoreCase(signature); } private static String sha1(String src) { try { MessageDigest md = MessageDigest.getInstance("sha1"); byte[] digest = md.digest(src.getBytes()); char[] chars = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; StringBuilder sb = new StringBuilder(); byte[] var5 = digest; int var6 = digest.length; for(int var7 = 0; var7 < var6; ++var7) { byte b = var5[var7]; sb.append(chars[b >> 4 & 15]); sb.append(chars[b & 15]); } return sb.toString(); } catch (NoSuchAlgorithmException var9) { var9.printStackTrace(); return null; } }*/}
点击提交 请求验证代码 提交成功后 验证完毕 之后微信所有信息都发送到这个接口中
如果帮助到你,给点鼓励点个推荐吧亲
转载于:https://www.cnblogs.com/shenhaha520/p/10132873.html
微信公众号开发之微信服务器配置相关推荐
- 微信公众号开发之微信公众平台与公众号第三方平台区别
微信公众号开发分为微信公众平台和公众号第三方平台. 首先需要一个认证服务号,然后在设置,基本配置里面配置公众号开发信息和服务器配置. 这是我们会得到开发者ID(AppID),开发者密码(AppSecr ...
- 微信公众 mysql回复图片_微信公众号开发之微信公共平台消息回复类实例
本文实例讲述了微信公众号开发之微信公共平台消息回复类.分享给大家供大家参考.具体如下: 微信公众号开发代码我在网上看到了有不少,其实都是大同小义了都是参考官方给出的demo文件进行修改的,这里就给各位 ...
- 视频教程-基于python的微信公众号开发教程-微信开发
基于python的微信公众号开发教程 微信企业号星级会员.10多年软件从业经历,国家级软件项目负责人,主要从事软件研发.软件企业员工技能培训.已经取得计算机技术与软件资格考试(软考)--"信 ...
- Java微信公众号开发之微信公众平台接入开发者
微信开发者接入官方文档 : https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319 一.微信公共号通讯机制 作为开发 ...
- ThinkPHP5.0微信公众号开发之 微信公众号接入
ThinkPHP5.0 微信公众号接入 第一步:准备工作 首先,要有自己的公众号(这句是废话),个人可以申请微信公众号的订阅号,企业才可以申请服务号,其次要有云空间或者服务器,并且将服务器IP添加至微 ...
- 微信公众号开发 (1) 微信接入认证成为开发者
一.前言 本系列教程将基于springboot2.1.8.RELEASE完成 本文将实现 注册账号 接入微信 认证成为开发者 二.进入微信公众平台注册账号 https://mp.weixin.qq.c ...
- php获取微信收款记录,微信公众号开发之微信支付代码记录的实现
需求说明 这个需求说明是完全没有必要的,但是还是写一下吧,但凡是做公众号的,一般都是需要了解这个微信支付的,不然基本的业务都没办法走,所以今天简单的记录一下微信支付的一些问题以及流程是怎么样的.记录的 ...
- 微信公众号开发之微信买单
微信开发交流群:148540125 欢迎留言.转发.打赏 微信极速开发系列文章:http://www.jianshu.com/p/a172a1b69fdd 首先来看看微信支付都有哪些产品 此篇文章聊聊 ...
- Java微信公众号开发之微信素材管理工具类
1.前言 微信公众号在使用接口的时候是通过传入media_id来进行调用的,所以在使用的接口的时候我们往往需要先上传素材,然后拿到微信返回给我们的media_id去调用相关接口,素材管理分为临时素材和 ...
最新文章
- linux下,redis 3.2.1双节点集群安装部署
- ZOJ 3609 Modular Inverse(扩展欧几里得)题解
- OpenCV HDF读写属性
- 【线性筛】【质因数分解】【约数个数定理】hdu6069 Counting Divisors
- Cisco Adsl 详细配置
- linux内核那些事之VMA常用操作
- 赛门铁克:靠近数据源的重复数据删除
- 自动化专业学python如何_如何系统有效学习 Python 自动化测试?
- ACM题目————中位数
- Python字符串转换为小写字母– str.lower()
- 华为鸿蒙os2.0更新,鸿蒙OS2.0更新了吗?更新方法、更新包大小、使用体验等都来了...
- php log日志管理,PHP日志LOG类定义与用法示例
- Console-算法[for]-素数
- Shiro的详细简介解释(快速搭建官网解释代码)
- 英语语法之形容词与副词
- 详解矩阵算法在电商sku组件中的应用一
- python中idle_python中的idle是什么意思
- android系统 备份恢复,Android系统备份及系统还原方法介绍
- 信息安全—WIFI攻击实验
- 第二十七课 awk工具
热门文章
- ExtJs2.0学习系列(1)--Ext.MessageBox
- 漫步微积分十七——最大最小值问题(续)
- 机器人驾驶的神经网络愿景(上)
- java 注册成功跳转,写了个注册页面填了注册信息后点注册按钮居然不跳转,为什么?...
- 万能搜索监控ip工具_录像机搜不到摄像头IP可能是以下原因
- leetcode —— 面试题54. 二叉搜索树的第k大节点
- 吴恩达深度学习 —— 3.2 神经网络表示
- Java多层翻页网络爬虫实战(以搜房网为例)
- python 用户的画像可视化呈现技术_一人一车一面:解读汽车大数据用户画像背后的AI技术...
- Java学习笔记--导航