接入微信公众平台开发需要使用微信公众号,由于正式微信公众号注册具有一定门槛,普通用户很难申请。所以,为了帮助开发者快速了解和上手微信公众号开发,熟悉各个接口的调用,微信还提供了微信公众帐号测试号,通过手机微信扫描二维码即可获得测试号。
测试号申请地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
当普通微信用户向公众号发送消息或者与微信公众号进行互动触发某些事件时,微信服务器将会把这些消息或者事件以XML数据包格式POST到开发者配置的服务器地址URL上,对于公众号和公众账号测试号的配置方式如下。

配置微信公众号

微信公众平台地址:https://mp.weixin.qq.com
配置步骤:公众平台首页-->开发-->基本配置-->服务器配置-->修改配置。

配置测试号

测试号管理地址:https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index
对于公众账号测试号,在接口配置信息中对服务器地址URL和令牌Token进行设置,配置规则与正式微信公众号相同。

验证服务器地址URL

开发者提交配置信息后,微信服务器将发送GET请求到填写的服务器地址URL上以验证配置的服务器地址URL是否正确并确认开发者的身份,GET请求携带参数如下表所示:

开发者需在配置的服务器地址URL中对GET请求传入的signature进行校验,以确认此次请求是否来自微信服务器,若确认此次GET请求来自微信服务器,只需原样返回echostr参数内容即可接入成功,否则接入失败。
加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序;
2)将三个参数字符串拼接成一个字符串进行sha1加密;
3)开发者获得加密后的字符串可与signature对比,判断该请求是否来源于微信。
校验signature的Java示例代码如下。

import java.io.InputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;import com.pengjunlee.wechat.msg.WeChatEncrypt;
import com.pengjunlee.wechat.msg.WechatSession;/*** 处理微信消息和事件专用控制器*/
@Controller
@RequestMapping("/wechat")
public class WeChatController
{private static final String token = "pengjunlee";// 公众号管理后台配置的令牌(Token)/*** 验证微信服务器端GET请求 实现一* * @param out* @param request* @param response*/@RequestMapping(value = "/index", method = RequestMethod.GET)public void checkSignature(PrintWriter out, HttpServletRequest request, HttpServletResponse response){String signature = request.getParameter("signature"); // 微信加密签名String timestamp = request.getParameter("timestamp"); // 时间戳String nonce = request.getParameter("nonce"); // 随机数String echostr = request.getParameter("echostr"); // 随机字符串String[] arr = new String[]{token, timestamp, nonce};// 对数组内的token、timestamp、nonce三个元素进行字典序排序Arrays.sort(arr);// 将排序后的token、timestamp、nonce三个字符串按顺序拼接成一个字符串StringBuilder sb = new StringBuilder();for (int i = 0; i < arr.length; i++){sb.append(arr[i]);}// 对拼接好的字符串进行SHA-1加密String tmpStr = WeChatEncrypt.encrypt(sb.toString(), WeChatEncrypt.SHA_1);// 将加密后的字符串与signature进行比较if (tmpStr.equals(signature)){out.print(echostr);// 身份验证成功,将echostr字符串内容原样返回}else{out.print("");// 身份验证失败,返回空字符串}out.flush();out.close();}/*** 验证微信服务器端GET请求 实现二* * @param out* @param signature* @param timestamp* @param nonce* @param echostr* @throws Exception*/@GetMapping(value = "/index2")public void checkSignature2(PrintWriter out, @RequestParam(value = "signature", required = true) String signature, @RequestParam String timestamp,@RequestParam String nonce, @RequestParam String echostr) throws Exception{List<String> list = new ArrayList<String>(3){private static final long serialVersionUID = 1L;@Overridepublic String toString(){return this.get(0) + this.get(1) + this.get(2);}};list.add(token); // 令牌list.add(timestamp);// 时间戳list.add(nonce);// 随机数Collections.sort(list); // 排序String tmpStr = WeChatEncrypt.encrypt(list.toString(), WeChatEncrypt.SHA_1); // SHA-1加密if (signature.equals(tmpStr)){out.write(echostr); // 身份验证成功,将echostr字符串内容原样返回}else{out.write(""); // 身份验证失败,返回空字符串}out.flush();out.close();}/*** 接收微信服务器POST过来的各种消息&事件* * @param request* @param response* @throws Exception*/@PostMapping(value = "/index")public void interceptMsgAndEvent(HttpServletRequest request, HttpServletResponse response) throws Exception{// response.setCharacterEncoding("UTF-8");response.setContentType("application/xml; charset=UTF-8"); // 设置响应内容的类型和编码字符集InputStream in = request.getInputStream();PrintWriter out = response.getWriter();handleMsgAndEvent(in, out);}/*** 处理微信服务器POST过来的各种消息&事件* * @param in* @param out* @throws Exception*/public void handleMsgAndEvent(InputStream in, PrintWriter out) throws Exception{WechatSession session = new WechatSession(in, out);session.process(); // 处理微信消息或者事件session.close(); // 关闭Session}
}

