>위챗 애플릿 >위챗 개발 >PHP WeChat 고급 인터페이스 대량 메시징 여러 고객 서비스

PHP WeChat 고급 인터페이스 대량 메시징 여러 고객 서비스

高洛峰
高洛峰원래의
2017-02-20 14:51:281494검색

이 기사에서는 주로 PHP WeChat 고급 인터페이스 대량 전송 및 다중 고객 서비스 관련 정보를 자세히 소개합니다. 관심 있는 친구는 이를 참조할 수 있습니다.

이 기사의 예는 PHP WeChat 고급 인터페이스를 모든 사람과 공유합니다. 대량 발송, 참고용으로 여러 고객 서비스 소스 코드, 구체적인 내용은 다음과 같습니다

/**
 * 微信接口调用
 * 依赖
 * 全局变量
 * global $uid 公众号用户id, $wid 公众号id, $wechatid 粉丝唯一id;
 * 参数
 * $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
 * $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
 * 缓存类 自定义
 * Cache:set
 * Cache:get
 * 具体业务修改
 * 1.上传图文信息至微信素材库
 * function uploadArticlesToWeiXinServer()
 * 2.关键字匹配图文回复
 * function getArticleData()
 * 
 * usage:
 *  $options = array(
 *  'token'=>'tokenaccesskey', //填写你设定的key
 *  'appid'=>'wxdk1234567890', //填写高级调用功能的app id
 *  'appsecret'=>'xxxxxxxxxxxxxxxxxxx', //填写高级调用功能的密钥
 *  );
 */
class WeiXinTool {

  private $appid;
  private $appsecret;
  private $access_token;
  private $mediaType = array('image' => array("jpg"), 'voice' => array('amr', 'MP3'), 'video' => array('mp4'), 'thumb' => array("jpg"));
  private $mediaMaxSize = array('image' => 131072, 'voice' => 262144, 'video' => 1048576, 'thumb' => 65536);
  private $tem_file_path = "";

//  授权地址
  const AUTH_URL = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s';
//  素材上传
  const UPLOAD_MEDIA_URL = "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=%s&type=%s";
  const GET_MEDIA_URL = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=%s&media_id=%s";
  const UPLOAD_NEWS_URL = "https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=%s";

  public function __construct($options) {
    $this->appid = isset($options['appid']) ? $options['appid'] : '';
    $this->appsecret = isset($options['appsecret']) ? $options['appsecret'] : '';
    //需修改
    //上传图片临时文件目录自定义
    $this->tem_file_path = YYUC_FRAME_PATH . YYUC_PUB . '/' . Session::get('upath');
  }

  /**
   * 需修改
   * 具体业务需求,图文信息上传至素材库
   * 微站文章上传至微信素材
   * @param type $wid 
   * @param type $aid
   * @return int
   */
  public function uploadArticlesToWeiXinServer($wid, $aid) {

    //具体图文组装过程,需修改
    $m = new Model('website_article');
    $m_pubs = new Model('pubs');
    $m_pubs->find(array("id" => $wid));
    $m->find(array("wid" => $wid, 'id' => $aid));
    $res = array();
    if ($m->has_id() && $m_pubs->has_id()) {
      $res[] = $m->get_model_array();
//      var_dump($res);
      $m->votetouser = json_decode($m->votetouser, TRUE);
      $articles = $m->votetouser[0];
      $m_article = new Model('website_article');
      $ress = $m_article->where(array('wid' => $wid, 'id' => $articles))->list_all_array();
      $res = array_merge($res, $ress);
    } else {
      $errarr = array();
      $errarr['errcode'] = 44003;
      $errarr['errmsg'] = self::$errorno[$errarr['errcode']];
      return $errarr;
    }
    $items = array();
    foreach ($res as $k => $v) {
      $mediaid = $this->uploadMedia($v['picurl']);
      if ($mediaid['media_id']) {
        $thumb_media_id = $mediaid['media_id'];
      } else {
        return $mediaid;
      }
      $item = array(
        "thumb_media_id" => $thumb_media_id,
        "author" => $m_pubs->pubun,
        "title" => $v['title'],
        "content_source_url" => WeiXinTool::complateUrl(WeiSite::parseArticleLinkData($v)),
        "content" => $v['reply_content'], //内容 富文本
        "digest" => $v['description']//描述
      );
      $items[] = $item;
    }
    //以上具体图文组装过程,需修改

    $postData['articles'] = $items;
    $error = $this->uploadNews($postData);
    return $error;
  }

