微信公众平台接入教程(三)

这段的接入代码参考柳峰的博客。里边有比较全的微信API调用过程。需要的请移步。http://my.youkuaiyun.com/lyq8479。

根据微信开放者文档接入指南。

只有匹配到这种情况才可以接入。于是在eclipse中建立了一个web项目。

web.xml代码如下。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
	<servlet>
		<servlet-name>coreServlet</servlet-name>
		<servlet-class>com.softManager.smile.servlet.CoreServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>coreServlet</servlet-name>
		<url-pattern>/coreServlet</url-pattern>
	</servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
CoreServlet.java代码如下:

<span style="font-size:14px;">package com.softManager.smile.servlet;

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 com.softManager.smile.service.CoreService;
import com.softManager.smile.util.SignUtil;

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();  
        // 通过检验signature对请求进行校验,若校验成功则原样返回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 respMessage = CoreService.processRequest(request);  
          
        // 响应消息   
        PrintWriter out = response.getWriter();  
        out.print(respMessage);  
        out.close();  
    }   
}</span>
SignUtil.java代码如下:

<span style="font-size:14px;">package com.softManager.smile.util;

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

public class SignUtil {
	// 与接口配置信息中的Token要一致   
	
	private static String token = "weixinSoftManager";
	
		/**
		 * 验证签名
		 * @param signature
		 * @param timestamp
		 * @param nonce
		 * @return
		 */
		public static boolean checkSignature(String signature,String timestamp,String nonce){
			String [] arr = new String []{token,timestamp,nonce};
			//将token、timestamp、nonce三个参数按字典顺序排序
			Arrays.sort(arr);
			StringBuilder content = new StringBuilder();
			for(int i = 0;i<arr.length;i++){
				content.append(arr[i]);
			}
			MessageDigest md = null;
			String tempStr = null;
			try{
				md = MessageDigest.getInstance("SHA-1");
				byte[] digest = md.digest(content.toString().getBytes());
				tempStr = byteToStr(digest);
			}catch(NoSuchAlgorithmException e){
				e.printStackTrace();
			}
			
			content = null;
			return tempStr != null?tempStr.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;
		}
}</span>
CoreService.java

package com.softManager.smile.service;

import java.util.Date;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import com.softManager.smile.message.response.TextMessageRep;
import com.softManager.smile.util.MessageUtil;

public class CoreService {
	/** 
     * 处理微信发来的请求 
     *  
     * @param request 
     * @return 
     */  
    public static String processRequest(HttpServletRequest request) {  
        String respMessage = null;  
        try {  
            // 默认返回的文本消息内容   
            String respContent = "请求处理异常,请稍候尝试!";  
  
            // xml请求解析   
            Map<String, String> requestMap = MessageUtil.parseXml(request);  
  
            // 发送方帐号(open_id)   
            String fromUserName = requestMap.get("FromUserName");  
            // 公众帐号   
            String toUserName = requestMap.get("ToUserName");  
            // 消息类型   
            String msgType = requestMap.get("MsgType");  
  
            // 回复文本消息   
            TextMessageRep textMessage = new TextMessageRep();  
            textMessage.setToUserName(fromUserName);  
            textMessage.setFromUserName(toUserName);  
            textMessage.setCreateTime(new Date().getTime());  
            textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);  
            textMessage.setFuncFlag(0);  
  
            // 文本消息   
            if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {  
                respContent = "您发送的是文本消息!";  
            }  
            // 图片消息   
            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) {  
                respContent = "您发送的是图片消息!";  
            }  
            // 地理位置消息   
            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) {  
                respContent = "您发送的是地理位置消息!";  
            }  
            // 链接消息   
            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) {  
                respContent = "您发送的是链接消息!";  
            }  
            // 音频消息   
            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) {  
                respContent = "您发送的是音频消息!";  
            }  
            // 事件推送   
            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {  
                // 事件类型   
                String eventType = requestMap.get("Event");  
                // 订阅   
                if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {  
                    respContent = "小十四~小傻瓜,我最亲爱的大妞妞~最爱你啦,哈哈哈~";  
                }  
                // 取消订阅   
                else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {  
                    // TODO 取消订阅后用户再收不到公众号发送的消息,因此不需要回复消息   
                }  
                // 自定义菜单点击事件   
                else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {  
                    // TODO 自定义菜单权没有开放,暂不处理该类消息   
                }  
            }  
  
            textMessage.setContent(respContent);  
            respMessage = MessageUtil.textMessageToXml(textMessage);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
  
        return respMessage;  
    }  
}
这样就可以处理来自用户的消息了。我们将此工程打成war包通过svn提交到刚才我们配置好的百度服务器上。同时配置微信公众平台的URL和令牌。


之后我们关注这个订阅号来试一下效果。

比较成功哦。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值