深巷老酒 發表於 2019-6-25 10:39:00

微信公众号开发

<p>微信公众号开发时:关注回复等需要单独开发;</p>
<p>根据提供的url地址:</p>
<p>1、公众中开启开发配置,</p>
<p>启用AppSecret,设置ip白名单,白名单中加入</p>
<p>然后进行服务器配置</p>
<p>URL地址的填写就是微信公众的消息等访问地址路径;http://www.aa.com/wx/index/index.html</p>
<p>Token是自己设置的,首先要有URL这个路径,</p>
<p>url中的验证:</p>
<div class="cnblogs_code">
<pre>&lt;?<span style="color: rgba(0, 0, 0, 1)">php
namespace app\wx\controller;
</span><span style="color: rgba(0, 0, 255, 1)">use</span><span style="color: rgba(0, 0, 0, 1)"> think\Controller;

</span><span style="color: rgba(0, 128, 128, 1)">header</span>("Content-type: text/html; charset=utf-8"<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">define</span>("TOKEN","hengyuanjiaoyu");    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义识别码 需要跟微信公众平台上保持一致</span>
<span style="color: rgba(0, 0, 255, 1)">class</span> Index <span style="color: rgba(0, 0, 255, 1)">extends</span><span style="color: rgba(0, 0, 0, 1)"> Controller
{
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> index()
    {
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 微信验证token</span>
      <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">valid();
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">微信验证</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> valid(){
      </span><span style="color: rgba(128, 0, 128, 1)">$echoStr</span> = <span style="color: rgba(128, 0, 128, 1)">$_GET</span>["echostr"<span style="color: rgba(0, 0, 0, 1)">];
      </span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">checkSignature()){
         </span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 128, 1)">$echoStr</span><span style="color: rgba(0, 0, 0, 1)">;
         </span><span style="color: rgba(0, 0, 255, 1)">exit</span><span style="color: rgba(0, 0, 0, 1)">;
      }
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">检查微信签名</span>
    <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> checkSignature(){
      </span><span style="color: rgba(128, 0, 128, 1)">$signature</span> = <span style="color: rgba(128, 0, 128, 1)">$_GET</span>["signature"<span style="color: rgba(0, 0, 0, 1)">];
      </span><span style="color: rgba(128, 0, 128, 1)">$timestamp</span> = <span style="color: rgba(128, 0, 128, 1)">$_GET</span>["timestamp"<span style="color: rgba(0, 0, 0, 1)">];
      </span><span style="color: rgba(128, 0, 128, 1)">$nonce</span> = <span style="color: rgba(128, 0, 128, 1)">$_GET</span>["nonce"<span style="color: rgba(0, 0, 0, 1)">];   
               
      </span><span style="color: rgba(128, 0, 128, 1)">$token</span> =<span style="color: rgba(0, 0, 0, 1)"> TOKEN;
      </span><span style="color: rgba(128, 0, 128, 1)">$tmpArr</span> = <span style="color: rgba(0, 0, 255, 1)">array</span>(<span style="color: rgba(128, 0, 128, 1)">$token</span>, <span style="color: rgba(128, 0, 128, 1)">$timestamp</span>, <span style="color: rgba(128, 0, 128, 1)">$nonce</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 128, 128, 1)">sort</span>(<span style="color: rgba(128, 0, 128, 1)">$tmpArr</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(128, 0, 128, 1)">$tmpStr</span> = <span style="color: rgba(0, 128, 128, 1)">implode</span>(<span style="color: rgba(128, 0, 128, 1)">$tmpArr</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(128, 0, 128, 1)">$tmpStr</span> = <span style="color: rgba(0, 128, 128, 1)">sha1</span>(<span style="color: rgba(128, 0, 128, 1)">$tmpStr</span><span style="color: rgba(0, 0, 0, 1)">);
      
      </span><span style="color: rgba(0, 0, 255, 1)">if</span>( <span style="color: rgba(128, 0, 128, 1)">$tmpStr</span> == <span style="color: rgba(128, 0, 128, 1)">$signature</span><span style="color: rgba(0, 0, 0, 1)"> ){
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
      }</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      }
    }
}</span></pre>
</div>
<p>&nbsp;</p>
<p>消息加密秘钥自动生成,</p>
<p>消息加解密方式选择明文模式就可</p>
<p><img src="https://img2018.cnblogs.com/blog/803621/201908/803621-20190806165207466-991979370.png"></p>
<p>&nbsp;</p>
<p>在地址中进行开发回复:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">require</span>(<span style="color: rgba(0, 128, 128, 1)">dirname</span>(<span style="color: rgba(255, 0, 255, 1)">__FILE__</span>) . '/api.class.php'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">require</span>(<span style="color: rgba(0, 128, 128, 1)">dirname</span>(<span style="color: rgba(255, 0, 255, 1)">__FILE__</span>) . '/wechat.class.php'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$weixin</span> = <span style="color: rgba(0, 0, 255, 1)">new</span> core_lib_wechat(<span style="color: rgba(128, 0, 128, 1)">$weixinconfig</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$weixin</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">valid();
</span><span style="color: rgba(128, 0, 128, 1)">$api</span> = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> weixinapi();
</span><span style="color: rgba(128, 0, 128, 1)">$weburl</span> .= <span style="color: rgba(128, 0, 128, 1)">$api</span>-&gt;<span style="color: rgba(0, 128, 128, 1)">dir</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$type</span> = <span style="color: rgba(128, 0, 128, 1)">$weixin</span>-&gt;getRev()-&gt;<span style="color: rgba(0, 0, 0, 1)">getRevType();
</span><span style="color: rgba(128, 0, 128, 1)">$wxid</span> = <span style="color: rgba(128, 0, 128, 1)">$weixin</span>-&gt;getRev()-&gt;<span style="color: rgba(0, 0, 0, 1)">getRevFrom();
</span><span style="color: rgba(128, 0, 128, 1)">$data</span> = <span style="color: rgba(128, 0, 128, 1)">$weixin</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">getRevData();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">上报地理信息</span>
<span style="color: rgba(128, 0, 128, 1)">$loc</span> = <span style="color: rgba(128, 0, 128, 1)">$weixin</span>-&gt;getRev()-&gt;<span style="color: rgba(0, 0, 0, 1)">getUserLocation();
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$loc</span><span style="color: rgba(0, 0, 0, 1)">) {
    </span><span style="color: rgba(128, 0, 128, 1)">$api</span>-&gt;updatelocation(<span style="color: rgba(128, 0, 128, 1)">$wxid</span>, <span style="color: rgba(128, 0, 128, 1)">$loc</span><span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(128, 0, 128, 1)">$reMsg</span> = ""<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">switch</span> (<span style="color: rgba(128, 0, 128, 1)">$type</span><span style="color: rgba(0, 0, 0, 1)">) {
    </span><span style="color: rgba(0, 0, 255, 1)">case</span> 'text':
      <span style="color: rgba(128, 0, 128, 1)">$content</span> = <span style="color: rgba(128, 0, 128, 1)">$weixin</span>-&gt;getRev()-&gt;<span style="color: rgba(0, 0, 0, 1)">getRevContent();
      </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">case</span> 'event':
      <span style="color: rgba(128, 0, 128, 1)">$event</span> = <span style="color: rgba(128, 0, 128, 1)">$weixin</span>-&gt;getRev()-&gt;<span style="color: rgba(0, 0, 0, 1)">getRevEvent();
      </span><span style="color: rgba(128, 0, 128, 1)">$content</span> =json_encode(<span style="color: rgba(128, 0, 128, 1)">$event</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">case</span> 'image':
      <span style="color: rgba(128, 0, 128, 1)">$content</span> = json_encode(<span style="color: rgba(128, 0, 128, 1)">$weixin</span>-&gt;getRev()-&gt;<span style="color: rgba(0, 0, 0, 1)">getRevPic());
      </span><span style="color: rgba(128, 0, 128, 1)">$reMsg</span> = "图片很美!"<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">case</span> 'location':
      <span style="color: rgba(128, 0, 128, 1)">$content</span> = json_encode(<span style="color: rgba(128, 0, 128, 1)">$weixin</span>-&gt;getRev()-&gt;<span style="color: rgba(0, 0, 0, 1)">getRevGeo());
      </span><span style="color: rgba(128, 0, 128, 1)">$reMsg</span> = "您所在的位置很安全!"<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">default</span>:
      <span style="color: rgba(128, 0, 128, 1)">$reMsg</span> = <span style="color: rgba(128, 0, 128, 1)">$weixinconfig</span>['help'<span style="color: rgba(0, 0, 0, 1)">];
}
</span><span style="color: rgba(128, 0, 128, 1)">$api</span>-&gt;saveMsg(<span style="color: rgba(128, 0, 128, 1)">$content</span>, <span style="color: rgba(128, 0, 128, 1)">$wxid</span>, <span style="color: rgba(128, 0, 128, 1)">$type</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$reMsg</span><span style="color: rgba(0, 0, 0, 1)">) {
    </span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 128, 1)">$weixin</span>-&gt;text(<span style="color: rgba(128, 0, 128, 1)">$reMsg</span>)-&gt;reply();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">公众号回复</span>
    <span style="color: rgba(0, 0, 255, 1)">exit</span><span style="color: rgba(0, 0, 0, 1)">;
}</span></pre>
</div>
<p>&nbsp;微信公众号开发类</p>
<div class="cnblogs_code"><img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_fdc329f9-6084-427f-9895-ecbea72abadb" class="code_img_opened lazyload" style="display: none" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_fdc329f9-6084-427f-9895-ecbea72abadb" class="cnblogs_code_hide">
<pre>&lt;?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
*    微信公众平台PHP-SDK, 官方API
*@version 1.2
*usage:
*   $options = array(
*            'token'=&gt;'tokenaccesskey', //填写你设定的key
*            'appid'=&gt;'wxdk1234567890', //填写高级调用功能的app id
*            'appsecret'=&gt;'xxxxxxxxxxxxxxxxxxx', //填写高级调用功能的密钥
*      );
*   $weObj = new Wechat($options);
*   $weObj-&gt;valid();
*   $type = $weObj-&gt;getRev()-&gt;getRevType();
*   switch($type) {
*         case Wechat::MSGTYPE_TEXT:
*               $weObj-&gt;text("hello, I'm wechat")-&gt;reply();
*               exit;
*               break;
*         case Wechat::MSGTYPE_EVENT:
*               ....
*               break;
*         case Wechat::MSGTYPE_IMAGE:
*               ...
*               break;
*         default:
*               $weObj-&gt;text("help info")-&gt;reply();
*   }
*   //获取菜单操作:
*   $menu = $weObj-&gt;getMenu();
*   //设置菜单
*   $newmenu =array(
*         "button"=&gt;
*               array(
*                   array('type'=&gt;'click','name'=&gt;'最新消息','key'=&gt;'MENU_KEY_NEWS'),
*                   array('type'=&gt;'view','name'=&gt;'我要搜索','url'=&gt;'http://www.baidu.com'),
*                   )
*          );
*   $result = $weObj-&gt;createMenu($newmenu);
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> core_lib_wechat
{
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> MSGTYPE_TEXT = 'text'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> MSGTYPE_IMAGE = 'image'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> MSGTYPE_LOCATION = 'location'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> MSGTYPE_LINK = 'link'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> MSGTYPE_EVENT = 'event'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> MSGTYPE_MUSIC = 'music'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> MSGTYPE_NEWS = 'news'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> MSGTYPE_VOICE = 'voice'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> MSGTYPE_VIDEO = 'video'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> API_URL_PREFIX = 'https://api.weixin.qq.com/cgi-bin'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> AUTH_URL = '/token?grant_type=client_credential&amp;'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> MENU_CREATE_URL = '/menu/create?'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> MENU_GET_URL = '/menu/get?'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> MENU_DELETE_URL = '/menu/delete?'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> MEDIA_GET_URL = '/media/get?'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> QRCODE_CREATE_URL='/qrcode/create?'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> QR_SCENE = 0<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> QR_LIMIT_SCENE = 1<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> QRCODE_IMG_URL='https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket='<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> USER_GET_URL='/user/get?'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> USER_INFO_URL='/user/info?'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> GROUP_GET_URL='/groups/get?'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> GROUP_CREATE_URL='/groups/create?'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> GROUP_UPDATE_URL='/groups/update?'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> GROUP_MEMBER_UPDATE_URL='/groups/members/update?'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> CUSTOM_SEND_URL='/message/custom/send?'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> OAUTH_PREFIX = 'https://open.weixin.qq.com/connect/oauth2'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> OAUTH_AUTHORIZE_URL = '/authorize?'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> OAUTH_TOKEN_PREFIX = 'https://api.weixin.qq.com/sns/oauth2'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> OAUTH_TOKEN_URL = '/access_token?'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> OAUTH_REFRESH_URL = '/refresh_token?'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> OAUTH_USERINFO_URL = 'https://api.weixin.qq.com/sns/userinfo?'<span style="color: rgba(0, 0, 0, 1)">;
   
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(128, 0, 128, 1)">$token</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(128, 0, 128, 1)">$appid</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(128, 0, 128, 1)">$appsecret</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(128, 0, 128, 1)">$access_token</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(128, 0, 128, 1)">$user_token</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(128, 0, 128, 1)">$_msg</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(128, 0, 128, 1)">$_funcflag</span> = <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(128, 0, 128, 1)">$_receive</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(128, 0, 128, 1)">$debug</span> =<span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(128, 0, 128, 1)">$errCode</span> = 40001<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(128, 0, 128, 1)">$errMsg</span> = "no access"<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(128, 0, 128, 1)">$_logcallback</span><span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(128, 0, 128, 1)">$_charset</span> = 'utf-8'<span style="color: rgba(0, 0, 0, 1)">;
   
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> __construct(<span style="color: rgba(128, 0, 128, 1)">$options</span><span style="color: rgba(0, 0, 0, 1)">)
    {
      </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;token = <span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$options</span>['token'])?<span style="color: rgba(128, 0, 128, 1)">$options</span>['token']:''<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;appid = <span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$options</span>['appid'])?<span style="color: rgba(128, 0, 128, 1)">$options</span>['appid']:''<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;appsecret = <span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$options</span>['appsecret'])?<span style="color: rgba(128, 0, 128, 1)">$options</span>['appsecret']:''<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;debug = <span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$options</span>['debug'])?<span style="color: rgba(128, 0, 128, 1)">$options</span>['debug']:<span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_logcallback = <span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$options</span>['logcallback'])?<span style="color: rgba(128, 0, 128, 1)">$options</span>['logcallback']:<span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * For weixin server validation
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>   
    <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> checkSignature()
    {
      </span><span style="color: rgba(128, 0, 128, 1)">$signature</span> = <span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$_GET</span>["signature"])?<span style="color: rgba(128, 0, 128, 1)">$_GET</span>["signature"]:''<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$timestamp</span> = <span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$_GET</span>["timestamp"])?<span style="color: rgba(128, 0, 128, 1)">$_GET</span>["timestamp"]:''<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$nonce</span> = <span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$_GET</span>["nonce"])?<span style="color: rgba(128, 0, 128, 1)">$_GET</span>["nonce"]:''<span style="color: rgba(0, 0, 0, 1)">;
               
      </span><span style="color: rgba(128, 0, 128, 1)">$token</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">token;
      </span><span style="color: rgba(128, 0, 128, 1)">$tmpArr</span> = <span style="color: rgba(0, 0, 255, 1)">array</span>(<span style="color: rgba(128, 0, 128, 1)">$token</span>, <span style="color: rgba(128, 0, 128, 1)">$timestamp</span>, <span style="color: rgba(128, 0, 128, 1)">$nonce</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 128, 128, 1)">sort</span>(<span style="color: rgba(128, 0, 128, 1)">$tmpArr</span>,<span style="color: rgba(0, 0, 0, 1)"> SORT_STRING);
      </span><span style="color: rgba(128, 0, 128, 1)">$tmpStr</span> = <span style="color: rgba(0, 128, 128, 1)">implode</span>( <span style="color: rgba(128, 0, 128, 1)">$tmpArr</span><span style="color: rgba(0, 0, 0, 1)"> );
      </span><span style="color: rgba(128, 0, 128, 1)">$tmpStr</span> = <span style="color: rgba(0, 128, 128, 1)">sha1</span>( <span style="color: rgba(128, 0, 128, 1)">$tmpStr</span><span style="color: rgba(0, 0, 0, 1)"> );
      
      </span><span style="color: rgba(0, 0, 255, 1)">if</span>( <span style="color: rgba(128, 0, 128, 1)">$tmpStr</span> == <span style="color: rgba(128, 0, 128, 1)">$signature</span><span style="color: rgba(0, 0, 0, 1)"> ){
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
      }</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      }
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * For weixin server validation
   * @param bool $return 是否返回
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> valid(<span style="color: rgba(128, 0, 128, 1)">$return</span>=<span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">)
    {
      </span><span style="color: rgba(128, 0, 128, 1)">$echoStr</span> = <span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$_GET</span>["echostr"]) ? <span style="color: rgba(128, 0, 128, 1)">$_GET</span>["echostr"]: ''<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$return</span><span style="color: rgba(0, 0, 0, 1)">) {
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$echoStr</span><span style="color: rgba(0, 0, 0, 1)">) {
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">checkSignature())
                        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$echoStr</span><span style="color: rgba(0, 0, 0, 1)">;
                  </span><span style="color: rgba(0, 0, 255, 1)">else</span>
                        <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
                } </span><span style="color: rgba(0, 0, 255, 1)">else</span>
                  <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">checkSignature();
      } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$echoStr</span><span style="color: rgba(0, 0, 0, 1)">) {
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">checkSignature())
                        </span><span style="color: rgba(0, 0, 255, 1)">die</span>(<span style="color: rgba(128, 0, 128, 1)">$echoStr</span><span style="color: rgba(0, 0, 0, 1)">);
                  </span><span style="color: rgba(0, 0, 255, 1)">else</span>
                        <span style="color: rgba(0, 0, 255, 1)">die</span>('no access'<span style="color: rgba(0, 0, 0, 1)">);
                }</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">checkSignature())
                        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
                  </span><span style="color: rgba(0, 0, 255, 1)">else</span>
                        <span style="color: rgba(0, 0, 255, 1)">die</span>('no access'<span style="color: rgba(0, 0, 0, 1)">);
                }
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 设置发送消息
   * @param array $msg 消息数组
   * @param bool $append 是否在原消息数组追加
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> Message(<span style="color: rgba(128, 0, 128, 1)">$msg</span> = '',<span style="color: rgba(128, 0, 128, 1)">$append</span> = <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">){
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 128, 128, 1)">is_null</span>(<span style="color: rgba(128, 0, 128, 1)">$msg</span><span style="color: rgba(0, 0, 0, 1)">)) {
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_msg =<span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">();
            }</span><span style="color: rgba(0, 0, 255, 1)">elseif</span> (<span style="color: rgba(0, 128, 128, 1)">is_array</span>(<span style="color: rgba(128, 0, 128, 1)">$msg</span><span style="color: rgba(0, 0, 0, 1)">)) {
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$append</span><span style="color: rgba(0, 0, 0, 1)">)
                  </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_msg = <span style="color: rgba(0, 128, 128, 1)">array_merge</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_msg,<span style="color: rgba(128, 0, 128, 1)">$msg</span><span style="color: rgba(0, 0, 0, 1)">);
                </span><span style="color: rgba(0, 0, 255, 1)">else</span>
                  <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_msg = <span style="color: rgba(128, 0, 128, 1)">$msg</span><span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">return $this-&gt;_msg;</span>
            } <span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">return $this-&gt;_msg;</span>