  /**
   * 需修改
   * 微站文章关键字匹配数据解析
   */
  public static function getArticleData($keyword) {
    global $wid;
    $m = new Model('website_article');
    $m->find(array('wid' => $wid, 'keyword@~' => " " . $keyword . " "));
    $res = array();
    if ($m->has_id()) {
      $res[] = array("tit" => $m->title, "pic" => $m->picurl, "dec" => $m->description, "url" => WeiSite::parseArticleLinkData($m->get_model_array()));
      $m->votetouser = json_decode($m->votetouser, TRUE);
      $articles = $m->votetouser[0];
      if (!empty($articles)) {
        foreach ($articles as $v) {
          $m_article = new Model('website_article');
          $m_article->find(array('wid' => $wid, 'id' => $v));
          $res[] = array("tit" => $m_article->title, "pic" => $m_article->picurl, "dec" => $m_article->description, "url" => WeiSite::parseArticleLinkData($m_article->get_model_array()));
        }
      }
      return $res;
    }
  }

  /**
   * 获取accesstoken
   * @param type $flag 强制刷新accesstoken 开关
   * @return type
   */
  public function getAccessToken($flag = FALSE) {
    $url = sprintf(self::AUTH_URL, $this->appid, $this->appsecret);
    $result = Cache::get(md5($url));
    if ($flag || empty($result)) {
      $result = $this->http_get($url);
      $result = json_decode($result, TRUE);
      if ($result['errcode']) {
        return $result['errcode'];
      }
      Cache::set(md5($url), $result, 1);
    }
    $this->access_token = $result['access_token'];
    return true;
  }

  /**
   * 上传媒体
   * @param type $file 媒体文件 $url或者物理路径地址
   * @param type $type 类型 
   * @return int
   * return 
   array (size=3)
   'type' => string 'image' (length=5)
   'media_id' => string '-0Lr3rX9mDYBB7i5bDydvwFHHm3zW2Uxt0OoDFBPmGRfYiwckiALqHH_DlP9jCm_' (length=64)
   'created_at' => int 1400477181
   */
  public function uploadMedia($file, $type = "image") {
    $file = self::complateUrl($file);
    $urlarr = parse_url($file);
    $filetype = explode(".", $urlarr['path']);
    $filetype = strtolower($filetype[count($filetype) - 1]);
    $resizeSize = 100; //图片处理后另存质量
    if (!key_exists($type, $this->mediaType) || !in_array($filetype, $this->mediaType[$type])) {
//      return 40005; //格式错误
      $errarr = array();
      $errarr['errcode'] = 40005;
      $errarr['errmsg'] = self::$errorno[$errarr['errcode']];
      return $errarr;
    }

    $temp_file = $this->tem_file_path . 'uploadMedia.' . $filetype;
    $temp_file_resize = $this->tem_file_path . 'uploadMediaResize.' . $filetype;
    file_put_contents($temp_file, self::http_get($file));
    $handle = fopen($temp_file, "r");
    $fstat = fstat($handle);

    if ($fstat['size'] > $this->mediaMaxSize[$type]) {
      $resizeSize = intval($this->mediaMaxSize[$type] / $fstat['size'] * 100);
      ImageTool::resizeImage($temp_file_resize, $temp_file, 400, 400, $resizeSize); //图片太大再处理压缩
      $temp_file = $temp_file_resize;
//      return 40006; //大小错误
    }
    $filePath = realpath($temp_file);
    $uploadUrl = sprintf(self::UPLOAD_MEDIA_URL, $this->access_token, $type);
    $postData = array("r" => time(), 'media' => "@{$filePath}");
    $result = self::http_post($uploadUrl, $postData);
    $result = json_decode($result, TRUE);
    return $result;
  }

