zoukankan      html  css  js  c++  java
  • 微信公众平台开发小结

    前段时间研究一下微信公众平台开发,记录一下,以免忘了。

    一、准备过程

    1、注册公众账号,https://mp.weixin.qq.com/,注册账号,需要邮箱激活,而且还要填写信息登记。

    2、公众账号的开发模式支持任何语言,我选用的PHP,因为PHP简单,而且服务器比较好找,这里我用的是SAE的。

    微信公众账号分订阅号和服务号,服务号针对企业级用户,功能全;而订阅号主要面向个人或小媒体等,功能相对少一些。 不过,这两种模式都支持开发模式,也就是自己来做消息服务器。

    公众账号基本过程:订阅用户发送消息或发生事件(关注等),消息会先发到微信服务器,微信服务器经过分析处理后,将消息转发到公众号的自定义服务器(在开发模式中指定)上,公众号的自定义服务器经过分析处理,对消息做出回应,可以返回一些信息或者做其他操作,微信服务器会将公众号的自定义服务器返回的信息,转发给订阅用户,这样完成一个完整的过程

    二、开启公众账号开发模式 登陆公众账号>>>>高级功能>>>>开发模式:

    QQ截图20140410203451

    URL是开发者用来接收微信服务器数据的接口URL地址。 Token可任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。

    此时提交 会提示: QQ截图20140410204739  

    [摘自微信公众平台官方文档>>>]

    因为微信服务器会发送GET请求到填写的URL,GET请求携带四个参数:

    参数描述
    signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
    timestamp 时间戳
    nonce 随机数
    echostr 随机字符串

    开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。 检验signature的PHP示例代码:

     1 private function checkSignature()
     2 {
     3         $signature = $_GET["signature"];
     4         $timestamp = $_GET["timestamp"];
     5         $nonce = $_GET["nonce"];    
     6 
     7     $token = TOKEN;
     8     $tmpArr = array($token, $timestamp, $nonce);
     9     sort($tmpArr, SORT_STRING);
    10     $tmpStr = implode( $tmpArr );
    11     $tmpStr = sha1( $tmpStr );
    12 
    13     if( $tmpStr == $signature ){
    14         return true;
    15     }else{
    16         return false;
    17     }
    18 }

    [<<<摘自微信公众平台官方文档] 上文中的“TOKEN”就是之前填写的 Token值。

     1 <?php
     2 
     3 define("TOKEN", "laoqian");   //安全起见,定义TOKEN
     4 
     5 //有echostr参数时,是微信服务器验证
     6 if (isset($_GET['echostr'])) {
     7     if(checkSignature()){
     8         echo $echoStr;
     9         exit;
    10     }
    11 }
    12 
    13 private function checkSignature()
    14 {
    15     $signature = $_GET["signature"];
    16     $timestamp = $_GET["timestamp"];
    17     $nonce = $_GET["nonce"];    
    18 
    19     $token = TOKEN;
    20     $tmpArr = array($token, $timestamp, $nonce);
    21     sort($tmpArr);
    22     $tmpStr = implode( $tmpArr );
    23     $tmpStr = sha1( $tmpStr );
    24 
    25 if( $tmpStr == $signature ){
    26     return true;
    27 }else{
    28     return false;
    29 }
    30 }
    31 
    32 ?>

    三、实现基本功能 微信公众平台开发,发送的消息是基于xml的,定义了多种消息,包括文本消息、 图片消息、 语音消息、 视频消息、 地理位置消息、 链接消息等。 部分实现代码:

      1     //回复文本消息
      2     public function responseText($object, $content, $flag=0)
      3     {
      4         /*回复文本消息
      5 
      6             <xml>
      7             <ToUserName><![CDATA[toUser]]></ToUserName>
      8             <FromUserName><![CDATA[fromUser]]></FromUserName>
      9             <CreateTime>12345678</CreateTime>
     10             <MsgType><![CDATA[text]]></MsgType>
     11             <Content><![CDATA[你好]]></Content>
     12             </xml>
     13             参数    是否必须    描述
     14             ToUserName     是     接收方帐号(收到的OpenID)
     15             FromUserName     是    开发者微信号
     16             CreateTime     是     消息创建时间 (整型)
     17             MsgType     是     text
     18             Content     是     回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示)
     19         */
     20 
     21         $fromUsername = $object->FromUserName;
     22         $toUsername = $object->ToUserName;
     23         $keyword = trim($object->Content);
     24         $time = time();
     25         $textTpl = "<xml>
     26                         <ToUserName><![CDATA[%s]]></ToUserName>
     27                         <FromUserName><![CDATA[%s]]></FromUserName>
     28                         <CreateTime>%s</CreateTime>
     29                         <MsgType><![CDATA[%s]]></MsgType>
     30                         <Content><![CDATA[%s]]></Content>
     31                         <FuncFlag>%d</FuncFlag>
     32                         </xml>";
     33 
     34         $msgType = "text";
     35         $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $content,$flag);
     36 
     37         echo $resultStr;
     38         exit;
     39 
     40     }
     41 
     42     //回复图片消息
     43     public function responseImage($object, $MediaId)
     44     {
     45         /* 回复图片消息            
     46             <xml>
     47             <ToUserName><![CDATA[toUser]]></ToUserName>
     48             <FromUserName><![CDATA[fromUser]]></FromUserName>
     49             <CreateTime>12345678</CreateTime>
     50             <MsgType><![CDATA[image]]></MsgType>
     51             <Image>
     52             <MediaId><![CDATA[media_id]]></MediaId>
     53             </Image>
     54             </xml>
     55             参数    是否必须    说明
     56             ToUserName     是     接收方帐号(收到的OpenID)
     57             FromUserName     是    开发者微信号
     58             CreateTime     是     消息创建时间 (整型)
     59             MsgType     是     image
     60             MediaId     是     通过上传多媒体文件,得到的id。
     61 
     62         */
     63         $fromUsername = $object->FromUserName;
     64         $toUsername = $object->ToUserName;
     65         $time = time();
     66         $textTpl = "<xml>
     67                     <ToUserName><![CDATA[%s]]></ToUserName>
     68                     <FromUserName><![CDATA[%s]]></FromUserName>
     69                     <CreateTime>%s</CreateTime>
     70                     <MsgType><![CDATA[%s]]></MsgType>
     71                     <Image>
     72                     <MediaId><![CDATA[%s]]></MediaId>
     73                     </Image>
     74                     </xml>";
     75 
     76         $msgType = "image";
     77         $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType,  $MediaId);
     78 
     79         echo $resultStr;
     80         exit;
     81 
     82     }
     83 
     84     //回复语音消息
     85     public function responseVoice($object,$MediaId)
     86     {
     87         /*回复语音消息
     88 
     89             <xml>
     90             <ToUserName><![CDATA[toUser]]></ToUserName>
     91             <FromUserName><![CDATA[fromUser]]></FromUserName>
     92             <CreateTime>12345678</CreateTime>
     93             <MsgType><![CDATA[voice]]></MsgType>
     94             <Voice>
     95             <MediaId><![CDATA[media_id]]></MediaId>
     96             </Voice>
     97             </xml>
     98             参数    是否必须    说明
     99             ToUserName     是     接收方帐号(收到的OpenID)
    100             FromUserName     是    开发者微信号
    101             CreateTime     是     消息创建时间戳 (整型)
    102             MsgType     是     语音,voice
    103             MediaId     是     通过上传多媒体文件,得到的id
    104 
    105         */
    106         $fromUsername = $object->FromUserName;
    107         $toUsername = $object->ToUserName;
    108         $time = time();
    109         $textTpl = "<xml>
    110                     <ToUserName><![CDATA[%s]]></ToUserName>
    111                     <FromUserName><![CDATA[%s]]></FromUserName>
    112                     <CreateTime>%s</CreateTime>
    113                     <MsgType><![CDATA[%s]]></MsgType>
    114                     <Voice>
    115                     <MediaId><![CDATA[%s]]></MediaId>
    116                     </Voice>
    117                     </xml>";
    118 
    119         $msgType = "voice";
    120         $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType,  $MediaId);
    121 
    122         echo $resultStr;
    123         exit;
    124     }
    125 
    126     public function responseVideo($object, $MediaId,$Title,$Description)
    127     {
    128         /*回复视频消息
    129 
    130             <xml>
    131             <ToUserName><![CDATA[toUser]]></ToUserName>
    132             <FromUserName><![CDATA[fromUser]]></FromUserName>
    133             <CreateTime>12345678</CreateTime>
    134             <MsgType><![CDATA[video]]></MsgType>
    135             <Video>
    136             <MediaId><![CDATA[media_id]]></MediaId>
    137             <Title><![CDATA[title]]></Title>
    138             <Description><![CDATA[description]]></Description>
    139             </Video> 
    140             </xml>
    141             参数    是否必须    说明
    142             ToUserName     是     接收方帐号(收到的OpenID)
    143             FromUserName     是    开发者微信号
    144             CreateTime     是     消息创建时间 (整型)
    145             MsgType     是     video
    146             MediaId     是     通过上传多媒体文件,得到的id
    147             Title     否     视频消息的标题
    148             Description     否     视频消息的描述
    149         */
    150 
    151         $fromUsername = $object->FromUserName;
    152         $toUsername = $object->ToUserName;
    153 
    154         $time = time();
    155         $textTpl ="<xml>
    156                     <ToUserName><![CDATA[%s]]></ToUserName>
    157                     <FromUserName><![CDATA[%s]]></FromUserName>
    158                     <CreateTime>%s</CreateTime>
    159                     <MsgType><![CDATA[%s]]></MsgType>
    160                     <Video>
    161                     <MediaId><![CDATA[%s]]></MediaId>
    162                     <Title><![CDATA[%s]]></Title>
    163                     <Description><![CDATA[%s]]></Description>
    164                     </Video> 
    165                     </xml>";
    166 
    167         $msgType = "video";
    168         $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $MediaId,$Title,$Description);
    169 
    170         echo $resultStr;
    171         exit;
    172     }

      先记录这些,以后有时间再研究。

  • 相关阅读:
    叶树:任总喊你回家吃饭 (zz)
    一个小员工如何让一家大银行一夕倒闭(附几则)
    精妙SQL语句收集
    降温了 降温了
    東京タワー初めてphoto
    圣诞气氛photo
    初冬071110photo
    超级郁闷的一天
    eveningplan
    KOF怀念ING
  • 原文地址:https://www.cnblogs.com/tinker/p/3780815.html
Copyright © 2011-2022 走看看