<span style="color: rgba(0, 0, 0, 1)">            }
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;iconvUtf(<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">_msg);
    }
   
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> setFuncFlag(<span style="color: rgba(128, 0, 128, 1)">$flag</span><span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_funcflag = <span style="color: rgba(128, 0, 128, 1)">$flag</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">function</span> <span style="color: rgba(0, 128, 128, 1)">log</span>(<span style="color: rgba(128, 0, 128, 1)">$log</span><span style="color: rgba(0, 0, 0, 1)">){
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;debug &amp;&amp; <span style="color: rgba(0, 128, 128, 1)">function_exists</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">_logcallback)) {
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 128, 128, 1)">is_array</span>(<span style="color: rgba(128, 0, 128, 1)">$log</span>)) <span style="color: rgba(128, 0, 128, 1)">$log</span> = <span style="color: rgba(0, 128, 128, 1)">print_r</span>(<span style="color: rgba(128, 0, 128, 1)">$log</span>,<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 128, 128, 1)">call_user_func</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_logcallback,<span style="color: rgba(128, 0, 128, 1)">$log</span><span style="color: rgba(0, 0, 0, 1)">);
            }
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 获取微信服务器发来的信息
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> getRev()
    {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive) <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$postStr</span> = <span style="color: rgba(0, 128, 128, 1)">file_get_contents</span>("php://input"<span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 128, 128, 1)">log</span>(<span style="color: rgba(128, 0, 128, 1)">$postStr</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 255, 1)">empty</span>(<span style="color: rgba(128, 0, 128, 1)">$postStr</span><span style="color: rgba(0, 0, 0, 1)">)) {
            </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive = (<span style="color: rgba(0, 0, 255, 1)">array</span>)<span style="color: rgba(0, 128, 128, 1)">simplexml_load_string</span>(<span style="color: rgba(128, 0, 128, 1)">$postStr</span>, 'SimpleXMLElement',<span style="color: rgba(0, 0, 0, 1)"> LIBXML_NOCDATA);
            </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;iconvUtf(<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">_receive);
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 获取微信服务器发来的信息
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> getRevData()
    {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;iconvUtf(<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">_receive);
    }
      
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 获取消息发送者
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> getRevFrom() {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['FromUserName'<span style="color: rgba(0, 0, 0, 1)">]))
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['FromUserName'<span style="color: rgba(0, 0, 0, 1)">];
      </span><span style="color: rgba(0, 0, 255, 1)">else</span>
            <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 获取消息接受者
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> getRevTo() {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['ToUserName'<span style="color: rgba(0, 0, 0, 1)">]))
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['ToUserName'<span style="color: rgba(0, 0, 0, 1)">];
      </span><span style="color: rgba(0, 0, 255, 1)">else</span>
            <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 获取接收消息的类型
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> getRevType() {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['MsgType'<span style="color: rgba(0, 0, 0, 1)">]))
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['MsgType'<span style="color: rgba(0, 0, 0, 1)">];
      </span><span style="color: rgba(0, 0, 255, 1)">else</span>
            <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 获取消息ID
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> getRevID() {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['MsgId'<span style="color: rgba(0, 0, 0, 1)">]))
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['MsgId'<span style="color: rgba(0, 0, 0, 1)">];
      </span><span style="color: rgba(0, 0, 255, 1)">else</span>
            <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 获取消息发送时间
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> getRevCtime() {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['CreateTime'<span style="color: rgba(0, 0, 0, 1)">]))
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['CreateTime'<span style="color: rgba(0, 0, 0, 1)">];
      </span><span style="color: rgba(0, 0, 255, 1)">else</span>
            <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 获取接收消息内容正文
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> getRevContent(){
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['Content'<span style="color: rgba(0, 0, 0, 1)">]))
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['Content'<span style="color: rgba(0, 0, 0, 1)">];
      </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['Recognition'])) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取语音识别文字内容,需申请开通</span>
            <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['Recognition'<span style="color: rgba(0, 0, 0, 1)">];
      </span><span style="color: rgba(0, 0, 255, 1)">else</span>
            <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 获取接收消息图片
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> getRevPic(){
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['PicUrl'<span style="color: rgba(0, 0, 0, 1)">]))
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['PicUrl'<span style="color: rgba(0, 0, 0, 1)">];
      </span><span style="color: rgba(0, 0, 255, 1)">else</span>
            <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 获取接收消息链接
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> getRevLink(){
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['Url'<span style="color: rgba(0, 0, 0, 1)">])){
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">(
                </span>'url'=&gt;<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['Url'],
                'title'=&gt;<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['Title'],
                'description'=&gt;<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['Description'<span style="color: rgba(0, 0, 0, 1)">]
            );
      } </span><span style="color: rgba(0, 0, 255, 1)">else</span>
            <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 获取接收地理位置
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> getRevGeo(){
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['Location_X'<span style="color: rgba(0, 0, 0, 1)">])){
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">(
                </span>'x'=&gt;<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['Location_X'],
                'y'=&gt;<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['Location_Y'],
                'scale'=&gt;<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['Scale'],
                'label'=&gt;<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['Label'<span style="color: rgba(0, 0, 0, 1)">]
            );
      } </span><span style="color: rgba(0, 0, 255, 1)">else</span>
            <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 获取接收事件推送
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> getRevEvent(){
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['Event'<span style="color: rgba(0, 0, 0, 1)">])){
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">(
                </span>'event'=&gt;<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['Event'],
                'key'=&gt;<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['EventKey'],
                'Latitude'=&gt;<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['Latitude'],
                'Longitude'=&gt;<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['Longitude'],
                'Precision'=&gt;<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['Precision'],<span style="color: rgba(0, 0, 0, 1)">
            );
      } </span><span style="color: rgba(0, 0, 255, 1)">else</span>
            <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 获取接收语言推送
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> getRevVoice(){
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['MediaId'<span style="color: rgba(0, 0, 0, 1)">])){
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">(
                </span>'mediaid'=&gt;<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['MediaId'],
                'format'=&gt;<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['Format'],<span style="color: rgba(0, 0, 0, 1)">
            );
      } </span><span style="color: rgba(0, 0, 255, 1)">else</span>
            <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 获取接收视频推送
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> getRevVideo(){
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['MediaId'<span style="color: rgba(0, 0, 0, 1)">])){
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">(
                  </span>'mediaid'=&gt;<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['MediaId'],
                  'thumbmediaid'=&gt;<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['ThumbMediaId'<span style="color: rgba(0, 0, 0, 1)">]
            );
      } </span><span style="color: rgba(0, 0, 255, 1)">else</span>
            <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 获取接收TICKET
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> getRevTicket(){
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['Ticket'<span style="color: rgba(0, 0, 0, 1)">])){
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['Ticket'<span style="color: rgba(0, 0, 0, 1)">];
    } </span><span style="color: rgba(0, 0, 255, 1)">else</span>
      <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">function</span> xmlSafeStr(<span style="color: rgba(128, 0, 128, 1)">$str</span><span style="color: rgba(0, 0, 0, 1)">)
    {   
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> '&lt;!/",'',<span style="color: rgba(128, 0, 128, 1)">$str</span>).']]&gt;'<span style="color: rgba(0, 0, 0, 1)">;   
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 数据XML编码
   * @param mixed $data 数据
   * @return string
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">function</span> data_to_xml(<span style="color: rgba(128, 0, 128, 1)">$data</span><span style="color: rgba(0, 0, 0, 1)">) {
      </span><span style="color: rgba(128, 0, 128, 1)">$xml</span> = ''<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">foreach</span> (<span style="color: rgba(128, 0, 128, 1)">$data</span> <span style="color: rgba(0, 0, 255, 1)">as</span> <span style="color: rgba(128, 0, 128, 1)">$key</span> =&gt; <span style="color: rgba(128, 0, 128, 1)">$val</span><span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 128, 128, 1)">is_numeric</span>(<span style="color: rgba(128, 0, 128, 1)">$key</span>) &amp;&amp; <span style="color: rgba(128, 0, 128, 1)">$key</span> = "item id=\"<span style="color: rgba(128, 0, 128, 1)">$key</span>\""<span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(128, 0, 128, 1)">$xml</span>    .="&lt;<span style="color: rgba(128, 0, 128, 1)">$key</span>&gt;"<span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(128, 0, 128, 1)">$xml</span>    .=( <span style="color: rgba(0, 128, 128, 1)">is_array</span>(<span style="color: rgba(128, 0, 128, 1)">$val</span>) || <span style="color: rgba(0, 128, 128, 1)">is_object</span>(<span style="color: rgba(128, 0, 128, 1)">$val</span>)) ? self::data_to_xml(<span style="color: rgba(128, 0, 128, 1)">$val</span>): self::xmlSafeStr(<span style="color: rgba(128, 0, 128, 1)">$val</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">list</span>(<span style="color: rgba(128, 0, 128, 1)">$key</span>, ) = <span style="color: rgba(0, 128, 128, 1)">explode</span>(' ', <span style="color: rgba(128, 0, 128, 1)">$key</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(128, 0, 128, 1)">$xml</span>    .="&lt;/<span style="color: rgba(128, 0, 128, 1)">$key</span>&gt;"<span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$xml</span><span style="color: rgba(0, 0, 0, 1)">;
    }   
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * XML编码
   * @param mixed $data 数据
   * @param string $root 根节点名
   * @param string $item 数字索引的子节点名
   * @param string $attr 根节点属性
   * @param string $id   数字索引子节点key转换的属性名
   * @param string $encoding 数据编码
   * @return string
    </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> xml_encode(<span style="color: rgba(128, 0, 128, 1)">$data</span>, <span style="color: rgba(128, 0, 128, 1)">$root</span>='xml', <span style="color: rgba(128, 0, 128, 1)">$item</span>='item', <span style="color: rgba(128, 0, 128, 1)">$attr</span>='', <span style="color: rgba(128, 0, 128, 1)">$id</span>='id', <span style="color: rgba(128, 0, 128, 1)">$encoding</span>='utf-8'<span style="color: rgba(0, 0, 0, 1)">) {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 128, 128, 1)">is_array</span>(<span style="color: rgba(128, 0, 128, 1)">$attr</span><span style="color: rgba(0, 0, 0, 1)">)){
            </span><span style="color: rgba(128, 0, 128, 1)">$_attr</span> = <span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">();
            </span><span style="color: rgba(0, 0, 255, 1)">foreach</span> (<span style="color: rgba(128, 0, 128, 1)">$attr</span> <span style="color: rgba(0, 0, 255, 1)">as</span> <span style="color: rgba(128, 0, 128, 1)">$key</span> =&gt; <span style="color: rgba(128, 0, 128, 1)">$value</span><span style="color: rgba(0, 0, 0, 1)">) {
                </span><span style="color: rgba(128, 0, 128, 1)">$_attr</span>[] = "{<span style="color: rgba(128, 0, 128, 1)">$key</span>}=\"{<span style="color: rgba(128, 0, 128, 1)">$value</span>}\""<span style="color: rgba(0, 0, 0, 1)">;
            }
            </span><span style="color: rgba(128, 0, 128, 1)">$attr</span> = <span style="color: rgba(0, 128, 128, 1)">implode</span>(' ', <span style="color: rgba(128, 0, 128, 1)">$_attr</span><span style="color: rgba(0, 0, 0, 1)">);
      }
      </span><span style="color: rgba(128, 0, 128, 1)">$attr</span>   = <span style="color: rgba(0, 128, 128, 1)">trim</span>(<span style="color: rgba(128, 0, 128, 1)">$attr</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(128, 0, 128, 1)">$attr</span>   = <span style="color: rgba(0, 0, 255, 1)">empty</span>(<span style="color: rgba(128, 0, 128, 1)">$attr</span>) ? '' : " {<span style="color: rgba(128, 0, 128, 1)">$attr</span>}"<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$xml</span>   = "&lt;{<span style="color: rgba(128, 0, 128, 1)">$root</span>}{<span style="color: rgba(128, 0, 128, 1)">$attr</span>}&gt;"<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$xml</span>   .= self::data_to_xml(<span style="color: rgba(128, 0, 128, 1)">$data</span>, <span style="color: rgba(128, 0, 128, 1)">$item</span>, <span style="color: rgba(128, 0, 128, 1)">$id</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(128, 0, 128, 1)">$xml</span>   .= "&lt;/{<span style="color: rgba(128, 0, 128, 1)">$root</span>}&gt;"<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$xml</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 设置回复消息
   * Examle: $obj-&gt;text('hello')-&gt;reply();
   * @param string $text
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> text(<span style="color: rgba(128, 0, 128, 1)">$text</span>=''<span style="color: rgba(0, 0, 0, 1)">)
    {
      </span><span style="color: rgba(128, 0, 128, 1)">$FuncFlag</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_funcflag ? 1 : 0<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$msg</span> = <span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">(
            </span>'ToUserName' =&gt; <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;getRevFrom(),
            'FromUserName'=&gt;<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;getRevTo(),
            'MsgType'=&gt;self::MSGTYPE_TEXT,
            'Content'=&gt;<span style="color: rgba(128, 0, 128, 1)">$text</span>,
            'CreateTime'=&gt;<span style="color: rgba(0, 128, 128, 1)">time</span>(),
            'FuncFlag'=&gt;<span style="color: rgba(128, 0, 128, 1)">$FuncFlag</span><span style="color: rgba(0, 0, 0, 1)">
      );
      </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;Message(<span style="color: rgba(128, 0, 128, 1)">$msg</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 设置回复消息
   * Examle: $obj-&gt;text('hello')-&gt;reply();
   * @param string $text
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> image(<span style="color: rgba(128, 0, 128, 1)">$media_id</span>=''<span style="color: rgba(0, 0, 0, 1)">)
    {
      </span><span style="color: rgba(128, 0, 128, 1)">$FuncFlag</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_funcflag ? 1 : 0<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$msg</span> = <span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">(
            </span>'ToUserName' =&gt; <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;getRevFrom(),
            'FromUserName'=&gt;<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;getRevTo(),
            'CreateTime'=&gt;<span style="color: rgba(0, 128, 128, 1)">time</span>(),
            'MsgType'=&gt;self::MSGTYPE_IMAGE,
            'Image'=&gt;<span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">(
                </span>'MediaId'=&gt;<span style="color: rgba(128, 0, 128, 1)">$media_id</span><span style="color: rgba(0, 0, 0, 1)">
            )</span>,
            'FuncFlag'=&gt;<span style="color: rgba(128, 0, 128, 1)">$FuncFlag</span><span style="color: rgba(0, 0, 0, 1)">
      );
      </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;Message(<span style="color: rgba(128, 0, 128, 1)">$msg</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 设置回复音乐
   * @param string $title
   * @param string $desc
   * @param string $musicurl
   * @param string $hgmusicurl
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> music(<span style="color: rgba(128, 0, 128, 1)">$title</span>,<span style="color: rgba(128, 0, 128, 1)">$desc</span>,<span style="color: rgba(128, 0, 128, 1)">$musicurl</span>,<span style="color: rgba(128, 0, 128, 1)">$hgmusicurl</span>=''<span style="color: rgba(0, 0, 0, 1)">) {
      </span><span style="color: rgba(128, 0, 128, 1)">$FuncFlag</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_funcflag ? 1 : 0<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$msg</span> = <span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">(
            </span>'ToUserName' =&gt; <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;getRevFrom(),
            'FromUserName'=&gt;<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;getRevTo(),
            'CreateTime'=&gt;<span style="color: rgba(0, 128, 128, 1)">time</span>(),
            'MsgType'=&gt;self::MSGTYPE_MUSIC,
            'Music'=&gt;<span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">(
                </span>'Title'=&gt;<span style="color: rgba(128, 0, 128, 1)">$title</span>,
                'Description'=&gt;<span style="color: rgba(128, 0, 128, 1)">$desc</span>,
                'MusicUrl'=&gt;<span style="color: rgba(128, 0, 128, 1)">$musicurl</span>,
                'HQMusicUrl'=&gt;<span style="color: rgba(128, 0, 128, 1)">$hgmusicurl</span><span style="color: rgba(0, 0, 0, 1)">
            )</span>,
            'FuncFlag'=&gt;<span style="color: rgba(128, 0, 128, 1)">$FuncFlag</span><span style="color: rgba(0, 0, 0, 1)">
      );
      </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;Message(<span style="color: rgba(128, 0, 128, 1)">$msg</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 设置回复图文
   * @param array $newsData
   * 数组结构:
   *array(
   *      =&gt;array(
   *          'Title'=&gt;'msg title',
   *          'Description'=&gt;'summary text',
   *          'PicUrl'=&gt;'http://www.domain.com/1.jpg',
   *          'Url'=&gt;'http://www.domain.com/1.html'
   *      ),
   *      =&gt;....
   *)
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> news(<span style="color: rgba(128, 0, 128, 1)">$newsData</span>=<span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">())
    {
      </span><span style="color: rgba(128, 0, 128, 1)">$FuncFlag</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_funcflag ? 1 : 0<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$count</span> = <span style="color: rgba(0, 128, 128, 1)">count</span>(<span style="color: rgba(128, 0, 128, 1)">$newsData</span><span style="color: rgba(0, 0, 0, 1)">);
      
      </span><span style="color: rgba(128, 0, 128, 1)">$msg</span> = <span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">(
            </span>'ToUserName' =&gt; <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;getRevFrom(),
            'FromUserName'=&gt;<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;getRevTo(),
            'MsgType'=&gt;self::MSGTYPE_NEWS,
            'CreateTime'=&gt;<span style="color: rgba(0, 128, 128, 1)">time</span>(),
            'ArticleCount'=&gt;<span style="color: rgba(128, 0, 128, 1)">$count</span>,
            'Articles'=&gt;<span style="color: rgba(128, 0, 128, 1)">$newsData</span>,
            'FuncFlag'=&gt;<span style="color: rgba(128, 0, 128, 1)">$FuncFlag</span><span style="color: rgba(0, 0, 0, 1)">
      );
      </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;Message(<span style="color: rgba(128, 0, 128, 1)">$msg</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   *
   * 回复微信服务器, 此函数支持链式操作
   * @example $this-&gt;text('msg tips')-&gt;reply();
   * @param string $msg 要发送的信息, 默认取$this-&gt;_msg
   * @param bool $return 是否返回信息而不抛出到浏览器 默认:否
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> reply(<span style="color: rgba(128, 0, 128, 1)">$msg</span>=<span style="color: rgba(0, 0, 255, 1)">array</span>(),<span style="color: rgba(128, 0, 128, 1)">$return</span> = <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">)
    {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">empty</span>(<span style="color: rgba(128, 0, 128, 1)">$msg</span><span style="color: rgba(0, 0, 0, 1)">))
            </span><span style="color: rgba(128, 0, 128, 1)">$msg</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">_msg;
      </span><span style="color: rgba(128, 0, 128, 1)">$xmldata</span>=<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;xml_encode(<span style="color: rgba(128, 0, 128, 1)">$msg</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 128, 128, 1)">log</span>(<span style="color: rgba(128, 0, 128, 1)">$xmldata</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$return</span><span style="color: rgba(0, 0, 0, 1)">)
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$xmldata</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">else</span>
            <span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 128, 1)">$xmldata</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   

    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * GET 请求
   * @param string $url
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">function</span> http_get(<span style="color: rgba(128, 0, 128, 1)">$url</span><span style="color: rgba(0, 0, 0, 1)">){
      </span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span> =<span style="color: rgba(0, 0, 0, 1)"> curl_init();
      </span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 128, 128, 1)">stripos</span>(<span style="color: rgba(128, 0, 128, 1)">$url</span>,"https://")!==<span style="color: rgba(0, 0, 255, 1)">FALSE</span><span style="color: rgba(0, 0, 0, 1)">){
            
            curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span>, CURLOPT_SSL_VERIFYPEER, <span style="color: rgba(0, 0, 255, 1)">FALSE</span><span style="color: rgba(0, 0, 0, 1)">);
            curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span>, CURLOPT_SSL_VERIFYHOST, <span style="color: rgba(0, 0, 255, 1)">FALSE</span><span style="color: rgba(0, 0, 0, 1)">);
      }
      curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span>, CURLOPT_URL, <span style="color: rgba(128, 0, 128, 1)">$url</span><span style="color: rgba(0, 0, 0, 1)">);
      curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span>, CURLOPT_RETURNTRANSFER, 1<span style="color: rgba(0, 0, 0, 1)"> );
      </span><span style="color: rgba(128, 0, 128, 1)">$sContent</span> = curl_exec(<span style="color: rgba(128, 0, 128, 1)">$oCurl</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(128, 0, 128, 1)">$aStatus</span> = curl_getinfo(<span style="color: rgba(128, 0, 128, 1)">$oCurl</span><span style="color: rgba(0, 0, 0, 1)">);

      curl_close(</span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 128, 128, 1)">intval</span>(<span style="color: rgba(128, 0, 128, 1)">$aStatus</span>["http_code"])==200<span style="color: rgba(0, 0, 0, 1)">){
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$sContent</span><span style="color: rgba(0, 0, 0, 1)">;
      }</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      }
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * POST 请求
   * @param string $url
   * @param array $param
   * @return string content
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">function</span> http_post(<span style="color: rgba(128, 0, 128, 1)">$url</span>,<span style="color: rgba(128, 0, 128, 1)">$param</span><span style="color: rgba(0, 0, 0, 1)">){
      </span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span> =<span style="color: rgba(0, 0, 0, 1)"> curl_init();
      </span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 128, 128, 1)">stripos</span>(<span style="color: rgba(128, 0, 128, 1)">$url</span>,"https://")!==<span style="color: rgba(0, 0, 255, 1)">FALSE</span><span style="color: rgba(0, 0, 0, 1)">){
            curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span>, CURLOPT_SSL_VERIFYPEER, <span style="color: rgba(0, 0, 255, 1)">FALSE</span><span style="color: rgba(0, 0, 0, 1)">);
            curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span>, CURLOPT_SSL_VERIFYHOST, <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
      }
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 128, 128, 1)">is_string</span>(<span style="color: rgba(128, 0, 128, 1)">$param</span><span style="color: rgba(0, 0, 0, 1)">)) {
            </span><span style="color: rgba(128, 0, 128, 1)">$strPOST</span> = <span style="color: rgba(128, 0, 128, 1)">$param</span><span style="color: rgba(0, 0, 0, 1)">;
      } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(128, 0, 128, 1)">$aPOST</span> = <span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">();
            </span><span style="color: rgba(0, 0, 255, 1)">foreach</span>(<span style="color: rgba(128, 0, 128, 1)">$param</span> <span style="color: rgba(0, 0, 255, 1)">as</span> <span style="color: rgba(128, 0, 128, 1)">$key</span>=&gt;<span style="color: rgba(128, 0, 128, 1)">$val</span><span style="color: rgba(0, 0, 0, 1)">){
                </span><span style="color: rgba(128, 0, 128, 1)">$aPOST</span>[] = <span style="color: rgba(128, 0, 128, 1)">$key</span>."=".<span style="color: rgba(0, 128, 128, 1)">urlencode</span>(<span style="color: rgba(128, 0, 128, 1)">$val</span><span style="color: rgba(0, 0, 0, 1)">);
            }
            </span><span style="color: rgba(128, 0, 128, 1)">$strPOST</span> =<span style="color: rgba(0, 128, 128, 1)">join</span>("&amp;", <span style="color: rgba(128, 0, 128, 1)">$aPOST</span><span style="color: rgba(0, 0, 0, 1)">);
      }
      curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span>, CURLOPT_URL, <span style="color: rgba(128, 0, 128, 1)">$url</span><span style="color: rgba(0, 0, 0, 1)">);
      curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span>, CURLOPT_RETURNTRANSFER, 1<span style="color: rgba(0, 0, 0, 1)"> );
      curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span>, CURLOPT_POST,<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
      curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span>, CURLOPT_POSTFIELDS,<span style="color: rgba(128, 0, 128, 1)">$strPOST</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(128, 0, 128, 1)">$sContent</span> = curl_exec(<span style="color: rgba(128, 0, 128, 1)">$oCurl</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(128, 0, 128, 1)">$aStatus</span> = curl_getinfo(<span style="color: rgba(128, 0, 128, 1)">$oCurl</span><span style="color: rgba(0, 0, 0, 1)">);
      curl_close(</span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 128, 128, 1)">intval</span>(<span style="color: rgba(128, 0, 128, 1)">$aStatus</span>["http_code"])==200<span style="color: rgba(0, 0, 0, 1)">){
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$sContent</span><span style="color: rgba(0, 0, 0, 1)">;
      }</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      }
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 通用auth验证方法,暂时仅用于菜单更新操作
   * @param string $appid
   * @param string $appsecret
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> checkAuth(<span style="color: rgba(128, 0, 128, 1)">$appid</span>='',<span style="color: rgba(128, 0, 128, 1)">$appsecret</span>=''<span style="color: rgba(0, 0, 0, 1)">){
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$appid</span> || !<span style="color: rgba(128, 0, 128, 1)">$appsecret</span><span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(128, 0, 128, 1)">$appid</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">appid;
            </span><span style="color: rgba(128, 0, 128, 1)">$appsecret</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">appsecret;
      }
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">TODO: get the cache access_token</span>
      <span style="color: rgba(128, 0, 128, 1)">$result</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;http_get(self::API_URL_PREFIX.self::AUTH_URL.'appid='.<span style="color: rgba(128, 0, 128, 1)">$appid</span>.'&amp;secret='.<span style="color: rgba(128, 0, 128, 1)">$appsecret</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$result</span><span style="color: rgba(0, 0, 0, 1)">)
      {
            </span><span style="color: rgba(128, 0, 128, 1)">$json</span> = json_decode(<span style="color: rgba(128, 0, 128, 1)">$result</span>,<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$json</span> || <span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">])) {
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errCode = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errMsg = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errmsg'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            }
            </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;access_token = <span style="color: rgba(128, 0, 128, 1)">$json</span>['access_token'<span style="color: rgba(0, 0, 0, 1)">];
            </span><span style="color: rgba(128, 0, 128, 1)">$expire</span> = <span style="color: rgba(128, 0, 128, 1)">$json</span>['expires_in'] ? <span style="color: rgba(0, 128, 128, 1)">intval</span>(<span style="color: rgba(128, 0, 128, 1)">$json</span>['expires_in'])-100 : 3600<span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">TODO: cache access_token</span>
            <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">access_token;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }

    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 删除验证数据
   * @param string $appid
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> resetAuth(<span style="color: rgba(128, 0, 128, 1)">$appid</span>=''<span style="color: rgba(0, 0, 0, 1)">){
      </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;access_token = ''<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">TODO: remove cache</span>
      <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
    }
      
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 微信api不支持中文转义的json结构
   * @param array $arr
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">function</span> json_encode(<span style="color: rgba(128, 0, 128, 1)">$arr</span><span style="color: rgba(0, 0, 0, 1)">) {
      </span><span style="color: rgba(128, 0, 128, 1)">$parts</span> = <span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)"> ();
      </span><span style="color: rgba(128, 0, 128, 1)">$is_list</span> = <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Find out if the given array is a numerical array</span>
      <span style="color: rgba(128, 0, 128, 1)">$keys</span> = <span style="color: rgba(0, 128, 128, 1)">array_keys</span> ( <span style="color: rgba(128, 0, 128, 1)">$arr</span><span style="color: rgba(0, 0, 0, 1)"> );
      </span><span style="color: rgba(128, 0, 128, 1)">$max_length</span> = <span style="color: rgba(0, 128, 128, 1)">count</span> ( <span style="color: rgba(128, 0, 128, 1)">$arr</span> ) - 1<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> ((<span style="color: rgba(128, 0, 128, 1)">$keys</span> === 0) &amp;&amp; (<span style="color: rgba(128, 0, 128, 1)">$keys</span> [<span style="color: rgba(128, 0, 128, 1)">$max_length</span>] === <span style="color: rgba(128, 0, 128, 1)">$max_length</span> )) { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">See if the first key is 0 and last key is length - 1</span>
            <span style="color: rgba(128, 0, 128, 1)">$is_list</span> = <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">for</span>(<span style="color: rgba(128, 0, 128, 1)">$i</span> = 0; <span style="color: rgba(128, 0, 128, 1)">$i</span> &lt; <span style="color: rgba(0, 128, 128, 1)">count</span> ( <span style="color: rgba(128, 0, 128, 1)">$keys</span> ); <span style="color: rgba(128, 0, 128, 1)">$i</span> ++) { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">See if each key correspondes to its position</span>
                <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$i</span> != <span style="color: rgba(128, 0, 128, 1)">$keys</span> [<span style="color: rgba(128, 0, 128, 1)">$i</span>]) { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">A key fails at position check.</span>
                  <span style="color: rgba(128, 0, 128, 1)">$is_list</span> = <span style="color: rgba(0, 0, 255, 1)">false</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">It is an associative array.</span>
                  <span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
                }
            }
      }
      </span><span style="color: rgba(0, 0, 255, 1)">foreach</span> ( <span style="color: rgba(128, 0, 128, 1)">$arr</span> <span style="color: rgba(0, 0, 255, 1)">as</span> <span style="color: rgba(128, 0, 128, 1)">$key</span> =&gt; <span style="color: rgba(128, 0, 128, 1)">$value</span><span style="color: rgba(0, 0, 0, 1)"> ) {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 128, 128, 1)">is_array</span> ( <span style="color: rgba(128, 0, 128, 1)">$value</span> )) { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Custom handling for arrays</span>
                <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$is_list</span><span style="color: rgba(0, 0, 0, 1)">)
                  </span><span style="color: rgba(128, 0, 128, 1)">$parts</span> [] = self::json_encode ( <span style="color: rgba(128, 0, 128, 1)">$value</span> ); <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> :RECURSION: </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
                <span style="color: rgba(0, 0, 255, 1)">else</span>
                  <span style="color: rgba(128, 0, 128, 1)">$parts</span> [] = '"' . <span style="color: rgba(128, 0, 128, 1)">$key</span> . '":' . self::json_encode ( <span style="color: rgba(128, 0, 128, 1)">$value</span> ); <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> :RECURSION: </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
            } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(128, 0, 128, 1)">$str</span> = ''<span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (! <span style="color: rgba(128, 0, 128, 1)">$is_list</span><span style="color: rgba(0, 0, 0, 1)">)
                  </span><span style="color: rgba(128, 0, 128, 1)">$str</span> = '"' . <span style="color: rgba(128, 0, 128, 1)">$key</span> . '":'<span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Custom handling for multiple data types</span>
                <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 128, 128, 1)">is_numeric</span> ( <span style="color: rgba(128, 0, 128, 1)">$value</span> ) &amp;&amp; <span style="color: rgba(128, 0, 128, 1)">$value</span>&lt;2000000000<span style="color: rgba(0, 0, 0, 1)">)
                  </span><span style="color: rgba(128, 0, 128, 1)">$str</span> .= <span style="color: rgba(128, 0, 128, 1)">$value</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Numbers</span>
                <span style="color: rgba(0, 0, 255, 1)">elseif</span> (<span style="color: rgba(128, 0, 128, 1)">$value</span> === <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">)
                </span><span style="color: rgba(128, 0, 128, 1)">$str</span> .= 'false'; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">The booleans</span>
                <span style="color: rgba(0, 0, 255, 1)">elseif</span> (<span style="color: rgba(128, 0, 128, 1)">$value</span> === <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">)
                </span><span style="color: rgba(128, 0, 128, 1)">$str</span> .= 'true'<span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 0, 255, 1)">else</span>
                  <span style="color: rgba(128, 0, 128, 1)">$str</span> .= '"' . <span style="color: rgba(0, 128, 128, 1)">addslashes</span> ( <span style="color: rgba(128, 0, 128, 1)">$value</span> ) . '"'; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">All other things
                // :TODO: Is there any more datatype we should be in the lookout for? (Object?)</span>
                <span style="color: rgba(128, 0, 128, 1)">$parts</span> [] = <span style="color: rgba(128, 0, 128, 1)">$str</span><span style="color: rgba(0, 0, 0, 1)">;
            }
      }
      </span><span style="color: rgba(128, 0, 128, 1)">$json</span> = <span style="color: rgba(0, 128, 128, 1)">implode</span> ( ',', <span style="color: rgba(128, 0, 128, 1)">$parts</span><span style="color: rgba(0, 0, 0, 1)"> );
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$is_list</span><span style="color: rgba(0, 0, 0, 1)">)
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> '[' . <span style="color: rgba(128, 0, 128, 1)">$json</span> . ']'; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Return numerical JSON</span>
      <span style="color: rgba(0, 0, 255, 1)">return</span> '{' . <span style="color: rgba(128, 0, 128, 1)">$json</span> . '}'; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Return associative JSON</span>
