微信公众号的程序接入 - PHP 版本源代码

简介: 微信公众号的程序接入 - PHP 版本源代码


  1. Create a PHP project by referring to the following source code:
<?php
use sinacloud\sae\Storage as Storage; //upload mp3 to sina cloud
// define your token
define ( "TOKEN", "jerry" );
define ("BAIDU_TOKEN","24.229b04dcbe1338b22051faf6d8f5c3ef.2592000.1459386754.282335-7707083");
$wechatObj = new Weichat_base_api ();
if (isset ( $_GET ['echostr'] )) {
  $wechatObj->valid (); // 验证URL有效性,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。
} else {
  $wechatObj->responseMsg ();
}
class Weichat_base_api {
  public function valid() {
    $echoStr = $_GET ["echostr"];
    if ($this->checkSignature ()) {
      echo $echoStr;
      exit ();
    }
  }
  private function checkSignature() // 配置时验证URL有效性
  {
    // you must define TOKEN by yourself
    if (! defined ( "TOKEN" )) {
      throw new Exception ( 'TOKEN is not defined!' );
    }
    
    $signature = $_GET ["signature"]; // 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
    $timestamp = $_GET ["timestamp"]; // 时间戳
    $nonce = $_GET ["nonce"]; // 随机数
    
    $token = TOKEN;
    $tmpArr = array (
        $token,
        $timestamp,
        $nonce 
    );
    // use SORT_STRING rule
    sort ( $tmpArr, SORT_STRING );
    $tmpStr = implode ( $tmpArr );
    $tmpStr = sha1 ( $tmpStr );
    
    if ($tmpStr == $signature) {
      return true;
    } else {
      return false;
    }
  }
  
  public function responseMsg() {
    $postStr = $GLOBALS ["HTTP_RAW_POST_DATA"];
    
    if (! empty ( $postStr )) {
      $postObj = simplexml_load_string ( $postStr, 'SimpleXMLElement', LIBXML_NOCDATA );
      $fromUsername = $postObj->FromUserName;
      $toUsername = $postObj->ToUserName;
      $time = time ();
      switch ($postObj->MsgType) {
        case "text" :
          echo $this->receiveText($postObj);
          break;
        case "image" :
          echo $this->receiveImg($postObj);
          break;
        case "voice" :
          echo $this->receiveVoice($postObj);
          break;
        case "shortvideo" :
          $newsArr = array(
            array(
              "Title"=>"周哥测试1",
              "Description"=>"这是周哥测试的描述信息",
              "PicUrl"=>"https://ss0.baidu.com/6ONWsjip0QIZ8tyhnq/it/u=2026430319,4041659&fm=80",
              "Url"=>"http://news.163.com/16/0113/08/BD6RQDT500011229.html",
            ),
            array(
              "Title"=>"周哥测试2",
              "Description"=>"这是周哥测试的描述信息 II",
              "PicUrl"=>"https://ss0.baidu.com/6ONWsjip0QIZ8tyhnq/it/u=3624483189,4086732657&fm=80",
              "Url"=>"http://cnews.chinadaily.com.cn/2016-01/13/content_23061286.htm",
            ),
          );
          echo $this->replyNews($postObj,$newsArr);
          break;
        case "video" :
          echo $this->receiveVideo($postObj);
          break;
        case "location" :
          echo $this->receiveLocation($postObj);
          break;
        case "link" :
          echo $this->receiveLink($postObj);
          break;
        case "event":
          $this->receiveEvent($postObj);
          break;
      }
       
    } else {
      echo "";
      exit ();
    }
  }
  private function receiveText($obj)
  {
    $content = $obj->Content;
    return $this->tuling_api($obj,$content);
  }
  
  private function receiveImg($obj)
  {
    //获取图片消息的内容
    $imageArr = array(
        "PicUrl"=>$obj->PicUrl,
        "MediaId"=>$obj->MediaId
        );
    return $this->replyimg($obj, $imageArr);
  }
  private function receiveLocation($obj){
    $locationArr = array(
        "Location_X"=>$obj->Location_X,
        "Location_Y"=>$obj->Location_Y,
        "Label"=>$obj->Label
    );
    return $this->replyLocation($obj, $locationArr);
  }
  
