在这篇微信公众平台开发教程中,大家将采取微信公众账号方倍工作室作为讲解的例子

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

关键字:微信公众平台支付
小编:方倍工作室

 

 

关键字:微信公众平台开发 小编:方倍工作室

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

 

俺们将应用微信公众账号方倍工作室作为讲解的例证,二维码见尾部。

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

本连串教程将指导您已毕如下义务:

俺们将拔取微信公众账号方倍工作室作为讲解的例证,二维码见底部。

  1. 创设博客园云计算平台接纳
  2. 启用微信公众平台支付格局
  3. 体验常用接收新闻及发送新闻类型
  4. 刺探多少收发原理及新闻格式

本连串教程将率领您做到如下职责:

 

  1. 始建腾讯网云计算平台利用
  2. 启用微信公众平台开发形式
  3. 基础接口音信及事件
  4. 微信公众平台PHP SDK
  5. 微信公众平台支付情势原理
  6. 付出天气预先报告功效

先是章 申请服务器资源

 

创设博客园云总括应用

第一章 申请服务器资源

报名账号

创造乐乎云总结应用

大家利用SAE虎扑云总计平台作为服务器资源,并且申请PHP环境+MySQL数据库作为程序运行环境。
提请地址为:

报名账号

http://www.sinacloud.com/

俺们选拔SAE虎扑云统计平台作为服务器资源,并且申请PHP环境+MySQL数据库作为程序运行环境。
申请地址:http://sae.sina.com.cn/,使用和讯天涯论坛账号可以一向登录SAE,登录后SAE将赠送500个免费云豆。

直接点击上述网址,可以观看右上角乐乎登录的链接。

 图片 1

图片 2

 

点击进入之后,使用新浪新浪账号登录 

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

图片 3

登录后点击顶部【自己的首页

登录之后,依照提醒注册个人新闻即可。 

图片 4

 

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

创设新应用 http://www.cnblogs.com/txw1958/p/wechat-tutorial.html 

 图片 5

回来首页,在菜单顶部选拔 控制台 ,再选择 云应用SAE 

选拔一个未使用的appid,假诺老是已经被运用不亮堂该怎么好,就填写您的QQ号或者手机号吧。

图片 6

填写二级域名AppID、应用名称、验证码,开发语言选拔PHP,应用项目选取web应用。然后点击创造应用

跻身SAE应用列表

 图片 7

图片 8

选用创造成功。并自动跳转到应用列表中,可以看来曾经有刚刚成立的中央电视台-7

点击下侧的成立新应用,这时会弹出提醒,
禁止放置不合规非法情节,点击继续创建,弹出如下窗口。

 图片 9

图片 10

 

慎选一个未选拔的appid,如果老是已经被使用不晓得该怎么好,就填写您的QQ号或者手机号吧。

创办版本 http://www.cnblogs.com/txw1958/p/wechat-tutorial.html 

填写二级域名AppID、应用名称、验证码,开发语言选取PHP5.3,漫天应用和框架上面拔取第二个【PHP 空应用】。然后点击左下方的创设应用

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

 图片 11

 图片 12

运用创制成功。并自动跳转到应用列表中,可以见到曾经有刚刚成立的1354386063这几个利用。

跳转到代码管理

图片 13

图片 14

 

点击右边的图片 15

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

图片 16

点击刚才创造的施用名称,进入应用主页。

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

点击左侧的利用管理下面的代码管理

图片 17

图片 18

 

 

到那里,就打响成立了一个域名URL为 http://cctv7.sinaapp.com/ 的采用了。

在代码管理中,拔取采纳SVN托管的办法。

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

图片 19

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

跳转到代码管理

将以下代码复制下来,另存为index.php。必须选用专业的支付编辑软件操作,例如Notepad++,不要采纳Windows自带的记事本等。

图片 20

图片 21😉

点击左侧的“创造版本”

<?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;
        }
    }
}
?>

图片 22

图片 23😉

本子号默许为1,点击创制,有时会弹出平安登录,需求输入安全密码,借使不精晓或者忘记了,就点里面的找回密码,重新设置一下。:

下一场将index.php文件压缩成ZIP格式,注意不可能用RAR格式

图片 24

图片 25

表达通过之后,如下所示

那般会生成一个index.zip的文书。或者直接下载方倍已经收缩好的zip文件
点此下载

图片 26

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

到那里,就成功开创了一个域名URL为 http://1354386063.sinaapp.com/ 的利用了,记住您的那个URL,后面将会用到。

图片 27

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

选料上传代码包。

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

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

