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     }

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

  • 相关阅读:
    84. Largest Rectangle in Histogram (Solution 2)
    84. Largest Rectangle in Histogram (Solution 1)
    73. Set Matrix Zeroes
    【JavaScript】Symbol 静态方法
    【JavaScript】Date
    【JavaScript】Math
    725. Split Linked List in Parts把链表分成长度不超过1的若干部分
    791. Custom Sort String字符串保持字母一样,位置可以变
    508. Most Frequent Subtree Sum 最频繁的子树和
    762. Prime Number of Set Bits in Binary Representation二进制中有质数个1的数量
  • 原文地址:https://www.cnblogs.com/tinker/p/3780815.html
Copyright © 2011-2022 走看看