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



2019-07-02 16:45 
北桥苏 
阅读(5301
评论(0
编辑 
收藏 
举报

  最近做的一个项目,当有用户有资金到账或者成员变动时需要给他发一条微信消息提示。针对这个,开始想使用模板消息,但是刚注册的公众号申请消息模板需要几天时间申请,在时间不足下选择了使用客服消息接口,微信文档地址: https://mp.weixin.qq.com/wiki。

    这里跳过网页授权和用户信息获取,请求接口的步骤,主要看获取access_token,发布客服消息,验证是否关注公众号等接口。

 

1. 获取access_token。

// 获取access_token
public function getAccessToken($weid) {
        $appID = "wxfaddfdfdfd6cf6fc3569";                                      // 服务号appID
        $appSecret = "071bebfdfdofdfd23687bf53d63a";                            // 服务号appSerect

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

        if ($token[\'errcode\'] == \'40164\') {
            return error(-1, $this->errorCode($token[\'errcode\'], $token[\'errmsg\']));
        }
        if(empty($token) || !is_array($token) || empty($token[\'access_token\']) || empty($token[\'expires_in\'])) {
            $errorinfo = substr($content[\'meta\'], strpos($content[\'meta\'], \'{\'));
            $errorinfo = @json_decode($errorinfo, true);
            return error(\'-1\', \'获取微信公众号授权失败, 请稍后重试! 公众平台返回原始数据为: 错误代码-\' . $errorinfo[\'errcode\'] . \',错误信息-\' . $errorinfo[\'errmsg\']);
        }
        $record = array();
        $record[\'token\'] = $token[\'access_token\'];
        $record[\'expire\'] = TIMESTAMP + $token[\'expires_in\'] - 200;
        $cachekey = cache_system_key(\'accesstoken\', array(\'acid\' => $weid));
        cache_write($cachekey, $record);
        return $record[\'token\'];
    }

 

2. 判断是否关注公众号。

// 判断当前用户是否关注公众号
public public function isSubscribe($weid,$userid) {
        // 获取当前用户信息
        $userinfo = pdo_get(\'hcface_users\',array(\'uid\'=>$userid));
		
		//return $userinfo;
        if(empty($userinfo)) {
            return false;
        }
        // 获取access_token
        $accessToken = $this->getAccessToken($weid);

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

        if($result[\'subscribe\'] == 1) {
            $updateData = [];
            // 判断当前用户头像和昵称是否更换
            if($userinfo[\'avatar\'] != $result[\'headimgurl\']) {
                $updateData[\'avatar\'] = $result[\'headimgurl\'];
            }
            if($userinfo[\'nickname\'] != $result[\'nickname\']) {
                $updateData[\'avatar\'] = $result[\'nickname\'];
            }

            if(!empty($updateData)) {
                pdo_update(\'hcface_users\',$updateData,array(\'uid\'=>$userid));
            }
        }

        $userInfoData = [
            "subscribe" => $result[\'subscribe\'],
            "user_openid" => $userinfo[\'openid\'],
			"nickname" => $userinfo[\'nickname\'],
        ];
        return $userInfoData;
    }

 

3. 发送客服消息。

public function solPushMsg($openid, $content, $wid) {
        // 获取access_token
        $accessToken = $this->getAccessToken($wid);

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

        if(is_error($res)) {
            return false;
        }
        if($res[\'code\'] != \'200\') {
            return false;
        }

        return @json_decode($res[\'content\'],true);
    }

 

4. 微信接口返回的是一个数组。

 

5. 实现效果。

 

公众号

版权声明:本文为zerofc原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zerofc/p/11121619.html