>  기사  >  php教程  >  WeChat 인터페이스 PHP 버전 SDK의 WxApi.class.php

WeChat 인터페이스 PHP 버전 SDK의 WxApi.class.php

伊谢尔伦
伊谢尔伦원래의
2016-11-25 14:05:543189검색

그룹화, 사용자 정보 획득, 관심 목록 획득, 매개변수를 사용하여 QR 코드 생성 등을 포함하는 WeChat의 최신 인터페이스 PHP 버전 SDK가 출시되었습니다.

<?php
class OAuthException extends Exception {
     // pass
}
/**
* @package wx
* @author Jianjun Deng
* @version 1.0
*/
class WxAuthV2 {
     public $access_token;
     public $host = "https://api.weixin.qq.com/cgi-bin/";
     public $timeout = 30;
     public $connecttimeout = 30;
     public $ssl_verifypeer = FALSE;
     public $format = &#39;?&#39;;
     public $decode_json = TRUE;
     public $http_info;
     public static $boundary = &#39;&#39;;
     function __construct($access_token = NULL) {
          $this->access_token = $access_token;
     }
     function base64decode($str) {
          return base64_decode(strtr($str.str_repeat(&#39;=&#39;, (4 - strlen($str) % 4)), &#39;-_&#39;, &#39;+/&#39;));
     }
     /**
     * GET wrappwer for oAuthRequest.
     *
     * @return mixed
     */
     function get($url, $parameters = array()) {
          $response = $this->oAuthRequest($url, &#39;GET&#39;, $parameters);
          if ($this->format === &#39;?&#39; && $this->decode_json) {
               return json_decode($response, true);
          }
          return $response;
     }
     /**
     * POST wreapper for oAuthRequest.
     *
     * @return mixed
     */
     function post($url, $parameters = array(), $multi = false) {
          $response = $this->oAuthRequest($url, &#39;POST&#39;, $parameters, $multi );
          if ($this->format === &#39;?&#39; && $this->decode_json) {
               return json_decode($response, true);
          }
          return $response;
     }
     /**
     * DELTE wrapper for oAuthReqeust.
     *
     * @return mixed
     */
     function delete($url, $parameters = array()) {
          $response = $this->oAuthRequest($url, &#39;DELETE&#39;, $parameters);
          if ($this->format === &#39;json&#39; && $this->decode_json) {
               return json_decode($response, true);
          }
          return $response;
     }
     /**
     * Format and sign an OAuth / API request
     *
     * @return string
     * @ignore
     */
     function oAuthRequest($url, $method, $parameters, $multi = false) {
          if (strrpos($url, &#39;http://&#39;) !== 0 && strrpos($url, &#39;https://&#39;) !== 0) {
               $url = "{$this->host}{$url}{$this->format}"."access_token=".$this->access_token;
     }
     switch ($method) {
          case &#39;GET&#39;:
               $url = $url . &#39;&&#39; . http_build_query($parameters);
               return $this->http($url, &#39;GET&#39;);
          default:
               $headers = array();
               if (!$multi && (is_array($parameters) || is_object($parameters)) ) {
                    $body = $this->ch_json_encode($parameters);
               } else {
                    $body = self::build_http_query_multi($parameters);
                    $headers[] = "Content-Type: multipart/form-data; boundary=" . self::$boundary;
               }
               return $this->http($url, $method, $body, $headers);
     }
     }
     /**
     * Make an HTTP request
     *
     * @return string API results
     * @ignore
     */
     function http($url, $method, $postfields = NULL, $headers = array()) {
          $this->http_info = array();
          $ci = curl_init();
          /* Curl settings */
          curl_setopt($ci, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
          curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);
          curl_setopt($ci, CURLOPT_ENCODING, "");
          curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);
          curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, &#39;getHeader&#39;));
          curl_setopt($ci, CURLOPT_HEADER, FALSE);
          switch ($method) {
               case &#39;POST&#39;:
                    curl_setopt($ci, CURLOPT_POST, TRUE);
                    if (!empty($postfields)) {
                         curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
                         $this->postdata = $postfields;
                    }
                    break;
          }
          curl_setopt($ci, CURLOPT_URL, $url );
          curl_setopt($ci, CURLOPT_HTTPHEADER, $headers );
          curl_setopt($ci, CURLINFO_HEADER_OUT, TRUE );
          $response = curl_exec($ci);
          $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
          $this->http_info = array_merge($this->http_info, curl_getinfo($ci));
          $this->url = $url;
          curl_close ($ci);
          return $response;
     }
     /**
     * Get the header info to store.
     *
     * @return int
     * @ignore
     */
     function getHeader($ch, $header) {
          $i = strpos($header, &#39;:&#39;);
          if (!empty($i)) {
               $key = str_replace(&#39;-&#39;, &#39;_&#39;, strtolower(substr($header, 0, $i)));
               $value = trim(substr($header, $i + 2));
               $this->http_header[$key] = $value;
          }
          return strlen($header);
     }
     /**
     * @ignore
     */
     public static function build_http_query_multi($params) {
          if (!$params) return &#39;&#39;;
          uksort($params, &#39;strcmp&#39;);
          $pairs = array();
          self::$boundary = $boundary = uniqid(&#39;------------------&#39;);
          $MPboundary = &#39;--&#39;.$boundary;
          $endMPboundary = $MPboundary. &#39;--&#39;;
          $multipartbody = &#39;&#39;;
          foreach ($params as $parameter => $value) {
               if( in_array($parameter, array(&#39;pic&#39;, &#39;image&#39;)) && $value{0} == &#39;@&#39; ) {
                    $url = ltrim( $value, &#39;@&#39; );
                    $content = file_get_contents( $url );
                    $array = explode( &#39;?&#39;, basename( $url ) );
                    $filename = $array[0];
                    $multipartbody .= $MPboundary . "\r\n";
                    $multipartbody .= &#39;Content-Disposition: form-data; name="&#39; . $parameter . &#39;"; filename="&#39; . $filename . &#39;"&#39;. "\r\n";
                    $multipartbody .= "Content-Type: image/unknown\r\n\r\n";
                    $multipartbody .= $content. "\r\n";
               } else {
                    $multipartbody .= $MPboundary . "\r\n";
                    $multipartbody .= &#39;content-disposition: form-data; name="&#39; . $parameter . "\"\r\n\r\n";
                    $multipartbody .= $value."\r\n";
               }
          }
          $multipartbody .= $endMPboundary;
          return $multipartbody;
     }
     /**
      * 对数组和标量进行 urlencode 处理
      * 通常调用 wphp_json_encode()
      * 处理 json_encode 中文显示问题
      * @param array $data
      * @return string
      */
     function wphp_urlencode($data) {
     if (is_array($data) || is_object($data)) {
     foreach ($data as $k => $v) {
     if (is_scalar($v)) {
     if (is_array($data)) {
     $data[$k] = urlencode($v);
     } else if (is_object($data)) {
     $data->$k = urlencode($v);
     }
     } else if (is_array($data)) {
     $data[$k] = $this->wphp_urlencode($v); //递归调用该函数
     } else if (is_object($data)) {
     $data->$k = $this->wphp_urlencode($v);
     }
     }
     }
     return $data;
     }
     /**
      * json 编码
      *
      * 解决中文经过 json_encode() 处理后显示不直观的情况
      * 如默认会将“中文”变成"\u4e2d\u6587",不直观
      * 如无特殊需求,并不建议使用该函数,直接使用 json_encode 更好,省资源
      * json_encode() 的参数编码格式为 UTF-8 时方可正常工作
      *
      * @param array|object $data
      * @return array|object
      */
     public function ch_json_encode($data) {
     $ret = $this->wphp_urlencode($data);
     $ret = json_encode($ret);
     return urldecode($ret);
     }
}
class WxApi
{
 var $oauth;
     /**
     * 构造函数
     *
     * @access public
     * @param mixed $access_token OAuth认证返回的token
     * @return void
     */
     function __construct($access_token)
     {
          $this->oauth = new WxAuthV2($access_token);
     }
     /**
      * 查询分组 API:http://mp.weixin.qq.com/wiki/index.php?title=%E5%88%86%E7%BB%84%E7%AE%A1%E7%90%86%E6%8E%A5%E5%8F%A3
      * 
     */
     function groups_get()
     {
          $params = array();
          return $this->oauth->get(&#39;groups/get&#39;, $params);//可能是接口的bug不能补全
     }
     /**
      * 创建分组  API:http://mp.weixin.qq.com/wiki/index.php?title=%E5%88%86%E7%BB%84%E7%AE%A1%E7%90%86%E6%8E%A5%E5%8F%A3#.E5.88.9B.E5.BB.BA.E5.88.86.E7.BB.84
      * $name  分组名字(30个字符以内)
      */
     function groups_create($name){
       $params = array("");
       $params[&#39;group&#39;][&#39;name&#39;] = trim($name);
       return $this->oauth->post(&#39;groups/create&#39;,$params );
     }
     /**
      * 修改分组名   API:http://mp.weixin.qq.com/wiki/index.php?title=%E5%88%86%E7%BB%84%E7%AE%A1%E7%90%86%E6%8E%A5%E5%8F%A3#.E5.88.9B.E5.BB.BA.E5.88.86.E7.BB.84
      * POST数据例子:{"group":{"id":108,"name":"test2_modify2"}}
      * $id 分组id,由微信分配
      * $name 分组名字(30个字符以内)
      */
     function groups_update($id,$name){
     $params = array("");
     $params[&#39;group&#39;][&#39;id&#39;] = $this->id_format($id);
     $params[&#39;group&#39;][&#39;name&#39;] = trim($name);
     return $this->oauth->post(&#39;groups/update&#39;,$params);
     }
     /**
      * 移动用户分组   API:http://mp.weixin.qq.com/wiki/index.php?title=%E5%88%86%E7%BB%84%E7%AE%A1%E7%90%86%E6%8E%A5%E5%8F%A3#.E5.88.9B.E5.BB.BA.E5.88.86.E7.BB.84
      * {"openid":"oDF3iYx0ro3_7jD4HFRDfrjdCM58","to_groupid":108}
      *  $openid 用户唯一标识符
      *  $to_groupid 分组id
      * $name 分组名字(30个字符以内)
      */
     function groups_members_update($openid,$to_groupid){
     $params = array("");
     $params[&#39;group&#39;][&#39;openid&#39;] = trim($openid);
     $params[&#39;group&#39;][&#39;to_groupid&#39;] = trim($to_groupid);
     return $this->oauth->post(&#39;groups/members/update&#39;,$params);
     }
     /**
      * 获取关注列表 一次最多返回1万
      * http://mp.weixin.qq.com/wiki/index.php?title=%E8%8E%B7%E5%8F%96%E5%85%B3%E6%B3%A8%E8%80%85%E5%88%97%E8%A1%A8
      * 
      * 
      */
     function user_get($next_openid="")
     {
     $params = array();
     $params[&#39;next_openid&#39;]=$next_openid;
     return $this->oauth->get(&#39;user/get&#39;, $params);//可能是接口的bug不能补全
     }
     /**
      * 获取用户基本信息
      *Array ( [subscribe] => 1 
      *[openid] => of76zt-k-bMZZaCip16MKfGAigec 
      *[nickname] => _魏什么。 
      *[sex] => 1 
      *[language] => zh_TW 
      *[city] => 福州 
      *[province] => 福建
      *[country] => 中国
      *[headimgurl] => http://wx.qlogo.cn/mmopen/kaTUtbf9iaBY32aSBLkcxWVDicjlhHSiapLWDcia1ic948tYdmhJQLQa8FpB7MdqpDNQHOVUWoVfPHjlymJ1z1fyStAUyduicvAbmh/0 
      *[subscribe_time] => 1381576837 )
      */
     function user_info($openid="")
     {
     $params = array();
     $params[&#39;openid&#39;]=$openid;
     return $this->oauth->get(&#39;user/info&#39;, $params);//可能是接口的bug不能补全
     }
     /*
      * 发送客服文本消息 
      * http://mp.weixin.qq.com/wiki/index.php?title=%E5%8F%91%E9%80%81%E5%AE%A2%E6%9C%8D%E6%B6%88%E6%81%AF
      */
     function message_custom_send_text($touser,$content){
     $params = array("");
     $params[&#39;touser&#39;]=trim($touser);
     $params[&#39;msgtype&#39;]="text";
     $params[&#39;text&#39;]["content"]=$content;
     return $this->oauth->post(&#39;message/custom/send&#39;,$params);
     }
     /*
      * 发送客服图片消息
     * http://mp.weixin.qq.com/wiki/index.php?title=%E5%8F%91%E9%80%81%E5%AE%A2%E6%9C%8D%E6%B6%88%E6%81%AF
     *  access_token 是 调用接口凭证
touser 是 普通用户openid
msgtype 是 消息类型,image
media_id 是 发送的图片的媒体ID
     */
     function message_custom_send_image($touser,$media_id){
     $params = array("");
     $params[&#39;touser&#39;]=trim($touser);
     $params[&#39;msgtype&#39;]="image";
     $params[&#39;image&#39;]["media_id"]=$media_id;
     return $this->oauth->post(&#39;message/custom/send&#39;,$params);
     }
     /*
      * 发送客服语音消息
     * http://mp.weixin.qq.com/wiki/index.php?title=%E5%8F%91%E9%80%81%E5%AE%A2%E6%9C%8D%E6%B6%88%E6%81%AF
     *  access_token 是 调用接口凭证
     touser 是 普通用户openid
     msgtype 是 消息类型,image
     media_id 是 发送的图片的媒体ID
     */
     function message_custom_send_voice($touser,$media_id){
     $params = array("");
     $params[&#39;touser&#39;]=trim($touser);
     $params[&#39;msgtype&#39;]="voice";
     $params[&#39;voice&#39;]["media_id"]=$media_id;
     return $this->oauth->post(&#39;message/custom/send&#39;,$params);
     }
     /*
      * 发送客服图文消息 图文消息条数限制在10条以内。
     * http://mp.weixin.qq.com/wiki/index.php?title=%E5%8F%91%E9%80%81%E5%AE%A2%E6%9C%8D%E6%B6%88%E6%81%AF
     *  access_token 是 调用接口凭证
     *  touser 是 普通用户openid
     *  msgtype 是 消息类型,image
     *  media_id 是 发送的图片的媒体ID
     *  $newsArray[0]=array(
         "title"=>"",
         "description"=>"",
         "url"=>"",
         "picurl"=>""
     )
     */
     function message_custom_send_news($touser,$newsArray){
     $params = array("");
     $params[&#39;touser&#39;]=trim($touser);
     $params[&#39;msgtype&#39;]="news";
     $params[&#39;news&#39;]["articles"]=$newsArray;
     return $this->oauth->post(&#39;message/custom/send&#39;,$params);
     }
     
     /*
      * 创建临时二维码ticket 
      * http://mp.weixin.qq.com/wiki/index.php?title=%E7%94%9F%E6%88%90%E5%B8%A6%E5%8F%82%E6%95%B0%E7%9A%84%E4%BA%8C%E7%BB%B4%E7%A0%81
      * expire_seconds 该二维码有效时间,以秒为单位。 最大不超过1800。
  *action_name 二维码类型,QR_SCENE为临时,QR_LIMIT_SCENE为永久
  *action_info 二维码详细信息
  *scene_id 场景值ID,临时二维码时为32位整型,永久二维码时最大值为1000
      */
     function qrcode_create_scene($expire_seconds="900",$scene_id){
     $params = array("");
     $params[&#39;expire_seconds&#39;]=$expire_seconds;
     $params[&#39;action_name&#39;]="QR_SCENE";
     $params[&#39;action_info&#39;]["scene"]["scene_id"]=$scene_id;
     return $this->oauth->post(&#39;qrcode/create&#39;,$params);
     
     }
     /*
      * 创建永久二维码ticket
     * http://mp.weixin.qq.com/wiki/index.php?title=%E7%94%9F%E6%88%90%E5%B8%A6%E5%8F%82%E6%95%B0%E7%9A%84%E4%BA%8C%E7%BB%B4%E7%A0%81
     * expire_seconds 该二维码有效时间,以秒为单位。 最大不超过1800。
     *action_name 二维码类型,QR_LIMIT_SCENE为永久
     *action_info 二维码详细信息
     *scene_id 场景值ID,临时二维码时为32位整型,永久二维码时最大值为1000
     */
     function qrcode_create_forever($action_name="",$scene_id){
     $params = array("");
     $params[&#39;action_name&#39;]="QR_LIMIT_SCENE";
     $params[&#39;action_info&#39;]["scene"]["scene_id"]=$scene_id;
     return $this->oauth->post(&#39;qrcode/create&#39;,$params);
     }
     /*
      * 通过ticket换取二维码
      * 
      */
     function showqrcode($ticket){
     return file_get_contents("https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket={$ticket}");
     }
     
     protected function id_format(&$id) {
          if ( is_float($id) ) {
               $id = number_format($id, 0, &#39;&#39;, &#39;&#39;);
          } elseif ( is_string($id) ) {
               $id = trim($id);
          }
     }
}


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