微信公众平台支付入门教程电子版

本文转自:http://www.cnblogs.com/txw1958/p/wechat-tutorial.html

 

关键字:微信公众平台开发电子版, 作者:方倍工作室

 

在那篇微信公众平台支付教程中,大家只要你已经有了PHP语言程序、MySQL数据库、统计机网络通信、及HTTP/XML/CSS/JS等基础。

咱俩将采用微信公众账号方倍工作室作为讲解的例子,二维码见底部。

本连串教程将引导你成功如下义务:

  1. 创办今日头条云统计平台运用
  2. 启用微信公众平台支付情势
  3. 基本功接口音讯及事件
  4. 微信公众平台PHP SDK
  5. 微信公众平台开发情势原理
  6. 付出天气预告成效

 

首先章 申请服务器资源

创立微博云计算应用

提请账号

俺们利用SAE腾讯网云计算平台作为服务器资源,并且申请PHP环境+MySQL数据库作为程序运行环境。
申请地址:http://sae.sina.com.cn/,使用今日头条新浪账号可以平昔登录SAE,登录后SAE将赠送500个免费云豆。

 电子版 1

 

始建新应用 http://www.cnblogs.com/txw1958/p/wechat-tutorial.html[](http://www.cnblogs.com/txw1958/p/wechat-tutorial.html

签到后点击顶部【自我的首页

电子版 2

点击下侧的创制新应用,那时会弹出提醒,
禁止放置违规不合规情节,点击继续开创,弹出如下窗口。

 电子版 3

选料一个未使用的appid,假设每一次已经被应用不明了该怎么好,就填写您的QQ号或者手机号吧。

填写二级域名AppID、应用名称、验证码,开发语言拔取PHP,应用类型选用web应用。然后点击成立应用

 电子版 4

动用创造成功。并自行跳转到应用列表中,可以见到已经有刚刚创制的中央电视机台-7

 电子版 5

 

始建版本 http://www.cnblogs.com/txw1958/p/wechat-tutorial.html 

选择CCTV-7右侧的选用管理下面的代码管理

 电子版 6

跳转到代码管理

电子版 7

点击左边的电子版 8

电子版 9

本子号默许为1,点击创立,成功后如下图所示:

电子版 10

 

到此地,就打响创办了一个域名URL为 http://cctv7.sinaapp.com/ 的使用了。

 原文:http://www.cnblogs.com/txw1958/p/wechat-tutorial.html 

上传代码 http://www.cnblogs.com/txw1958/p/wechat-tutorial.html[](http://www.cnblogs.com/txw1958/p/wechat-tutorial.html

将以下代码复制下来,另存为index.php。必须选取正规的花费编辑软件操作,例如Notepad++,不要使用Windows自带的记事本等。

电子版 11😉

<?php
/*
    方倍工作室 http://www.cnblogs.com/txw1958/
    CopyRight 2013 www.doucube.com  All Rights Reserved
*/

define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
if (isset($_GET['echostr'])) {
    $wechatObj->valid();
}else{
    $wechatObj->responseMsg();
}

class wechatCallbackapiTest
{
    public function valid()
    {
        $echoStr = $_GET["echostr"];
        if($this->checkSignature()){
            echo $echoStr;
            exit;
        }
    }

    private function checkSignature()
    {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];

        $token = TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr);
        $tmpStr = implode( $tmpArr );
        $tmpStr = sha1( $tmpStr );

        if( $tmpStr == $signature ){
            return true;
        }else{
            return false;
        }
    }

    public function responseMsg()
    {
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

        if (!empty($postStr)){
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
            $fromUsername = $postObj->FromUserName;
            $toUsername = $postObj->ToUserName;
            $keyword = trim($postObj->Content);
            $time = time();
            $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($keyword == "?" || $keyword == "?")
            {
                $msgType = "text";
                $contentStr = date("Y-m-d H:i:s",time());
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                echo $resultStr;
            }
        }else{
            echo "";
            exit;
        }
    }
}
?>

电子版 12😉

然后将index.php文件压缩成ZIP格式,注意无法用RAR格式

电子版 13

诸如此类会生成一个index.zip的公文。或者间接下载方倍已经减弱好的zip文件
点此下载

在代码管理界面中,选拔操作按钮。

电子版 14

选料上传代码包。

点击上传文件,选拔刚刚压缩好的index.zip文件,点击上传,上传成功后如下所示

电子版 15

点击操作按钮下的代码编辑,

 电子版 16

大家得以寓目index.php已经上传成功,双击能够查阅编辑里面的代码

电子版 17

和讯云应用的开创就打响了。

 

其次章 启用开发格局

微信公众平台开发情势

高级效率

微信公众平台地址:https://mp.weixin.qq.com 

签到微信公众平台后台,选用高档成效,进入后就来看二种格局

电子版 18

咱俩要求先关闭编辑形式。点击编辑情势的进去

电子版 19

滑动关闭

电子版 20

 

