【微信】Java微信公众号平台接入视频

视频链接: 稍后更新地址 http://www.tudou.com/programs/view/Uj3-Wn3Ajwo/

官方PHP接入文件注释介绍

<?php  
/**  
  * wechat php test   表明php语句的说明和开始,表示此为php语言  
  */  
  
// 定义 token  
define("TOKEN", "weixin");  
$wechatObj = new wechatCallbackapiTest();  // 实例化当前class类  
$wechatObj->valid();                    // $webchatObj变量—>访问类中valid()方法  
  
class wechatCallbackapiTest                // 定义一个类,类名是class后的内容  
{  
    public function valid()                // 定义一个共有的名为valid的方法  
    {  
        $echoStr = $_GET["echostr"];       // 从微信用户获取一个随机变量$echoStr  
  
        //验证签名signature , 可选  
        if($this->checkSignature()){  
            echo $echoStr;                 // 如果签名相同,输出$echostr变量  
            exit;  
        }  
    }  
  
    public function responseMsg()          // 以下是一个公有的responseMsg的方法,是这段代码的核心内容,获得微信用户段发来的信息,不同环境有所不同  
    {  
        //get post 数据, 可能是由于不同的环境  
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];  // 将信息保存到变量$postStr中,同时解析用户数据  
  
        //提取post数据  
        if (!empty($postStr)){                      // 如果用户端数据不为空  
                /* libxml_disable_entity_loader是防止XML外部实体注入,最好的办法就是自己检查XML的有效性 */  
                libxml_disable_entity_loader(true);  
                $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);   // 将变量$postStr解析并赋予变量$postObj  
                $fromUsername = $postObj->FromUserName;       // 将用户端的用户名赋予变量$fromUsername  
                $toUsername = $postObj->ToUserName;           // 将公众号ID赋予变量$toUsername  
                $keyword = trim($postObj->Content);           // 将发来的文本内容去空格后赋予变量$keyword  
                $time = time();                              // 将系统时间赋予变量$time  
                 
  // 构建XML格式的文本赋予变量$textTp1(ToUserName:微信目标方,FromUserName:微信来远方,CreateTime:系统时间,MsgType:回复微信信息类型,Content:回复微信内容,FuncFlag:是否为星标微信)  
                $textTpl = "<xml>                           
                            <ToUserName><![CDATA[%s]]></ToUserName>  
                            <FromUserName><![CDATA[%s]]></FromUserName>  
                            <CreateTime>%s</CreateTime>  
                            <MsgType><![CDATA[%s]]></MsgType>  
                            <Content><![CDATA[%s]]></Content>  
                            <FuncFlag>0</FuncFlag>  
                            </xml>";   
                if(!empty( $keyword )) {                      // 如果用户端发来的消息不是空  
                    $msgType = "text";                        // 回复文本消息为text文本类型  
                    $contentStr = "欢迎来到 wechat 世界!"; // 这行就是我们进行文本回复的内容,如果要改回复的消息,只要在这里更改就可以   
                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);  // 将XML格式中的变量分别赋值,  
                    echo $resultStr;                          // 输出回复消息  
                }else{  
                    echo "Input something...";                // 输入内容,此消息不会发送到微信端,只是测试时候使用  
                }  
  
        }else {  
            echo "";  
            exit;  
        }  
    }  
          
    private function checkSignature()                        // 建立私有方法验证签名  
    {  
        // 你必须定义一个自己的TOKEN  
        if (!defined("TOKEN")) {  
            throw new Exception('TOKEN 未定义!');  
        }  
          
        $signature = $_GET["signature"];                     // 从用户端获取签名赋予变量$signature  
        $timestamp = $_GET["timestamp"];                     // 从用户段获取时间赋予变量$timestamp  
        $nonce = $_GET["nonce"];                             // 从用户段获取随机数赋予变量$snonce  
                  
        $token = TOKEN;                                      // 将常量TOKEN值赋予变量$token  
        $tmpArr = array($token, $timestamp, $nonce);         // 建立数组变量$tmpArr  
          
        sort($tmpArr, SORT_STRING);                          // 数组排序  
        $tmpStr = implode( $tmpArr );                        // 字典排序  
        $tmpStr = sha1( $tmpStr );                           // 加密  
          
        if( $tmpStr == $signature ){                         // 判断$tmpStr与$signature变量是否同值  
            return true;  
        }else{  
            return false;  
        }  
    }  
}  
  