WeChatEncrypt  加密工具类。

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;/*** 微信公众号字符串加密工具类*/
public class WeChatEncrypt
{public static final String MD5 = "MD5";public static final String SHA_1 = "SHA-1";public static final String SHA_256 = "SHA_256";/*** 使用指定的加密算法对字符串进行加密* * @param srcStr*            要加密的字符串* @param encryptType*            MD5\SHA_1\SHA_256* @return 加密后的字符串*/public static String encrypt(String srcStr, String encryptType){String desStr = "";try{if ((encryptType == null) || ("".equals(encryptType)))encryptType = "MD5";MessageDigest md = MessageDigest.getInstance(encryptType);md.update(srcStr.getBytes());desStr = bytes2Hex(md.digest());}catch (NoSuchAlgorithmException e){return srcStr;}return desStr;}/*** 将字节数组转换为16进制字符串* * @param bts* @return*/private static String bytes2Hex(byte[] bts){String des = "";String tmp = null;for (int i = 0; i < bts.length; i++){tmp = Integer.toHexString(bts[i] & 0xFF);if (tmp.length() == 1){des += "0";}des += tmp;}return des;}public static void main(String[] args){String strSrc = "\u53EF\u4EE5\u52A0\u5BC6\u6C49\u5B57";System.out.println("Source String:" + strSrc);System.out.println("Encrypted String:");System.out.println("Use MD5:" + encrypt(strSrc, null));System.out.println("Use MD5:" + encrypt(strSrc, "MD5"));System.out.println("Use SHA:" + encrypt(strSrc, "SHA-1"));System.out.println("Use SHA-256:" + encrypt(strSrc, "SHA-256"));}
}

本文项目源码已上传至CSDN,资源地址:http://download.csdn.net/download/pengjunlee/10257857