下述代码是一个微信接口文件,看不懂没有涉及,你可以暂时不要弄理解它的趣味。

图片 28

假若想弄了然,可以购进《微信公众平台支付最佳实践》,在该书中第25页~第27页有详细讲解。

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

图片 29

 图片 30

<?php
/*
    方倍工作室 http://www.cnblogs.com/txw1958/
    CopyRight 2013 www.fangbei.org  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()){
            header('content-type:text');
            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)){
            $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;
        }
    }
}
?>

我们得以观望index.php已经上传成功,双击可以查阅编辑里面的代码

图片 31

图片 32

大家将运用上述代码与微信公众平台对接。直接下载方倍工作室已经压缩好的上述代码的zip文件。点此进入下载

乐乎云应用的缔作育成功了。

归来SAE的代码管理界面中。

 

图片 33

第二章 启用开发形式

再拔取“上传代码包”,点击上传文件,接纳刚刚的index.zip文件,点击上传,上传成功后中间是一个蓝色的横条,如下所示

微信公众平台开发格局

图片 34

高等功能

如若没有黑色的横条,表示上传战败,必要重试。可以考虑在Chrome浏览器下重试一下。

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

点击编辑代码按钮,

登录微信公众平台后台,拔取高档功能,进入后就见到二种情势

图片 35

图片 36

 有时候要求输入自己的普洱密码,若是不记得了就点击“找回密码”。

俺们须要先关闭编辑格局。点击编辑方式的进去

图片 37

图片 38

安全评释成功后继续以前的操作。

滑动关闭

俺们得以看来index.php已经上传成功,双击可以查看编辑里面的代码

图片 39

图片 40

 

和讯云应用的创建就马到功成了。

付出方式

充值(本步骤可选拔性进行)

进入开发格局里面

腾讯网云SAE举行的是配额免费+超额付费的点子,相关专业请查看SAE价格连串介绍。初期对于多数用户来说免费配额已够用,即使您未来使用量比较大指出优先至少充值100元得到10000云豆,避防超额后使用被剥夺而影响工作。

图片 41

其次章 启用开发形式

 点击成为开发者

微信公众平台开发情势

图片 42

高档功用

弹出URL和Token填写框

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

图片 43

签到微信公众平台后台,在左手列表中最下方,找到“
基本配置 ”,点击进入

那边的URL为上篇中牵线的云应用的域名,而Token在index.php中定义为weixin。提交后提示您已变成开发者。

图片 44

图片 45

进入服务器配置填写框。

再滑动右上角启用按钮。

图片 46

图片 47

点击“修改配置”按钮

恭喜,你成功启用开发方式。

图片 48

 

此处的URL为上篇中牵线的云应用的域名,而Token在index.php中定义为weixin。EncodingAESKey则不用填,点击“随机生成”让自动生成一个,新闻加解密格局选择“明文形式”,然后点击“提交”按钮。

自动还原

图片 49

在位置的事例中,落成了一个发送“?”就能东山再起当前时光的效率。 效果如下:

 

图片 50

在弹出的唤起框中,点击“确定”

时至明日,你的微信公众平台账号已经落到实处自动还原了。

图片 51

 

陈设修改后如图所示,再点击“启用”按钮

 

图片 52

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

了然“是还是不是确定开启服务器配置”,点击“确定”

 

一经提醒“token验证失利”,可以先重次几回,微信服务器有时候不安宁。别的和讯SAE需求开展实名认证,请先上传身份证举办实名验证并通过查对后再试!

具有账号在提请之后,都将取得基础接口的权力,基础接口中校包含接受用户音讯,向用户回复新闻,接受事件推送等两种服务。

一旦依旧败诉,请先用微信调试器测试一下url和token是或不是正确,点此查看详细测试方法

图片 53

图片 54

收取用户音信

成功启用后如图。

近日普通用户能向公众账号推送多样格式的消息:文本(包含表情)、语音、图片、视频、地点、链接。
上边就那四种分别详解如下:

恭喜,你成功启用开发形式。

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

 

图片 55

电动回复

2. 图片

在上头的例子中,已毕了一个发送“?”就能復苏当前时间的功能。
功能如下:

发送图片

图片 56

图片 57

迄今截止,你的微信公众平台账号已经已毕机关还原了。 

3. 语音

 

出殡语音

其三章 常用音信类型接收与发送

图片 58

 

4. 视频

关注群众账号下载增添型代码

出殡摄像

微信扫描下列二维码,然后还原“入门教程代码”,或查看到扩张型代码的整体地址。

图片 59

图片 60图片 61

5. 位置

将上述信息复制后,通过 手机版微信发给电脑版微信 或 手机版QQ发给电脑版QQ
的主意,将下载地址转到电脑上,并下载其中的压缩文件。

发送位置

下一场经过前边章节同样的不二法门,上传到和讯SAE应用中。

图片 62

下一场在你的群众账号中分头回复下列文字

6. 链接

文本 表情 单图文 多图文 音乐

出殡链接

图片 63 图片 64 图片 65

图片 66

或者发送以下项目标新闻:语音 图片 小摄像 我的收藏 地方

 

图片 67 图片 68

向用户回复信息

你将体验到微信公众账号中最广大的接受新闻及发送新闻的项目。

现阶段常见民众账号能向用户推送三种格式的音讯:文本、图文、音乐、图片、语音、视频。其中图文音信包罗单条图文新闻和多条图文音讯,展示格局有一点点不一。

 

下边就这二种分别详解如下:【图片、语音、视频由于要求接纳和高档接口相关的media_id,在本教程中暂不切磋。】

 

1. 文件音讯格式 回复文本

第四章
数据收发原理及消息数据格式

图片 69

 

2. 图文消息格式

★ 本章是论战部分,初学者会相比较难以领会,不用太过追究。

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

支出形式变成开发者时的音信校验原理

图片 70 2.2 多图文音信

在开发者首次提交讲明申请时,微信服务器将发送GET请求到填写的URL上,并且带上七个参数(signature、timestamp、nonce、echostr),开发者通过对签名(即signature)的功能,来判断此条音讯的实在。

平复多图文

尔后,每便开发者接收用户音信的时候,微信也都会带上后面多个参数(signature、timestamp、nonce)访问开发者设置的URL,开发者依旧通过对签名的功能判断此条信息的实在。效验格局与首次提交注脚申请一致。

图片 71

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

3. 音乐信息

开发者通过检验signature对请求举行校验(上边有校验方式)。若确认此次GET请求来自微信服务器,请原样重返echostr参数内容,则连接生效,成为开发者成功,否则接入失利。

过来音乐音信

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

图片 72

启用接口是由代码中的checkSignature()函数来贯彻校验的。要是对这一法则难以精通,可以暂时不要深究,继续看下边。

 

 

接纳事件推送

改为开发者后音讯收发时的法则

方今用户在关心和废除关怀,以及点击菜单的时候会自动向群众平台发送事件推送信息:

上一章节中图,当用户发送一个“?”时,系统復苏了一个时日

  1. 关怀事件

这一原理的音讯流程图如下所示。

图片 73图片 74

图片 75

 

从上图可以阅览,用户在殡葬一个?后,微信服务器将组建一个消息发送给大家和好的服务器,自己的服务器然后卷土重来一个时光,并且将该时间也按自然的规则组装,回复给公众账号,公众账号再回复给用户,在那个收发进程中,发送方和接收方进行了替换(ToUserName和FromUserName值交流),收发都是以xml格式在后台进行传输的,

 

因此明白各类新闻类型的接受过来就是开展微信公众平台支付的底蕴!

第四章 微信公众平台PHP SDK

下边对前方所述的各类音讯类型讲解其XML数据包的格式。

 

 

方倍工作室开发了微信公众平台的PHPSDK,集成了现阶段拥有音信及事件的吸纳及发送,代码如下:

各样收发新闻的XML数据包分析

图片 76😉

接受音讯

<?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);
        }
    }
}
?>

1. 文本(包括表情)
吸收文本及表情

图片 77😉

图片 78

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

文字后台格式:

在本田账号中平复以下文字,你将获得和上一章一样的复苏内容。

图片 79

文本
图文
多图文
音乐
时间
<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>

还足以尝尝以下操作,体验一下其余音信

图片 80

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

表情后台格式

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

图片 81

 

<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>

在体会了上一节的各样作用之后,我们只是知其然,这一节里面,将介绍在地方的底蕴上介绍微信公众平台收发信息机制及原理,那是知其所以然。

图片 82

支付情势变成开发者时的音信校验原理

XML格式讲解

在开发者首次提交注脚申请时,微信服务器将发送GET请求到填写的URL上,并且带上多个参数(signature、timestamp、nonce、echostr),开发者通过对签名(即signature)的效果,来判定此条音信的实事求是。

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

而后,每一遍开发者接收用户音讯的时候,微信也都会带上前边多个参数(signature、timestamp、nonce)访问开发者设置的URL,开发者依旧通过对签名的成效判断此条新闻的实事求是。效验格局与第一次提交申明申请一致。

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

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

2. 图片
收到图片

开发者通过检查signature对请求进行校验(上面有校验格局)。若确认此次GET请求来自微信服务器,请原样重返echostr参数内容,则连接生效,成为开发者成功,否则接入败北。

图片 83

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

后台格式:

启用接口是由代码中的checkSignature()函数来完毕校验的。假如对这一法则难以明白,可以临时不用深究,继续看下边。

图片 84

 

<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>

变成开发者后音讯收发时的规律

图片 85

再来看下这一个图,当用户发送一个“?”时,系统復苏了一个岁月

XML格式讲解

图片 86

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

这一法则的音信流程图如下所示。

3. 语音
收下语音

图片 87

图片 88

从上图可以见到,用户在殡葬一个?后,微信服务器将组建一个信息发送给大家团结的服务器,自己的劳动器然后复原一个时刻,并且将该时间也按一定的条条框框组装,回复给民众账号,公众账号再苏醒给用户,在那个收发进度中,发送方和接收方进行了交替(ToUserName和FromUserName值沟通),收发都是以xml格式在后台进行传输的,

后台格式:

所以控制各类音讯类型的收发就是进展微信公众平台支付的根基

图片 89

上面对眼前所述的各个音讯类型讲解其XML数据包的格式。

<xml>
    <ToUserName><![CDATA[gh_d035bb259cf5]]></ToUserName>
    <FromUserName><![CDATA[owEUGj4BW8yeWRvyEERiVGKwAF1Q]]></FromUserName>
    <CreateTime>1364883809</CreateTime>
    <MsgType><![CDATA[voice]]></MsgType>
    <MediaId><![CDATA[JfmCezZ3Cwp0FwUvMADwwhvp-XScuvpictubpw0c6ALyA8tj3HLU4PoXzMpIY72P]]></MediaId>
    <Format><![CDATA[amr]]></Format>
    <MsgId>5862131322594912688</MsgId>
</xml>

 

图片 90

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

XML格式讲解

收到音讯

图片 91

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

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

图片 92

图片 93

文字后台格式:

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

图片 94😉

4. 视频

<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>

收受摄像

图片 95😉

图片 96

表情后台格式

后台格式:

图片 97😉

图片 98

<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>
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>

图片 99😉

图片 100

XML格式讲解

XML格式讲解

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

图片 101

可以观望,文本和神情的消息类型均为文本

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

2. 图片 发送图片

图片 102

图片 103

5. 位置

后台格式:

接收地方

图片 104😉

图片 105

<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>

后台格式:

图片 106😉

图片 107

XML格式讲解

<xml>
<ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
<FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></FromUserName>
<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>
ToUserName 消息接收方微信号,一般为公众平台账号微信号
FromUserName 消息发送方微信号
CreateTime 消息创建时间
MsgType 消息类型;图片消息为image
PicUrl 图片链接地址,可以用HTTP GET获取
MsgId 消息ID号

图片 108

3. 语音 发送语音

XML格式讲解

图片 109

图片 110

后台格式:

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

图片 111😉

图片 112

<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>

6. 链接

图片 113😉

吸收链接

XML格式讲解

图片 114

图片 115😉

后台格式:

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

图片 116

图片 117😉

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

图片 118

4. 视频

XML格式讲解

发送视频

图片 119

图片 120

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

后台格式:

图片 121

图片 122😉

 

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>

平复新闻

图片 123😉

只介绍三种格式的音讯:文本、图文、音乐。其中图文音讯包涵单条图文新闻和多条图文信息,体现格局有一点点不比。

XML格式讲解

1. 文件音信格式
过来文本

图片 124😉

图片 125

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

后台格式:

图片 126😉

图片 127

5. 位置

<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>

发送地点

图片 128

图片 129

XML格式讲解

后台格式:

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

图片 130😉

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

<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>

图片 131图片 132
后台格式:

图片 133😉

图片 134

XML格式讲解

<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.fangbei.org/weixin/weather/icon/banner.jpg]]></PicUrl>
            <Url><![CDATA[]]></Url>
        </item>
    </Articles>
    <FuncFlag>0</FuncFlag>
</xml>

图片 135😉

图片 136

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

2.2 多图文信息

图片 137😉

平复多图文

6. 链接

图片 138图片 139

出殡链接

后台数据格式

图片 140

图片 141

后台格式:

<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.fangbei.org/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.fangbei.org/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.fangbei.org/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.fangbei.org/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.fangbei.org/weixin/weather/icon/d01.gif]]></PicUrl>
            <Url><![CDATA[]]></Url>
        </item>
    </Articles>
    <FuncFlag>0</FuncFlag>
</xml>

图片 142😉

图片 143

<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> 

XML格式讲解

图片 144😉

图片 145

XML格式讲解

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

图片 146😉

图片 147

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

 3. 音乐音信

图片 148😉

过来音乐信息

 

图片 149

发送音讯

后台格式:

只介绍三种格式的音讯:文本、图文、音乐。其中图文音信包涵单条图文新闻和多条图文音信,浮现形式有一点点见仁见智。

图片 150

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

<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>

图片 151

图片 152

后台格式:

XML格式讲解

图片 153😉

图片 154

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

图片 155😉

图片 156

XML格式讲解

 

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

事件音讯类型

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

现阶段用户在关心和撤回关切,以及点击菜单的时候会活动向公众平台发送事件推送信息:

图片 157图片 158
后台格式:

  1. 珍视入微事件

图片 159😉

图片 160

<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>
<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>

图片 161😉

图片 162

2.2 多图文音讯

  1. 取消关切事件

过来多图文

图片 163

图片 164图片 165

<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>

后台数据格式

图片 166

图片 167😉

  1. 菜单点击事件
<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>

图片 168

图片 169😉

<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>

XML格式讲解

图片 170

图片 171😉

XML格式讲解

FromUserName 消息发送方
 ToUserName 消息接收方
 CreateTime 消息创建时间
 MsgType 消息类型,图文消息必须填写news
 Content 消息内容,图文消息可填空
 ArticleCount 图文消息个数,限制为10条以内
 Articles 多条图文消息信息,默认第一个item为大图
  Title 图文消息标题
  Description 图文消息描述
  PicUrl 图片链接,支持JPG、PNG格式,较好的效果为大图640*320,小图80*80
  Url 点击图文消息跳转链接
FuncFlag 星标字段
ToUserName     接收方微信号
FromUserName 发送方微信号,若为普通用户,则是一个OpenID
CreateTime     消息创建时间
MsgType     消息类型,event
Event     事件类型,subscribe(订阅)、unsubscribe(取消订阅)、CLICK(自定义菜单点击事件)
EventKey 事件KEY值,与自定义菜单接口中KEY值对应

图片 172😉

 3. 音乐音信

卷土重来音乐新闻

图片 173

后台格式:

图片 174😉

<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>

图片 175😉

XML格式讲解

图片 176😉

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

图片 177😉

 

事件信息类型

时下用户在关注和注销关切,以及点击菜单的时候会活动向民众平台发送事件推送信息:

  1. 关心事件

图片 178😉

<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>

图片 179😉

  1. 裁撤关切事件

图片 180😉

<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>

图片 181😉

  1. 食谱点击事件

图片 182😉

<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>

图片 183😉

XML格式讲解

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

 

 

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

 

这一章里,大家来快捷支付天气预先报告功能、大家运用方倍工作室的对应接口来兑现。下边代码达成了这般该作用。

图片 184😉

<?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)
    {

    }
}
?>

图片 185😉

在万众账号中动用的吩咐如下:

  1. 出殡城市称号,如“蒙特利尔”,可以查询该城市的天气

在你的公众账号输入相应的吩咐,完结效益类似如下所示:

图片 186

 

 

第七章 小结

 

看来,通过本学科,你拿走了以下收获:

    1. 您通过本课程得到了一个免费的云统计空间
    1. 你成功启用了支出情势,并且达成了岁月的自动回复
  • 3.
    你足够高效地就感受了各样音信接收及发送,比方倍当年协调寻找所用的时刻短了累累
  • 4.
    您打探了微信公众平台支付的法则,并且明白了各样音讯及发送是怎么一次事
  • 5.
    你采纳方倍工作室的接口,成功的开发了您的率先个微信公众平台成效——天气预告。

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

点击图标购买:

图片 187 图片 188

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

 

付出指导[收费服务]

除此以外大家提供微信公众平台支付实战引导,内容囊括:1.
微信公众平台基础疑难解答;2.
赠与微信公众平台支付实战教程电子版,高级接口教程电子版,赠送《微信公众平台开发最佳实践》;3.微信群众平台开发技术咨询;4.
颇具标题在24时辰内获取復苏;5.迫切技术难点的电话指点;6.
提供天气、快递、点歌、翻译、人脸识别、四六级、星座、解梦、笑话、苹果产品查询等职能源码;7.
附属QQ群引导。欢迎参预。

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

 

 

关怀大家

越来越多效益、代码、教程、行业秘密,将在微信公众账号中揭破,欢迎关切,二维码见下
 个人微信账号

图片 189 
 图片 190

 

 

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

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

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

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