莹宝我爱你 發表於 2019-7-2 16:45:00

PHP公众号开发给用户发微信消息提醒功能

<p>  最近做的一个项目,当有用户有资金到账或者成员变动时需要给他发一条微信消息提示。针对这个,开始想使用模板消息,但是刚注册的公众号申请消息模板需要几天时间申请,在时间不足下选择了使用客服消息接口,微信文档地址:&nbsp;https://mp.weixin.qq.com/wiki。</p>
<p>&nbsp; &nbsp; 这里跳过网页授权和用户信息获取,请求接口的步骤,主要看获取access_token,发布客服消息,验证是否关注公众号等接口。</p>
<p><img class="zoom-in-cursor lazyload" alt="" width="1564" height="883" data-src="https://oscimg.oschina.net/oscnet/b202d6697fa065c9e9fce1cb28145959b16.jpg"></p>
<p><img class="zoom-in-cursor lazyload" alt="" width="1659" height="916" data-src="https://oscimg.oschina.net/oscnet/7d20df70d3f75acd672fda42f6b6f68e63d.jpg"></p>
<p>&nbsp;</p>
<p>1. 获取access_token。</p>
<pre><code class="hljs php"><span class="hljs-comment">// 获取access_token
<span class="hljs-keyword">public <span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">getAccessToken<span class="hljs-params">($weid) {
      $appID = <span class="hljs-string">"wxfaddfdfdfd6cf6fc3569";                                    <span class="hljs-comment">// 服务号appID
      $appSecret = <span class="hljs-string">"071bebfdfdofdfd23687bf53d63a";                            <span class="hljs-comment">// 服务号appSerect

      $url = <span class="hljs-string">"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&amp;appid=$appID&amp;secret=$appSecret";
      $content = ihttp_get($url);                                             <span class="hljs-comment">// 自定义请求函数
      <span class="hljs-keyword">if(is_error($content)) {
            <span class="hljs-keyword">return error(<span class="hljs-string">'-1', <span class="hljs-string">'获取微信公众号授权失败, 请稍后重试!错误详情: ' . $content[<span class="hljs-string">'message']);
      }
      <span class="hljs-keyword">if (<span class="hljs-keyword">empty($content[<span class="hljs-string">'content'])) {
            <span class="hljs-keyword">return error(<span class="hljs-string">'-1', <span class="hljs-string">'AccessToken获取失败,请检查appid和appsecret的值是否与微信公众平台一致!');
      }
      $token = @json_decode($content[<span class="hljs-string">'content'], <span class="hljs-keyword">true);

      <span class="hljs-keyword">if ($token[<span class="hljs-string">'errcode'] == <span class="hljs-string">'40164') {
            <span class="hljs-keyword">return error(<span class="hljs-number">-1, <span class="hljs-keyword">$this-&gt;errorCode($token[<span class="hljs-string">'errcode'], $token[<span class="hljs-string">'errmsg']));
      }
      <span class="hljs-keyword">if(<span class="hljs-keyword">empty($token) || !is_array($token) || <span class="hljs-keyword">empty($token[<span class="hljs-string">'access_token']) || <span class="hljs-keyword">empty($token[<span class="hljs-string">'expires_in'])) {
            $errorinfo = substr($content[<span class="hljs-string">'meta'], strpos($content[<span class="hljs-string">'meta'], <span class="hljs-string">'{'));
            $errorinfo = @json_decode($errorinfo, <span class="hljs-keyword">true);
            <span class="hljs-keyword">return error(<span class="hljs-string">'-1', <span class="hljs-string">'获取微信公众号授权失败, 请稍后重试! 公众平台返回原始数据为: 错误代码-' . $errorinfo[<span class="hljs-string">'errcode'] . <span class="hljs-string">',错误信息-' . $errorinfo[<span class="hljs-string">'errmsg']);
      }
      $record = <span class="hljs-keyword">array();
      $record[<span class="hljs-string">'token'] = $token[<span class="hljs-string">'access_token'];
      $record[<span class="hljs-string">'expire'] = TIMESTAMP + $token[<span class="hljs-string">'expires_in'] - <span class="hljs-number">200;
      $cachekey = cache_system_key(<span class="hljs-string">'accesstoken', <span class="hljs-keyword">array(<span class="hljs-string">'acid' =&gt; $weid));
      cache_write($cachekey, $record);
      <span class="hljs-keyword">return $record[<span class="hljs-string">'token'];
    }</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>&nbsp;</p>