  /**
   * 群发图文信息
   * @param type $touser 粉丝数组/粉丝组id
   * @param type $media_id
   * @return type
   */
  public function sendArticles($touser, $media_id) {
    $errarr = array();
    $postData = array();
    $postData['mpnews'] = array("media_id" => $media_id);
    $postData['msgtype'] = "mpnews";
    if (is_array($touser)) {
      //用户列表群发
      $postData['touser'] = $touser;
      $url = 'https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token=%s';
    } else {
      $group = intval($touser);
      $groups = $this->getGroups(true);
      if (key_exists($group, $groups['list'])) {
        $postData['filter'] = array("group_id" => $group);
      } else {
        $errarr['errcode'] = 40050; //无效分组id
        $errarr['errmsg'] = self::$errorno[$errarr['errcode']];
        return $errarr;
      }
      $url = 'https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token=%s';
    }
    $url = sprintf($url, $this->access_token);
    $result = self::http_post($url, self::json_encode($postData));
    $result = json_decode($result, TRUE);
    return $result;
  }

  /**
   * 删除群发信息
   * @param type $msgid
   * @return type
   */
  public function delSend($msgid) {
    $url = 'https://api.weixin.qq.com/cgi-bin/message/mass/delete?access_token=%s';
    $url = sprintf($url, $this->access_token);
    $postData = array('msgid' => $msgid, 'r' => time());
    $result = self::http_post($url, self::json_encode($postData));
    $result = json_decode($result, TRUE);
    return $result;
  }

  /**
   * 群发图文素材上传
   $postData = array('articles' => array($item, $item,...));
   $item = array(
   "thumb_media_id" => "WMQubqCECMQwAjqh8CI500LfhyoG0vmTTlKKJM5oP-of0uLML1_2s26j8XeIorDL",
   "author" => "xxx",
   "title" => "Happy Day",
   "content_source_url" => "www.qq.com",
   "content" => "content",
   "digest" => "digest"
   );
   * return 
   array (size=3)
   'type' => string 'news' (length=4)
   'media_id' => string 'OuXqv2dgZzxAmK4z-tvStgr6InG18oIllWkD6Tj1qJZVRg-2f64FDU2D3J7dptHs' (length=64)
   'created_at' => int 1400477183
   */
  public function uploadNews($postData) {
    $uploadUrl = sprintf(self::UPLOAD_NEWS_URL, $this->access_token);
    $result = self::http_post($uploadUrl, self::json_encode($postData));
    $result = json_decode($result, TRUE);
    return $result;
  }

  /**
   * 获取粉丝列表
   * @param type $nextOpenId
   * @return type
   */
  public function getAllConnects($nextOpenId = "") {
    $url = 'https://api.weixin.qq.com/cgi-bin/user/get?access_token=%s&next_openid=%s';
    $url = sprintf($url, $this->access_token, $nextOpenId);
    $result = self::http_get($url);
    $result = json_decode($result, TRUE);
    $count = count($result['data']['openid']);
    $list = $result['data']['openid'];
    if ($result['data']['openid'][$count - 1] == $result['next_openid']) {
      return $result['data']['openid'];
    } else {
      $templist = $this->getAllConnects($result['next_openid']);
      $list = array_merge($list, $templist);
      return $list;
    }
  }

  /**
   * 根据粉丝唯一id获取微信信息
   * @param type $openid
   * @return type
   */
  public function getFansInfo($openid) {
    $url = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token=%s&openid=%s&lang=zh_CN';
    $url = sprintf($url, $this->access_token, $openid);
    $result = self::http_get($url);
    $result = json_decode($result, TRUE);
    return $result;
  }

  /**
   * 更新粉丝组信息
   * @param type $openid
   * @param type $groupid
   * @return type
   */
  public function updateFansGroups($openid, $groupid) {
    $url = 'https://api.weixin.qq.com/cgi-bin/groups/members/update?access_token=%s';
    $url = sprintf($url, $this->access_token);
    $postData = array("to_groupid" => $groupid, 'openid' => $openid);
    $result = self::http_post($url, self::json_encode($postData));
    $result = json_decode($result, TRUE);
    $this->getGroups(true);
    return $result;
  }

  /**
   * 获取粉丝组信息
   * @param type $openid
   * @return type
   */
  public function getFansGroupInfo($openid) {
    $url = 'https://api.weixin.qq.com/cgi-bin/groups/getid?access_token=%s';
    $url = sprintf($url, $this->access_token);
    $postData = array("r" => time(), 'openid' => $openid);
    $result = self::http_post($url, self::json_encode($postData));
    $result = json_decode($result, TRUE);
    return $result['groupid'];
  }

  /**
   * 获取唯一key
   * @param type $key
   * @return type
   */
  public function getKey($key) {
    return md5($this->appid . $this->appsecret . $key);
  }

