zoukankan      html  css  js  c++  java
  • 微信公众平台使用说明

    微信公众平台使用说明

    微信公众平台是通过公众号为用户提供服务的平台

    用户OpenID :每关注一个公众号就会生成一个OpenID

    用户UnionID: 多个公众号可以绑到一个开放平台账号下(同主体),每个用户对同一个开放平台下的多个公众号都只有一个UnionID

    微信公众平台是为公众号进行服务的,

    微信公众平台调用每个接口都是基于 access_token的,有效期2个小时,每天次数有限

    公众号主要通过 消息会话 网页 来为用户提供服务的

    消息会话:

        群发消息

        被动回复消息:要加密

        客服消息

        模板消息

    网页:

        网页授权获取用户基本信息

        微信JS-SDK: 可以在网页上录制和播放语音、上传照片和拍照等

    接口使用说明:

    第三方平台代公众号调用接口:

    授权成功后,可以使用authorizer_access_token作为凭证,调用方式和公众号使用自身API的方式一样(只是需将调用API时提供的公众号自身access_token参数,替换为authorizer_access_token)

    目的:给你一个公众号,能自定义菜单,能收发消息

    前期准备:

    一个公众号:https://mp.weixin.qq.com

    微信公众平台 -> 开发->基本配置 ->公众号开发信息 :

    开发者appid  

    开发者appsecret

    IP白名单

    如果没有将公众号授权给第三方平台的话,就要开启->服务器配置:

               服务器地址URL:这个地址是收发微信服务器消息的

               令牌Token:这个自定义,要与代码验证中的一致

               消息加解密EncodingAESKey: 这个也是自定义

    令牌Token的检测代码:

    当你写好代码后,配置好服务器后点击提交的时候,微信服务器会向公众号的服务器url发送可以用$_GET 接收的参数,其中有一项是:$_GET['echostr'],验证代码如下:

    if(isset($_GET['echostr'])){
        // 这里要先进行公众平台的服务器配置
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
        $token = "zhaizhishe";
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr);
        $tmpStr = implode( $tmpArr );
        $tmpStr = sha1( $tmpStr );

        if( $tmpStr == $signature ){

    header('content-type:text');
    ob_clean();
            echo  $_GET['echostr'];
        }else{

    echo "fail";


                }
    }

    验证代码可以自行百度:https://blog.csdn.net/fkedwgwy/article/details/80356660

    如果提交成功,这个服务器url就可以收发信息了

    微信token验证失败原因及解决方案 :

    https://blog.csdn.net/sinat_22878395/article/details/69258165

    如果粉丝给公众号发消息,

    实际上是 粉丝-->微信服务器-(消息体是xml形式)-->公众号服务器

    所以微信服务器给公众号发来xml形式的消息体,公众号就要进行处理

    类似这样的:

    <xml><ToUserName><![CDATA[gh_612e2d3e001d]]></ToUserName>
    <FromUserName><![CDATA[oqz7p0RcdvSUwUl95JWosYKhEQj8]]></FromUserName>
    <CreateTime>1534125513</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[52]]></Content>
    <MsgId>6589018907673136305</MsgId>
    </xml>

    这个xml字符串 直接用 file_get_contents("php://input") 来接收;

    消息类型有:文本 、图片、语音、视频、小视频、地理位置、链接、事件

    每个消息类型的xml格式都有所区别,但是都有一个MsgType,具体类型可以通过该字段来判断;事件可以通过MsgType = event来判断,具体什么事件可以通过Event来判断,有些还得通过EventKey进一步判断

    回复消息的时候,也要根据消息类型的模板来,如果公众号想给粉丝回复图片消息,就需用到图片类型的xml格式;

    这里的$postStr就是file_get_contents("php://input")赋值的

    if (!empty($postStr)){
        $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
        switch($postObj->MsgType){
            case "event":
                $this->_doEvent($postObj);
                break;
            case "text":
                $this->_doText($postObj);
                break;
            case "image":
                $this->_doImage($postObj);
                break;
            case "voice":
                $this->_doVoice($postObj);
                break;
            case "video":
                $this->_doVideo($postObj);
                break;
            case "shortvideo":
                $this->_doShortvideo($postObj);
                break;
            case "location":
                $this->_doLocation($postObj);
                break;
            case "link":
                $this->_doLink($postObj);
                break;
            default:
                $this->_doText($postObj);
                break;

        }
    }

    附上模板:

     $template = [
        'text' => "<xml>
            <ToUserName><![CDATA[%s]]></ToUserName>
            <FromUserName><![CDATA[%s]]></FromUserName>
            <CreateTime>%s</CreateTime>
            <MsgType><![CDATA[%s]]></MsgType>
            <Content><![CDATA[%s]]></Content>
            </xml>",
        'image' =>"<xml>
            <ToUserName><![CDATA[%s]]></ToUserName>
            <FromUserName><![CDATA[%s]]></FromUserName>
            <CreateTime>%s</CreateTime>
            <MsgType><![CDATA[%s]]></MsgType>
            <Image><MediaId><![CDATA[%s]]></MediaId></Image></xml>",
        'article'=>'<xml>
            <ToUserName><![CDATA[%s]]></ToUserName>
            <FromUserName><![CDATA[%s]]></FromUserName>
            <CreateTime>%s</CreateTime>
            <MsgType><![CDATA[news]]></MsgType>
            <ArticleCount>%s</ArticleCount>
            <Articles>%s</Articles>
            </xml>',
        'article_blade'=>' <item>
            <Title><![CDATA[%s]]></Title>
            <Description><![CDATA[%s]]></Description>
            <PicUrl><![CDATA[%s]]></PicUrl>
            <Url><![CDATA[%s]]></Url>
            </item>'
    ];

    这里是处理事件的方法:

    public function _doEvent($postObj){
        if ($postObj->Event == 'subscribe') { // 关注事件
            $contentStr = "我知道你会来的,你到底还是来了";
            $resultStr = sprintf($this->template['text'], $postObj->FromUserName, $postObj->ToUserName,time(), "text", $contentStr);
            echo $resultStr;

        } elseif ($postObj->Event == 'CLICK') {//菜单点击事件
            if($postObj->EventKey == "about_us"){
                $picUrl1 ="http://mmbiz.qpic.cn/mmbiz_jpg/90z7NBNDibEtcicTNDMuMtTk3JA78jHZdoM47F91c5m9zfNic2U3U4hrP6TcZ4GTG0EWV3bKsiaLRuhRE50VwfgH7g/0?wx_fmt=jpeg";//这是引用的图片地址
                $picUrl2='http://mmbiz.qpic.cn/mmbiz_png/90z7NBNDibEtcicTNDMuMtTk3JA78jHZdoUbWcIllAibib4RibCnpicoKzbE2WqNVLN0XDQp7uQiajSK7oEmuRNibBGLfQ/0?wx_fmt=png';
                $picUrl3='http://mmbiz.qpic.cn/mmbiz_jpg/90z7NBNDibEtcicTNDMuMtTk3JA78jHZdo3mf2MfibyXzbCnVibI95J7FtiaRPSlyvkxMzddWNibh7XfQBzWzDHSZIlQ/0?wx_fmt=jpeg';
                $url="http://www.guigu.org/wap.php?action=article&id=120111";
                $url2 = "http://www.zhaizhishe.com/";
                $url3 ="https://www.zhipin.com/gongsi/119e4beb5ff768881nx509W6EQ~~.html";
                $item_list = array(
                    array('title'=>'益帮手','desc'=>'点击图片查看','picurl'=>$picUrl1,'url'=>$url),
                    array('title'=>'宅职社','desc'=>'这里有你需要的','picurl'=>$picUrl2,'url'=>$url2),
                    array('title'=>'加入我们吧,有你更精彩喔','desc'=>'技术宅','picurl'=>$picUrl3,'url'=>$url3),
                );

                //拼凑文章部分
                $item_str = '';
                foreach ($item_list as $item) {
                    $item_str .= sprintf($this->template['article_blade'],$item['title'],$item['desc'],$item['picurl'],$item['url']);
                }
                //拼凑主体部分
                $response = sprintf($this->template['article'], $postObj->FromUserName,$postObj->ToUserName, time(), count($item_list), $item_str);
                echo $response;
            }
            if($postObj->EventKey == "public_account"){

                $resultStr = sprintf($this->template['image'], $postObj->FromUserName, $postObj->ToUserName,time(), "image","eEs3ScKeaId4eLAkfLaKWWbfbypcdL6oAB3DLfl3cQg");
                echo $resultStr;

            }
        } elseif ($postObj->Event == 'VIEW') {//连接跳转事件
            $contentStr = "你做了跳转操作";
            $resultStr = sprintf($this->template['text'], $postObj->FromUserName, $postObj->ToUserName,time(), "text", $contentStr);
            echo $resultStr;
        }
    }

     

    上面Event == “CLICK”或者 “VIEW”是基于 自定义菜单事件的

    其中view是点击菜单跳转链接的,view对应的一定是url

    然后click是点击菜单拉取消息的,click对应的是一定是自定的eventKey值

    附上自定义菜单方法:

     public function createMenu(){

           // 这里要特别注意:
           // view 对应的是url
           // click 对应的是 key
           $data ='{
        "button":[

      {
                  "type":"view",
                  "name":"官网",
                  "url":"http://www.zhaizhishe.com/"
         },

         {
              "name":"宅职社",
              "sub_button":[
               {
                  "type":"click",
                  "name":"公众号",
                  "key":"public_account"
               },
               {
                  "type":"click",
                  "name":"关于我",
                  "key":"about_us"

               },
               {
                  "type":"view",
                  "name":"加入我",
                  "url":"https://www.zhipin.com/gongsi/119e4beb5ff768881nx509W6EQ~~.html"
               }]
          },

        {
              "name":"益帮手",
              "sub_button":[
               {
                  "type":"click",
                  "name":"小程序",
                  "key":"mini"
               },
               {
                  "type":"view",
                  "name":"智慧水站",
                  "url":"http://www.guigu.org/wap.php?action=article&id=120111"
               }
              ]
           }
       ]
    }';


           $url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$this->access_token;
           $content_send_code = request_curl($url,$https=false,$method='post',$data,$json=true);
           $content_send_code = json_decode($content_send_code,True);
           var_dump($content_send_code);
           return $content_send_code;
           /*
            * array(2) {
                     ["errcode"]=>
                     int(0)
                     ["errmsg"]=>
                     string(2) "ok"
                   }

            * */

       }

    如果要给粉丝回复图片消息的时候,前提是素材库里面要先有图片

    首先要先新增其他类型的永久素材,返回media_id url

    然后新增永久素材,这里的post参数有一个thumb_media_id必须等于上一个方法返回的merdia_id

    /**
     * 新增永久素材
     * @return mixed
     */
    public function createMaterial(){
        $file = "F:\hxx\pic\04.jpg";
        $thumb_media_id = $this->uplodeForever($file);
        $data = '
                    {
                            "articles": [{
                            "title": "my_img_01",
                            "thumb_media_id":"'.$thumb_media_id['media_id'].'",
                            "author": "xiaoxian",
                            "digest": "",
                            "show_cover_pic": 1,
                            "content": "this is my content",
                            "content_source_url":"http://www.zhaizhishe.com"
                            },]
                    }
                ';

        $url = "https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=".$this->access_token;
        $content_send_code = request_curl($url,$https=true,$method='post',$data,$json=true);
        $content_send_code = json_decode($content_send_code,True);
        var_dump($content_send_code);
        return $content_send_code;


    }

    /**
     * 新增其他类型永久素材,返回media_id和 url
     * @param $file
     * @return mixed
     */
    public function uplodeForever($file){
        $url='https://api.weixin.qq.com/cgi-bin/material/add_material?access_token='.$this->access_token.'&type=image';
        $data = array(
            'media' => new CURLFile($file),
        );
        // 这个方法里的 $josn= false,因为没有用Json格式的数据, $https = true;
        $content = request_curl($url,$https=true,$method='post',$data,$json=false);
        $content = json_decode($content,True); //转数组
        if(!empty($content['errcode'])){
            die("media_id获取失败,错误编码:".$content['errcode']."错误信息:".$content['errmsg']);
        }
       var_dump($content);
        return $content;
        /*
         * $content = [
         *
         *          ["media_id"]=>"Zsy4YtKwjDza2KjxV9sk5OcMrictB0DxUcot8koydcfWpH8MMesC3W2W8QHCM6Jx"
         *           ["url"]=>""
         * ];*/
    }

  • 相关阅读:
    python json模块 pickli模块
    python sys模块
    python os模块
    python random模块使用
    react项目搭建
    PHP开发环境及搭建
    Vue2之页面 、js 、css分离
    Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.
    Uncaught Error: Bootstrap's JavaScript requires jQuery
    Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your own promise library instead: http://mongoosejs.com/docs/promises.html
  • 原文地址:https://www.cnblogs.com/muyanshu/p/9708434.html
Copyright © 2011-2022 走看看