微信公众平台--提升篇

课程大纲

  • 详解微信界面交互接口和订阅事件推送
  • access_token的作用和使用方法
  • 通过“天气查询”实例来熟悉基础接口的使用

事件推送

定义:微信公众平台推送消息到第三方服务器

开发环境搭建

关注事件推送:

<?php
/*
 * 接受事件推送并回复
 * 文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140454
 * 关注
 */
//1.获取到微信推送过来的post过来的数据(XML格式)
/*
<xml>
<ToUserName>< ![CDATA[toUser] ]></ToUserName>
<FromUserName>< ![CDATA[FromUser] ]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType>< ![CDATA[event] ]></MsgType>
<Event>< ![CDATA[subscribe] ]></Event>
</xml>
*/
$postArr = file_get_contents('php://input');
//2.处理消息类型,并设置回复类型和内容
$postObj = simplexml_load_string($postArr,'SimpleXMLElement', LIBXML_NOCDATA);
//3/判断该数据报是否是订阅的事件推送
if(strtolower($postObj->MsgType) == 'event') {//订阅/取消订阅事件
    //关注
    if(strtolower($postObj->Event) == 'subscribe'){
        //回复用户消息,文本回复,文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543,还有其他回复消息方式,自行测试
        $toUser = $postObj->FromUserName;
        $fromUser = $postObj->ToUserName;
        $time = time();
        $MsgType = 'text';
        $Content = 'Welcome To Jason World';
        /*
        <xml>
        <ToUserName>< ![CDATA[toUser] ]></ToUserName>
        <FromUserName>< ![CDATA[fromUser] ]></FromUserName>
         <CreateTime>12345678</CreateTime>
         <MsgType>< ![CDATA[text] ]></MsgType>
        <Content>< ![CDATA[你好] ]></Content>
         </xml>
        */
        //组装XML字符串给微信
        $template = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[%s]]></MsgType><Content><![CDATA[%s]]></Content></xml>";
        $info = sprintf($template,$toUser,$fromUser,$time,$MsgType,$Content);
        echo $info;
    }
}

消息回复的类型

  • 纯文本
  • 单图文
  • 多图文

实例

纯文本:

<?php
//文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543,还有其他回复消息方式,自行测试
$postArr = file_get_contents('php://input');
$postObj = simplexml_load_string($postArr,'SimpleXMLElement', LIBXML_NOCDATA);
if(strtolower($postObj->MsgType) == 'text') {//用户输入的文字信息
    /**
     * 文本消息
     */
    switch ($postObj->Content){//用户输入的关键字
        case "T1":
            $Content = "我是文本1";break;
        case "T2":
            $Content = "我是文本2";break;
        case "T3":
            $Content = "<a href='www.baidu.com'>百度</a>";break;
        default:
            $Content = "其他文本消息";
    }
    $ToUserName = $postObj->FromUserName;
    $FromUserName = $postObj->ToUserName;
    $CreateTime = time();
    $MsgType = 'text';
    //文本消息
    $template = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[%s]]></MsgType><Content><![CDATA[%s]]></Content></xml>";
    $info = sprintf($template,$ToUserName,$FromUserName,$CreateTime,$MsgType,$Content);
    echo $info;
}

单图文或者多图文:

<?php
//文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543,参考:回复图文消息
$postArr = file_get_contents('php://input');
$postObj = simplexml_load_string($postArr,'SimpleXMLElement', LIBXML_NOCDATA);
if(strtolower($postObj->MsgType) == 'text') {//用户输入的文字信息
    /**
     * 单图文消息或者多图文
     * PS:图片链接,支持JPG、PNG格式,较好的效果为大图360*200,小图200*200
     * PS:单图文才会显示图片的“描述”信息,多图文不显示
     * PS:多图文发送时,子图文不能超过8个
     */
    if(trim($postObj->Content) == "tuwen1") {
        file_put_contents("2.log",$postObj->ToUserName);
        $ToUserName   = $postObj->FromUserName;
        $FromUserName = $postObj->ToUserName;
        $CreateTime   = time();
        $MsgType      = 'news';
        //图文消息
        $arr = [
            [
                'Title' => '标题1',
                'Description' => '描述1',
                'PicUrl' => 'http://bull.smallzhou.cn/wx_1.jpg',
                'Url' => 'www.baidu.com'
            ],
            [
                'Title' => '标题2',
                'Description' => '描述2',
                'PicUrl' => 'http://bull.smallzhou.cn/wx_2.jpg',
                'Url' => 'www.sina.cn'
            ],
            [
                'Title' => '标题3',
                'Description' => '描述3',
                'PicUrl' => 'http://bull.smallzhou.cn/wx_3.jpg',
                'Url' => 'www.sucaihuo.com'
            ]
        ];
        $template = "<xml>
                <ToUserName><![CDATA[%s]]></ToUserName>
                <FromUserName><![CDATA[%s]]></FromUserName>
                <CreateTime>%s</CreateTime>
                <MsgType><![CDATA[%s]]></MsgType>
                <ArticleCount>".count($arr)."</ArticleCount>
                <Articles>";
        foreach ($arr as $v){
            $template .= "<item>
                          <Title><![CDATA[".$v['Title']."]]></Title>
                          <Description><![CDATA[".$v['Description']."]]></Description>
                          <PicUrl><![CDATA[".$v['PicUrl']."]]></PicUrl>
                          <Url><![CDATA[".$v['Url']."]]></Url>
                          </item>";
        }

        $template .= "</Articles></xml>";
        $info = sprintf($template,$ToUserName,$FromUserName,$CreateTime,$MsgType);
        file_put_contents("1.log",$info);
        echo $info;
    }
}