<span style="color: rgba(0, 0, 0, 1)">    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 创建菜单
   * @param array $data 菜单数组数据
   * example:
   {
   "button":[
   {
   "type":"click",
   "name":"今日歌曲",
   "key":"MENU_KEY_MUSIC"
   },
   {
   "type":"view",
   "name":"歌手简介",
   "url":"http://www.qq.com/"
   },
   {
   "name":"菜单",
   "sub_button":[
   {
   "type":"click",
   "name":"hello word",
   "key":"MENU_KEY_MENU"
   },
   {
   "type":"click",
   "name":"赞一下我们",
   "key":"MENU_KEY_GOOD"
   }]
   }]
   }
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> createMenu(<span style="color: rgba(128, 0, 128, 1)">$data</span><span style="color: rgba(0, 0, 0, 1)">){
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;access_token &amp;&amp; !<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;checkAuth()) <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$result</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;http_post(self::API_URL_PREFIX.self::MENU_CREATE_URL.'access_token='.<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;access_token,self::json_encode(<span style="color: rgba(128, 0, 128, 1)">$data</span><span style="color: rgba(0, 0, 0, 1)">));
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$result</span><span style="color: rgba(0, 0, 0, 1)">)
      {
            </span><span style="color: rgba(128, 0, 128, 1)">$json</span> = json_decode(<span style="color: rgba(128, 0, 128, 1)">$result</span>,<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$json</span> || !<span style="color: rgba(0, 0, 255, 1)">empty</span>(<span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">])) {
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errCode = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errMsg = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errmsg'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            }
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 获取菜单
   * @return array('menu'=&gt;array(....s))
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> getMenu(){
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;access_token &amp;&amp; !<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;checkAuth()) <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$result</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;http_get(self::API_URL_PREFIX.self::MENU_GET_URL.'access_token='.<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">access_token);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$result</span><span style="color: rgba(0, 0, 0, 1)">)
      {
            </span><span style="color: rgba(128, 0, 128, 1)">$json</span> = json_decode(<span style="color: rgba(128, 0, 128, 1)">$result</span>,<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$json</span> || <span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">])) {
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errCode = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errMsg = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errmsg'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            }
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$json</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 删除菜单
   * @return boolean
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> deleteMenu(){
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;access_token &amp;&amp; !<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;checkAuth()) <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$result</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;http_get(self::API_URL_PREFIX.self::MENU_DELETE_URL.'access_token='.<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">access_token);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$result</span><span style="color: rgba(0, 0, 0, 1)">)
      {
            </span><span style="color: rgba(128, 0, 128, 1)">$json</span> = json_decode(<span style="color: rgba(128, 0, 128, 1)">$result</span>,<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$json</span> || !<span style="color: rgba(0, 0, 255, 1)">empty</span>(<span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">])) {
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errCode = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errMsg = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errmsg'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            }
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }

    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 根据媒体文件ID获取媒体文件
   * @param string $media_id 媒体文件id
   * @return raw data
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> getMedia(<span style="color: rgba(128, 0, 128, 1)">$media_id</span><span style="color: rgba(0, 0, 0, 1)">){
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;access_token &amp;&amp; !<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;checkAuth()) <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$result</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;http_get(self::API_URL_PREFIX.self::MEDIA_GET_URL.'access_token='.<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;access_token.'&amp;media_id='.<span style="color: rgba(128, 0, 128, 1)">$media_id</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$result</span><span style="color: rgba(0, 0, 0, 1)">)
      {
            </span><span style="color: rgba(128, 0, 128, 1)">$json</span> = json_decode(<span style="color: rgba(128, 0, 128, 1)">$result</span>,<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">])) {
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errCode = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errMsg = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errmsg'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            }
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$json</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }   
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 创建二维码ticket
   * @param int $scene_id 自定义追踪id
   * @param int $type 0:临时二维码;1:永久二维码(此时expire参数无效)
   * @param int $expire 临时二维码有效期,最大为1800秒
   * @return array('ticket'=&gt;'qrcode字串','expire_seconds'=&gt;1800)
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> getQRCode(<span style="color: rgba(128, 0, 128, 1)">$scene_id</span>,<span style="color: rgba(128, 0, 128, 1)">$type</span>=0,<span style="color: rgba(128, 0, 128, 1)">$expire</span>=1800<span style="color: rgba(0, 0, 0, 1)">){
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;access_token &amp;&amp; !<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;checkAuth()) <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$data</span> = <span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">(
            </span>'action_name'=&gt;<span style="color: rgba(128, 0, 128, 1)">$type</span>?"QR_LIMIT_SCENE":"QR_SCENE",
            'expire_seconds'=&gt;<span style="color: rgba(128, 0, 128, 1)">$expire</span>,
            'action_info'=&gt;<span style="color: rgba(0, 0, 255, 1)">array</span>('scene'=&gt;<span style="color: rgba(0, 0, 255, 1)">array</span>('scene_id'=&gt;<span style="color: rgba(128, 0, 128, 1)">$scene_id</span><span style="color: rgba(0, 0, 0, 1)">))
      );
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$type</span> == 1<span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 0, 255, 1)">unset</span>(<span style="color: rgba(128, 0, 128, 1)">$data</span>['expire_seconds'<span style="color: rgba(0, 0, 0, 1)">]);
      }
      </span><span style="color: rgba(128, 0, 128, 1)">$result</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;http_post(self::API_URL_PREFIX.self::QRCODE_CREATE_URL.'access_token='.<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;access_token,self::json_encode(<span style="color: rgba(128, 0, 128, 1)">$data</span><span style="color: rgba(0, 0, 0, 1)">));
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$result</span><span style="color: rgba(0, 0, 0, 1)">)
      {
            </span><span style="color: rgba(128, 0, 128, 1)">$json</span> = json_decode(<span style="color: rgba(128, 0, 128, 1)">$result</span>,<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$json</span> || !<span style="color: rgba(0, 0, 255, 1)">empty</span>(<span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">])) {
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errCode = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errMsg = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errmsg'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            }
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$json</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 获取二维码图片
   * @param string $ticket 传入由getQRCode方法生成的ticket参数
   * @return string url 返回http地址
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> getQRUrl(<span style="color: rgba(128, 0, 128, 1)">$ticket</span><span style="color: rgba(0, 0, 0, 1)">) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> self::QRCODE_IMG_URL.<span style="color: rgba(128, 0, 128, 1)">$ticket</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 批量获取关注用户列表
   * @param unknown $next_openid
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> getUserList(<span style="color: rgba(128, 0, 128, 1)">$next_openid</span>=''<span style="color: rgba(0, 0, 0, 1)">){
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;access_token &amp;&amp; !<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;checkAuth()) <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$result</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;http_get(self::API_URL_PREFIX.self::USER_GET_URL.'access_token='.<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;access_token.'&amp;next_openid='.<span style="color: rgba(128, 0, 128, 1)">$next_openid</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$result</span><span style="color: rgba(0, 0, 0, 1)">)
      {
            </span><span style="color: rgba(128, 0, 128, 1)">$json</span> = json_decode(<span style="color: rgba(128, 0, 128, 1)">$result</span>,<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">])) {
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errCode = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errMsg = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errmsg'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            }
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$json</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 获取关注者详细信息
   * @param string $openid
   * @return array
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> getUserInfo(<span style="color: rgba(128, 0, 128, 1)">$openid</span><span style="color: rgba(0, 0, 0, 1)">){
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;access_token &amp;&amp; !<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;checkAuth()) <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$result</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;http_get(self::API_URL_PREFIX.self::USER_INFO_URL.'access_token='.<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;access_token.'&amp;openid='.<span style="color: rgba(128, 0, 128, 1)">$openid</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$result</span><span style="color: rgba(0, 0, 0, 1)">)
      {
            </span><span style="color: rgba(128, 0, 128, 1)">$json</span> = json_decode(<span style="color: rgba(128, 0, 128, 1)">$result</span>,<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">])) {
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errCode = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errMsg = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errmsg'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            }
            </span><span style="color: rgba(128, 0, 128, 1)">$json</span>['access_token'] = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">access_token;
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$json</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 获取用户分组列表
   * @return boolean|array
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> getGroup(){
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;access_token &amp;&amp; !<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;checkAuth()) <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$result</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;http_get(self::API_URL_PREFIX.self::GROUP_GET_URL.'access_token='.<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">access_token);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$result</span><span style="color: rgba(0, 0, 0, 1)">)
      {
            </span><span style="color: rgba(128, 0, 128, 1)">$json</span> = json_decode(<span style="color: rgba(128, 0, 128, 1)">$result</span>,<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">])) {
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errCode = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errMsg = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errmsg'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            }
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$json</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 新增自定分组
   * @param string $name 分组名称
   * @return boolean|array
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> createGroup(<span style="color: rgba(128, 0, 128, 1)">$name</span><span style="color: rgba(0, 0, 0, 1)">){
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;access_token &amp;&amp; !<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;checkAuth()) <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$data</span> = <span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">(
                </span>'group'=&gt;<span style="color: rgba(0, 0, 255, 1)">array</span>('name'=&gt;<span style="color: rgba(128, 0, 128, 1)">$name</span><span style="color: rgba(0, 0, 0, 1)">)
      );
      </span><span style="color: rgba(128, 0, 128, 1)">$result</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;http_post(self::API_URL_PREFIX.self::GROUP_CREATE_URL.'access_token='.<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;access_token,self::json_encode(<span style="color: rgba(128, 0, 128, 1)">$data</span><span style="color: rgba(0, 0, 0, 1)">));
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$result</span><span style="color: rgba(0, 0, 0, 1)">)
      {
            </span><span style="color: rgba(128, 0, 128, 1)">$json</span> = json_decode(<span style="color: rgba(128, 0, 128, 1)">$result</span>,<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$json</span> || !<span style="color: rgba(0, 0, 255, 1)">empty</span>(<span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">])) {
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errCode = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errMsg = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errmsg'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            }
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$json</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 更改分组名称
   * @param int $groupid 分组id
   * @param string $name 分组名称
   * @return boolean|array
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> updateGroup(<span style="color: rgba(128, 0, 128, 1)">$groupid</span>,<span style="color: rgba(128, 0, 128, 1)">$name</span><span style="color: rgba(0, 0, 0, 1)">){
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;access_token &amp;&amp; !<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;checkAuth()) <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$data</span> = <span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">(
                </span>'group'=&gt;<span style="color: rgba(0, 0, 255, 1)">array</span>('id'=&gt;<span style="color: rgba(128, 0, 128, 1)">$groupid</span>,'name'=&gt;<span style="color: rgba(128, 0, 128, 1)">$name</span><span style="color: rgba(0, 0, 0, 1)">)
      );
      </span><span style="color: rgba(128, 0, 128, 1)">$result</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;http_post(self::API_URL_PREFIX.self::GROUP_UPDATE_URL.'access_token='.<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;access_token,self::json_encode(<span style="color: rgba(128, 0, 128, 1)">$data</span><span style="color: rgba(0, 0, 0, 1)">));
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$result</span><span style="color: rgba(0, 0, 0, 1)">)
      {
            </span><span style="color: rgba(128, 0, 128, 1)">$json</span> = json_decode(<span style="color: rgba(128, 0, 128, 1)">$result</span>,<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$json</span> || !<span style="color: rgba(0, 0, 255, 1)">empty</span>(<span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">])) {
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errCode = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errMsg = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errmsg'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            }
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$json</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 移动用户分组
   * @param int $groupid 分组id
   * @param string $openid 用户openid
   * @return boolean|array
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> updateGroupMembers(<span style="color: rgba(128, 0, 128, 1)">$groupid</span>,<span style="color: rgba(128, 0, 128, 1)">$openid</span><span style="color: rgba(0, 0, 0, 1)">){
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;access_token &amp;&amp; !<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;checkAuth()) <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$data</span> = <span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">(
                </span>'openid'=&gt;<span style="color: rgba(128, 0, 128, 1)">$openid</span>,
                'to_groupid'=&gt;<span style="color: rgba(128, 0, 128, 1)">$groupid</span><span style="color: rgba(0, 0, 0, 1)">
      );
      </span><span style="color: rgba(128, 0, 128, 1)">$result</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;http_post(self::API_URL_PREFIX.self::GROUP_MEMBER_UPDATE_URL.'access_token='.<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;access_token,self::json_encode(<span style="color: rgba(128, 0, 128, 1)">$data</span><span style="color: rgba(0, 0, 0, 1)">));
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$result</span><span style="color: rgba(0, 0, 0, 1)">)
      {
            </span><span style="color: rgba(128, 0, 128, 1)">$json</span> = json_decode(<span style="color: rgba(128, 0, 128, 1)">$result</span>,<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$json</span> || !<span style="color: rgba(0, 0, 255, 1)">empty</span>(<span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">])) {
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errCode = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errMsg = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errmsg'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            }
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$json</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 发送客服消息
   * @param array $data 消息结构{"touser":"OPENID","msgtype":"news","news":{...}}
   * @return boolean|array
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> sendCustomMessage(<span style="color: rgba(128, 0, 128, 1)">$data</span><span style="color: rgba(0, 0, 0, 1)">){
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;access_token &amp;&amp; !<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;checkAuth()) <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$result</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;http_post(self::API_URL_PREFIX.self::CUSTOM_SEND_URL.'access_token='.<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;access_token,self::json_encode(<span style="color: rgba(128, 0, 128, 1)">$data</span><span style="color: rgba(0, 0, 0, 1)">));
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$result</span><span style="color: rgba(0, 0, 0, 1)">)
      {
            </span><span style="color: rgba(128, 0, 128, 1)">$json</span> = json_decode(<span style="color: rgba(128, 0, 128, 1)">$result</span>,<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$json</span> || !<span style="color: rgba(0, 0, 255, 1)">empty</span>(<span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">])) {
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errCode = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errMsg = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errmsg'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            }
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$json</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * oauth 授权跳转接口
   * @param string $callback 回调URI
   * @return string
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> getOauthRedirect(<span style="color: rgba(128, 0, 128, 1)">$callback</span>,<span style="color: rgba(128, 0, 128, 1)">$state</span>='',<span style="color: rgba(128, 0, 128, 1)">$scope</span>='snsapi_userinfo'<span style="color: rgba(0, 0, 0, 1)">){
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> self::OAUTH_PREFIX.self::OAUTH_AUTHORIZE_URL.'appid='.<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;appid.'&amp;redirect_uri='.<span style="color: rgba(0, 128, 128, 1)">urlencode</span>(<span style="color: rgba(128, 0, 128, 1)">$callback</span>).'&amp;response_type=code&amp;scope='.<span style="color: rgba(128, 0, 128, 1)">$scope</span>.'&amp;state='.<span style="color: rgba(128, 0, 128, 1)">$state</span>.'#wechat_redirect'<span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
   * 通过code获取Access Token
   * @return array {access_token,expires_in,refresh_token,openid,scope}
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> getOauthAccessToken(){
      </span><span style="color: rgba(128, 0, 128, 1)">$code</span> = <span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$_GET</span>['code'])?<span style="color: rgba(128, 0, 128, 1)">$_GET</span>['code']:''<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$code</span>) <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$result</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;http_get(self::OAUTH_TOKEN_PREFIX.self::OAUTH_TOKEN_URL.'appid='.<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;appid.'&amp;secret='.<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;appsecret.'&amp;code='.<span style="color: rgba(128, 0, 128, 1)">$code</span>.'&amp;grant_type=authorization_code'<span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$result</span><span style="color: rgba(0, 0, 0, 1)">)
      {
            </span><span style="color: rgba(128, 0, 128, 1)">$json</span> = json_decode(<span style="color: rgba(128, 0, 128, 1)">$result</span>,<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$json</span> || !<span style="color: rgba(0, 0, 255, 1)">empty</span>(<span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">])) {
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errCode = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errMsg = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errmsg'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            }
            </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;user_token = <span style="color: rgba(128, 0, 128, 1)">$json</span>['access_token'<span style="color: rgba(0, 0, 0, 1)">];
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$json</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 刷新access token并续期
   * @param string $refresh_token
   * @return boolean|mixed
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> getOauthRefreshToken(<span style="color: rgba(128, 0, 128, 1)">$refresh_token</span><span style="color: rgba(0, 0, 0, 1)">){
      </span><span style="color: rgba(128, 0, 128, 1)">$result</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;http_get(self::OAUTH_TOKEN_PREFIX.self::OAUTH_REFRESH_URL.'appid='.<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;appid.'&amp;grant_type=refresh_token&amp;refresh_token='.<span style="color: rgba(128, 0, 128, 1)">$refresh_token</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$result</span><span style="color: rgba(0, 0, 0, 1)">)
      {
            </span><span style="color: rgba(128, 0, 128, 1)">$json</span> = json_decode(<span style="color: rgba(128, 0, 128, 1)">$result</span>,<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$json</span> || !<span style="color: rgba(0, 0, 255, 1)">empty</span>(<span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">])) {
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errCode = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errMsg = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errmsg'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            }
            </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;user_token = <span style="color: rgba(128, 0, 128, 1)">$json</span>['access_token'<span style="color: rgba(0, 0, 0, 1)">];
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$json</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 获取授权后的用户资料
   * @param string $access_token
   * @param string $openid
   * @return array {openid,nickname,sex,province,city,country,headimgurl,privilege}
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> getOauthUserinfo(<span style="color: rgba(128, 0, 128, 1)">$access_token</span>,<span style="color: rgba(128, 0, 128, 1)">$openid</span><span style="color: rgba(0, 0, 0, 1)">){
      </span><span style="color: rgba(128, 0, 128, 1)">$result</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;http_get(self::OAUTH_USERINFO_URL.'access_token='.<span style="color: rgba(128, 0, 128, 1)">$access_token</span>.'&amp;openid='.<span style="color: rgba(128, 0, 128, 1)">$openid</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$result</span><span style="color: rgba(0, 0, 0, 1)">)
      {
            </span><span style="color: rgba(128, 0, 128, 1)">$json</span> = json_decode(<span style="color: rgba(128, 0, 128, 1)">$result</span>,<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$json</span> || !<span style="color: rgba(0, 0, 255, 1)">empty</span>(<span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">])) {
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errCode = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errMsg = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errmsg'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            }
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$json</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 进入客服模式
   * Examle: $obj-&gt;kefu()-&gt;reply();
   * @param string $text
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> kefu()
    {
      </span><span style="color: rgba(128, 0, 128, 1)">$msg</span> = <span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">(
                </span>'ToUserName' =&gt; <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;getRevFrom(),
                'FromUserName'=&gt;<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;getRevTo(),
                'MsgType'=&gt;'transfer_customer_service',
                'CreateTime'=&gt;<span style="color: rgba(0, 128, 128, 1)">time</span><span style="color: rgba(0, 0, 0, 1)">()
      );
      </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;Message(<span style="color: rgba(128, 0, 128, 1)">$msg</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span><span style="color: rgba(0, 0, 0, 1)">;
    }
   
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">编码转换</span>
    <span style="color: rgba(0, 0, 255, 1)">function</span> iconvUtf(<span style="color: rgba(128, 0, 128, 1)">$content</span><span style="color: rgba(0, 0, 0, 1)">){
      </span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_charset != 'utf-8'<span style="color: rgba(0, 0, 0, 1)">){
            </span><span style="color: rgba(128, 0, 128, 1)">$content</span> = <span style="color: rgba(0, 128, 128, 1)">serialize</span>(<span style="color: rgba(128, 0, 128, 1)">$content</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(128, 0, 128, 1)">$content</span> = <span style="color: rgba(0, 128, 128, 1)">iconv</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_charset,'UTF-8',<span style="color: rgba(128, 0, 128, 1)">$content</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(128, 0, 128, 1)">$content</span> = <span style="color: rgba(0, 128, 128, 1)">unserialize</span>(<span style="color: rgba(128, 0, 128, 1)">$content</span><span style="color: rgba(0, 0, 0, 1)">);
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$content</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取用户上报的地理信息</span>
    <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> getUserLocation(){
      </span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 0, 255, 1)">empty</span>(<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['Latitude'])) <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">(
                </span>'FromUserName'=&gt;<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['FromUserName'],
                'Latitude'=&gt;<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['Latitude'],
                'Longitude'=&gt;<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['Longitude'],
                'Precision'=&gt;<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;_receive['Precision'],<span style="color: rgba(0, 0, 0, 1)">
      );
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>tp5中微信公众号开发,设置自定义菜单</p>
<div class="cnblogs_code"><img id="code_img_closed_83f15d08-149b-4038-8e1f-fb137e9835fa" class="code_img_closed lazyload" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_83f15d08-149b-4038-8e1f-fb137e9835fa" class="code_img_opened lazyload" style="display: none" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_83f15d08-149b-4038-8e1f-fb137e9835fa" class="cnblogs_code_hide">
<pre>&lt;?<span style="color: rgba(0, 0, 0, 1)">php

namespace app\wx\controller;

</span><span style="color: rgba(0, 0, 255, 1)">use</span><span style="color: rgba(0, 0, 0, 1)"> think\Controller;

</span><span style="color: rgba(0, 128, 128, 1)">header</span>("Content-type: text/html; charset=utf-8"<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">define</span>("TOKEN", "hengyuanjiaoyu");    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义识别码 需要跟微信公众平台上保持一致</span>
<span style="color: rgba(0, 0, 255, 1)">class</span> Index <span style="color: rgba(0, 0, 255, 1)">extends</span><span style="color: rgba(0, 0, 0, 1)"> Controller
{
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> API_URL_PREFIX = 'https://api.weixin.qq.com/cgi-bin'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> AUTH_URL = '/token?grant_type=client_credential&amp;'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">const</span> MENU_CREATE_URL = '/menu/create?'<span style="color: rgba(0, 0, 0, 1)">;

    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(128, 0, 128, 1)">$appid</span> = 'xxxxxxxxxxxxxxx'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(128, 0, 128, 1)">$appsecret</span> = 'XXXXXXXXXXXXXX'<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(128, 0, 128, 1)">$access_token</span><span style="color: rgba(0, 0, 0, 1)">;


    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> index()
    {
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 微信验证token</span>
      <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">valid();
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">微信验证</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> valid()
    {
      </span><span style="color: rgba(128, 0, 128, 1)">$echoStr</span> = <span style="color: rgba(128, 0, 128, 1)">$_GET</span>["echostr"<span style="color: rgba(0, 0, 0, 1)">];
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">checkSignature()) {
            </span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(128, 0, 128, 1)">$echoStr</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">exit</span><span style="color: rgba(0, 0, 0, 1)">;
      }
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">检查微信签名</span>
    <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> checkSignature()
    {
      </span><span style="color: rgba(128, 0, 128, 1)">$signature</span> = <span style="color: rgba(128, 0, 128, 1)">$_GET</span>["signature"<span style="color: rgba(0, 0, 0, 1)">];
      </span><span style="color: rgba(128, 0, 128, 1)">$timestamp</span> = <span style="color: rgba(128, 0, 128, 1)">$_GET</span>["timestamp"<span style="color: rgba(0, 0, 0, 1)">];
      </span><span style="color: rgba(128, 0, 128, 1)">$nonce</span> = <span style="color: rgba(128, 0, 128, 1)">$_GET</span>["nonce"<span style="color: rgba(0, 0, 0, 1)">];

      </span><span style="color: rgba(128, 0, 128, 1)">$token</span> =<span style="color: rgba(0, 0, 0, 1)"> TOKEN;
      </span><span style="color: rgba(128, 0, 128, 1)">$tmpArr</span> = <span style="color: rgba(0, 0, 255, 1)">array</span>(<span style="color: rgba(128, 0, 128, 1)">$token</span>, <span style="color: rgba(128, 0, 128, 1)">$timestamp</span>, <span style="color: rgba(128, 0, 128, 1)">$nonce</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 128, 128, 1)">sort</span>(<span style="color: rgba(128, 0, 128, 1)">$tmpArr</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(128, 0, 128, 1)">$tmpStr</span> = <span style="color: rgba(0, 128, 128, 1)">implode</span>(<span style="color: rgba(128, 0, 128, 1)">$tmpArr</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(128, 0, 128, 1)">$tmpStr</span> = <span style="color: rgba(0, 128, 128, 1)">sha1</span>(<span style="color: rgba(128, 0, 128, 1)">$tmpStr</span><span style="color: rgba(0, 0, 0, 1)">);

      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$tmpStr</span> == <span style="color: rgba(128, 0, 128, 1)">$signature</span><span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
      } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      }
    }
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 创建菜单
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> createMenu()
    {
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 防止json_encode时报错,没有下级的不要有空数组</span>
      <span style="color: rgba(128, 0, 128, 1)">$data</span> = <span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">(
            </span>'button' =&gt;<span style="color: rgba(0, 0, 0, 1)"> [
                [
                  </span>'type' =&gt; 'scancode_push',
                  'name' =&gt; '扫码',
                  'key' =&gt; 'reselmenu_0_1'<span style="color: rgba(0, 0, 0, 1)">
                ]</span>,<span style="color: rgba(0, 0, 0, 1)">
                [
                  </span>'type' =&gt; 'view',
                  'name' =&gt; '工作轨迹',
                  'url' =&gt; 'https://www.hengyuanjiaoyu.com/wx/gz/index.html'<span style="color: rgba(0, 0, 0, 1)">
                ]
            ]
      );
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;access_token &amp;&amp; !<span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;checkAuth()) <span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$result</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;http_post(self::API_URL_PREFIX . self::MENU_CREATE_URL . 'access_token=' . <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;access_token, self::json_encode(<span style="color: rgba(128, 0, 128, 1)">$data</span><span style="color: rgba(0, 0, 0, 1)">));
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$result</span><span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(128, 0, 128, 1)">$json</span> = json_decode(<span style="color: rgba(128, 0, 128, 1)">$result</span>, <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$json</span> || !<span style="color: rgba(0, 0, 255, 1)">empty</span>(<span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">])) {
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errCode = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errMsg = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errmsg'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            }
            </span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">echo</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 获取access_token
   * @param string $appid
   * @param string $appsecret
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> checkAuth(<span style="color: rgba(128, 0, 128, 1)">$appid</span> = '', <span style="color: rgba(128, 0, 128, 1)">$appsecret</span> = ''<span style="color: rgba(0, 0, 0, 1)">)
    {
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$appid</span> || !<span style="color: rgba(128, 0, 128, 1)">$appsecret</span><span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(128, 0, 128, 1)">$appid</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">appid;
            </span><span style="color: rgba(128, 0, 128, 1)">$appsecret</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">appsecret;
      }
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">TODO: 获取token</span>
      <span style="color: rgba(128, 0, 128, 1)">$result</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;http_get(self::API_URL_PREFIX . self::AUTH_URL . 'appid=' . <span style="color: rgba(128, 0, 128, 1)">$appid</span> . '&amp;secret=' . <span style="color: rgba(128, 0, 128, 1)">$appsecret</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$result</span><span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(128, 0, 128, 1)">$json</span> = json_decode(<span style="color: rgba(128, 0, 128, 1)">$result</span>, <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$json</span> || <span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">])) {
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errCode = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errcode'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;errMsg = <span style="color: rgba(128, 0, 128, 1)">$json</span>['errmsg'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            }
            </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;access_token = <span style="color: rgba(128, 0, 128, 1)">$json</span>['access_token'<span style="color: rgba(0, 0, 0, 1)">];
            </span><span style="color: rgba(128, 0, 128, 1)">$expire</span> = <span style="color: rgba(128, 0, 128, 1)">$json</span>['expires_in'] ? <span style="color: rgba(0, 128, 128, 1)">intval</span>(<span style="color: rgba(128, 0, 128, 1)">$json</span>['expires_in']) - 100 : 3600; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">过期时间
            //TODO: 获取 access_token</span>
            <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;<span style="color: rgba(0, 0, 0, 1)">access_token;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 微信api不支持中文转义的json结构
   * @param array $arr
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">function</span> json_encode(<span style="color: rgba(128, 0, 128, 1)">$arr</span><span style="color: rgba(0, 0, 0, 1)">)
    {
      </span><span style="color: rgba(128, 0, 128, 1)">$parts</span> = <span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">();
      </span><span style="color: rgba(128, 0, 128, 1)">$is_list</span> = <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Find out if the given array is a numerical array</span>
      <span style="color: rgba(128, 0, 128, 1)">$keys</span> = <span style="color: rgba(0, 128, 128, 1)">array_keys</span>(<span style="color: rgba(128, 0, 128, 1)">$arr</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(128, 0, 128, 1)">$max_length</span> = <span style="color: rgba(0, 128, 128, 1)">count</span>(<span style="color: rgba(128, 0, 128, 1)">$arr</span>) - 1<span style="color: rgba(0, 0, 0, 1)">;

      </span><span style="color: rgba(0, 0, 255, 1)">if</span> ((<span style="color: rgba(128, 0, 128, 1)">$keys</span> === 0) &amp;&amp; (<span style="color: rgba(128, 0, 128, 1)">$keys</span>[<span style="color: rgba(128, 0, 128, 1)">$max_length</span>] === <span style="color: rgba(128, 0, 128, 1)">$max_length</span>)) { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">See if the first key is 0 and last key is length - 1</span>
            <span style="color: rgba(128, 0, 128, 1)">$is_list</span> = <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(128, 0, 128, 1)">$i</span> = 0; <span style="color: rgba(128, 0, 128, 1)">$i</span> &lt; <span style="color: rgba(0, 128, 128, 1)">count</span>(<span style="color: rgba(128, 0, 128, 1)">$keys</span>); <span style="color: rgba(128, 0, 128, 1)">$i</span>++) { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">See if each key correspondes to its position</span>
                <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$i</span> != <span style="color: rgba(128, 0, 128, 1)">$keys</span>[<span style="color: rgba(128, 0, 128, 1)">$i</span>]) { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">A key fails at position check.</span>
                  <span style="color: rgba(128, 0, 128, 1)">$is_list</span> = <span style="color: rgba(0, 0, 255, 1)">false</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">It is an associative array.</span>
                  <span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
                }
            }
      }
      </span><span style="color: rgba(0, 0, 255, 1)">foreach</span> (<span style="color: rgba(128, 0, 128, 1)">$arr</span> <span style="color: rgba(0, 0, 255, 1)">as</span> <span style="color: rgba(128, 0, 128, 1)">$key</span> =&gt; <span style="color: rgba(128, 0, 128, 1)">$value</span><span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 128, 128, 1)">is_array</span>(<span style="color: rgba(128, 0, 128, 1)">$value</span>)) { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Custom handling for arrays</span>
                <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$is_list</span><span style="color: rgba(0, 0, 0, 1)">)
                  </span><span style="color: rgba(128, 0, 128, 1)">$parts</span>[] = self::json_encode(<span style="color: rgba(128, 0, 128, 1)">$value</span>); <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> :RECURSION: </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
                <span style="color: rgba(0, 0, 255, 1)">else</span>
                  <span style="color: rgba(128, 0, 128, 1)">$parts</span>[] = '"' . <span style="color: rgba(128, 0, 128, 1)">$key</span> . '":' . self::json_encode(<span style="color: rgba(128, 0, 128, 1)">$value</span>); <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> :RECURSION: </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
            } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(128, 0, 128, 1)">$str</span> = ''<span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(128, 0, 128, 1)">$is_list</span><span style="color: rgba(0, 0, 0, 1)">)
                  </span><span style="color: rgba(128, 0, 128, 1)">$str</span> = '"' . <span style="color: rgba(128, 0, 128, 1)">$key</span> . '":'<span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Custom handling for multiple data types</span>
                <span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 128, 128, 1)">is_numeric</span>(<span style="color: rgba(128, 0, 128, 1)">$value</span>) &amp;&amp; <span style="color: rgba(128, 0, 128, 1)">$value</span> &lt; 2000000000<span style="color: rgba(0, 0, 0, 1)">)
                  </span><span style="color: rgba(128, 0, 128, 1)">$str</span> .= <span style="color: rgba(128, 0, 128, 1)">$value</span>; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Numbers</span>
                <span style="color: rgba(0, 0, 255, 1)">elseif</span> (<span style="color: rgba(128, 0, 128, 1)">$value</span> === <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">)
                  </span><span style="color: rgba(128, 0, 128, 1)">$str</span> .= 'false'; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">The booleans</span>
                <span style="color: rgba(0, 0, 255, 1)">elseif</span> (<span style="color: rgba(128, 0, 128, 1)">$value</span> === <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">)
                  </span><span style="color: rgba(128, 0, 128, 1)">$str</span> .= 'true'<span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 0, 255, 1)">else</span>
                  <span style="color: rgba(128, 0, 128, 1)">$str</span> .= '"' . <span style="color: rgba(0, 128, 128, 1)">addslashes</span>(<span style="color: rgba(128, 0, 128, 1)">$value</span>) . '"'; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">All other things
                // :TODO: Is there any more datatype we should be in the lookout for? (Object?)</span>
                <span style="color: rgba(128, 0, 128, 1)">$parts</span>[] = <span style="color: rgba(128, 0, 128, 1)">$str</span><span style="color: rgba(0, 0, 0, 1)">;
            }
      }
      </span><span style="color: rgba(128, 0, 128, 1)">$json</span> = <span style="color: rgba(0, 128, 128, 1)">implode</span>(',', <span style="color: rgba(128, 0, 128, 1)">$parts</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(128, 0, 128, 1)">$is_list</span><span style="color: rgba(0, 0, 0, 1)">)
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> '[' . <span style="color: rgba(128, 0, 128, 1)">$json</span> . ']'; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Return numerical JSON</span>
      <span style="color: rgba(0, 0, 255, 1)">return</span> '{' . <span style="color: rgba(128, 0, 128, 1)">$json</span> . '}'; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Return associative JSON</span>
<span style="color: rgba(0, 0, 0, 1)">    }
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * GET 请求
   * @param string $url
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">function</span> http_get(<span style="color: rgba(128, 0, 128, 1)">$url</span><span style="color: rgba(0, 0, 0, 1)">)
    {
      </span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span> =<span style="color: rgba(0, 0, 0, 1)"> curl_init();
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 128, 128, 1)">stripos</span>(<span style="color: rgba(128, 0, 128, 1)">$url</span>, "https://") !== <span style="color: rgba(0, 0, 255, 1)">FALSE</span><span style="color: rgba(0, 0, 0, 1)">) {

            curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span>, CURLOPT_SSL_VERIFYPEER, <span style="color: rgba(0, 0, 255, 1)">FALSE</span><span style="color: rgba(0, 0, 0, 1)">);
            curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span>, CURLOPT_SSL_VERIFYHOST, <span style="color: rgba(0, 0, 255, 1)">FALSE</span><span style="color: rgba(0, 0, 0, 1)">);
      }
      curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span>, CURLOPT_URL, <span style="color: rgba(128, 0, 128, 1)">$url</span><span style="color: rgba(0, 0, 0, 1)">);
      curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span>, CURLOPT_RETURNTRANSFER, 1<span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(128, 0, 128, 1)">$sContent</span> = curl_exec(<span style="color: rgba(128, 0, 128, 1)">$oCurl</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(128, 0, 128, 1)">$aStatus</span> = curl_getinfo(<span style="color: rgba(128, 0, 128, 1)">$oCurl</span><span style="color: rgba(0, 0, 0, 1)">);

      curl_close(</span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 128, 128, 1)">intval</span>(<span style="color: rgba(128, 0, 128, 1)">$aStatus</span>["http_code"]) == 200<span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$sContent</span><span style="color: rgba(0, 0, 0, 1)">;
      } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      }
    }
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * POST 请求
   * @param string $url
   * @param array $param
   * @return string content
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">function</span> http_post(<span style="color: rgba(128, 0, 128, 1)">$url</span>, <span style="color: rgba(128, 0, 128, 1)">$param</span><span style="color: rgba(0, 0, 0, 1)">)
    {
      </span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span> =<span style="color: rgba(0, 0, 0, 1)"> curl_init();
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 128, 128, 1)">stripos</span>(<span style="color: rgba(128, 0, 128, 1)">$url</span>, "https://") !== <span style="color: rgba(0, 0, 255, 1)">FALSE</span><span style="color: rgba(0, 0, 0, 1)">) {
            curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span>, CURLOPT_SSL_VERIFYPEER, <span style="color: rgba(0, 0, 255, 1)">FALSE</span><span style="color: rgba(0, 0, 0, 1)">);
            curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span>, CURLOPT_SSL_VERIFYHOST, <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
      }
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 128, 128, 1)">is_string</span>(<span style="color: rgba(128, 0, 128, 1)">$param</span><span style="color: rgba(0, 0, 0, 1)">)) {
            </span><span style="color: rgba(128, 0, 128, 1)">$strPOST</span> = <span style="color: rgba(128, 0, 128, 1)">$param</span><span style="color: rgba(0, 0, 0, 1)">;
      } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(128, 0, 128, 1)">$aPOST</span> = <span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">();
            </span><span style="color: rgba(0, 0, 255, 1)">foreach</span> (<span style="color: rgba(128, 0, 128, 1)">$param</span> <span style="color: rgba(0, 0, 255, 1)">as</span> <span style="color: rgba(128, 0, 128, 1)">$key</span> =&gt; <span style="color: rgba(128, 0, 128, 1)">$val</span><span style="color: rgba(0, 0, 0, 1)">) {
                </span><span style="color: rgba(128, 0, 128, 1)">$aPOST</span>[] = <span style="color: rgba(128, 0, 128, 1)">$key</span> . "=" . <span style="color: rgba(0, 128, 128, 1)">urlencode</span>(<span style="color: rgba(128, 0, 128, 1)">$val</span><span style="color: rgba(0, 0, 0, 1)">);
            }
            </span><span style="color: rgba(128, 0, 128, 1)">$strPOST</span> =<span style="color: rgba(0, 128, 128, 1)">join</span>("&amp;", <span style="color: rgba(128, 0, 128, 1)">$aPOST</span><span style="color: rgba(0, 0, 0, 1)">);
      }
      curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span>, CURLOPT_URL, <span style="color: rgba(128, 0, 128, 1)">$url</span><span style="color: rgba(0, 0, 0, 1)">);
      curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span>, CURLOPT_RETURNTRANSFER, 1<span style="color: rgba(0, 0, 0, 1)">);
      curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span>, CURLOPT_POST, <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">);
      curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span>, CURLOPT_POSTFIELDS, <span style="color: rgba(128, 0, 128, 1)">$strPOST</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(128, 0, 128, 1)">$sContent</span> = curl_exec(<span style="color: rgba(128, 0, 128, 1)">$oCurl</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(128, 0, 128, 1)">$aStatus</span> = curl_getinfo(<span style="color: rgba(128, 0, 128, 1)">$oCurl</span><span style="color: rgba(0, 0, 0, 1)">);
      curl_close(</span><span style="color: rgba(128, 0, 128, 1)">$oCurl</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 128, 128, 1)">intval</span>(<span style="color: rgba(128, 0, 128, 1)">$aStatus</span>["http_code"]) == 200<span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$sContent</span><span style="color: rgba(0, 0, 0, 1)">;
      } </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
      }
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">设置菜单</span></div>
<h2 id="title" class="weui-desktop-page__title">微信网页授权</h2>
<p>1、首先进行微信认证;</p>
<p>2、开通“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名</p>
<p><img alt="" width="485" height="150" data-src="https://img2018.cnblogs.com/blog/803621/201908/803621-20190808114514450-1412473113.png">根据提示下载文件,配置好域名;</p>
<p>3、获取code,获取openID</p>
<div class="cnblogs_code"><img id="code_img_closed_f1c09e54-9a50-4156-8c85-6bf85cfe3026" class="code_img_closed lazyload" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif"><img id="code_img_opened_f1c09e54-9a50-4156-8c85-6bf85cfe3026" class="code_img_opened lazyload" style="display: none" alt="" data-src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif">
<div id="cnblogs_code_open_f1c09e54-9a50-4156-8c85-6bf85cfe3026" class="cnblogs_code_hide">
<pre>&lt;?<span style="color: rgba(0, 0, 0, 1)">php
namespace app\index\controller;
</span><span style="color: rgba(0, 0, 255, 1)">class</span> Qrcode <span style="color: rgba(0, 0, 255, 1)">extends</span><span style="color: rgba(0, 0, 0, 1)"> Controller
{
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> index(){
      </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(is_weixin()){
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">如果是微信扫码</span>
            <span style="color: rgba(128, 0, 128, 1)">$code</span> = input('?code') ? input('code') : ''<span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(128, 0, 128, 1)">$code</span><span style="color: rgba(0, 0, 0, 1)">){
                </span><span style="color: rgba(128, 0, 128, 1)">$openid</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;getopenid(<span style="color: rgba(128, 0, 128, 1)">$code</span><span style="color: rgba(0, 0, 0, 1)">);
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取openID</span>
            }<span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
                </span><span style="color: rgba(128, 0, 128, 1)">$backurl</span>='https://'.<span style="color: rgba(128, 0, 128, 1)">$_SERVER</span>['HTTP_HOST'].<span style="color: rgba(128, 0, 128, 1)">$_SERVER</span>['REQUEST_URI'<span style="color: rgba(0, 0, 0, 1)">];
                </span><span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;getcode(<span style="color: rgba(128, 0, 128, 1)">$backurl</span><span style="color: rgba(0, 0, 0, 1)">);
            }
            
      }
      }
      </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 微信获取openid
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> getopenid(<span style="color: rgba(128, 0, 128, 1)">$coded</span><span style="color: rgba(0, 0, 0, 1)">){
      </span><span style="color: rgba(128, 0, 128, 1)">$appid</span> = 'XXXXXXXX'<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$appsecret</span> = 'XXXXXXXX'<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$code</span> = <span style="color: rgba(128, 0, 128, 1)">$coded</span><span style="color: rgba(0, 0, 0, 1)">;

      </span><span style="color: rgba(128, 0, 128, 1)">$token_url</span> = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.<span style="color: rgba(128, 0, 128, 1)">$appid</span>.'&amp;secret='.<span style="color: rgba(128, 0, 128, 1)">$appsecret</span>.'&amp;code='.<span style="color: rgba(128, 0, 128, 1)">$code</span>.'&amp;grant_type=authorization_code'<span style="color: rgba(0, 0, 0, 1)">;

      </span><span style="color: rgba(128, 0, 128, 1)">$token_data</span> = <span style="color: rgba(128, 0, 128, 1)">$this</span>-&gt;http(<span style="color: rgba(128, 0, 128, 1)">$token_url</span><span style="color: rgba(0, 0, 0, 1)">);
      
      </span><span style="color: rgba(0, 0, 255, 1)">if</span>(!<span style="color: rgba(0, 0, 255, 1)">empty</span>(<span style="color: rgba(128, 0, 128, 1)">$token_data</span>))
      {
            </span><span style="color: rgba(128, 0, 128, 1)">$tdata</span> = json_decode(<span style="color: rgba(128, 0, 128, 1)">$token_data</span>, <span style="color: rgba(0, 0, 255, 1)">TRUE</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(128, 0, 128, 1)">$openid</span> = <span style="color: rgba(128, 0, 128, 1)">$tdata</span>['openid'<span style="color: rgba(0, 0, 0, 1)">];
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$openid</span><span style="color: rgba(0, 0, 0, 1)">;
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">FALSE</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * 获取微信code
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> getcode(<span style="color: rgba(128, 0, 128, 1)">$burl</span><span style="color: rgba(0, 0, 0, 1)">){
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> $backurl='https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];</span>
      <span style="color: rgba(128, 0, 128, 1)">$backurl</span> = <span style="color: rgba(128, 0, 128, 1)">$burl</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$redirect_uri</span> = <span style="color: rgba(0, 128, 128, 1)">urlencode</span>(<span style="color: rgba(128, 0, 128, 1)">$backurl</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(128, 0, 128, 1)">$appid</span> = 'XXXXXXXX'<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$state</span> = 123<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(128, 0, 128, 1)">$url</span> = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='.<span style="color: rgba(128, 0, 128, 1)">$appid</span>.'&amp;redirect_uri='.<span style="color: rgba(128, 0, 128, 1)">$redirect_uri</span>.'&amp;response_type=code&amp;scope=snsapi_base&amp;state='.<span style="color: rgba(128, 0, 128, 1)">$state</span>.'#wechat_redirect'<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 128, 128, 1)">header</span>("Location: <span style="color: rgba(128, 0, 128, 1)">$url</span>"<span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">exit</span><span style="color: rgba(0, 0, 0, 1)">();
    }
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
   * Http方法
   *
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>
    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">function</span> http(<span style="color: rgba(128, 0, 128, 1)">$url</span><span style="color: rgba(0, 0, 0, 1)">)
    {
      </span><span style="color: rgba(128, 0, 128, 1)">$ch</span> = curl_init(<span style="color: rgba(128, 0, 128, 1)">$url</span><span style="color: rgba(0, 0, 0, 1)">);
      curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$ch</span>, CURLOPT_CONNECTTIMEOUT, 30<span style="color: rgba(0, 0, 0, 1)">);
      curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$ch</span>, CURLOPT_TIMEOUT, 10<span style="color: rgba(0, 0, 0, 1)">);
      curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$ch</span>, CURLOPT_RETURNTRANSFER, <span style="color: rgba(0, 0, 255, 1)">TRUE</span><span style="color: rgba(0, 0, 0, 1)">);
      curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$ch</span>, CURLOPT_SSL_VERIFYPEER, <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
      curl_setopt(</span><span style="color: rgba(128, 0, 128, 1)">$ch</span>, CURLOPT_HEADER, <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(128, 0, 128, 1)">$output</span> = curl_exec(<span style="color: rgba(128, 0, 128, 1)">$ch</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">输出内容</span>
      curl_close(<span style="color: rgba(128, 0, 128, 1)">$ch</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">array</span>(<span style="color: rgba(128, 0, 128, 1)">$output</span><span style="color: rgba(0, 0, 0, 1)">);
    }   
}
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 是否是微信浏览器
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> is_weixin()
{
    </span><span style="color: rgba(128, 0, 128, 1)">$useragent</span> = <span style="color: rgba(0, 128, 128, 1)">addslashes</span>(<span style="color: rgba(128, 0, 128, 1)">$_SERVER</span>['HTTP_USER_AGENT'<span style="color: rgba(0, 0, 0, 1)">]);
    </span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 128, 128, 1)">strpos</span>(<span style="color: rgba(128, 0, 128, 1)">$useragent</span>, 'MicroMessenger') === <span style="color: rgba(0, 0, 255, 1)">false</span> &amp;&amp; <span style="color: rgba(0, 128, 128, 1)">strpos</span>(<span style="color: rgba(128, 0, 128, 1)">$useragent</span>, 'Windows Phone') === <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)"> )
    {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
    {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
    }
}      
</span>?&gt;      </pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/ziyandeyanhuo/p/11081421.html
頁: [1]
查看完整版本: 微信公众号开发