欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

微信公众平台使用说明

程序员文章站 2022-06-02 23:29:13
微信公众平台使用说明 微信公众平台是通过公众号为用户提供服务的平台 用户OpenID :每关注一个公众号就会生成一个OpenID 用户UnionID: 多个公众号可以绑到一个开放平台账号下(同主体),每个用户对同一个开放平台下的多个公众号都只有一个UnionID 微信公众平台是为公众号进行服务的, ......

微信公众平台使用说明

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

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

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

 

 

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

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

 

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

消息会话:

    群发消息

    被动回复消息:要加密

    客服消息

    模板消息

网页:

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

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

 

接口使用说明:

 

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

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

 

 

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

前期准备:

一个公众号:

 

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

开发者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";


            }
}

验证代码可以自行百度:

如果提交成功,这个服务器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"]=>""
     * ];*/
}