开发方式

跻身支付情势里面

电子版 21

 点击成为开发者

电子版 22

弹出URL和Token填写框

电子版 23

此间的URL为上篇中介绍的云应用的域名,而Token在index.php中定义为weixin。提交后提醒您已变为开发者。

电子版 24

再滑动右上角启用按钮。

电子版 25

恭贺,你成功启用开发情势。

 

机动回复

在上边的事例中,完毕了一个发送“?”就能復苏当前光阴的成效。 效果如下:

电子版 26

至此,你的微信公众平台账号已经落实机关復苏了。

 

 

其三章 基础接口音信及事件

 

拥有账号在报名未来,都将得到基础接口的权位,基础接口中校包蕴吸纳用户音信,向用户回复新闻,接受事件推送等两种服务。

电子版 27

收下用户新闻

当前普通用户能向群众账号推送五种格式的音讯:文本(包含表情)、语音、图片、录像、地方、链接。
下边就这五种分别详解如下:

1. 文件(包蕴表情) 发送文书及表情

电子版 28

2. 图片

发送图片

电子版 29

3. 语音

出殡语音

电子版 30

4. 视频

发送录像

电子版 31

5. 位置

出殡地点

电子版 32

6. 链接

出殡链接

电子版 33

 

向用户回复音讯

当下家常公众账号能向用户推送六种格式的新闻:文本、图文、音乐、图片、语音、视频。其中图文音讯包含单条图文音讯和多条图文新闻,显示格局有一点点不比。

上面就那两种分别详解如下:【图片、语音、录像由于需求选取和高档接口相关的media_id,在本教程中暂不研讨。】

1. 文书信息格式 回复文本

电子版 34

2. 图文音信格式

2.1 单条图文音信 回复单条图文

电子版 35 2.2 多图文音讯

平复多图文

电子版 36

3. 音乐音讯

过来音乐音信

电子版 37

 

收下事件推送

此时此刻用户在关心和取消关心,以及点击菜单的时候会自行向民众平台发送事件推送新闻:

  1. 关爱事件

电子版 38电子版 39

 

 

第四章 微信公众平台PHP SDK

 

方倍工作室开发了微信公众平台的PHPSDK,集成了当前具有音信及事件的接收及发送,代码如下:

电子版 40😉

<?php
/*
    方倍工作室 
    http://www.cnblogs.com/txw1958/
    CopyRight 2014 All Rights Reserved
*/

define("TOKEN", "weixin");

$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {
    $wechatObj->responseMsg();
}else{
    $wechatObj->valid();
}

class wechatCallbackapiTest
{
    //验证消息
    public function valid()
    {
        $echoStr = $_GET["echostr"];
        if($this->checkSignature()){
            echo $echoStr;
            exit;
        }
    }

    //检查签名
    private function checkSignature()
    {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
        $token = TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr, SORT_STRING);
        $tmpStr = implode($tmpArr);
        $tmpStr = sha1($tmpStr);