access_token与appid,appsecret的关系

①appid + appsecret 获取access_token
②access_token唯一有效性,时间为2小时,获取新access_token原access_token几秒内将失效

全局有效性

流程:通过appid和appsecret获取access_token保存数据库,调用接口时带上access_token,失效时,重新用appid和appsecret获取access_token并保存于数据库

微信开放接口

  • access_token
  • 微信服务器地址

获取access_token:

<?php
/**
 * 获取access_token
 * https请求方式: GET
 * https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
 * 文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
 * PS:需要去微信平台设置Ip白名单
 */
//1.初始化
$ch = curl_init();
//2.设置参数
$appId = "wx0016e74682eb2c09";
$appSecret = "07e766de4bd26503b8f8c1a4db07a17d";
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appId."&secret=".$appSecret;
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
//3.执行
$outPut = curl_exec($ch);
//4.关闭
curl_close($ch);
if(curl_errno($ch)){
    var_dump(curl_errno($ch));
}
var_dump(json_decode($outPut,true));

获取微信服务器IP地址:

<?php
/**
 * 获取微信服务器IP地址
 * 文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140187
 * http请求方式: GET
 * https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=ACCESS_TOKEN
 * 作用:安全监测,监测是否请求来至于微信
 */
//1.初始化
$ch = curl_init();
//2.设置参数
$access_token = "11_gUbWrkeL6Mq68V6fsCzbZWmxkvRRpn-lzvcuEcdQSLTJNRiM1tyiYsQu3lrwmZWCpaBq7whYbrl7YgJmiw0LAz0ENq2dp2VI0QsOQnLz52nRvbrT3K6oBfhZZzkhORte5cMDGV-KCFStiIDGUIIhAAAGUU";
$url = "https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=" . $access_token;
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
//3.执行
$outPut = curl_exec($ch);
//4.关闭
curl_close($ch);
if(curl_errno($ch)){
    var_dump(curl_errno($ch));
}
print_r(json_decode($outPut,true));

阿里云接口地址

https://market.aliyun.com/data?accounttraceid=c83f9881-4bab-4091-8098-c749bd365653

第三方API在微信中的实现

天气查询:

<?php
$postArr = file_get_contents('php://input');
$postObj = simplexml_load_string($postArr,'SimpleXMLElement', LIBXML_NOCDATA);
if(strtolower($postObj->MsgType) == 'text') {//用户输入的文字信息
    $host = "https://ali-weather.showapi.com";
    $path = "/day15";
    $method = "GET";
    $appcode = "bbc29e80425e4b1ea2581339a53e8116";//你自己的AppCode
    $headers = array();
    array_push($headers, "Authorization:APPCODE " . $appcode);
    $area = urlencode($postObj->Content);
    $querys = "area=".$area."&areaid=";
    $url = $host . $path . "?" . $querys;

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($curl, CURLOPT_FAILONERROR, false);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    //curl_setopt($curl, CURLOPT_HEADER, true);
    if (1 == strpos("$".$host, "https://"))
    {
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    }
    $data = json_decode(curl_exec($curl),true);
    $fiftheenWeatherDayArr = $data['showapi_res_body']['dayList'];

    $Content = "天气预报:\n".
        "地区:".$fiftheenWeatherDayArr[0]['area']."\n".
        "预报日期:".$fiftheenWeatherDayArr[0]['daytime']."\n".
        "白天天气:".$fiftheenWeatherDayArr[0]['day_weather']."\n".
        "白天最高温度:".$fiftheenWeatherDayArr[0]['day_air_temperature']."\n".
        "白天风力:".$fiftheenWeatherDayArr[0]['day_wind_power']."\n".
        "白天风向:".$fiftheenWeatherDayArr[0]['day_wind_direction']."\n".
        "晚上天气:".$fiftheenWeatherDayArr[0]['night_weather']."\n".
        "晚上最低温度:".$fiftheenWeatherDayArr[0]['night_air_temperature']."\n".
        "晚上风力:".$fiftheenWeatherDayArr[0]['night_wind_power']."\n".
        "晚上风向:".$fiftheenWeatherDayArr[0]['night_wind_direction']."\n";

    $ToUserName = $postObj->FromUserName;
    $FromUserName = $postObj->ToUserName;
    $CreateTime = time();
    $MsgType = 'text';
    //文本消息
    $template = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[%s]]></MsgType><Content><![CDATA[%s]]></Content></xml>";
    $info = sprintf($template,$ToUserName,$FromUserName,$CreateTime,$MsgType,$Content);
    echo $info;
}

猜你喜欢

转载自blog.csdn.net/qq_29627497/article/details/81098425