<p>2. 判断是否关注公众号。</p>
<pre><code class="hljs php"><span class="hljs-comment">// 判断当前用户是否关注公众号
<span class="hljs-keyword">public <span class="hljs-keyword">public <span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">isSubscribe<span class="hljs-params">($weid,$userid) {
      <span class="hljs-comment">// 获取当前用户信息
      $userinfo = pdo_get(<span class="hljs-string">'hcface_users',<span class="hljs-keyword">array(<span class="hljs-string">'uid'=&gt;$userid));
               
                <span class="hljs-comment">//return $userinfo;
      <span class="hljs-keyword">if(<span class="hljs-keyword">empty($userinfo)) {
            <span class="hljs-keyword">return <span class="hljs-keyword">false;
      }
      <span class="hljs-comment">// 获取access_token
      $accessToken = <span class="hljs-keyword">$this-&gt;getAccessToken($weid);

      <span class="hljs-comment">// 是否关注接口
      $url = <span class="hljs-string">"https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$accessToken.<span class="hljs-string">"&amp;openid=".$userinfo[<span class="hljs-string">'openid'].<span class="hljs-string">"&amp;lang=zh_CN";
      $res = ihttp_request($url);
      
      <span class="hljs-keyword">if(is_error($res)) {
            <span class="hljs-keyword">return <span class="hljs-keyword">false;
      }
      <span class="hljs-keyword">if($res[<span class="hljs-string">'code'] != <span class="hljs-string">'200') {
            <span class="hljs-keyword">return <span class="hljs-keyword">false;
      }
      
      $result = @json_decode($res[<span class="hljs-string">'content'],<span class="hljs-keyword">true);

      <span class="hljs-keyword">if($result[<span class="hljs-string">'subscribe'] == <span class="hljs-number">1) {
            $updateData = [];
            <span class="hljs-comment">// 判断当前用户头像和昵称是否更换
            <span class="hljs-keyword">if($userinfo[<span class="hljs-string">'avatar'] != $result[<span class="hljs-string">'headimgurl']) {
                $updateData[<span class="hljs-string">'avatar'] = $result[<span class="hljs-string">'headimgurl'];
            }
            <span class="hljs-keyword">if($userinfo[<span class="hljs-string">'nickname'] != $result[<span class="hljs-string">'nickname']) {
                $updateData[<span class="hljs-string">'avatar'] = $result[<span class="hljs-string">'nickname'];
            }

            <span class="hljs-keyword">if(!<span class="hljs-keyword">empty($updateData)) {
                pdo_update(<span class="hljs-string">'hcface_users',$updateData,<span class="hljs-keyword">array(<span class="hljs-string">'uid'=&gt;$userid));
            }
      }

      $userInfoData = [
            <span class="hljs-string">"subscribe" =&gt; $result[<span class="hljs-string">'subscribe'],
            <span class="hljs-string">"user_openid" =&gt; $userinfo[<span class="hljs-string">'openid'],
                        <span class="hljs-string">"nickname" =&gt; $userinfo[<span class="hljs-string">'nickname'],
      ];
      <span class="hljs-keyword">return $userInfoData;
    }</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>&nbsp;</p>
<p>3. 发送客服消息。</p>
<pre><code class="hljs php"><span class="hljs-keyword">public <span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">solPushMsg<span class="hljs-params">($openid, $content, $wid) {
      <span class="hljs-comment">// 获取access_token
      $accessToken = <span class="hljs-keyword">$this-&gt;getAccessToken($wid);

      $data = <span class="hljs-keyword">array(
          <span class="hljs-string">'touser' =&gt; $openid,            <span class="hljs-comment">// 用户openID
          <span class="hljs-string">'msgtype' =&gt; <span class="hljs-string">'text',
          <span class="hljs-string">'text' =&gt; [
                <span class="hljs-string">'content' =&gt; $content,   <span class="hljs-comment">// 内容
            ],
      );
      $url = <span class="hljs-string">'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='.$accessToken;
      $res = ihttp_request($url,json_encode($data,JSON_UNESCAPED_UNICODE)); <span class="hljs-comment">// json_encode第二个参数必须带上,不然发出的消息可能是unicode编码的

      <span class="hljs-keyword">if(is_error($res)) {
            <span class="hljs-keyword">return <span class="hljs-keyword">false;
      }
      <span class="hljs-keyword">if($res[<span class="hljs-string">'code'] != <span class="hljs-string">'200') {
            <span class="hljs-keyword">return <span class="hljs-keyword">false;
      }

      <span class="hljs-keyword">return @json_decode($res[<span class="hljs-string">'content'],<span class="hljs-keyword">true);
    }</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>&nbsp;</p>
<p>4. 微信接口返回的是一个数组。</p>
<p><img class="zoom-in-cursor lazyload" alt="" width="1299" height="588" data-src="https://oscimg.oschina.net/oscnet/ee990d43517d5f2fc87d95f25d290bbd204.jpg"></p>
<p>&nbsp;</p>
<p>5. 实现效果。</p>
<p><img class="zoom-in-cursor lazyload" alt="" width="440" height="181" data-src="https://oscimg.oschina.net/oscnet/2f1a1f8b53548f77c650211eac5058eb08c.jpg"></p>
<p>&nbsp;</p>
<p>公众号</p>
<p><img class="zoom-in-cursor lazyload" alt="" width="430" height="430" data-src="https://oscimg.oschina.net/oscnet/361943aa9b031776d088d84da8970c75e63.jpg"></p>

</div>
<div id="MySignature" role="contentinfo">
    个人网站:www.zerofc.cn
公众号:ZEROFC_DEV
QQ交流群:515937120
QQ:2652364582
头条号:1637769351151619
B站:286666708
大鱼号:北桥苏<br><br>
来源:https://www.cnblogs.com/zerofc/p/11121619.html
頁: [1]
查看完整版本: PHP公众号开发给用户发微信消息提醒功能