微信开发初探

  前期准备

  1、搭建服务器,创建应用,配置域名,

  

一、在本地建一个文件夹,名字为1,在这个文件夹下,从服务器的svn仓库把代码checkout下来,新建index.php文件,先进行校验。

<?php

    $WechatObj = new wechatCallbackapiTest($appID,$appsecret);

    if (!isset($_GET['echostr'])) {
        
        $WechatObj ->action();
    }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"];
        $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 action(){
        echo 'helloworld';
    }
}

二、申请公众号,开启开发者模式,

  进入公众平台测试账号,修改接口配置信息,URL和上面服务器的域名相同,Token与校验代码中的相同。然后下面有测试号二维码,用手机扫一扫就可以关注进行测试

接口配置信息提交时有时会提示token验证失败,首先检查填写的token与代码中的是否相同,如果填写没有错误,试着在输出echostr前加一行代码:header('content-type:text);就好了。如下图

三、以上步骤是必须的,接下来就可以看着开发文档一步步进行啦。

  1、实现公众号自动回复。用printf将xml所需的参数组装起来,返回给用户。

    其中type为event表示触发事件时回复,有两种情况即新用户关注公众号和取消关注。

//自动回复
    public function response_msg(){
        $poststr = $GLOBALS['HTTP_RAW_POST_DATA'];//接收用户信息
        $postobj = simplexml_load_string($poststr,'SimpleXMLElement',LIBXML_NOCDATA);//将xml转换为对象
        $fromusername = $postobj ->FromUserName;//消息发送方
        $tousername = $postobj ->ToUserName;//消息接收方
        $type = $postobj ->MsgType;//消息类型
        $event = $postobj ->Event;//事件
        $event_key = $postobj ->Event_Key;
        $mid = $postobj ->MediaId;//媒体消息id
        $link = $postobj ->Url;//链接消息地址
        $latitude = $postobj ->Location_X;//位置的经度
        $longitude = $postobj ->Location_Y;//纬度

        $keyword = trim($postobj ->Content);//用户发送的关键字,去除多余空格
        $time = time();//消息接收时间

        //文本模板
        $textTpl = "
            <xml>
            <ToUserName><![CDATA[%s]]></ToUserName>
            <FromUserName><![CDATA[%s]]></FromUserName>
            <CreateTime>%s</CreateTime>
            <MsgType><![CDATA[text]]></MsgType>
            <Content><![CDATA[%s]]></Content>
            </xml>";
if($type == 'text'){
            switch ($keyword) {
                case '早上好':
                    $content = '早安,又是美好的一天!';break;
                case '晚安':
                    $content = '美好的一天过去了,晚安,你和世界!';break;
                default:
                    $content = '熊孩子,你好呀!';break;
            }

        }elseif($type == 'event'){
            switch ($event) {
                case 'subscribe':
                    $content = '欢迎关注,带你进入奇妙有趣的微信公众号开发之旅';break;
                case 'unsubscribe':
                    $content = '欢迎再次关注!';break;
            }
        }else{
            switch ($type) {
                case 'image':
                    $content = 'image'.$mid;break;
                case 'voice':
                    $content = 'voice'.$mid;break;case 'video':
                    $content = 'video'.$mid;break;
                case 'location':
                    $content = $latitude.','.$longitude;break;
                case 'link':
                    $content = $link;break;
            }

        }
        $result = printf($textTpl,$fromusername,$tousername,$time,$content);
        echo $result;
    }

  2、上面公众号自动回复的全是文本消息,下面看看还有些什么类型的消息。

  • 用户可给公众号发送六种类型的消息:文本(包括表情)、语音、图片、视频、位置、链接。

  ①文本:

     <xml>
         <ToUserName><![CDATA[toUser]]></ToUserName>         //发送的目的地
         <FromUserName><![CDATA[fromUser]]></FromUserName>    //发送者
         <CreateTime>1348831860</CreateTime>                 //消息创建时间
         <MsgType><![CDATA[text]]></MsgType>                 //消息类型
         <Content><![CDATA[你好]]></Content>                 //文本内容
         <MsgId>1234567890123456</MsgId>                    //消息ID
         </xml>

  ②图片:

     <xml>
         <ToUserName><![CDATA[toUser]]></ToUserName>
         <FromUserName><![CDATA[fromUser]]></FromUserName>
         <CreateTime>1348831860</CreateTime>
         <MsgType><![CDATA[image]]></MsgType>
         <PicUrl><![CDATA[图片路径]]></PicUrl>
         <MediaId><![CDATA[media_id]]></MediaId>
         <MsgId>1234567890123456</MsgId>
         </xml>

  ③语音:

     <xml>
     <ToUserName><![CDATA[toUser]]></ToUserName>
     <FromUserName><![CDATA[fromUser]]></FromUserName>
     <CreateTime>1357290913</CreateTime>
     <MsgType><![CDATA[voice]]></MsgType>
     <MediaId><![CDATA[media_id]]></MediaId>
     <Format><![CDATA[语音格式]]></Format>
     <MsgId>1234567890123456</MsgId>
     </xml>

    开启语音识别功能的公众号,xml添加了一个元素

     <xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[fromUser]]></FromUserName>
        <CreateTime>1357290913</CreateTime>
        <MsgType><![CDATA[voice]]></MsgType>
        <MediaId><![CDATA[media_id]]></MediaId>
        <Format><![CDATA[语音格式]]></Format>
        <Recognition><![CDATA[语音识别结果]]></Recognition>
        <MsgId>1234567890123456</MsgId>
        </xml>

  ④视频:

     <xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[fromUser]]></FromUserName>
        <CreateTime>1357290913</CreateTime>
        <MsgType><![CDATA[video]]></MsgType>
        <MediaId><![CDATA[media_id]]></MediaId>
        <ThumbMediaId><![CDATA[视频消息缩略图的媒体id]]></ThumbMediaId>
        <MsgId>1234567890123456</MsgId>
        </xml>

  还有一个小视频类型,MsgType为shortvideo,其他的和上面的视频都一样。

     <xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[fromUser]]></FromUserName>
        <CreateTime>1357290913</CreateTime>
        <MsgType><![CDATA[shortvideo]]></MsgType>
        <MediaId><![CDATA[media_id]]></MediaId>
        <ThumbMediaId><![CDATA[视频消息缩略图的媒体id]]></ThumbMediaId>
        <MsgId>1234567890123456</MsgId>
        </xml>

  ⑤地理位置:

     <xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[fromUser]]></FromUserName>
        <CreateTime>1351776360</CreateTime>
        <MsgType><![CDATA[location]]></MsgType>
        <Location_X>纬度</Location_X>
        <Location_Y>经度</Location_Y>
        <Scale>20</Scale>
        <Label><![CDATA[位置信息]]></Label>
        <MsgId>1234567890123456</MsgId>
        </xml>

  ⑥链接:

     <xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[fromUser]]></FromUserName>
        <CreateTime>1351776360</CreateTime>
        <MsgType><![CDATA[link]]></MsgType>
        <Title><![CDATA[消息标题]]></Title>
        <Description><![CDATA[消息描述]]></Description>
        <Url><![CDATA[消息链接]]></Url>
        <MsgId>1234567890123456</MsgId>
        </xml>
  • 公众号给用户回复的消息类型有:文本、图片、语音、视频、音乐、图文。前四种模板和上面都是一样的,就是少最后的MsgId,这个id是发送消息后才生成的,因此公众号给用户发送消息时还没有id。

  ①文本:

     <xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[fromUser]]></FromUserName>
        <CreateTime>12345678</CreateTime>
        <MsgType><![CDATA[text]]></MsgType>
        <Content><![CDATA[你好]]></Content>
        </xml>

  ②图片:

     <xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[fromUser]]></FromUserName>
        <CreateTime>12345678</CreateTime>
        <MsgType><![CDATA[image]]></MsgType>
        <Image>
        <MediaId><![CDATA[media_id]]></MediaId>   //通过素材管理中的接口上传多媒体文件,得到的id。
        </Image>
        </xml>

  ③语音:

     <xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[fromUser]]></FromUserName>
        <CreateTime>12345678</CreateTime>
        <MsgType><![CDATA[voice]]></MsgType>
        <Voice>
        <MediaId><![CDATA[media_id]]></MediaId>
        </Voice>
        </xml>

  ④视频:

     <xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[fromUser]]></FromUserName>
        <CreateTime>12345678</CreateTime>
        <MsgType><![CDATA[video]]></MsgType>
        <Video>
        <MediaId><![CDATA[media_id]]></MediaId>
        <Title><![CDATA[视频消息标题]]></Title>
        <Description><![CDATA[视频消息描述]]></Description>
        </Video> 
        </xml>

  ⑤音乐:

     <xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[fromUser]]></FromUserName>
        <CreateTime>12345678</CreateTime>
        <MsgType><![CDATA[music]]></MsgType>
        <Music>
        <Title><![CDATA[音乐标题]]></Title>
        <Description><![CDATA[音乐描述]]></Description>
        <MusicUrl><![CDATA[音乐链接]]></MusicUrl>
        <HQMusicUrl><![CDATA[高质量音乐链接]]></HQMusicUrl>
        <ThumbMediaId><![CDATA[缩略图的媒体id]]></ThumbMediaId>
        </Music>
        </xml>

  ⑥图文:

     <xml>
        <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[fromUser]]></FromUserName>
        <CreateTime>12345678</CreateTime>
        <MsgType><![CDATA[news]]></MsgType>
        <ArticleCount>2</ArticleCount>                            //图文消息个数,限制为10条以内
        <Articles>
        <item>
        <Title><![CDATA[图文消息标题]]></Title> 
        <Description><![CDATA[图文消息描述]]></Description>
        <PicUrl><![CDATA[图片链接]]></PicUrl>
        <Url><![CDATA[点击图文消息跳转链接]]></Url>
        </item>
        <item>
        <Title><![CDATA[title]]></Title>
        <Description><![CDATA[description]]></Description>
        <PicUrl><![CDATA[picurl]]></PicUrl>
        <Url><![CDATA[url]]></Url>
        </item>
        </Articles>
        </xml>

