1申请微信号

2下载ngrok 运行命令“ngrok http 8080”

3打开MYECLIPSE,建工程,并启动TOMCAT,保证项目可访问。

4用ngrok的地址,替换LOCALHOST

5编写一个servlet

CoreServlet类运行后执行校验

package org.liufeng.course.servlet;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.liufeng.course.service.CoreService;
import org.liufeng.course.util.SignUtil;

/**
 * 请求处理的核心类
 * 
 * @author liufeng
 * @date 2013-09-01
 */
public class CoreServlet extends HttpServlet {
    private static final long serialVersionUID = 4440739483644821986L;

/**
     * 请求校验(确认请求来自微信服务器)
     */
    public 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");

PrintWriter out = response.getWriter();
        // 请求校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
        if (SignUtil.checkSignature(signature, timestamp, nonce)) {
            out.print(echostr);
        }
        out.close();
        out = null;
    }

/**
     * 处理微信服务器发来的消息
     */
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 将请求、响应的编码均设置为UTF-8(防止中文乱码)
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");

// 接收参数微信加密签名、 时间戳、随机数
        String signature = request.getParameter("signature");
        String timestamp = request.getParameter("timestamp");
        String nonce = request.getParameter("nonce");

PrintWriter out = response.getWriter();
        // 请求校验
        if (SignUtil.checkSignature(signature, timestamp, nonce)) {
            // 调用核心服务类接收处理请求
            String respXml = CoreService.processRequest(request);
            out.print(respXml);
        }
        out.close();
        out = null;
    }

}
--------------------

CoreService 业务类

package org.liufeng.course.service;

import java.util.Date;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.liufeng.course.message.resp.TextMessage;
import org.liufeng.course.util.MessageUtil;

/**
 * 核心服务类
 * 
 * @author liufeng
 * @date 2013-12-02
 */
public class CoreService {
    /**
     * 处理微信发来的请求
     * 
     * @param request
     * @return xml
     */
    public static String processRequest(HttpServletRequest request) {
        // xml格式的消息数据
        String respXml = null;
        // 默认返回的文本消息内容
        String respContent = "发送任意文本,我们开始聊天吧!";
        try {
            // 调用parseXml方法解析请求消息
            Map<String, String> requestMap = MessageUtil.parseXml(request);
            // 发送方帐号
            String fromUserName = requestMap.get("FromUserName");
            // 开发者微信号
            String toUserName = requestMap.get("ToUserName");
            // 消息类型
            String msgType = requestMap.get("MsgType");
            // 消息创建时间
            String createTime = requestMap.get("CreateTime");
            
            // 文本消息
            if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
                String content = requestMap.get("Content");
                respContent = ChatService.chat(fromUserName, createTime, content);
            }
            // 回复文本消息
            TextMessage textMessage = new TextMessage();
            textMessage.setToUserName(fromUserName);
            textMessage.setFromUserName(toUserName);
            textMessage.setCreateTime(new Date().getTime());
            textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
            textMessage.setContent(respContent);
            // 将文本消息对象转换成xml
            respXml = MessageUtil.messageToXml(textMessage);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return respXml;
    }
}

----------------------

SignUtil 类TOKEN设置

package org.liufeng.course.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

/**
 * 请求校验工具类
 * 
 * @author liufeng
 * @date 2013-09-01
 */
public class SignUtil {
    // 与开发模式接口配置信息中的Token保持一致
    private static String token = "weixinCourse";

/**
     * 校验签名
     * 
     * @param signature 微信加密签名
     * @param timestamp 时间戳
     * @param nonce 随机数
     * @return
     */
    public static boolean checkSignature(String signature, String timestamp, String nonce) {
        // 对token、timestamp和nonce按字典排序
        String[] paramArr = new String[] { token, timestamp, nonce };
        Arrays.sort(paramArr);

// 将排序后的结果拼接成一个字符串
        String content = paramArr[0].concat(paramArr[1]).concat(paramArr[2]);

String ciphertext = null;
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            // 对接后的字符串进行sha1加密
            byte[] digest = md.digest(content.toString().getBytes());
            ciphertext = byteToStr(digest);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        
        // 将sha1加密后的字符串与signature进行对比
        return ciphertext != null ? ciphertext.equals(signature.toUpperCase()) : false;
    }

/**
     * 将字节数组转换为十六进制字符串
     * 
     * @param byteArray
     * @return
     */
    private static String byteToStr(byte[] byteArray) {
        String strDigest = "";
        for (int i = 0; i < byteArray.length; i++) {
            strDigest += byteToHexStr(byteArray[i]);
        }
        return strDigest;
    }

/**
     * 将字节转换为十六进制字符串
     * 
     * @param mByte
     * @return
     */
    private static String byteToHexStr(byte mByte) {
        char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
        char[] tempArr = new char[2];
        tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
        tempArr[1] = Digit[mByte & 0X0F];

String s = new String(tempArr);
        return s;
    }
}

