微信公众平台接入

来源:互联网 发布:桌面设计软件 编辑:程序博客网 时间:2024/05/17 02:56

查看原文观看视频:http://www.ibloger.net/article/272.html


官方PHP接入文件注释介绍

[plain] view plain copy
 print?
  1. <?php  
  2. /**  
  3.   * wechat php test   表明php语句的说明和开始,表示此为php语言  
  4.   */  
  5.   
  6. // 定义 token  
  7. define("TOKEN", "weixin");  
  8. $wechatObj = new wechatCallbackapiTest();  // 实例化当前class类  
  9. $wechatObj->valid();                    // $webchatObj变量—>访问类中valid()方法  
  10.   
  11. class wechatCallbackapiTest                // 定义一个类,类名是class后的内容  
  12. {  
  13.     public function valid()                // 定义一个共有的名为valid的方法  
  14.     {  
  15.         $echoStr = $_GET["echostr"];       // 从微信用户获取一个随机变量$echoStr  
  16.   
  17.         //验证签名signature , 可选  
  18.         if($this->checkSignature()){  
  19.             echo $echoStr;                 // 如果签名相同,输出$echostr变量  
  20.             exit;  
  21.         }  
  22.     }  
  23.   
  24.     public function responseMsg()          // 以下是一个公有的responseMsg的方法,是这段代码的核心内容,获得微信用户段发来的信息,不同环境有所不同  
  25.     {  
  26.         //get post 数据, 可能是由于不同的环境  
  27.         $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];  // 将信息保存到变量$postStr中,同时解析用户数据  
  28.   
  29.         //提取post数据  
  30.         if (!empty($postStr)){                      // 如果用户端数据不为空  
  31.                 /* libxml_disable_entity_loader是防止XML外部实体注入,最好的办法就是自己检查XML的有效性 */  
  32.                 libxml_disable_entity_loader(true);  
  33.                 $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);   // 将变量$postStr解析并赋予变量$postObj  
  34.                 $fromUsername = $postObj->FromUserName;       // 将用户端的用户名赋予变量$fromUsername  
  35.                 $toUsername = $postObj->ToUserName;           // 将公众号ID赋予变量$toUsername  
  36.                 $keyword = trim($postObj->Content);           // 将发来的文本内容去空格后赋予变量$keyword  
  37.                 $time = time();                              // 将系统时间赋予变量$time  
  38.                  
  39.   // 构建XML格式的文本赋予变量$textTp1(ToUserName:微信目标方,FromUserName:微信来远方,CreateTime:系统时间,MsgType:回复微信信息类型,Content:回复微信内容,FuncFlag:是否为星标微信)  
  40.                 $textTpl = "<xml>                           
  41.                             <ToUserName><![CDATA[%s]]></ToUserName>  
  42.                             <FromUserName><![CDATA[%s]]></FromUserName>  
  43.                             <CreateTime>%s</CreateTime>  
  44.                             <MsgType><![CDATA[%s]]></MsgType>  
  45.                             <Content><![CDATA[%s]]></Content>  
  46.                             <FuncFlag>0</FuncFlag>  
  47.                             </xml>";   
  48.                 if(!empty( $keyword )) {                      // 如果用户端发来的消息不是空  
  49.                     $msgType = "text";                        // 回复文本消息为text文本类型  
  50.                     $contentStr = "欢迎来到 wechat 世界!"; // 这行就是我们进行文本回复的内容,如果要改回复的消息,只要在这里更改就可以   
  51.                     $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);  // 将XML格式中的变量分别赋值,  
  52.                     echo $resultStr;                          // 输出回复消息  
  53.                 }else{  
  54.                     echo "Input something...";                // 输入内容,此消息不会发送到微信端,只是测试时候使用  
  55.                 }  
  56.   
  57.         }else {  
  58.             echo "";  
  59.             exit;  
  60.         }  
  61.     }  
  62.           
  63.     private function checkSignature()                        // 建立私有方法验证签名  
  64.     {  
  65.         // 你必须定义一个自己的TOKEN  
  66.         if (!defined("TOKEN")) {  
  67.             throw new Exception('TOKEN 未定义!');  
  68.         }  
  69.           
  70.         $signature = $_GET["signature"];                     // 从用户端获取签名赋予变量$signature  
  71.         $timestamp = $_GET["timestamp"];                     // 从用户段获取时间赋予变量$timestamp  
  72.         $nonce = $_GET["nonce"];                             // 从用户段获取随机数赋予变量$snonce  
  73.                   
  74.         $token = TOKEN;                                      // 将常量TOKEN值赋予变量$token  
  75.         $tmpArr = array($token, $timestamp, $nonce);         // 建立数组变量$tmpArr  
  76.           
  77.         sort($tmpArr, SORT_STRING);                          // 数组排序  
  78.         $tmpStr = implode( $tmpArr );                        // 字典排序  
  79.         $tmpStr = sha1( $tmpStr );                           // 加密  
  80.           
  81.         if( $tmpStr == $signature ){                         // 判断$tmpStr与$signature变量是否同值  
  82.             return true;  
  83.         }else{  
  84.             return false;  
  85.         }  
  86.     }  
  87. }  
  88.   
  89. ?>  
