转:https://blog.csdn.net/jeikerxiao/article/details/68064145

概述

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

  1. 在自己服务器上,开发验证微信验证服务器地址的有效性逻辑
  2. 在微信平台上,填写自己服务器地址信息
  3. 在自己服务器上,依据微信接口文档实现业务逻辑

第一步:实现验证服务器地址的有效性逻辑

开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带四个参数:

参数 描述
signature

微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。

timestamp 时间戳
nonce 随机数
echostr 随机字符串

开发者通过检验signature对请求进行校验(下面有校验方式)。

若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。

加密/校验流程如下:

  1. 将token、timestamp、nonce三个参数进行字典序排序
  2. 将三个参数字符串拼接成一个字符串进行sha1加密
  3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

java代码:

 package com.jeiker.demo.controller;

 import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays; @RestController
@RequestMapping("/wechat")
public class WeChatController { private Logger logger = LoggerFactory.getLogger(getClass()); // URL: http://www.xxxx.com/wechat/
// Token: 此处TOKEN即为微信接口配置信息的Token private String TOKEN = "wechat"; /**
* 验证微信后台配置的服务器地址有效性
*
* 接收并校验四个请求参数
*
* @param signature 微信加密签名
* @param timestamp 时间戳
* @param nonce 随机数
* @param echostr 随机字符串
* @return echostr
*/
@GetMapping("/")
public String checkName(@RequestParam(name = "signature") String signature,
@RequestParam(name = "timestamp") String timestamp,
@RequestParam(name = "nonce") String nonce,
@RequestParam(name = "echostr") String echostr) { logger.info("微信-开始校验签名");
logger.info("收到来自微信的 echostr 字符串:{}", echostr); // 加密/校验流程如下:
// 1. 将token、timestamp、nonce三个参数进行字典序排序
// 2. 将三个参数字符串拼接成一个字符串进行sha1加密
// 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信 // 1.排序
String sortString = sort(TOKEN, timestamp, nonce);
// 2.sha1加密
String myString = sha1(sortString);
// 3.字符串校验
if (myString != null && myString != "" && myString.equals(signature)) {
logger.info("微信-签名校验通过");
//如果检验成功原样返回echostr,微信服务器接收到此输出,才会确认检验完成。
logger.info("回复给微信的 echostr 字符串:{}", echostr);
return echostr;
} else {
logger.error("微信-签名校验失败");
return "";
}
} /**
* 排序方法
* @param token Token
* @param timestamp 时间戳
* @param nonce 随机数
* @return
*/
public String sort(String token, String timestamp, String nonce) {
String[] strArray = {token, timestamp, nonce};
Arrays.sort(strArray);
StringBuilder sb = new StringBuilder();
for (String str : strArray) {
sb.append(str);
} return sb.toString();
} /**
* 将字符串进行sha1加密
*
* @param str 需要加密的字符串
* @return 加密后的内容
*/
public String sha1(String str) {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-1");
digest.update(str.getBytes());
byte messageDigest[] = digest.digest();
// 创建 16进制字符串
StringBuffer hexString = new StringBuffer();
// 字节数组转换为 十六进制 数
for (int i = 0; i < messageDigest.length; i++) {
String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
if (shaHex.length() < 2) {
hexString.append(0);
}
hexString.append(shaHex);
}
return hexString.toString(); } catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
}

第二步:在微信公众号平台上填写服务器配置

登录微信公众平台官网后,在公众平台后台管理页面 - 开发者中心页,点击“修改配置”按钮,填写服务器地址(URL)、Token和EncodingAESKey,其中URL是开发者用来接收微信消息和事件的接口URL。Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。

信息填写好了后,点击“提交”按钮(这里以测试平台为例):

微信将会发出一个GET的验证请求到所填写的URL上,这时后端会收到请求输出日志:

echostr验证后,原样返回给微信服务器,就完成了服务器地址的验证。

服务器日志输出:

 微信-开始校验签名
收到来自微信的 echostr 字符串:4868431563403787247
微信-签名校验通过
回复给微信的 echostr 字符串:4868431563403787247

第三步:依据接口文档实现业务逻辑

验证URL有效性成功后即接入生效,成为开发者。

如果公众号类型为服务号(订阅号只能使用普通消息接口),可以在公众平台网站中申请认证,认证成功的服务号将获得众多接口权限,以满足开发者需求。

最新文章

  1. 查看nginx在安装时开启了哪些模块
  2. JAVA学习笔记(二):eclipse智能提示(转)
  3. Java IO--压缩流
  4. CISA 信息系统审计知识点 [第一章. 信息系统审计过程 ]
  5. iOS事件:触摸事件.运动事件.远程控制事件
  6. Centos安装配置Postfix邮件服务器
  7. Swift中对计算属性的理解和对之前的补充
  8. 安装ruby on rail
  9. AOP 在javascript 中的使用
  10. C语言编程练习(一)
  11. RAID技术详解
  12. 0x13链表与邻接表之邻值查找
  13. Ajax中,执行成功却依然刷新本页面
  14. Python学习之旅(十九)
  15. mysql查找一个字段属于哪个表
  16. Centos7 安装pyquery 等包的简易方法
  17. mac mini纯键盘操作连接蓝牙鼠标
  18. php安装redis拓展
  19. 数据库表数据传输到Oracle方案
  20. CentOS 安装tomcat

热门文章

  1. &lt;Android Framework 之路&gt;BootAnimation(1)
  2. C语言string.h中常用字符函数介绍
  3. Tesseract-OCR-05-主要API功能介绍
  4. PHP 使用WampServer环境,如何配置虚拟主机域名
  5. gradle中文学习资料
  6. Retrofit-入门使用
  7. SqlParameter.Value = NULL 引发的数据库异常
  8. ABAP SICF服务和Java Servlet的比较
  9. Redis 缓存穿透
  10. ES6-模块导入导出