        if($tmpStr == $signature){
            return true;
        }else{
            return false;
        }
    }

    //响应消息
    public function responseMsg()
    {
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
        if (!empty($postStr)){
            $this->logger("R ".$postStr);
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
            $RX_TYPE = trim($postObj->MsgType);

            switch ($RX_TYPE)
            {
                case "event":
                    $result = $this->receiveEvent($postObj);
                    break;
                case "text":
                    $result = $this->receiveText($postObj);
                    break;
                case "image":
                    $result = $this->receiveImage($postObj);
                    break;
                case "location":
                    $result = $this->receiveLocation($postObj);
                    break;
                case "voice":
                    $result = $this->receiveVoice($postObj);
                    break;
                case "video":
                    $result = $this->receiveVideo($postObj);
                    break;
                case "link":
                    $result = $this->receiveLink($postObj);
                    break;
                default:
                    $result = "unknown msg type: ".$RX_TYPE;
                    break;
            }
            $this->logger("T ".$result);
            echo $result;
        }else {
            echo "";
            exit;
        }
    }

    //接收事件消息
    private function receiveEvent($object)
    {
        $content = "";
        switch ($object->Event)
        {
            case "subscribe":
                $content = "欢迎关注方倍工作室 ";
                $content .= (!empty($object->EventKey))?("\n来自二维码场景 ".str_replace("qrscene_","",$object->EventKey)):"";
                break;
            case "unsubscribe":
                $content = "取消关注";
                break;
            case "SCAN":
                $content = "扫描场景 ".$object->EventKey;
                break;
            case "CLICK":
                switch ($object->EventKey)
                {
                    case "COMPANY":
                        $content = "方倍工作室提供互联网相关产品与服务。";
                        break;
                    default:
                        $content = "点击菜单:".$object->EventKey;
                        break;
                }
                break;
            case "LOCATION":
                $content = "上传位置:纬度 ".$object->Latitude.";经度 ".$object->Longitude;
                break;
            case "VIEW":
                $content = "跳转链接 ".$object->EventKey;
                break;
            default:
                $content = "receive a new event: ".$object->Event;
                break;
        }
        $result = $this->transmitText($object, $content);
        return $result;
    }

    //接收文本消息
    private function receiveText($object)
    {
        switch ($object->Content)
        {
            case "文本":
                $content = "这是个文本消息";
                break;
            case "图文":
            case "单图文":
                $content = array();
                $content[] = array("Title"=>"单图文标题",  "Description"=>"单图文内容", "PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");
                break;
            case "多图文":
                $content = array();
                $content[] = array("Title"=>"多图文1标题", "Description"=>"", "PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");
                $content[] = array("Title"=>"多图文2标题", "Description"=>"", "PicUrl"=>"http://d.hiphotos.bdimg.com/wisegame/pic/item/f3529822720e0cf3ac9f1ada0846f21fbe09aaa3.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");
                $content[] = array("Title"=>"多图文3标题", "Description"=>"", "PicUrl"=>"http://g.hiphotos.bdimg.com/wisegame/pic/item/18cb0a46f21fbe090d338acc6a600c338644adfd.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");
                break;
            case "音乐":
                $content = array("Title"=>"最炫民族风", "Description"=>"歌手:凤凰传奇", "MusicUrl"=>"http://121.199.4.61/music/zxmzf.mp3", "HQMusicUrl"=>"http://121.199.4.61/music/zxmzf.mp3");
                break;
            default:
                $content = date("Y-m-d H:i:s",time());
                break;
        }
        if(is_array($content)){
            if (isset($content[0]['PicUrl'])){
                $result = $this->transmitNews($object, $content);
            }else if (isset($content['MusicUrl'])){
                $result = $this->transmitMusic($object, $content);
            }
        }else{
            $result = $this->transmitText($object, $content);
        }
        return $result;
    }

    //接收图片消息
    private function receiveImage($object)
    {
        $content = array("MediaId"=>$object->MediaId);
        $result = $this->transmitImage($object, $content);
        return $result;
    }

    //接收位置消息
    private function receiveLocation($object)
    {
        $content = "你发送的是位置,纬度为:".$object->Location_X.";经度为:".$object->Location_Y.";缩放级别为:".$object->Scale.";位置为:".$object->Label;
        $result = $this->transmitText($object, $content);
        return $result;
    }

    //接收语音消息
    private function receiveVoice($object)
    {
        if (isset($object->Recognition) && !empty($object->Recognition)){
            $content = "你刚才说的是:".$object->Recognition;
            $result = $this->transmitText($object, $content);
        }else{
            $content = array("MediaId"=>$object->MediaId);
            $result = $this->transmitVoice($object, $content);
        }

        return $result;
    }

    //接收视频消息
    private function receiveVideo($object)
    {
        $content = array("MediaId"=>$object->MediaId, "ThumbMediaId"=>$object->ThumbMediaId, "Title"=>"", "Description"=>"");
        $result = $this->transmitVideo($object, $content);
        return $result;
    }

    //接收链接消息
    private function receiveLink($object)
    {
        $content = "你发送的是链接,标题为:".$object->Title.";内容为:".$object->Description.";链接地址为:".$object->Url;
        $result = $this->transmitText($object, $content);
        return $result;
    }

    //回复文本消息
    private function transmitText($object, $content)
    {
        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);
        return $result;
    }

    //回复图片消息
    private function transmitImage($object, $imageArray)
    {
        $itemTpl = "<Image>
    <MediaId><![CDATA[%s]]></MediaId>
</Image>";

        $item_str = sprintf($itemTpl, $imageArray['MediaId']);

        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
$item_str
</xml>";

        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
        return $result;
    }

    //回复语音消息
    private function transmitVoice($object, $voiceArray)
    {
        $itemTpl = "<Voice>
    <MediaId><![CDATA[%s]]></MediaId>
</Voice>";

        $item_str = sprintf($itemTpl, $voiceArray['MediaId']);

        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
$item_str
</xml>";

        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
        return $result;
    }

    //回复视频消息
    private function transmitVideo($object, $videoArray)
    {
        $itemTpl = "<Video>
    <MediaId><![CDATA[%s]]></MediaId>
    <ThumbMediaId><![CDATA[%s]]></ThumbMediaId>
    <Title><![CDATA[%s]]></Title>
    <Description><![CDATA[%s]]></Description>
</Video>";

        $item_str = sprintf($itemTpl, $videoArray['MediaId'], $videoArray['ThumbMediaId'], $videoArray['Title'], $videoArray['Description']);

        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA]></MsgType>
$item_str
</xml>";

        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
        return $result;
    }

    //回复图文消息
    private function transmitNews($object, $newsArray)
    {
        if(!is_array($newsArray)){
            return;
        }
        $itemTpl = "    <item>
        <Title><![CDATA[%s]]></Title>
        <Description><![CDATA[%s]]></Description>
        <PicUrl><![CDATA[%s]]></PicUrl>
        <Url><![CDATA[%s]]></Url>
    </item>
";
        $item_str = "";
        foreach ($newsArray as $item){
            $item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);
        }
        $newsTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<Content><![CDATA[]]></Content>