  private function receiveVoice($obj){
    if(isset($obj->Recognition))
    {
      $voice_content = $obj->Recognition;
      return $this->tuling_api($obj,$voice_content,"voice");
    }
    else
    {
      $voiceArr = array(
          "MediaId"=>$obj->MediaId,
          "Format"=>$obj->Format
      );
      return $this->replyVoice($obj, $voiceArr);
    }
  }
  private function receiveVideo($obj){
    $videoArr = array(
        "MediaId"=>$obj->MediaId,
        "ThumbMediaId"=>$obj->ThumbMediaId,
        "MsgId"=>$obj->MsgId
    );
    return $this->replyVideo($obj, $videoArr);
  }
  private function receiveLink($obj){
    $linkArr = array(
        "Title"=>$obj->Title,
        "Description"=>$obj->Description,
        "Url"=>$obj->Url
    );
    return $this->replyLink($obj, $linkArr);
  }
  
  private function receiveEvent($obj){
    switch ($obj->Event){
      case "subscribe":
        if(!empty($obj->EventKey)){
          //通过扫描带参数的二维码进行关注的逻辑
    
        }
        echo $this->replyText($obj,"你好,欢迎你关注我们的微信公众号码,给我们发送语音,调戏一下客服机器人吧,您可以说【成都天气】或者【明天从北京飞上海的航班】等!");
        break;
      case "unsubscribe":
        //write to data base about the unsubscribe
        break;
      case "SCAN":
        //已关注的情况下扫描带参数的二给码的逻辑
        break;
      case "LOCATION":
        break;
      case "CLICK":
        switch ($obj->EventKey){
          case "V1001_TODAY_MUSIC":
            echo $this->replyText($obj, "您点击的是[关于我们]");
            break;
          default:
            echo $this->replyText($obj, "谢谢您 的打赏!");
            break;
        }
        break;
    }
  }
  
  private function replyText($obj, $content)
  {
    $textTpl = "<xml>
                        <ToUserName><![CDATA[%s]]></ToUserName>
                        <FromUserName><![CDATA[%s]]></FromUserName>
                        <CreateTime>%s</CreateTime>
                        <MsgType><![CDATA[text]]></MsgType>
                        <Content><![CDATA[%s]]></Content>
                        <FuncFlag>0</FuncFlag>
                        </xml>";
    
    $resultStr = sprintf ( $textTpl, $obj->FromUserName, $obj->ToUserName, time(), $content );
    return $resultStr;
  }
  
