开发微信公众号在没有正式的公众平台账号时,我们可以使用测试平台账号———

测试平台申请地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

进入之后我们会看见此时appID、appsecret都有了,url是我们成为开发者与微信进行的一次握手配置(url其实就是我们项目中你controller的访问地址,token是我们自己填写的,可在后台进行判断的),这里的url可以用ngrok来做映射,这样开发起来比较方便,ngrok配置(点击查看)ngrok下载地址(点击下载)

我们可以在开发者文档中看见

这里查看详细配置;期间我们要说道微信会给我们的url通过get方式传递4个参数

下面我们来看一下controller怎么编写

  1. package com.website.wechat.controller;
  2. import java.io.IOException;
  3. import java.security.MessageDigest;
  4. import java.util.ArrayList;
  5. import java.util.Collections;
  6. import java.util.List;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import org.springframework.stereotype.Controller;
  10. import org.springframework.web.bind.annotation.RequestMapping;
  11. import org.springframework.web.bind.annotation.RequestMethod;
  12. import org.springframework.web.bind.annotation.ResponseBody;
  13. @Controller
  14. @RequestMapping(value="weixin")
  15. public class WeiXinController {
  16. private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5',
  17. '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
  18. @RequestMapping(value="getWeiXinMethod",method=RequestMethod.GET)
  19. @ResponseBody
  20. public void getWeiXinMethod(HttpServletRequest request, HttpServletResponse response) throws IOException{
  21. boolean validate = validate(request);
  22. if (validate) {
  23. response.getWriter().write(request.getParameter("echostr"));
  24. response.getWriter().close();
  25. }
  26. }
  27. private boolean validate(HttpServletRequest req) throws IOException {
  28. String signature = req.getParameter("signature");//微信加密签名
  29. String timestamp = req.getParameter("timestamp");//时间戳
  30. String nonce = req.getParameter("nonce");//随机数
  31. List<String> list = new ArrayList<String>();
  32. list.add("chenchen");
  33. list.add(timestamp);
  34. list.add(nonce);
  35. Collections.sort(list);//字典排序
  36. String s = "";
  37. for (int i = 0; i < list.size(); i++) {
  38. s += (String) list.get(i);
  39. }
  40. if (encode("SHA1", s).equalsIgnoreCase(signature)) {
  41. return true;
  42. } else {
  43. return false;
  44. }
  45. }
  46. public static String encode(String algorithm, String str) {
  47. if (str == null) {
  48. return null;
  49. }
  50. try {
  51. //Java自带的加密类
  52. MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
  53. //转为byte
  54. messageDigest.update(str.getBytes());
  55. return getFormattedText(messageDigest.digest());
  56. } catch (Exception e) {
  57. throw new RuntimeException(e);
  58. }
  59. }
  60. private static String getFormattedText(byte[] bytes) {
  61. int len = bytes.length;
  62. StringBuilder buf = new StringBuilder(len * 2);
  63. // 把密文转换成十六进制的字符串形式
  64. for (int j = 0; j < len; j++) {
  65. buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
  66. buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
  67. }
  68. return buf.toString();
  69. }
  70. }
package com.website.wechat.controller;

import java.io.IOException;

import java.security.MessageDigest;

import java.util.ArrayList;

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.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.ResponseBody; @Controller

@RequestMapping(value="weixin")

public class WeiXinController {
private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; @RequestMapping(value="getWeiXinMethod",method=RequestMethod.GET)
@ResponseBody
public void getWeiXinMethod(HttpServletRequest request, HttpServletResponse response) throws IOException{
boolean validate = validate(request);
if (validate) {
response.getWriter().write(request.getParameter("echostr"));
response.getWriter().close();
} } private boolean validate(HttpServletRequest req) throws IOException {
String signature = req.getParameter("signature");//微信加密签名
String timestamp = req.getParameter("timestamp");//时间戳
String nonce = req.getParameter("nonce");//随机数
List&lt;String&gt; list = new ArrayList&lt;String&gt;();
list.add("chenchen");
list.add(timestamp);
list.add(nonce);
Collections.sort(list);//字典排序
String s = "";
for (int i = 0; i &lt; list.size(); i++) {
s += (String) list.get(i);
}
if (encode("SHA1", s).equalsIgnoreCase(signature)) {
return true;
} else {
return false;
}
} public static String encode(String algorithm, String str) {
if (str == null) {
return null;
}
try {
//Java自带的加密类
MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
//转为byte
messageDigest.update(str.getBytes());
return getFormattedText(messageDigest.digest());
} catch (Exception e) {
throw new RuntimeException(e);
}
} private static String getFormattedText(byte[] bytes) {
int len = bytes.length;
StringBuilder buf = new StringBuilder(len * 2);
// 把密文转换成十六进制的字符串形式
for (int j = 0; j &lt; len; j++) {
buf.append(HEX_DIGITS[(bytes[j] &gt;&gt; 4) &amp; 0x0f]);
buf.append(HEX_DIGITS[bytes[j] &amp; 0x0f]);
}
return buf.toString();
}

}