<ArticleCount>%s</ArticleCount>
<Articles>
$item_str</Articles>
</xml>";

        $result = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($newsArray));
        return $result;
    }

    //回复音乐消息
    private function transmitMusic($object, $musicArray)
    {
        $itemTpl = "<Music>
    <Title><![CDATA[%s]]></Title>
    <Description><![CDATA[%s]]></Description>
    <MusicUrl><![CDATA[%s]]></MusicUrl>
    <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
</Music>";

        $item_str = sprintf($itemTpl, $musicArray['Title'], $musicArray['Description'], $musicArray['MusicUrl'], $musicArray['HQMusicUrl']);

        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[music]]></MsgType>
$item_str
</xml>";

        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
        return $result;
    }

    //日志记录
    private function logger($log_content)
    {
        if(isset($_SERVER['HTTP_APPNAME'])){   //SAE
            sae_set_display_errors(false);
            sae_debug($log_content);
            sae_set_display_errors(true);
        }else if($_SERVER['REMOTE_ADDR'] != "127.0.0.1"){ //LOCAL
            $max_size = 10000;
            $log_filename = "log.xml";
            if(file_exists($log_filename) and (abs(filesize($log_filename)) > $max_size)){unlink($log_filename);}
            file_put_contents($log_filename, date('H:i:s')." ".$log_content."\r\n", FILE_APPEND);
        }
    }
}
?>

电子版 41😉

使用第一章同样办法,将上述代码另存为index.php,压缩成index.zip,或者直接点击下载,上传到SAE,你的群众账号就能接过及回复所有新闻类型及事件通报了。

在民众账号中回复以下文字,你将获取和上一章一样的回复内容。

文本
图文
多图文
音乐
时间

还足以品味以下操作,体验一下别样音信

发送一张图片给公众账号
发送一段语音给公众账号
发送一段视频给公众账号
发送位置信息给公众账号
发送收藏中的链接给公众账号

第五章
微信公众平台开发情势原理分析

 

在感受了上一节的各类功效之后,我们只是知其然,这一节里面,将介绍在上头的根底上介绍微信公众平台收发消息机制及原理,那是知其所以然。

开发情势成为开发者时的新闻校验原理

在开发者首次提交评释申请时,微信服务器将发送GET请求到填写的URL上,并且带上七个参数(signature、timestamp、nonce、echostr),开发者通过对签名(即signature)的成效,来判定此条新闻的实际。

今后,每一趟开发者接收用户音信的时候,微信也都会带上后边多少个参数(signature、timestamp、nonce)访问开发者设置的URL,开发者仍然通过对签名的效益判断此条消息的实际。效验格局与首次提交认证申请一致。

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

开发者通过验证signature对请求进行校验(上边有校验格局)。若确认此次GET请求来自微信服务器,请原样再次回到echostr参数内容,则连接生效,成为开发者成功,否则接入失利。

加密/校验流程如下:
1. 将token、timestamp、nonce三个参数进行字典序排序
2. 将三个参数字符串拼接成一个字符串进行sha1加密
3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

启用接口是由代码中的checkSignature()函数来贯彻校验的。假诺对这一法则难以知晓,可以暂时不要深究,继续看上面。

 

化为开发者后新闻收发时的规律

再来看下那么些图,当用户发送一个“?”时,系统恢复生机了一个岁月

电子版 42

这一规律的新闻流程图如下所示。

电子版 43

从上图能够看看,用户在发送一个?后,微信服务器将组建一个音讯发送给大家团结一心的服务器,自己的劳务器然后复原一个时间,并且将该时间也按自然的平整组装,回复给民众账号,公众账号再过来给用户,在那几个收发进度中,发送方和接收方举行了交替(ToUserName和FromUserName值沟通),收发都是以xml格式在后台举办传输的,

所以控制各类新闻类型的收发就是开展微信公众平台开发的基本功

上面对前边所述的各个新闻类型讲解其XML数据包的格式。

 

各样收发音讯的XML数据包分析

收起音信

1. 文本(包罗表情) 发送文书及表情

电子版 44

文字后台格式:

电子版 45😉

<xml>
 <ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
 <FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></FromUserName>
 <CreateTime>1359028446</CreateTime>
 <MsgType><![CDATA[text]]></MsgType>
 <Content><![CDATA[测试文字]]></Content>
 <MsgId>5836982729904121631</MsgId>
</xml>

电子版 46😉

表情后台格式

电子版 47😉

<xml><ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
<FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></FromUserName>
<CreateTime>1359044526</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[/::)/::~/::B/::|/:8-)]]></Content>
<MsgId>5837051792978241864</MsgId>
</xml>

电子版 48😉