  private function replyImg($obj, $imageArr){
    $replyXml = "<xml>
            <ToUserName><![CDATA[%s]]></ToUserName>
            <FromUserName><![CDATA[%s]]></FromUserName>
            <CreateTime>%s</CreateTime>
            <MsgType><![CDATA[image]]></MsgType>
            <Image>
            <MediaId><![CDATA[%s]]></MediaId>
            </Image>
          </xml>";
    return sprintf ( $replyXml, $obj->FromUserName, $obj->ToUserName, time(), $imageArr['MediaId'] );
  }
  private function replyLocation($obj, $locationArr){
    return $this->replyText($obj, $locationArr['Label']);
  }
  private function replyVoice($obj, $voiceArr){
    $replyXml = "<xml>
          <ToUserName><![CDATA[%s]]></ToUserName>
          <FromUserName><![CDATA[%s]]></FromUserName>
          <CreateTime>%s</CreateTime>
          <MsgType><![CDATA[voice]]></MsgType>
          <Voice>
          <MediaId><![CDATA[%s]]></MediaId>
          </Voice>
          </xml>";
    return sprintf ( $replyXml, $obj->FromUserName, $obj->ToUserName, time(), $voiceArr['MediaId'] );
  }
  private function replyVideo($obj, $videoArr){
    $replyXml = "<xml>
          <ToUserName><![CDATA[%s]]></ToUserName>
          <FromUserName><![CDATA[%s]]></FromUserName>
          <CreateTime>%s</CreateTime>
          <MsgType><![CDATA[video]]></MsgType>
          <Video>
          <MediaId><![CDATA[%s]]></MediaId>
          <Title><![CDATA[%s]]></Title>
          <Description><![CDATA[%s]]></Description>
          </Video> 
          </xml>";
    return sprintf ( $replyXml, $obj->FromUserName, $obj->ToUserName, time(), $videoArr['MediaId'], "这是视频标题", "这是视频具体的描述信息!" );   
  }
  private function replyMusic($obj, $musicArr){
    $replyXml = "<xml>
          <ToUserName><![CDATA[%s]]></ToUserName>
          <FromUserName><![CDATA[%s]]></FromUserName>
          <CreateTime>%s</CreateTime>
          <MsgType><![CDATA[music]]></MsgType>
          <Music>
          <Title><![CDATA[%s]]></Title>
          <Description><![CDATA[%s]]></Description>
          <MusicUrl><![CDATA[%s]]></MusicUrl>
          <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
          </Music>
          </xml>";
    return sprintf($replyXml,$obj->FromUserName,$obj->ToUserName,time(),$musicArr['Title'],$musicArr['Description'],$musicArr['MusicURL'],$musicArr['HQMusicUrl']);
  }
  private function replyLink($obj, $linkArr){
    return $this->replyText($obj, $linkArr['Description']);
  }
  private function replyNews($obj, $newsArr){
    $itemXml = "";
    if(is_array($newsArr))
    {
      foreach($newsArr as $item)
      {
        $itemStr = "<item>
              <Title><![CDATA[%s]]></Title>
              <Description><![CDATA[%s]]></Description>
              <PicUrl><![CDATA[%s]]></PicUrl>
              <Url><![CDATA[%s]]></Url>
              </item>";
        $itemXml .= sprintf ( $itemStr, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);
      }
    }
    
    $replyXml = "<xml>
          <ToUserName><![CDATA[%s]]></ToUserName>
          <FromUserName><![CDATA[%s]]></FromUserName>
          <CreateTime>%s</CreateTime>
          <MsgType><![CDATA[news]]></MsgType>
          <ArticleCount>%s</ArticleCount>
          <Articles>
          {$itemXml}
          </Articles>
          </xml>";
    return sprintf ( $replyXml, $obj->FromUserName, $obj->ToUserName, time(),count($newsArr));
  }
  private function https_request($url,$data=null)
  {
    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    if($data)
    {
      curl_setopt($ch,CURLOPT_POST,1);//模拟Post
      curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    }
    $outopt = curl_exec($ch);
    curl_close($ch);
    $outoptArr = json_decode($outopt,true);
    if(is_array($outoptArr))
    {
      return $outoptArr;
    }
    else
    {
      return $outopt;
    }
  }
  private function get_baidu_voice($content)
  {
    $content=urlencode($content);
    $baidu_token=BAIDU_TOKEN;
    $baidu_voice_url="http://tsn.baidu.com/text2audio?tex={$content}&lan=zh&cuid=CTU50915170&ctp=1&tok={$baidu_token}";
    $voice=$this->https_request($baidu_voice_url);
    return $voice;
  }
  private function upload_media($content)
  {
  
    //Upload media to Sina Cloud to get access url
    $storage=new Storage();
    $mediaName=time().".mp3";
    $bucketName="mp3";
    $storage->putObject($content,$bucketName,$mediaName);
    $mp3Url=$storage->getUrl($bucketName,$mediaName);
    return $mp3Url;
    //currently not able to upload a network mp3 to weichat server
    /*
      $access_token=$this->get_access_token();
      $url="https://api.weixin.qq.com/cgi-bin/media/upload?access_token={$access_token}&type=voice";
      //file_put_contents("123.mp3","http://tsn.baidu.com/text2audio?tex=%E8%BF%99%E6%98%AF%E6%88%91%E6%83%B3%E8%A6%81%E8%AE%A9%E4%BD%A0%E8%AF%BB%E5%87%BA%E6%9D%A5%E7%9A%84%E8%AF%AD%E9%9F%B3%E4%BF%A1%E6%81%AF%EF%BC%8C%E4%BD%A0%E8%A7%89%E5%BE%97%E6%88%91%E8%AF%BB%E5%BE%97%E6%80%8E%E4%B9%88%E6%A0%B7%EF%BC%9F&lan=zh&cuid=CTU50915170&ctp=1&tok=24.4abf9d281640a29052eed0a77908d445.2592000.1456367301.282335-7707083");
      $post=array("filename"=>"@http://bille001-mp3.stor.sinaapp.com/1454081891.mp3");
      $mediaArr=$this->https_request($url,$post);
      return $mediaArr;*/
  }
  private function tuling_api($obj,$question,$type="text")
  {
    $question_en=urlencode($question);
    $tulingURL = "http://www.tuling123.com/openapi/api?key=de4ae9269c7438c33de5806562a35cac&info={$question_en}";
    $tulingResultArr=$this->https_request($tulingURL);
    if(isset($tulingResultArr['url']))
    {
      return $this->replyText($obj,$tulingResultArr['text']." ".$tulingResultArr['url']);
    }
    elseif(isset($tulingResultArr['list']))
    {
      $listArr = $tulingResultArr['list'];
      $itemObj = new ArrayObject();
      $i = 0;
      foreach($listArr as $list)
      {
        if(!empty($list['article']))
        {
          $description = $list['source'];// news
          $title = $list['article'];
        }
        else
        {
          $description = $list['info']; // cookbook
          $title = $list['name'];
        }
        $item = array(
            "Title"=>$title,
            "Description"=>$description,
            "PicUrl"=>$list['icon'],
            "Url"=>$list['detailurl'],
        );
        $i++;
        if ($i<10)
        {
          $itemObj->append($item);
        }
  
      }
      $itemArr = $itemObj->getArrayCopy();
      return $this->replyNews($obj,$itemArr);
    }
    else
    {
      if($type=="text")
      {
        return $this->replyText($obj,$tulingResultArr['text']);
      }
      else
      {
        $baidu_content = $this->get_baidu_voice($tulingResultArr['text']);
        $mp3Url=$this->upload_media($baidu_content);
        $musicArr=array(
            "Title"=>"Q:".$question,
            "Description"=>"A:".$tulingResultArr['text'],
            "MusicURL"=>$mp3Url,
            "HQMusicUrl"=>$mp3Url,
        );
        return $this->replyMusic($obj,$musicArr);
      }
        
    }
  }
}
?>
  1. Once done, deploy it to Heroku:

