• 微信开发初探


      前期准备

      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方式(如创建自定义菜单)

      

  • 相关阅读:
    base64编码
    URL编码和解码
    Android MineType
    Gzip压缩
    关于文件与文件系统的压缩与打包命令-Linux(笔记)
    tesseract的编译安装
    HDOJ How many ways?? 2157【矩阵高速幂】
    [ACM] POJ 3253 Fence Repair (Huffman树思想,优先队列)
    6.非关系型数据库(Nosql)之mongodb:集群(主从复制)
    androidproject有红色叹号的解决方式
  • 原文地址:https://www.cnblogs.com/rendd/p/6170983.html
Copyright © 2020-2023  润新知