  /**
   * 获取媒体图片到本地
   * @param type $mediaid
   * @return string
   */
  public function getMedia($mediaid) {
    $url = sprintf(self::GET_MEDIA_URL, $this->access_token, $mediaid);
    $result = self::http_get($url);
    $temp_file = $this->tem_file_path . 'getMedia.jpg';
    file_put_contents($temp_file, $result);
    return $temp_file;
  }

  /**
   * 用户组
   * @param type $flag 强制刷新用户组
   * @return type
   */
  public function getGroups($flag = false) {
    $key = $this->appid . 'gasdfev' . $this->appsecret;
    $result = Cache::get($key);
    if (empty($result) || $flag) {
      $url = 'https://api.weixin.qq.com/cgi-bin/groups/get?access_token=%s';
      $url = sprintf($url, $this->access_token);
      $result = self::http_get($url);
      $result = json_decode($result, TRUE);
      $temg = array();
      $temlist = array();
      foreach ($result['groups'] as $k => $v) {
        $temg[$v['id']] = $v;
        $temlist[$v['id']] = $v['name'];
      }
      $result['map'] = $temg;
      $result['list'] = $temlist;
      Cache::set($key, $result);
    }
    return $result;
  }

  /**
   * 新增用户组
   * @param type $name
   * @return type
   */
  public function createGroup($name) {
    $url = 'https://api.weixin.qq.com/cgi-bin/groups/create?access_token=%s';
    $url = sprintf($url, $this->access_token);
    $result = self::http_post($url, self::json_encode(array('group' => array('name' => $name))));
    $result = json_decode($result, TRUE);
    return $result;
  }

  /**
   * 修改用户组
   * @param type $id
   * @param type $name
   * @return type
   */
  public function modifyGroup($id, $name) {
    $url = 'https://api.weixin.qq.com/cgi-bin/groups/update?access_token=%s';
    $url = sprintf($url, $this->access_token);
    $result = self::http_post($url, self::json_encode(array('group' => array('id' => $id, 'name' => $name))));
    $result = json_decode($result, TRUE);
    return $result;
  }

