PHP公众号开发给用户发微信消息提醒功能
<p> 最近做的一个项目,当有用户有资金到账或者成员变动时需要给他发一条微信消息提示。针对这个,开始想使用模板消息,但是刚注册的公众号申请消息模板需要几天时间申请,在时间不足下选择了使用客服消息接口,微信文档地址: https://mp.weixin.qq.com/wiki。</p><p> 这里跳过网页授权和用户信息获取,请求接口的步骤,主要看获取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> </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&appid=$appID&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->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' => $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> </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'=>$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->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">"&openid=".$userinfo[<span class="hljs-string">'openid'].<span class="hljs-string">"&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'=>$userid));
}
}
$userInfoData = [
<span class="hljs-string">"subscribe" => $result[<span class="hljs-string">'subscribe'],
<span class="hljs-string">"user_openid" => $userinfo[<span class="hljs-string">'openid'],
<span class="hljs-string">"nickname" => $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> </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->getAccessToken($wid);
$data = <span class="hljs-keyword">array(
<span class="hljs-string">'touser' => $openid, <span class="hljs-comment">// 用户openID
<span class="hljs-string">'msgtype' => <span class="hljs-string">'text',
<span class="hljs-string">'text' => [
<span class="hljs-string">'content' => $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> </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> </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> </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]