接入微信公众平台开发,开发者需要按照如下步骤完成:

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

微信公众号开发之微信服务器配置相关推荐

  1. 微信公众号开发之微信公众平台与公众号第三方平台区别

    微信公众号开发分为微信公众平台和公众号第三方平台. 首先需要一个认证服务号,然后在设置,基本配置里面配置公众号开发信息和服务器配置. 这是我们会得到开发者ID(AppID),开发者密码(AppSecr ...

  2. 微信公众 mysql回复图片_微信公众号开发之微信公共平台消息回复类实例

    本文实例讲述了微信公众号开发之微信公共平台消息回复类.分享给大家供大家参考.具体如下: 微信公众号开发代码我在网上看到了有不少,其实都是大同小义了都是参考官方给出的demo文件进行修改的,这里就给各位 ...

  3. 视频教程-基于python的微信公众号开发教程-微信开发

    基于python的微信公众号开发教程 微信企业号星级会员.10多年软件从业经历,国家级软件项目负责人,主要从事软件研发.软件企业员工技能培训.已经取得计算机技术与软件资格考试(软考)--"信 ...

  4. Java微信公众号开发之微信公众平台接入开发者

    微信开发者接入官方文档 : https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319 一.微信公共号通讯机制 作为开发 ...

  5. ThinkPHP5.0微信公众号开发之 微信公众号接入

    ThinkPHP5.0 微信公众号接入 第一步:准备工作 首先,要有自己的公众号(这句是废话),个人可以申请微信公众号的订阅号,企业才可以申请服务号,其次要有云空间或者服务器,并且将服务器IP添加至微 ...

  6. 微信公众号开发 (1) 微信接入认证成为开发者

    一.前言 本系列教程将基于springboot2.1.8.RELEASE完成 本文将实现 注册账号 接入微信 认证成为开发者 二.进入微信公众平台注册账号 https://mp.weixin.qq.c ...

  7. php获取微信收款记录,微信公众号开发之微信支付代码记录的实现

    需求说明 这个需求说明是完全没有必要的,但是还是写一下吧,但凡是做公众号的,一般都是需要了解这个微信支付的,不然基本的业务都没办法走,所以今天简单的记录一下微信支付的一些问题以及流程是怎么样的.记录的 ...

  8. 微信公众号开发之微信买单

    微信开发交流群:148540125 欢迎留言.转发.打赏 微信极速开发系列文章:http://www.jianshu.com/p/a172a1b69fdd 首先来看看微信支付都有哪些产品 此篇文章聊聊 ...

  9. Java微信公众号开发之微信素材管理工具类

    1.前言 微信公众号在使用接口的时候是通过传入media_id来进行调用的,所以在使用的接口的时候我们往往需要先上传素材,然后拿到微信返回给我们的media_id去调用相关接口,素材管理分为临时素材和 ...

最新文章

  1. linux下,redis 3.2.1双节点集群安装部署
  2. ZOJ 3609 Modular Inverse(扩展欧几里得)题解
  3. OpenCV HDF读写属性
  4. 【线性筛】【质因数分解】【约数个数定理】hdu6069 Counting Divisors
  5. Cisco Adsl 详细配置
  6. linux内核那些事之VMA常用操作
  7. 赛门铁克:靠近数据源的重复数据删除
  8. 自动化专业学python如何_如何系统有效学习 Python 自动化测试?
  9. ACM题目————中位数
  10. Python字符串转换为小写字母– str.lower()
  11. 华为鸿蒙os2.0更新,鸿蒙OS2.0更新了吗?更新方法、更新包大小、使用体验等都来了...
  12. php log日志管理,PHP日志LOG类定义与用法示例
  13. Console-算法[for]-素数
  14. Shiro的详细简介解释(快速搭建官网解释代码)
  15. 英语语法之形容词与副词
  16. 详解矩阵算法在电商sku组件中的应用一
  17. python中idle_python中的idle是什么意思
  18. android系统 备份恢复,Android系统备份及系统还原方法介绍
  19. 信息安全—WIFI攻击实验
  20. 第二十七课 awk工具

热门文章

  1. ExtJs2.0学习系列(1)--Ext.MessageBox
  2. 漫步微积分十七——最大最小值问题(续)
  3. 机器人驾驶的神经网络愿景(上)
  4. java 注册成功跳转,写了个注册页面填了注册信息后点注册按钮居然不跳转,为什么?...
  5. 万能搜索监控ip工具_录像机搜不到摄像头IP可能是以下原因
  6. leetcode —— 面试题54. 二叉搜索树的第k大节点
  7. 吴恩达深度学习 —— 3.2 神经网络表示
  8. Java多层翻页网络爬虫实战(以搜房网为例)
  9. python 用户的画像可视化呈现技术_一人一车一面:解读汽车大数据用户画像背后的AI技术...
  10. Java学习笔记--导航