  /**
   * 多客服接入
   * @global type $wid
   * @param type $postObj
   */
  public static function responseService($postObj) {
    global $wid;
    $fromUsername = $postObj->FromUserName;
    $toUsername = $postObj->ToUserName;
    $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[transfer_customer_service]]></MsgType>
</xml>";
    $resstr = sprintf($textTpl, $fromUsername, $toUsername, time());
    echo $resstr;
  }

  /**
   * 微信回复多图文
   * @global type $wid
   * @param type $res
   * array(array(),array()
   * );
   * @param type $rid
   * @param type $postObj
   */
  public static function response_morearts($res, $postObj) {
    global $wid;
    $fromUsername = $postObj->FromUserName;
    $toUsername = $postObj->ToUserName;
    $textTpl = "<xml>
 <ToUserName><![CDATA[%s]]></ToUserName>
 <FromUserName><![CDATA[%s]]></FromUserName>
 <CreateTime>%s</CreateTime>
 <MsgType><![CDATA[%s]]></MsgType>
 <ArticleCount>%s</ArticleCount>
 <Articles>
 ITEM
 </Articles>
 </xml>";
    $resstr = sprintf($textTpl, $fromUsername, $toUsername, time(), "news", count($res));
    $item = &#39;&#39;;
    $subitem = "<item>
 <Title><![CDATA[%s]]></Title>
 <Description><![CDATA[%s]]></Description>
 <PicUrl><![CDATA[%s]]></PicUrl>
 <Url><![CDATA[%s]]></Url>
 </item>";
    foreach ($res as $r) {
      $r[&#39;url&#39;] = self::parseUrl($r[&#39;url&#39;]);
      $item .= sprintf($subitem, $r[&#39;tit&#39;], $r[&#39;des&#39;], self::complateUrl($r[&#39;pic&#39;]), self::replaceToWXUrl(self::complateUrl($r[&#39;url&#39;]), $postObj));
    }
    $resstr = str_replace(&#39;ITEM&#39;, $item, $resstr);
    echo $resstr;
  }

  /**
   * url解析
   * @param type $url
   * @return string
   */
  public static function complateUrl($url) {
    if (false === stristr($url, "http://")) {//查找http:// 如果不存在
      if (0 === strpos($url, &#39;/&#39;)) {//查找首字母 如果存在
        $url = substr($url, 1); //去除/
      }
      $url = "http://" . $_SERVER[&#39;HTTP_HOST&#39;] . &#39;/&#39; . $url; //拼接完整路径
    }
    return $url;
  }

  /**
   * 微信url固定参数替换
   * @param type $url
   * @param type $postObj
   * @return type
   */
  public static function replaceToWXUrl($url, $postObj) {
    global $wechatid;
    return str_ireplace(&#39;fromUsername&#39;, $wechatid, $url);
  }

  /**
   * 完成以下行为
   * parseUrlParam
   * setUrlPublicParam
   * buildUrlParam
   * @param type $url
   * @param type $other 附加参数 基础参数wid wxid wechatid
   */
  public static function parseUrl($url, $other = array()) {
    $url = self::parseUrlParam($url);
    $url = self::setUrlPublicParam($url);
    if (is_array($other) && !empty($other)) {
      $url[&#39;param&#39;] = array_merge($url[&#39;param&#39;], $other);
    }
    $url = self::buildUrlParam($url);
    return $url;
  }

  /**
   * 分析url
   * @param type $url
   * @return type
   */
  public static function parseUrlParam($url) {
    $temp = explode("?", $url);
    $url0 = $temp[0];
    $url1 = $temp[1];
    $p = explode("&", $url1);
    $param = array();
    foreach ($p as $v) {
      $tempp = explode("=", $v);
      $param[$tempp[0]] = $tempp[1];
    }
    return array("url" => $url0, "param" => $param);
  }

  /**
   * 组装url
   * @param type $arr
   * @return type
   */
  public static function buildUrlParam($arr) {
    $url = $arr[&#39;url&#39;];
    $param = $arr[&#39;param&#39;];
    $param_arr = array();
    foreach ($param as $k => $v) {
      if ($k == "") continue;
      $param_arr[] = $k . "=" . $v;
    }
    return $url . "?" . implode("&", $param_arr) . "#mp.weixin.qq.com";
  }

  /**
   * 设置微信保留参数信息
   * @global type $uid
   * @global type $wid
   * @global type $wechatid
   * @param type $url
   * @return type
   */
  public static function setUrlPublicParam($url) {
    global $uid, $wid, $wechatid;
    $url[&#39;param&#39;][&#39;wid&#39;] = $wid;
    $url[&#39;param&#39;][&#39;wxid&#39;] = $wechatid;
    $url[&#39;param&#39;][&#39;wechatid&#39;] = $wechatid;
    return $url;
  }

  public static $errorno = array(
    &#39;-1&#39; => &#39;系统繁忙&#39;,
    &#39;0&#39; => &#39;请求成功&#39;,
    &#39;40001&#39; => &#39;获取access_token时AppSecret错误,或者access_token无效&#39;,
    &#39;40002&#39; => &#39;不合法的凭证类型&#39;,
    &#39;40003&#39; => &#39;不合法的OpenID&#39;,
    &#39;40004&#39; => &#39;不合法的媒体文件类型&#39;,
    &#39;40005&#39; => &#39;不合法的文件类型&#39;,
    &#39;40006&#39; => &#39;不合法的文件大小&#39;,
    &#39;40007&#39; => &#39;不合法的媒体文件id&#39;,
    &#39;40008&#39; => &#39;不合法的消息类型&#39;,
    &#39;40009&#39; => &#39;不合法的图片文件大小&#39;,
    &#39;40010&#39; => &#39;不合法的语音文件大小&#39;,
    &#39;40011&#39; => &#39;不合法的视频文件大小&#39;,
    &#39;40012&#39; => &#39;不合法的缩略图文件大小&#39;,
    &#39;40013&#39; => &#39;不合法的APPID&#39;,
    &#39;40014&#39; => &#39;不合法的access_token&#39;,
    &#39;40015&#39; => &#39;不合法的菜单类型&#39;,
    &#39;40016&#39; => &#39;不合法的按钮个数&#39;,
    &#39;40017&#39; => &#39;不合法的按钮个数&#39;,
    &#39;40018&#39; => &#39;不合法的按钮名字长度&#39;,
    &#39;40019&#39; => &#39;不合法的按钮KEY长度&#39;,
    &#39;40020&#39; => &#39;不合法的按钮URL长度&#39;,
    &#39;40021&#39; => &#39;不合法的菜单版本号&#39;,
    &#39;40022&#39; => &#39;不合法的子菜单级数&#39;,
    &#39;40023&#39; => &#39;不合法的子菜单按钮个数&#39;,
    &#39;40024&#39; => &#39;不合法的子菜单按钮类型&#39;,
    &#39;40025&#39; => &#39;不合法的子菜单按钮名字长度&#39;,
    &#39;40026&#39; => &#39;不合法的子菜单按钮KEY长度&#39;,
    &#39;40027&#39; => &#39;不合法的子菜单按钮URL长度&#39;,
    &#39;40028&#39; => &#39;不合法的自定义菜单使用用户&#39;,
    &#39;40029&#39; => &#39;不合法的oauth_code&#39;,
    &#39;40030&#39; => &#39;不合法的refresh_token&#39;,
    &#39;40031&#39; => &#39;不合法的openid列表&#39;,
    &#39;40032&#39; => &#39;不合法的openid列表长度&#39;,
    &#39;40033&#39; => &#39;不合法的请求字符,不能包含\uxxxx格式的字符&#39;,
    &#39;40035&#39; => &#39;不合法的参数&#39;,
    &#39;40038&#39; => &#39;不合法的请求格式&#39;,
    &#39;40039&#39; => &#39;不合法的URL长度&#39;,
    &#39;40050&#39; => &#39;不合法的分组id&#39;,
    &#39;40051&#39; => &#39;分组名字不合法&#39;,
    &#39;40059&#39; => &#39;不合法的消息id&#39;,
    &#39;41001&#39; => &#39;缺少access_token参数&#39;,
    &#39;41002&#39; => &#39;缺少appid参数&#39;,
    &#39;41003&#39; => &#39;缺少refresh_token参数&#39;,
    &#39;41004&#39; => &#39;缺少secret参数&#39;,
    &#39;41005&#39; => &#39;缺少多媒体文件数据&#39;,
    &#39;41006&#39; => &#39;缺少media_id参数&#39;,
    &#39;41007&#39; => &#39;缺少子菜单数据&#39;,
    &#39;41008&#39; => &#39;缺少oauth code&#39;,
    &#39;41009&#39; => &#39;缺少openid&#39;,
    &#39;42001&#39; => &#39;access_token超时&#39;,
    &#39;42002&#39; => &#39;refresh_token超时&#39;,
    &#39;42003&#39; => &#39;oauth_code超时&#39;,
    &#39;43001&#39; => &#39;需要GET请求&#39;,
    &#39;43002&#39; => &#39;需要POST请求&#39;,
    &#39;43003&#39; => &#39;需要HTTPS请求&#39;,
    &#39;43004&#39; => &#39;需要接收者关注&#39;,
    &#39;43005&#39; => &#39;需要好友关系&#39;,
    &#39;44001&#39; => &#39;多媒体文件为空&#39;,
    &#39;44002&#39; => &#39;POST的数据包为空&#39;,
    &#39;44003&#39; => &#39;图文消息内容为空&#39;,
    &#39;44004&#39; => &#39;文本消息内容为空&#39;,
    &#39;45001&#39; => &#39;多媒体文件大小超过限制&#39;,
    &#39;45002&#39; => &#39;消息内容超过限制&#39;,
    &#39;45003&#39; => &#39;标题字段超过限制&#39;,
    &#39;45004&#39; => &#39;描述字段超过限制&#39;,
    &#39;45005&#39; => &#39;链接字段超过限制&#39;,
    &#39;45006&#39; => &#39;图片链接字段超过限制&#39;,
    &#39;45007&#39; => &#39;语音播放时间超过限制&#39;,
    &#39;45008&#39; => &#39;图文消息超过限制&#39;,
    &#39;45009&#39; => &#39;接口调用超过限制&#39;,
    &#39;45010&#39; => &#39;创建菜单个数超过限制&#39;,
    &#39;45015&#39; => &#39;回复时间超过限制&#39;,
    &#39;45016&#39; => &#39;系统分组,不允许修改&#39;,
    &#39;45017&#39; => &#39;分组名字过长&#39;,
    &#39;45018&#39; => &#39;分组数量超过上限&#39;,
    &#39;46001&#39; => &#39;不存在媒体数据&#39;,
    &#39;46002&#39; => &#39;不存在的菜单版本&#39;,
    &#39;46003&#39; => &#39;不存在的菜单数据&#39;,
    &#39;46004&#39; => &#39;不存在的用户&#39;,
    &#39;47001&#39; => &#39;解析JSON/XML内容错误&#39;,
    &#39;48001&#39; => &#39;api功能未授权&#39;,
    &#39;50001&#39; => &#39;用户未授权该api&#39;
  );

  /**
   * GET 请求
   * @param string $url
   */
  public static function http_get($url) {
    if (!function_exists(&#39;curl_init&#39;)) {
      die(&#39;curl 未开启&#39;);
    };
    $oCurl = curl_init();
    if (stripos($url, "https://") !== FALSE) {
      curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
      curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE);
    }
    curl_setopt($oCurl, CURLOPT_URL, $url);
    curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1);
    $sContent = curl_exec($oCurl);
    $aStatus = curl_getinfo($oCurl);
    curl_close($oCurl);
    if (intval($aStatus["http_code"]) == 200) {
      return $sContent;
    } else {
      return false;
    }
  }

  /**
   * POST 请求
   * @param string $url
   * @param array $param
   * @return string content
   */
  public static function http_post($url, $param, $httpBuildQuery = false) {
    if (!function_exists(&#39;curl_init&#39;)) {
      die(&#39;curl 未开启&#39;);
    };
    $oCurl = curl_init();
    if (stripos($url, "https://") !== FALSE) {
      curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
      curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false);
    }
    curl_setopt($oCurl, CURLOPT_URL, $url);
    curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1);
//    curl_setopt($oCurl, CURLOPT_HTTPHEADER, $header);//设置HTTP头
    curl_setopt($oCurl, CURLOPT_POST, 1);
    if ($httpBuildQuery) {
      $param = http_build_query($param);
    }
    curl_setopt($oCurl, CURLOPT_POSTFIELDS, $param);
    $sContent = curl_exec($oCurl);
    $aStatus = curl_getinfo($oCurl);
    curl_close($oCurl);
    if (intval($aStatus["http_code"]) == 200) {
      return $sContent;
    } else {
      return false;
    }
  }

  /**
   * 微信api不支持中文转义的json结构
   * @param array $arr
   */
  static function json_encode($arr) {
    $parts = array();
    $is_list = false;
    //Find out if the given array is a numerical array
    $keys = array_keys($arr);
    $max_length = count($arr) - 1;
    if (($keys [0] === 0) && ($keys [$max_length] === $max_length )) { //See if the first key is 0 and last key is length - 1
      $is_list = true;
      for ($i = 0; $i < count($keys); $i ++) { //See if each key correspondes to its position
        if ($i != $keys [$i]) { //A key fails at position check.
          $is_list = false; //It is an associative array.
          break;
        }
      }
    }
    foreach ($arr as $key => $value) {
      if (is_array($value)) { //Custom handling for arrays
        if ($is_list) $parts [] = self::json_encode($value); /* :RECURSION: */
        else $parts [] = &#39;"&#39; . $key . &#39;":&#39; . self::json_encode($value); /* :RECURSION: */
      } else {
        $str = &#39;&#39;;
        if (!$is_list) $str = &#39;"&#39; . $key . &#39;":&#39;;
        //Custom handling for multiple data types
        if (is_numeric($value) && $value < 2000000000) $str .= $value; //Numbers
        elseif ($value === false) $str .= &#39;false&#39;; //The booleans
        elseif ($value === true) $str .= &#39;true&#39;;
        else $str .= &#39;"&#39; . addslashes($value) . &#39;"&#39;;
//All other things
// :TODO: Is there any more datatype we should be in the lookout for? (Object?)
        $parts [] = $str;
      }
    }
    $json = implode(&#39;,&#39;, $parts);
    if ($is_list) return &#39;[&#39; . $json . &#39;]&#39;; //Return numerical JSON
    return &#39;{&#39; . $json . &#39;}&#39;; //Return associative JSON
  }

}

위 내용이 이 글의 전체 내용입니다. 모든 사람이 PHP 프로그래밍을 배우는 데 도움이 될 것입니다.

더 많은 PHP WeChat 고급 인터페이스 그룹 메시징 및 다양한 고객 서비스 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.