6 在测试公众号上填写URL(servlet地址)及TOKEN(在类中自定义的字符串)。

7用微信访问即可。

测试微信号连接的开发的步骤相关推荐

  1. 个人微信号二次开发sdk协议,微信个人号开发API接口

    个人微信号二次开发sdk协议,微信个人号开发API接口 微信SDK程序概要说明 个人微信号开发sdk非微信ipad协议.非mac协议,非安卓协议,api可实现微信99%功能: 无需扫码登录.可收发朋友 ...

  2. 微信小程序支付开发具体步骤

    一.支付业务流程图展示  地址:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_4&index=2      ...

  3. 微信二次修改微信号_微信正测试微信号修改功能:一年只有一次机会

    对于许多人来说,或许已经习惯了用自己的手机号表示自己的微信号,添加朋友或者展示什么的都直接用微信号.但是,相信也有不少人因为微信的注册时间比较长远,当年注册的时候,就给自己取了一个比较符合当时的环境的 ...

  4. 个人微信号二次开发的实现,api接口

    各位兄弟姐妹们大家好!!!! 我又瞧到了好玩的微信机器人分享给大家! 社群运营这几年风头正盛,不能落伍啊,我们也赶紧组建了社群. 但是微信群还是社交属性为主的,当我们运营多个社群的时候会发现效率过低, ...

  5. Xshell 5 连接本地开发板步骤

    转载注明出处:http://blog.csdn.net/zou_pl/article/details/78722527 使用xshell软件+串口线,连接本地开发板的步骤:

  6. 微信机器人/微信号二次开发/IPAD协议开发/个微开发

    登录模块 登录微控平台 获取微信二维码 执行微信登录 获取联系人列表(群.好友) 二次登录(退出微信号 需要再次登录 调用此接口即可) 退出微信 消息接收模块 设置消息接收地址 取消消息接收 消息发送 ...

  7. 个微协议,微信号二次开发/ipad协议

    GeWe框架,是完整的第三方服务平台,并基于IPAD协议8.0.37开发出的最新个微API服务框架. 你可以 通过API 实现 个性化微信功能 (例云发单助手.社群小助手.客服系统.机器人等),用来自 ...

  8. 微信小程序商城开发的流程

    今天珍奶bb给大家简单唠唠微信小程序商城开发的流程? 在唠微信小程序商城制作流程前,先给大家科普一下当前的实体经济环境是如何的?制作一个微信小程序商城是否存在它的必要性.不用看具体数据,就直接看我们身 ...

  9. 从陈坤微信号说起:微信公众平台开发者的江湖

    陈坤的微信公众号这段时间大火,企鹅君其实也想发表点意见的,但无奈不懂娱乐圈,姿势不够只有看的份. 不过看来看去吧,发现个问题:大家关注陈坤微信号如何圈钱的同时,就没想过问下,这个微信公众号到底谁做的? ...

最新文章

  1. 手机网页H5 自适应不同分辨率的屏幕 必学标签meta之viewport
  2. git——从远程库克隆
  3. thinkphp去掉index.php
  4. Android视图绘制流程完全解析,带你一步步深入了解View(二)
  5. 史蒂夫·乔布斯很懂团队建设
  6. python 转成摩尔斯电码_一篇文章教会你摩尔斯码
  7. Vulhub 靶场下载使用
  8. Amazon Alexa 新里程碑: 50000 个功能、 20000 种设备、 3500 个品牌
  9. 最有用的Postgres扩展:pg_stat_statements
  10. 2013年6月13日星期四
  11. TensorFlow tf.keras.losses.BinaryCrossentropy
  12. android生成错误日志文件,android Crash日志写入文件
  13. 【Gym-102059 G】Fascination Street【亏欠型DP思想】
  14. 基于SpringBoot开发的后台管理、系统脚手架Github\Gitee收集
  15. c语言观察程序流程图,程序流程图的画法
  16. 腾讯云不同账号之间VPC网络直接建立内网通讯
  17. OpenGL: WIN7的64BIT下OPENGL着色语言(GLSL)开发环境配置
  18. 解决Mybatis报错并分析原因:Invalid bound statement (not found): com.xxx.mapper.xxx
  19. 3DES解密之网页解密(xhr断点及追栈)
  20. Entry name *.xml collided终极解决方案

热门文章

  1. hadoop性能测试
  2. pytest多文件执行顺序控制
  3. android系统开机默认设置修改记录
  4. iOS 百度地图之坐标转换
  5. GCPC 13 A Boggle 暴力,Trie剪枝
  6. 笔记分享②:GPS经纬度坐标转为CGCS2000
  7. lua脚本php,phpStudy中起用lua脚本_PHP教程
  8. java实现RabbitMQ消息队列
  9. Linux: vi 编辑器
  10. 中国传媒大学计算机课程表,课 程 表 - 中国传媒大学