接下来使用Java版本接入

微信请求校验类

[java] view plain copy
 print?
  1. package cn.weixin.validationTest;  
  2.   
  3. import java.security.MessageDigest;  
  4. import java.util.Arrays;  
  5. /** 
  6.  * 微信请求校验工具类 
  7.  * @author X-rapido 
  8.  * @version 1.0 
  9.  */  
  10.   
  11. public class ValidationUtil{  
  12.   
  13.     private static String token="Rapido";   // 用户Token  
  14.       
  15.     /** 
  16.      * 验证签名 
  17.      */  
  18.     public static boolean checkSignauer(String signature,String timestamp,String nonce){  
  19.         // 构建成一个字符串数组  
  20.         String [] str = new String[]{token,timestamp,nonce};  
  21.         Arrays.sort(str); // 排序  
  22.           
  23.         StringBuffer buff = new StringBuffer();  
  24.         for (int i = 0; i < str.length; i++) {  
  25.             buff.append(str[i]);  
  26.         }  
  27.         MessageDigest md = null// 加密类  
  28.         String result = null;  
  29.         try {  
  30.             md = MessageDigest.getInstance("SHA-1");  // 实例加密算法(微信文档中用SHA-1)  
  31.             byte[] digest = md.digest(buff.toString().getBytes());  
  32.             result = bytesToStr(digest);  
  33.               
  34.             System.out.println("加密以后的字符串:"+result);  
  35.               
  36.         } catch (Exception e) {  
  37.             e.printStackTrace();  
  38.         }  
  39.         return result != null? result.equals(signature.toUpperCase()) : false;  
  40.     }  
  41.       
  42.     /** 
  43.      * 将字节数组转换为16进制字符串 
  44.      * @param byteArray 
  45.      * @return 
  46.      */  
  47.     private static String bytesToStr(byte[] byteArray){  
  48.         String strDigest = "";  
  49.         for (int i = 0; i < byteArray.length; i++) {  
  50.             strDigest += byteToHexStr(byteArray[i]);  
  51.         }  
  52.         return strDigest;  
  53.     }  
  54.       
  55.     /** 
  56.      * 将一个字节转换为16进制字符串 
  57.      * @param mByte 
  58.      * @return 
  59.      */  
  60.     private static String byteToHexStr(byte mByte){  
  61.         char [] digit={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};  
  62.         char [] temp = new char[2];  
  63.           
  64.         temp[0] = digit[(mByte>>>4) & 0X0F];  
  65.         temp[1] = digit[mByte & 0X0F];  
  66.           
  67.         String s = new String(temp);  
  68.         return s;  
  69.     }  
  70.   
  71. }  

微信测试接入类

[java] view plain copy
 print?
  1. package cn.weixin.servlet;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5.   
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.http.HttpServlet;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10.   
  11. import cn.weixin.common.ValidationUtil;  
  12.   
  13. /** 
  14.  * 接收来自微信服务器转发过来的请求[验证消息真实性] 
  15.  *  
  16.  * @author X-rapido 
  17.  *  
  18.  */  
  19. public class AccessVerifyServlet extends HttpServlet {  
  20.   
  21.     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  22.         String signature = request.getParameter("signature"); // 获取微信加密的签名字符串  
  23.         String timestamp = request.getParameter("timestamp"); // 时间戳  
  24.         String nonce = request.getParameter("nonce"); // 随机数  
  25.         String echostr = request.getParameter("echostr");   // 随机字符串  
  26.           
  27.         System.out.println("加密的签名串signatur:"+signature+",时间戳timestamp:"+timestamp+",随机数nonce:"+nonce+",随机字符串echostr:"+echostr);  
  28.           
  29.         PrintWriter out = response.getWriter();  
  30.           
  31.         if(ValidationUtil.checkSignauer(signature, timestamp, nonce)){  
  32.             out.print(echostr);  
  33.         }  
  34.         out.close();  
  35.     }  
  36.   
  37.     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  38.         doGet(request, response);  
  39.     }  
  40.   
  41. }  
web.xml
[html] view plain copy
 print?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <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">  
  3.     
  4.   <display-name>weixin</display-name>  
  5.   <distributable/>  
  6.     
  7.     <welcome-file-list>  
  8.         <welcome-file>index.html</welcome-file>  
  9.         <welcome-file>index.htm</welcome-file>  
  10.         <welcome-file>index.jsp</welcome-file>  
  11.     </welcome-file-list>  
  12.       
  13.     <servlet>  
  14.         <description>微信接入验证</description>  
  15.         <servlet-name>AccessVerifyServlet</servlet-name>  
  16.         <servlet-class>cn.weixin.servlet.AccessVerifyServlet</servlet-class>  
  17.     </servlet>  
  18.   
  19.     <servlet-mapping>  
  20.         <servlet-name>AccessVerifyServlet</servlet-name>  
  21.         <url-pattern>/AccessVerifyServlet</url-pattern>  
  22.     </servlet-mapping>  
  23. </web-app>  
在一下联接中使用

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