四、微信JSSDK开发。需要获取access_token。

  在测试号管理里面设置JS接口安全域名。域名与上面服务器域名相同。

  

  公众号创建自定义菜单,http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN

  1、获取access_token。在测试号信息里面找到appID和appsecret。 

    http请求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

//获取access_token
    function getAccessToken(){ 
        $appid = "wx16f3xxxxxxxxxdcd";
        $appsecret = "9a8094xxxxxxxxxxxxxxxxdfc79eae";
        $url_get = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appsecret";
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url_get);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $json = curl_exec($ch);
        curl_close($ch);
        $output = json_decode($json,true);
        $access_token = $output['access_token'];
    }

  2、创建菜单,示例如下:

//自定义菜单 post方式
    public function menu($access_token){
        $url = " https://api.weixin.qq.com/cgi-bin/menu/create?access_token=$access_token";
        $menu = '  {
             "button":[
             {    
                  "type":"click",
                  "name":"今日主题",
                  "key":"V1001_TODAY_MUSIC"
              },
              {
                   "name":"菜单",
                   "sub_button":[
                   {    
                       "type":"view",
                       "name":"搜索",
                       "url":"http://www.soso.com/"
                    },
                    {
                       "type":"view",
                       "name":"视频",
                       "url":"http://v.qq.com/"
                    },
                    {
                       "type":"click",
                       "name":"赞一下我们",
                       "key":"V1001_GOOD"
                    }]
               }]
         }';

         $ch = curl_init();
         curl_setopt($ch, CURLOPT_URL, $url);
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
         curl_setopt($ch, CURLOPT_POST, 1);
         curl_setopt($ch, CURLOPT_POSTFIELDS, $menu);
         $output = curl_exec($ch);
         curl_close($ch);
         $output = json_decode($output,true);
         var_dump($output);
    }

  扫码关注测试号后显示如下:截图是电脑端微信

  

五、PHP CURL

  PHP支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。

  PHP中使用cURL实现Get和Post请求的方法,网上有好多demo,这里就不举例了。

   1、Get方式(如获取access_token)

  2、Post方式(如创建自定义菜单)

  

posted @ 2016-12-13 18:13  菜乌  阅读(507)  评论(0编辑  收藏  举报