微信公众号开发常用类库

<?php
namespace WeChat\Model;
use Think\Model;
class JieRuModel extends Model {
    private $_token = ''; //令牌
    private $appid;
    private $appsecret;
    public function __construct()
    {
        $this->_token = C('WECHAT.TOKEN'); //实例令牌
        $this->appid = C('WECHAT.APPID');//公众号的appid
        $this->appsecret = C('WECHAT.APPSECRET');//公众号的秘钥
        //文本模板
        $this->textTpl = "<xml>
                          <ToUserName><![CDATA[%s]]></ToUserName>
                          <FromUserName><![CDATA[%s]]></FromUserName>
                          <CreateTime>%s</CreateTime>
                          <MsgType><![CDATA[%s]]></MsgType>
                          <Content><![CDATA[%s]]></Content>
                          <FuncFlag>0</FuncFlag>
                          </xml>";
        //图文模板
        $this->newsTpl = "<xml>
                          <ToUserName><![CDATA[%s]]></ToUserName>
                          <FromUserName><![CDATA[%s]]></FromUserName>
                          <CreateTime>%s</CreateTime>
                          <MsgType><![CDATA[news]]></MsgType>
                          <ArticleCount>%s</ArticleCount>
                          <Articles>%s
                          </Articles>
                          </xml>";
        //图文模板里面的内容
        $this->item = "<item>
                        <Title><![CDATA[%s]]></Title>
                        <Description><![CDATA[%s]]></Description>
                        <PicUrl><![CDATA[%s]]></PicUrl>
                        <Url><![CDATA[%s]]></Url>
                        </item>";
        //音乐模板
        $this->musicTpl = "<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>
                            <ThumbMediaId><![CDATA[%s]]></ThumbMediaId>
                            </Music>
                            </xml>";
    }

  //验证开发者机器的有效性
    public function JieRu()
    {
        if($this->checkSignature()){
            $echoStr = $_GET["echostr"];
            echo $echoStr;
            exit;
        }else{
            echo '失败';
        }
    }

  //检验signature
    private function checkSignature()
    {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];


        $token = $this->_token;
        $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 responseMsg()
      {
      //也就是说基本上$GLOBALS['HTTP_RAW_POST_DATA'] 和 $_POST是一样的。
      //但是如果post过来的数据不是PHP能够识别的,你可以用 $GLOBALS['HTTP_RAW_POST_DATA']来接收,比如 text/xml 或者 soap 等等。
      $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
          //extract post data
      if (!empty($postStr)){
                  /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
                     the best way is to check the validity of xml by yourself */
                  //xml安全设置操作,微信建议开启的
                  libxml_disable_entity_loader(true);
                  //postStr数据进行解析
                  $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                  switch ($postObj->MsgType) {
                    case 'text':
                      $this->_doText($postObj);   //处理文本信息的方法
                      break;
                    case 'image':
                      $this->_doImage($postObj);  //处理图片消息的方法
                      break;
                    case 'location':
                      $this->_doLocation($postObj); //处理位置信息的方法
                      break;
                    case 'event':
                      $this->_doEvent($postObj);    //处理事件消息的方法
                      break;
                    default:
                      # code...
                      break;
                  }
          }
      }


         /*
     * 处理事件类型
     * Time:2016年7月10日16:14:20
     * By:php47
     */
    private function _doEvent($postObj){
      //判断event值的类型,进行相对应的操作
      switch ($postObj->Event) {
        case 'subscribe':
          $this->_doSubscribe($postObj);  //处理关注事件
          break;
        case 'unsubscribe':
          $this->_doUnsubscribe($postObj); //处理取消关注事件
          break;
        case 'CLICK':
          $this->_doClick($postObj);  //处理自定义菜单点击事件
          break;
        default:
          # code...
          break;
      }
    }


    /*
     * 点击事件的处理
     * Time:2016年7月10日16:51:53
     * By:php47
     *
     */
    private function _doClick($postObj){
      switch ($postObj->EventKey) {
        case 'news':
          $this->_sendTuwen($postObj); //处理news Click值的方法,发送图文方法
          break;


        default:
          # code...
          break;
      }
    }


        /*
     * 发送音乐信息
     * Time:2016年7月10日17:22:48
     * By:php47
     *
     */
    private function _sendMusic($postObj){
      //1.歌曲信息的组合
      $Title = '小歌曲';
      $Description = '小歌曲';
      $MusicUrl = 'http://so1.111ttt.com:8282/2016/1/06/20/199201048457.mp3?tflag=1466389833&pin=70d37142ea5d912f168918986e2e5ad1';
      $HQMusicUrl = 'http://so1.111ttt.com:8282/2016/1/06/20/199201048457.mp3?tflag=1466389833&pin=70d37142ea5d912f168918986e2e5ad1';
      $ThumbMediaId = 'Q4LZnvVfOWowvVj2q0z4X2YrTqqj2MsOD8SWN8cckROpAaMZ05STV5wWg9aaIHsW';
      //2.组合模板
      $resultStr = sprintf($this->musicTpl, $postObj->FromUserName, $postObj->ToUserName, time(), $Title, $Description, $MusicUrl, $HQMusicUrl, $ThumbMediaId);
      //3.输出模板信息
      echo $resultStr;
    }


    /*
     * 发送图文方法
     * Time:2016年7月10日17:00:49
     * By:php47
     *
     */
    private function _sendTuwen($postObj){
      //组合新闻数组
       $newsList = array(
            array(
                        'Title' => ' 决战!C罗还差一步加冕欧洲之王!',
                        'Description' => '经过了一个多月的鏖战,由24路诸侯几百名球员联袂出演的法兰西之夏即将迎来最终结局。两张决赛门票一张属于东道主法国,经过了一个多月的鏖战,由24路诸侯几百名球员联袂出演的法兰西之夏即将迎来最终结局。两张决赛门票一张属于东道主法国,另一张则是属于低开高走,常规时间五平一胜杀进决赛的葡萄牙。而两支队伍的一切奋斗与汗水都将在7月11日得到答案。是留下一个伤心的背影,抑或是带走所有的蛋糕。',
                        'PicUrl' => 'http://img1.gtimg.com/sports/pics/hv1/233/90/2096/136315583.jpg',
                        'Url' => 'http://sports.qq.com/fans/post.htm?id=1539363816777711645&mid=142#1',
            ),
            array(
                        'Title' => '球探-法国新磐石武装巴萨 欧洲杯36年第一人',
                        'Description' => '腾讯体育7月8日讯 法国淘汰德国杀入欧洲杯决赛,同时也是队史上首次在欧洲杯零封日耳曼战车,蓝衣军防线表现出色,尤其是新锐国脚乌姆蒂蒂,连续两战打出高水准,巴萨斥资2500万欧元提前将其购入,实属明智。',
                        'PicUrl' => 'http://img1.gtimg.com/sports/pics/hv1/92/208/2095/136280507.jpg',
                        'Url' => 'http://sports.qq.com/a/20160708/026374.htm',
                        ),
        );
       $items = '';
       //循环输出item模板
       foreach ($newsList as $key => $value) {
         $items .= sprintf($this->item, $value['Title'], $value['Description'], $value['PicUrl'], $value['Url']);
       }
       $contentStr = sprintf($this->newsTpl, $postObj->FromUserName, $postObj->ToUserName, time(), count($newsList), $items);
       echo $contentStr;
    }


    /*
     * 关注事件处理
     * Time:2016年7月10日16:21:01
     * By:php47
     *
     */
    private function _doSubscribe($postObj){
      $contentStr = '欢迎关注我们东升超越物流!';
      $resultStr = sprintf($this->textTpl, $postObj->FromUserName, $postObj->ToUserName, time(), "text", $contentStr);
      echo $resultStr;
    }


    /*
     * 取消关注事件处理
     * Time:2016年7月10日16:28:31
     * By:php47
     *
     */
    private function _doUnsubscribe($postObj){
      //删除用户的一些信息获取绑定的相关操作
    }


       /*
     *  处理文本信息
     *  Time:2016年7月10日15:02:30
     *  By:php47
     */
    private function _doText($postObj){
      $keyword = trim($postObj->Content);
      if(!empty( $keyword ))
              {
                $msgType = "text";
                $url = 'http://api.qingyunke.com/api.php?key=free&appid=0&msg='.$keyword;
                //2.get请求,直接发送
                $contents = $this->request($url,false);
                //3.处理返回值
                //json转化为对象信息
                $contents = json_decode($contents);
                //输出返回的信息
                $contentStr = $contents->content;
                $resultStr = sprintf($this->textTpl, $postObj->FromUserName, $postObj->ToUserName, time(), $msgType, $contentStr);
                echo $resultStr;
              }
    }
       /*
     * 处理图片消息
     * Time:2016年7月10日15:51:09
     * By:php47
     *
     */
    private function _doImage($postObj){
      //把接收到图片地址链接以文本形式返回
      $PicUrl = $postObj->PicUrl;
      //保存文件到服务器
      // $pic = $this->request($PicUrl,false);
      // file_put_contents('./pic.png',$pic);
      $resultStr = sprintf($this->textTpl, $postObj->FromUserName, $postObj->ToUserName, time(), "text", $PicUrl);
      echo $resultStr;
    }
    /*
     * 处理位置消息
     * Time:22016年7月10日16:03:23
     * By:php47
     *
     */
    private function _doLocation($postObj){
      //组合x,y数据
      $contentStr = '您当前x为:'.$postObj->Location_X.',Y为:'.$postObj->Location_Y;
      $resultStr = sprintf($this->textTpl, $postObj->FromUserName, $postObj->ToUserName, time(), "text", $contentStr);
      echo $resultStr;
    }
     //封装请求方法
  public function request($url,$https=true,$method='get',$data=null){
    //1.初始化url
    $ch = curl_init($url);
    //2.设置相关的参数
    //字符串不直接输出,进行一个变量的存储
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    //判断是否为https请求
    if($https === true){
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    }
    //判断是否为post请求
    if($method == 'post'){
      curl_setopt($ch, CURLOPT_POST, true);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    }
    //3.发送请求
    $str = curl_exec($ch);
    //4.关闭连接
    curl_close($ch);
    //返回请求到的结果
    return $str;
  }


  /*
   * 获取access_token(获取很多借口的凭证)
   * Time:2016年7月9日11:25:24
   * By: php47
   *
  */
   public function getAccessToken(){
     $lasttime = session('lasttime');
     if($lasttime and time() < ($lasttime+3600)){
         return session('access_token');exit;
     }
    //1.url地址
    $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$this->appid.'&secret='.$this->appsecret;
    //2.get方式,直接发送放松请求
    $content = $this->request($url);
    //3.处理返回值,先看看
    //返回值json字符串,pph不能直接进行操作,把它传化为一个对象或者数组进行操作
    $content = json_decode($content);
    $access_token = $content->access_token;
     session('lasttime',time());
     session('access_token',$access_token);
    return $access_token;
   }
    /*
   * 创建菜单操作
   * Time:2016年7月9日17:10:06
   * By:php47
   *
   */
   public function createMenu(){
     $url = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token='.$this->getAccessToken();
     $data = '{'
            .'"button":[{'
            .''
            .'"type":"view",'
            .'"name":"在线下单",'
            .'"url":"http://dongsheng.qmlzsm.com/dswiliu/index.php/"'
            .'},{'
            .'"name":"积分商城",'
            .'"sub_button":[{'
            .'"type":"view",'
            .'"name":"代缴罚款",'
            .'"url":"http://dongsheng.qmlzsm.com/dswiliu/index.php?c=amerce"'
            .'},{'
            .'"type":"view",'
            .'"name":"积分商城",'
            .'"url":"http://dongsheng.qmlzsm.com/dswiliu/index.php?m=Home&c=integralMall&a=index"'
            .'}]'
            .'},{'
            .'"type":"view",'
            .'"name":"我的",'
            .'"url":"http://dongsheng.qmlzsm.com/dswiliu/index.php?c=User"'
            .'}]'
            .'}';
     //3.携带post数据,发送请求
     $content = $this->request($url,true,'post',$data);
    //4.处理返回值
      //把json转化成一个对象
      $content = json_decode($content);
      //业务逻辑判断
      if($content->errmsg == 'ok'){
        echo '创建菜单成功!';
      }else{
        echo '创建失败,错误代码为:'.$content->errcode;
      }


   }
   //发送模板信息
   public function send_template_message($data){


                //模板消息(里面的选项具体根据提供的模板设置)
        $template = 
              array(
                   'touser' => $data['openid'],//用户的openid
                   'template_id' => C('WECHAT.MOBAN_ID'),//模板id
                   'url' => '',//点击模板的跳转地址
                   'data' => array(
                         'first' => array(
                                     'value' => '尊敬的客户您好',
                                     'color' => '#000000',
                            ),
                         'keyword1' => array(
                                      'value' => $data['danhao'],
                                     'color' => '#000000',
                            ),
                         'keyword2' => array(
                                      'value' => $data['goodsName'].",".$data['loadingAddr'].'-'.$data['unloadingAddr'].",业务员已开单,请及时取单",
                                      'color' => '#000000',


                            ),
                         'remark' => array(
                                      'value' => $data['time'],
                                      'color' => '#000000',
                           )
                  )
                );
        $url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".$this->getAccessToken();        
        $data = json_encode($template);
        $res = $this->request($url,true,'post',$data);
        return json_decode($res, true);
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值