?>

接下来使用Java版本接入

微信请求校验类

package cn.weixin.validationTest;  
  
import java.security.MessageDigest;  
import java.util.Arrays;  
/** 
 * 微信请求校验工具类 
 * @author X-rapido 
 * @version 1.0 
 */  
  
public class ValidationUtil{  
  
    private static String token="Rapido";   // 用户Token  
      
    /** 
     * 验证签名 
     */  
    public static boolean checkSignauer(String signature,String timestamp,String nonce){  
        // 构建成一个字符串数组  
        String [] str = new String[]{token,timestamp,nonce};  
        Arrays.sort(str); // 排序  
          
        StringBuffer buff = new StringBuffer();  
        for (int i = 0; i < str.length; i++) {  
            buff.append(str[i]);  
        }  
        MessageDigest md = null; // 加密类  
        String result = null;  
        try {  
            md = MessageDigest.getInstance("SHA-1");  // 实例加密算法(微信文档中用SHA-1)  
            byte[] digest = md.digest(buff.toString().getBytes());  
            result = bytesToStr(digest);  
              
            System.out.println("加密以后的字符串:"+result);  
              
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return result != null? result.equals(signature.toUpperCase()) : false;  
    }  
      
    /** 
     * 将字节数组转换为16进制字符串 
     * @param byteArray 
     * @return 
     */  
    private static String bytesToStr(byte[] byteArray){  
        String strDigest = "";  
        for (int i = 0; i < byteArray.length; i++) {  
            strDigest += byteToHexStr(byteArray[i]);  
        }  
        return strDigest;  
    }  
      
    /** 
     * 将一个字节转换为16进制字符串 
     * @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 [] temp = new char[2];  
          
        temp[0] = digit[(mByte>>>4) & 0X0F];  
        temp[1] = digit[mByte & 0X0F];  
          
        String s = new String(temp);  
        return s;  
    }  
  
}

微信测试接入类

package cn.weixin.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 cn.weixin.common.ValidationUtil;  
  
/** 
 * 接收来自微信服务器转发过来的请求[验证消息真实性] 
 * @author X-rapido 
 */  
public class AccessVerifyServlet extends HttpServlet {  
  
    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");   // 随机字符串  
          
        System.out.println("加密的签名串signatur:"+signature+",时间戳timestamp:"+timestamp+",随机数nonce:"+nonce+",随机字符串echostr:"+echostr);  
          
        PrintWriter out = response.getWriter();  
          
        if(ValidationUtil.checkSignauer(signature, timestamp, nonce)){  
            out.print(echostr);  
        }  
        out.close();  
    }  
  
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
        doGet(request, response);  
    }  
  
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>  
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">  
    
  <display-name>weixin</display-name>  
  <distributable/>  
    
    <welcome-file-list>  
        <welcome-file>index.html</welcome-file>  
        <welcome-file>index.htm</welcome-file>  
        <welcome-file>index.jsp</welcome-file>  
    </welcome-file-list>  
      
    <servlet>  
        <description>微信接入验证</description>  
        <servlet-name>AccessVerifyServlet</servlet-name>  
        <servlet-class>cn.weixin.servlet.AccessVerifyServlet</servlet-class>  
    </servlet>  
  
    <servlet-mapping>  
        <servlet-name>AccessVerifyServlet</servlet-name>  
        <url-pattern>/AccessVerifyServlet</url-pattern>  
    </servlet-mapping>  
</web-app>

在一下联接中使用

微信在接入时候,会以get数据请求我的url地址,我的Servlet就会接收数据,并进行签名认证返回接收的随机数,微信服务器接收随机数并进行签名认证,确定后就接入成功!

未经允许请勿转载:程序喵 » 【微信】Java微信公众号平台接入视频

点  赞 (1) 打  赏
分享到: