zoukankan      html  css  js  c++  java
  • 微信开发初探

      前期准备

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

      

  • 相关阅读:
    169. Majority Element
    283. Move Zeroes
    1331. Rank Transform of an Array
    566. Reshape the Matrix
    985. Sum of Even Numbers After Queries
    1185. Day of the Week
    867. Transpose Matrix
    1217. Play with Chips
    766. Toeplitz Matrix
    1413. Minimum Value to Get Positive Step by Step Sum
  • 原文地址:https://www.cnblogs.com/rendd/p/6170983.html
Copyright © 2011-2022 走看看