微信公众号开发:账号申请与接入相关推荐

  1. 微信公众号开发账号申请以及菜单配置。

    一.微信公众平台接口测试帐号申请 1. 账号申请地址:账号申请地址 二.微信公众平台接口测试帐号配置 1. 测试号基本信息appid 2. 配置JS接口安全域名名(页面域名) 注意:不要加上http或 ...

  2. Java微信公众号开发(一:接入平台,验证token)

    Java微信公众号开发(一:接入平台,验证token) 开发环境: 环境:JDK1.8 框架:springBoot 首先,在我们接入微信公众平台之前,我们需要注册微信公众号的开发者账号,获取开发者ID ...

  3. 微信公众号开发教程(一) 验证接入

    作者:陈惠,叩丁狼教育高级讲师.原创文章,转载请注明出处. 微信公众号开发教程(一)验证接入 本篇文章主要介绍了微信公众号开发接入详细流程,希望对刚接触公众号开发的同学有所帮助,有兴趣的同学可多多关注 ...

  4. 微信公众号开发之服务器验证接入

    微信公众号开发需要将项目运行在带有独立ip地址的主机上,可以选择内网穿透或者云服务器,我用的阿里云的服务器.微信验证接入过程就是微信给你的服务器发送一个get请求,请求中携带signature.tim ...

  5. 公众号 多服务器配置_微信公众号开发之配置和接入(二)

    从今天开始我们就正式开始微信公众号开发了,首先进入微信官网https://mp.weixin.qq.com/,注册或者登陆(如果已经注册了)你的微信公众号,登陆后需要管理员用个人微信扫码验证通过才行, ...

  6. 玩一玩微信公众号开发(一) 接入系统

    一开始我准备学一学微信开发.后来看了一下文档,需要自己搭服务器进行接口对调.有点麻烦所以就没继续学下去.现在学习过了Kotlin.Spring Boot很多东西,感觉可以比较方便的进行开发了.今天就来 ...

  7. ASP.NET微信公众号开发实记之一 接入配置

    第一步:填写服务器配置 登录微信公众平台官网后,在公众平台后台管理页面 - 开发者中心页,点击"修改配置"按钮,填写服务器地址(URL).Token和EncodingAESKey, ...

  8. 微信接入php指南,微信公众号开发教程01:接入指南

    要成为微信开发者,首先需要进入接入校验,微信相关的接入文档地址为: 具体步骤如下: 一.填写服务器配置 1.申请微信公众号,并登陆:https://mp.weixin.qq.com/ 2.填写相关的参 ...

  9. JAVA带你一步一步实现微信公众号开发(一)--接入微信公众平台

    (一)接入流程解析 在我们的开发过程中无论如何最好的参考工具当然是我们的官方文档了:http://mp.weixin.qq.com/wiki/8/f9a0b8382e0b77d87b3bcc1ce6f ...

  10. 微信公众号测试账号申请,后台获取公众号关注取关事件,获取用户发送消息

    目录 1.访问微信公众号平台 2.扫码登录 3.登录后进行接口信息配置 4.完成以上配置和代码,将代码部署到服务器上,后台就可以接收到公众号的关注.取关.用户发送的消息等等事件拉! 1.访问微信公众号 ...

最新文章

  1. HTTP协议之Chunked解析
  2. 7个问题,直击管理的本质
  3. python 多级菜单_python多级菜单
  4. 百度云获取外链直接下载突破限速
  5. Java计算一段程序的运行时间
  6. html5的消息通知
  7. 乔布斯在斯坦福大学演讲稿英文_西方大文豪最爱的10个英文单词,写尽人世间细腻情感!...
  8. linux arm. 快速启动,教你如何快速启动Linux 系统
  9. UIButton @selector 想要传递多个参数
  10. 2021年中国电子设备维修服务市场趋势报告、技术动态创新及2027年市场预测
  11. python卸载_手把手教Python环境安装
  12. 如何使用计算机小学生课件,小学信息技术计算机基础ppt课件
  13. 网站速度优化4个实用办法
  14. Java 从键盘输入数据到一维double数组中
  15. 从汇编指令解决浮点数疑问
  16. 当时我就哭了!中国首个火星探测器天问一号发射成功!
  17. IOTA,物联网区块链?
  18. WiFi安全现状,70%的WiFi可被快速破解
  19. DeprecationWarning: use options instead of chrome_options self.driver = webdriver.Chrome(chrome_op
  20. 限制html窗口最小宽度,给页面一个最小宽度,小于这个宽度时,出现横向滚动条...

热门文章

  1. COMSOL流体操作
  2. 黑苹果10.14版本n卡安装以及声卡驱动
  3. nginx的cgi模块
  4. Windows Server2012 服务器修改密码过期时间
  5. python摄像头动作捕捉_为动作捕捉设备写MOTIONBUILDER插件
  6. 可以测量50A以上电流的隔离集成式电流传感器CH704应用案例分享
  7. c++学习 | MFC —— 控件介绍
  8. springboot接收前端的数组_SpringBoot如何接收数组参数的方法
  9. 如何用命令行去修改视频文件格式
  10. PS修改证件照照背景颜色(带毛发)