Click Open App button to get the application url:

  1. Configure the url to your public Wechat account:


相关文章
|
5月前
|
安全 小程序 PHP
PHP代码审计(七)Rips源代码审计系统使用教程
上一篇中提到的Seay源代码审计系统是由C#编写的winform程序,现在已经停止更新了,但是,还是比较好用的。 PHP代码审计还有另一个工具,也是一个神器Rips
183 0
|
5月前
|
安全 小程序 PHP
PHP代码审计(六)Seay源代码审计系统使用教程
www.cnseay.com/ 当然,这个已经不能访问了。 软件的版本比较早,需要.NET framework3.5框架,我这里是软件启动的时候自动提醒安装,如果没有自动提醒,那么你需要手动安装.NET frameWork3.5框架,否则,程序应该是没有办法运行。
421 0
|
4天前
|
PHP Apache
centos7.9 安装php7.0以上版本
centos7.9 安装php7.0以上版本
79 2
|
4天前
|
安全 编译器 PHP
PHP 8.1版本发布:引领Web开发新潮流
PHP编程语言一直是Web开发的主力军,而最新发布的PHP 8.1版本则为开发者们带来了更多创新和便利。本文将介绍PHP 8.1版本的主要特性,包括更快的性能、新的语言功能和增强的安全性,以及如何利用这些功能来提升Web应用程序的质量和效率。
|
4天前
|
关系型数据库 MySQL Linux
Centos7 yum安装lAMP 环境 php版本5.6.38 mysql版本5.7.22
Centos7 yum安装lAMP 环境 php版本5.6.38 mysql版本5.7.22
28 0
|
6月前
|
弹性计算 监控 Java
阿里云国际站代理商:如何在阿里云上升级PHP版本?
@luotuoemo飞机@TG 阿里云国际站代理商:如何在阿里云上升级PHP版本?在所选实例右侧的操作栏中,点击“更多”>“实例管理”,进入实例管理页面。在这里,您可以看到实例的详细信息,包括当前的PHP版本、操作系统类型等。
|
8月前
|
自然语言处理 安全 Java
JAVA丨PHP交易所源码,JAVA/PHP交易所系统开发稳定版/多语言/海外版/多版本/成熟技术/方案详细/逻辑功能/规则案例
Identify requirements and design the system: Clarify your business requirements and design the architecture and functionality of the system. This includes determining the supported transaction types, user authentication, transaction matching engines, order management, fund management, etc.