此时验证和调用已经没问题,成功介入微信,成为一名开发者

Java 微信公众号开发--- 接入微信的更多相关文章

  1. 微信公众号开发 [05] 微信支付功能开发(网页JSAPI调用)

    1.微信支付的流程 如下三张手机截图,我们在微信网页端看到的支付,表面上看到的是 "点击支付按钮 - 弹出支付框 - 支付成功后出现提示页面",实际上的核心处理过程是: 点击支付按 ...

  2. 微信公众号开发之微信JSSDK

    概述 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以直接使用微 ...

  3. 线程安全使用(四) [.NET] 简单接入微信公众号开发:实现自动回复 [C#]C#中字符串的操作 自行实现比dotcore/dotnet更方便更高性能的对象二进制序列化 自已动手做高性能消息队列 自行实现高性能MVC WebAPI 面试题随笔 字符串反转

    线程安全使用(四)   这是时隔多年第四篇,主要是因为身在东软受内网限制,好多文章就只好发到东软内部网站,懒的发到外面,现在一点点把在东软写的文章给转移出来. 这里主要讲解下CancellationT ...

  4. Java之微信公众号开发

    这次以文本回复作为案例来讲解Java相关得微信公众号开发. 首先必须要有一个个人微信公众号 个人微信公众号相关的接口权限有限,不过用于个人学习体验一下足够了,如图: 然后进入微信公众后台,点击基本配置 ...

  5. Java微信公众号开发梳理

    Java微信公众号开发梳理 现在微信公众平台的开发已经越来越普遍,这次开发需要用到微信公众平台.因此做一个简单的记录,也算是给那些没踩过坑的童鞋一些启示吧.我将分几块来简单的描述一下,之后会做详细的说 ...

  6. 微信公众号开发(一)--验证服务器地址的Java实现

    现在主流上都用php写微信公众号后台,其实作为后端语言之一的java也可以实现. 这篇文章将对验证服务器地址这一步做出实现. 参考资料:1.慕课网-<初识java微信公众号开发>,2.微信 ...

  7. C#微信公众号开发系列教程二(新手接入指南)

    http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可 ...

  8. 微信公众号开发C#系列-2、微信公众平台接入指南

    概述 微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流程是这样的,用户发送消息到微信服务器,微信服务器将接收到的消息post到用户接入时填写的url中,在url处理程序中,首先 ...

  9. [.NET] 使用 Senparc.Weixin 接入微信公众号开发:简单实现自动回复

    使用 Senparc.Weixin 接入微信公众号开发:简单实现自动回复 目录 一.前提 二.基本配置信息简析 三.配置服务器地址(URL) 四.请求处理 一.前提 先申请微信公众号的授权,找到或配置 ...

随机推荐

  1. Bootstrap历练实例:标签页内的下拉菜单

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  2. PMD 编译 语法分析 词法分析 抽象语法树

    编译原理 163 课堂 http://mooc.study.163.com/learn/-1000002001?tid=1000003000#/learn/content?type=detail&am ...

  3. 瀑布流封装(仿写UITableView)

    本篇文章将会仿照苹果系统提供的UITableView类,封装一个瀑布流效果的控件!!! 该控件和系统的UITableView是相同级别的 (继承自系统的UIScrollView) GitHub中Dem ...

  4. 音频框架TheAmazingAudioEngine实现音效

    TheAmazingAudioEngine是Michael Tyson开源的iOS第三方音频框架.很多音频类APP应用这个框架作开发. 应用这个框架,可以比较方便地实现iOS音频开发中的各种音效的实现 ...

  5. SVN:The working copy is locked due to a previous error (二)

    之前也碰到过这种问题,但是根本问题不同,解决方案不同. 传送门:SVN:The working copy is locked due to a previous error (二) 本次错误如图: 解 ...

  6. Linux基础学习-用户的创建修改删除

    用户添加修改删除 1 useradd添加用户 添加一个新用户hehe,指定uid为3000,家目录为/home/haha [root@qdlinux ~]# useradd -u 3000 -d /h ...

  7. python3.6 取整除法

    python3.6 中取整除法运算逻辑如下: d 非零,那么商 q 满足这样的关系: a = qd + r ,且0 ≤ r n1=7//3 #7 = 3*2 +1 n2=-6.1//3 #-7 = 3 ...

  8. The 2018 ACM-ICPC Chinese Collegiate Programming Contest Fight Against Monsters

    #include <iostream> #include <cstdio> #include <cstring> #include <string> # ...

  9. poj 3190 奶牛挤奶问题 贪心算法

    题意:奶牛挤奶问题,每只奶牛在[a,b]的时间内挤奶,要求挤奶的过程中不能不打扰,且只能自己一个人独享挤奶的机器.问最少需要多少个挤奶的机器? 思路: 对奶牛挤奶开始的时间从小到大开始排序. 将正在工 ...

  10. npm 安装express npm ERR! code UNABLE_TO_VERIFY_LEAF_SIGNATURE

    npm安装总是报错 报错信息: 解决方案: 在命令行输入: npm config set strict-ssl false 设置之后即可安装软件: