当前位置:首页 > PHP教程 > PHP高级教程

php微信公众平台开发类实例

本文实例讲述了php微信公众平台开发类。分享给大家供大家参考。具体分析如下:

thinkwechat.php类文件如下:

<?php
class wechat {
  /**
   * 微信推送过来的数据或响应数据
   * @var array
   */
  private $data = array();
  /**
   * 构造方法,用于实例化微信sdk
   * @param string $token 微信开放平台设置的token
   */
  public function __construct($token) {
    $this->auth($token) || exit;
    if(!empty($_get['echostr'])){
      exit($_get['echostr']);
    } else {
      try
      {
        $xml = file_get_contents("php://input");
        $xml = new simplexmlelement($xml);
        $xml || exit;
        foreach ($xml as $key => $value) {
          $this->data[$key] = strval($value);
        }
      }catch(exception $e){
      }
    }
  }
  /**
   * 获取微信推送的数据
   * @return array 转换为数组后的数据
   */
  public function request(){
    return $this->data;
  }
  /**
   * * 响应微信发送的信息(自动回复)
   * @param string $to   接收用户名
   * @param string $from  发送者用户名
   * @param array $content 回复信息,文本信息为string类型
   * @param string $type  消息类型
   * @param string $flag  是否新标刚接受到的信息
   * @return string     xml字符串
   */
  public function response($content, $type = 'text', $flag = 0){
    /* 基础数据 */
    $this->data = array(
      'tousername'  => $this->data['fromusername'],
      'fromusername' => $this->data['tousername'],
      'createtime'  => time(),
      'msgtype'   => $type,
    );
    /* 添加类型数据 */
    $this->$type($content);
    /* 添加状态 */
    $this->data['funcflag'] = $flag;
    /* 转换数据为xml */
    $xml = new simplexmlelement('<xml></xml>');
    $this->data2xml($xml, $this->data);
    exit($xml->asxml());
  }
  /**
   * 回复文本信息
   * @param string $content 要回复的信息
   */
  private function text($content){
    $this->data['content'] = $content;
  }
  /**
   * 回复音乐信息
   * @param string $content 要回复的音乐
   */
  private function music($music){
    list(
      $music['title'], 
      $music['description'], 
      $music['musicurl'], 
      $music['hqmusicurl']
    ) = $music;
    $this->data['music'] = $music;
  }
  /**
   * 回复图文信息
   * @param string $news 要回复的图文内容
   */
  private function news($news){
    $articles = array();
    foreach ($news as $key => $value) {
      list(
        $articles[$key]['title'],
        $articles[$key]['description'],
        $articles[$key]['picurl'],
        $articles[$key]['url']
      ) = $value;
      if($key >= 9) { break; } //最多只允许10调新闻
    }
    $this->data['articlecount'] = count($articles);
    $this->data['articles'] = $articles;
  }
  /**
   * 数据xml编码
   * @param object $xml xml对象
   * @param mixed $data 数据
   * @param string $item 数字索引时的节点名称
   * @return string
   */
  private function data2xml($xml, $data, $item = 'item') {
    foreach ($data as $key => $value) {
      /* 指定默认的数字key */
      is_numeric($key) && $key = $item;
      /* 添加子元素 */
      if(is_array($value) || is_object($value)){
        $child = $xml->addchild($key);
        $this->data2xml($child, $value, $item);
      } else {
        if(is_numeric($value)){
          $child = $xml->addchild($key, $value);
        } else {
          $child = $xml->addchild($key);
          $node = dom_import_simplexml($child);
          $node->appendchild($node->ownerdocument->createcdatasection($value));
        }
      }
    }
  }
  /**
   * 对数据进行签名认证,确保是微信发送的数据
   * @param string $token 微信开放平台设置的token
   * @return boolean    true-签名正确,false-签名错误
   */
  private function auth($token){
    if(empty($_get['signature'])) return;
    /* 获取数据 */
    $data = array($_get['timestamp'], $_get['nonce'], $token);
    $sign = $_get['signature'];
    /* 对数据进行字典排序 */
    sort($data,sort_string);
    /* 生成签名 */
    $signature = sha1(implode($data));
    return $signature === $sign;
  }
}

希望本文所述对大家的php程序设计有所帮助。


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:)!