XML格式讲解

ToUserName 消息接收方微信号,一般为公众平台账号微信号
FromUserName 消息发送方微信号
CreateTime 消息创建时间
MsgType 消息类型;文本消息为text
Content 消息内容
MsgId 消息ID号

可以见见,文本和神采的音信类型均为文本

2. 图片 发送图片

电子版 49

后台格式:

电子版 50😉

<xml><ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
<FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></FromUserName>
<CreateTime>1359028479</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<PicUrl><![CDATA[http://mmbiz.qpic.cn/mmbiz/L4qjYtOibummHn90t1mnaibYiaR8ljyicF3MW7XX3BLp1qZgUb7CtZ0DxqYFI4uAQH1FWs3hUicpibjF0pOqLEQyDMlg/0]]></PicUrl>
<MsgId>5836982871638042400</MsgId>
<MediaId><![CDATA[PGKsO3LAgbVTsFYO7FGu51KUYa07D0C_Nozz2fn1z6VYtHOsF59PTFl0vagGxkVH]]></MediaId>
</xml>

电子版 51😉

XML格式讲解

ToUserName 消息接收方微信号,一般为公众平台账号微信号
FromUserName 消息发送方微信号
CreateTime 消息创建时间
MsgType 消息类型;图片消息为image
PicUrl 图片链接地址,可以用HTTP GET获取
MsgId 消息ID号

3. 语音 发送语音

电子版 52

后台格式:

电子版 53😉

<xml><ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
<FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></FromUserName>
<CreateTime>1359028479</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<PicUrl><![CDATA[http://mmbiz.qpic.cn/mmbiz/L4qjYtOibummHn90t1mnaibYiaR8ljyicF3MW7XX3BLp1qZgUb7CtZ0DxqYFI4uAQH1FWs3hUicpibjF0pOqLEQyDMlg/0]]></PicUrl>
<MsgId>5836982871638042400</MsgId>
<MediaId><![CDATA[PGKsO3LAgbVTsFYO7FGu51KUYa07D0C_Nozz2fn1z6VYtHOsF59PTFl0vagGxkVH]]></MediaId>
</xml>

电子版 54😉

XML格式讲解

电子版 55😉

ToUserName 消息接收方微信号,一般为公众平台账号微信号
FromUserName 消息发送方微信号
CreateTime 消息创建时间
MsgType 消息类型;语音消息为voice
MediaId 媒体ID
Format 语音格式,这里为amr
MsgId 消息ID号

电子版 56😉

附:AMR接口简介
全称Adaptive Multi-Rate,主要用于移动设备的音频,压缩比比较大,但相对其他的压缩格式质量比较差,由于多用于人声,通话,效果还是很不错的。

4. 视频

出殡录像

电子版 57

后台格式:

电子版 58😉

xml><ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
<FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></FromUserName>
<CreateTime>1359028186</CreateTime>
<MsgType><![CDATA]></MsgType>
<MediaId><![CDATA[DBVFRIj29LB2hxuYpc0R6VLyxwgyCHZPbRj_IIs6YaGhutyXUKtFSDcSCPeoqUYr]]></MediaId>
<ThumbMediaId><![CDATA[mxUJ5gcCeesJwx2T9qsk62YzIclCP_HnRdfTQcojlPeT2G9Q3d22UkSLyBFLZ01J]]></ThumbMediaId>
<MsgId>5836981613212624665</MsgId>
</xml>

电子版 59😉

XML格式讲解

电子版 60😉

ToUserName 消息接收方微信号,一般为公众平台账号微信号
FromUserName 消息发送方微信号
CreateTime 消息创建时间
MsgType 消息类型;视频消息为video
MediaId 媒体ID
ThumbMediaId 媒体缩略ID?
MsgId 消息ID号

电子版 61😉

5. 位置

发送地点

电子版 62

后台格式:

电子版 63😉

<xml>
<ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
<FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></FLACFromUserName>
<CreateTime>1359036619</CreateTime>
<MsgType><![CDATA[location]]></MsgType>
<Location_X>22.539968</Location_X>
<Location_Y>113.954980</Location_Y>
<Scale>16</Scale>
<Label><![CDATA[中国广东省深圳市南山区华侨城深南大道9789号 邮政编码: 518057]]></Label>
<MsgId>5837017832671832047</MsgId>
</xml>

电子版 64😉

XML格式讲解

电子版 65😉

 ToUserName 消息接收方微信号,一般为公众平台账号微信号
 FromUserName 消息发送方微信号
 CreateTime 消息创建时间
 MsgType 消息类型,地理位置为location
 Location_X 地理位置纬度
 Location_Y 地理位置经度
 Scale 地图缩放大小
 Label 地理位置信息
 MsgId 消息ID号

电子版 66😉

6. 链接

出殡链接

电子版 67

后台格式:

电子版 68😉

<xml>
<ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName> 
<FromUserName><![CDATA[oIDrpjl2LYdfTAM-oxDgB4XZcnc8]]></FromUserName> 
<CreateTime>1359709372</CreateTime> 
<MsgType><![CDATA[link]]></MsgType> 
<Title><![CDATA[微信公众平台开发者的江湖]]></Title> 
<Description><![CDATA[陈坤的微信公众号这段时间大火,大家..]]></Description> 
<Url><![CDATA[http://israel.duapp.com/web/photo.php]]></Url> 
<MsgId>5839907284805129867</MsgId> 
</xml> 

电子版 69😉

XML格式讲解

电子版 70😉

 ToUserName 消息接收方微信号,一般为公众平台账号微信号
 FromUserName 消息发送方微信号
 CreateTime 消息创建时间
 MsgType 消息类型,链接为link
 Title 图文消息标题
 Description 图文消息描述
 Url 点击图文消息跳转链接
 MsgId 消息ID号

电子版 71😉

 

出殡音信

只介绍二种格式的音信:文本、图文、音乐。其中图文音讯包罗单条图文音信和多条图文音讯,显示方式有一点点不一。

1. 文本音信格式 回复文本

电子版 72

后台格式:

电子版 73😉

<xml>
<ToUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></ToUserName>
<FromUserName><![CDATA[gh_680bdefc8c5d]]></FromUserName>
<CreateTime>1359036631</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[【深圳】天气实况 温度:27℃ 湿度:59% 风速:东北风3级
11月03日 周日 27℃~23℃ 小雨 东北风4-5级
11月04日 周一 26℃~21℃ 阵雨 微风
11月05日 周二 27℃~22℃ 阴 微风]]></Content>
<FuncFlag>0</FuncFlag>
</xml>

电子版 74😉

XML格式讲解

 FromUserName 消息发送方
 ToUserName 消息接收方
 CreateTime 消息创建时间
 MsgType 消息类型,文本消息必须填写text
 Content 消息内容,大小限制在2048字节,字段为空为不合法请求
 FuncFlag 星标字段

  2. 图文音讯格式 2.1 单条图文音信 回复单条图文

电子版 75电子版 76
后台格式:

电子版 77😉

<xml>
    <ToUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></ToUserName>
    <FromUserName><![CDATA[gh_680bdefc8c5d]]></FromUserName>
    <CreateTime>1359011899</CreateTime>
    <MsgType><![CDATA[news]]></MsgType>
    <Content><![CDATA[]]></Content>
    <ArticleCount>1</ArticleCount>
    <Articles>
        <item>
            <Title><![CDATA[[苹果产品信息查询]]></Title>
            <Description><![CDATA[序列号:USE IMEI NUMBER
IMEI号:358031058974471
设备名称:iPhone 5C
设备颜色:
设备容量:
激活状态:已激活
电话支持:未过期[2014-01-13]
硬件保修:未过期[2014-10-14]
生产工厂:中国]]>
    </Description>
            <PicUrl><![CDATA[http://www.doucube.com/weixin/weather/icon/banner.jpg]]></PicUrl>
            <Url><![CDATA[]]></Url>
        </item>
    </Articles>
    <FuncFlag>0</FuncFlag>
</xml>

电子版 78😉

2.2 多图文音讯

复原多图文

电子版 79电子版 80

后台数据格式

电子版 81😉

<xml>
    <ToUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></ToUserName>
    <FromUserName><![CDATA[gh_680bdefc8c5d]]></FromUserName>
    <CreateTime>1359011829</CreateTime>
    <MsgType><![CDATA[news]]></MsgType>
    <Content><![CDATA[]]></Content>
    <ArticleCount>5</ArticleCount>
    <Articles>
        <item>
            <Title><![CDATA[【深圳】天气实况 温度:3℃ 湿度:43﹪ 风速:西南风2级]]></Title>
            <Description><![CDATA[]]></Description>
<PicUrl><![CDATA[http://www.doucube.com/weixin/weather/icon/banner.jpg]]></PicUrl>
            <Url><![CDATA[]]></Url>
        </item>
        <item>
            <Title><![CDATA[06月24日 周四 2℃~-7℃ 晴 北风3-4级转东南风小于3级]]></Title>
            <Description><![CDATA[]]></Description>
            <PicUrl><![CDATA[http://www.doucube.com/weixin/weather/icon/d00.gif]]></PicUrl>
            <Url><![CDATA[]]></Url>
        </item>
        <item>
            <Title><![CDATA[06月25日 周五 -1℃~-8℃ 晴 东南风小于3级转东北风3-4级]]></Title>
            <Description><![CDATA[]]></Description>
    <PicUrl><![CDATA[http://www.doucube.com/weixin/weather/icon/d00.gif]]></PicUrl>
            <Url><![CDATA[]]></Url>
        </item>
        <item>
            <Title><![CDATA[06月26日 周六 -1℃~-7℃ 多云 东北风3-4级转东南风小于3级]]></Title>
            <Description><![CDATA[]]></Description>
<PicUrl><![CDATA[http://www.doucube.com/weixin/weather/icon/d01.gif]]></PicUrl>
            <Url><![CDATA[]]></Url>
        </item>
        <item>
            <Title><![CDATA[06月27日 周日 0℃~-6℃ 多云 东南风小于3级转东北风3-4级]]></Title>
            <Description><![CDATA[]]></Description>
<PicUrl><![CDATA[http://www.doucube.com/weixin/weather/icon/d01.gif]]></PicUrl>
            <Url><![CDATA[]]></Url>
        </item>
    </Articles>
    <FuncFlag>0</FuncFlag>
</xml>

电子版 82😉

XML格式讲解

电子版 83😉

FromUserName 消息发送方
 ToUserName 消息接收方
 CreateTime 消息创建时间
 MsgType 消息类型,图文消息必须填写news
 Content 消息内容,图文消息可填空
 ArticleCount 图文消息个数,限制为10条以内
 Articles 多条图文消息信息,默认第一个item为大图
  Title 图文消息标题
  Description 图文消息描述
  PicUrl 图片链接,支持JPG、PNG格式,较好的效果为大图640*320,小图80*80
  Url 点击图文消息跳转链接
FuncFlag 星标字段

电子版 84😉

 3. 音乐新闻

平复音乐信息

电子版 85

后台格式:

电子版 86😉

<xml>
    <ToUserName><![CDATA[ollB4jqgdO_cRnVXk_wRnSywgtQ8]]></ToUserName>
    <FromUserName><![CDATA[gh_b629c48b653e]]></FromUserName>
    <CreateTime>1372310544</CreateTime>
    <MsgType><![CDATA[music]]></MsgType>
    <Music>
        <Title><![CDATA[最炫民族风]]></Title>
        <Description><![CDATA[凤凰传奇]]></Description>
        <MusicUrl><![CDATA[http://zj189.cn/zj/download/music/zxmzf.mp3]]></MusicUrl>
        <HQMusicUrl><![CDATA[http://zj189.cn/zj/download/music/zxmzf.mp3]]></HQMusicUrl>
    </Music>
    <FuncFlag>0</FuncFlag>
</xml>

电子版 87😉

XML格式讲解

电子版 88😉

ToUserName     接收方帐号(收到的OpenID)
FromUserName     开发者微信号
CreateTime     消息创建时间
MsgType          消息类型,此处为music
    Title       音乐标题
    Description 音乐描述
    MusicUrl     音乐链接
    HQMusicUrl     高质量音乐链接,WIFI环境优先使用该链接播放音乐
FuncFlag     位0x0001被标志时,星标刚收到的消息。

电子版 89😉

 

事件音信类型

当前用户在关怀和撤废关怀,以及点击菜单的时候会活动向公众平台发送事件推送音讯:

  1. 关心事件

电子版 90😉

<xml>
    <ToUserName><![CDATA[gh_b629c48b653e]]></ToUserName>
    <FromUserName><![CDATA[ollB4jv7LA3tydjviJp5V9qTU_kA]]></FromUserName>
    <CreateTime>1372307736</CreateTime>
    <MsgType><![CDATA[event]]></MsgType>
    <Event><![CDATA[subscribe]]></Event>
    <EventKey><![CDATA[]]></EventKey>
</xml>

电子版 91😉

  1. 撤废关切事件

电子版 92😉

<xml>
    <ToUserName><![CDATA[gh_b629c48b653e]]></ToUserName>
    <FromUserName><![CDATA[ollB4jqgdO_cRnVXk_wRnSywgtQ8]]></FromUserName>
    <CreateTime>1372309890</CreateTime>
    <MsgType><![CDATA[event]]></MsgType>
    <Event><![CDATA[unsubscribe]]></Event>
    <EventKey><![CDATA[]]></EventKey>
</xml>

电子版 93😉

  1. 食谱点击事件

电子版 94😉

<xml>
    <ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
    <FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></FromUserName>
    <CreateTime>1377886191</CreateTime>
    <MsgType><![CDATA[event]]></MsgType>
    <Event><![CDATA[CLICK]]></Event>
    <EventKey><![CDATA[天气深圳]]></EventKey>
</xml>

电子版 95😉

XML格式讲解

ToUserName     接收方微信号
FromUserName 发送方微信号,若为普通用户,则是一个OpenID
CreateTime     消息创建时间
MsgType     消息类型,event
Event     事件类型,subscribe(订阅)、unsubscribe(取消订阅)、CLICK(自定义菜单点击事件)
EventKey 事件KEY值,与自定义菜单接口中KEY值对应

 

 

第六章 开发天气预先报告功效

 

这一章里,大家来很快支付天气预告功用、大家接纳方倍工作室的应和接口来贯彻。上边代码完成了那般该意义。

电子版 96😉

<?php
/*
    方倍工作室
    CopyRight 2014 All Rights Reserved
*/

define("TOKEN", "weixin");

$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {
    $wechatObj->responseMsg();
}else{
    $wechatObj->valid();
}

class wechatCallbackapiTest
{
    public function valid()
    {
        $echoStr = $_GET["echostr"];
        if($this->checkSignature()){
            echo $echoStr;
            exit;
        }
    }

    private function checkSignature()
    {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
        $token = TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr, SORT_STRING);
        $tmpStr = implode($tmpArr);
        $tmpStr = sha1($tmpStr);

        if($tmpStr == $signature){
            return true;
        }else{
            return false;
        }
    }

    public function responseMsg()
    {
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
        if (!empty($postStr)){
            $this->logger("R ".$postStr);
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
            $RX_TYPE = trim($postObj->MsgType);

            switch ($RX_TYPE)
            {
                case "event":
                    $result = $this->receiveEvent($postObj);
                    break;
                case "text":
                    $result = $this->receiveText($postObj);
                    break;
            }
            $this->logger("T ".$result);
            echo $result;
        }else {
            echo "";
            exit;
        }
    }

    private function receiveEvent($object)
    {
        $content = "";
        switch ($object->Event)
        {
            case "subscribe":
                $content = "欢迎关注方倍工作室 ";
                break;
        }
        $result = $this->transmitText($object, $content);
        return $result;
    }

    private function receiveText($object)
    {
        $keyword = trim($object->Content);$url = "http://apix.sinaapp.com/weather/?appkey=".$object->ToUserName."&city=".urlencode($keyword); 
        $output = file_get_contents($url);
        $content = json_decode($output, true);

        $result = $this->transmitNews($object, $content);
        return $result;
    }

    private function transmitText($object, $content)
    {
        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);
        return $result;
    }

    private function transmitNews($object, $newsArray)
    {
        if(!is_array($newsArray)){
            return;
        }
        $itemTpl = "    <item>
        <Title><![CDATA[%s]]></Title>
        <Description><![CDATA[%s]]></Description>
        <PicUrl><![CDATA[%s]]></PicUrl>
        <Url><![CDATA[%s]]></Url>
    </item>
";
        $item_str = "";
        foreach ($newsArray as $item){
            $item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);
        }
        $newsTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<Content><![CDATA[]]></Content>
<ArticleCount>%s</ArticleCount>
<Articles>
$item_str</Articles>
</xml>";

        $result = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($newsArray));
        return $result;
    }

    private function logger($log_content)
    {

    }
}
?>

电子版 97😉

在公众账号中选拔的吩咐如下:

  1. 发送城市称号,如“卡塔尔多哈”,可以查询该城市的天气

在您的本田账号输入相应的命令,完毕效益类似如下所示:

电子版 98

 

 

第七章 小结

 

总的看,通过本课程,你拿走了以下收获:

    1. 你通过本学科得到了一个免费的云计算空间
    1. 您成功启用了开支情势,并且已毕了岁月的自发性还原
  • 3.
    您万分快捷地就感受了种种音讯接收及发送,比方倍当年协调寻找所用的时刻短了很多
  • 4.
    你询问了微信公众平台支付的原理,并且熟谙了各样音信及发送是怎么两遍事
  • 5.
    你使用方倍工作室的接口,成功的开发了你的率先个微信公众平台成效——天气预先报告。

接下去该做什么样啊?你可以学学开发一些基础的常用功用,推荐:方倍工作室 编写,机械工业出版社
出版的《微信公众平台支付最佳实践》,里面含有众多php开发技巧、数据库使用、及近30项微信公众平台实用作用或技术

点击图标购买:

电子版 99 电子版 100

上学完这一层次之后,你可以开首自己胜任一个微型的微信公众平台账号功效的用度了,比如通过为一个账号支付出自定义菜单,为种菜单添加相应的响应信息,学习完这一层次之后,你能独当一面一个中小型账号的职能的付出了。

 

付出率领[收费服务]

其它大家提供微信公众平台开发实战指导,内容包罗:1.
微信公众平台基础疑难解答;2.
赠与微信公众平台开发实战教程电子版,高级接口教程电子版,赠送《微信公众平台开发最佳实践》;3.微信公众平台开发技术咨询;4.
具有题目在24钟头内获取上涨;5.急切技术问题的电话机引导;6.
提供天气、快递、点歌、翻译、人脸识别、四六级、星座、解梦、笑话、苹果产品查询等功用源码;7.
专属QQ群引导。欢迎出席。

劳动采购地点 http://item.taobao.com/item.htm?id=37979420283

 

 

关切我们

越多职能、代码、教程、行业秘密,将在微信公众账号中公告,欢迎关怀,二维码见下
 个人微信账号

电子版 101 
 电子版 102

 

 

 原文:http://www.cnblogs.com/txw1958/p/wechat-tutorial.html** **

====================================================================

★学习微信公众平台支付教程
点击进入

★微信平台付费定制开发 联系QQ 1354386063

相关文章