• php 公众号开发


    思考:

    1,优先使用php扩展库的sdk,配合微信文档。

    2,公众号开发比较简单,重在业务。

    公众号关联与消息分发

    <?php
    
    namespace appwapcontroller;
    
    use thinkController;
    	hinkLoader::addNamespace('data', 'data/');
    use dataextendWchatOauth;
    use dataserviceConfig;
    use dataserviceWebSite;
    use dataserviceWeixin;
    
    class Wchat extends Controller
    {
    
        public $wchat;
    
        public $weixin_service;
    
        public $author_appid;
    
        public $instance_id;
    
        public $style;
    
        public function __construct()
        {
            parent::__construct();
            $this->wchat = new WchatOauth(); // 微信公众号相关类
            
            $this->weixin_service = new Weixin();
            // 使用那个手机模板
            $config = new Config();
            $use_wap_template = $config->getUseWapTemplate(0);
            
            if (empty($use_wap_template)) {
                $use_wap_template['value'] = 'default_new';
            }
            $this->style = "wap/" . $use_wap_template['value'] . "/";
            $this->assign("style", "wap/" . $use_wap_template['value']);
            
            $this->getMessage();
        }
    
        /**
         * ************************************************************************微信公众号消息相关方法 开始******************************************************
         */
        /**
         * 关联公众号微信
         */
        public function relateWeixin()
        {
            $sign = request()->get('signature', '');
            if (isset($sign)) {
                $signature = $sign;
                $timestamp = request()->get('timestamp');
                $nonce = request()->get('nonce');
                
                $token = "TOKEN";
                $config = new Config();
                $this->instance_id = 0;
                $wchat_config = $config->getInstanceWchatConfig($this->instance_id);
                if (! empty($wchat_config["value"]["token"])) {
                    $token = $wchat_config["value"]["token"];
                }
                
                $tmpArr = array(
                    $token,
                    $timestamp,
                    $nonce
                );
                
                sort($tmpArr, SORT_STRING);
                $tmpStr = implode($tmpArr);
                $tmpStr = sha1($tmpStr);
                
                if ($tmpStr == $signature) {
                    $echostr = request()->get('echostr', '');
                    if (! empty($echostr)) {
                        ob_clean();
                        echo $echostr;
                    }
                    
                    return 1;
                } else {
                    return 0;
                }
            }
        }
    
        public function templateMessage()
        {
            $media_id = request()->get('media_id', 0);
            $weixin = new Weixin();
            $info = $weixin->getWeixinMediaDetailByMediaId($media_id);
            if (! empty($info["media_parent"])) {
                $website = new WebSite();
                $website_info = $website->getWebSiteInfo();
                $this->assign("website_info", $website_info);
                $this->assign("info", $info);
                return view($this->style . 'Wchat/templateMessage');
            } else {
                echo "图文消息没有查询到";
            }
        }
    
        /**
         * 微信开放平台模式(需要对消息进行加密和解密)
         * 微信获取消息以及返回接口
         */
        public function getMessage()
        {
            $from_xml = file_get_contents('php://input');
            if (empty($from_xml)) {
                return;
            }
            $signature = request()->get('msg_signature', '');
            $signature = request()->get('timestamp', '');
            $nonce = request()->get('nonce', '');
            $url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] . '?' . $_SERVER['QUERY_STRING'];
            $ticket_xml = $from_xml;
            $postObj = simplexml_load_string($ticket_xml, 'SimpleXMLElement', LIBXML_NOCDATA);
            
            $this->instance_id = 0;
            if (! empty($postObj->MsgType)) {
                switch ($postObj->MsgType) {
                    case "text":
                        $weixin = new Weixin();
                        // 用户发的消息 存入表中
                        $weixin->addUserMessage((string) $postObj->FromUserName, (string) $postObj->Content, (string) $postObj->MsgType);
                        $resultStr = $this->MsgTypeText($postObj);
                        break;
                    case "event":
                        $resultStr = $this->MsgTypeEvent($postObj);
                        break;
                    default:
                        $resultStr = "";
                        break;
                }
            }
            if (! empty($resultStr)) {
                echo $resultStr;
            } else {
                echo '';
            }
            exit();
        }
    
        /**
         * 文本消息回复格式
         *
         * @param unknown $postObj            
         * @return Ambigous <void, string>
         */
        private function MsgTypeText($postObj)
        {
            $funcFlag = 0; // 星标
            $wchat_replay = $this->weixin_service->getWhatReplay($this->instance_id, (string) $postObj->Content);
            // 判断用户输入text
            if (! empty($wchat_replay)) { // 关键词匹配回复
                $contentStr = $wchat_replay; // 构造media数据并返回
            } elseif ($postObj->Content == "uu") {
                $contentStr = "shopId:" . $this->instance_id;
            } elseif ($postObj->Content == "TESTCOMPONENT_MSG_TYPE_TEXT") {
                $contentStr = "TESTCOMPONENT_MSG_TYPE_TEXT_callback"; // 微店插件功能 关键词,预留口
            } elseif (strpos($postObj->Content, "QUERY_AUTH_CODE") !== false) {
                $get_str = str_replace("QUERY_AUTH_CODE:", "", $postObj->Content);
                $contentStr = $get_str . "_from_api"; // 微店插件功能 关键词,预留口
            } else {
                $content = $this->weixin_service->getDefaultReplay($this->instance_id);
                if (! empty($content)) {
                    $contentStr = $content;
                } else {
                    $contentStr = '';
                }
            }
            if (is_array($contentStr)) {
                $resultStr = $this->wchat->event_key_news($postObj, $contentStr);
            } elseif (! empty($contentStr)) {
                $resultStr = $this->wchat->event_key_text($postObj, $contentStr);
            } else {
                $resultStr = '';
            }
            return $resultStr;
        }
    
        /**
         * 事件消息回复机制
         */
        // 事件自动回复 MsgType = Event
        private function MsgTypeEvent($postObj)
        {
            $contentStr = "";
            switch ($postObj->Event) {
                case "subscribe": // 关注公众号
                    $str = $this->wchat->get_fans_info($postObj->FromUserName);
                    if (preg_match("/^qrscene_/", $postObj->EventKey)) {
                        $source_uid = substr($postObj->EventKey, 8);
                        $_SESSION['source_shop_id'] = $this->instance_id;
                        $_SESSION['source_uid'] = $source_uid;
                    } elseif (! empty($_SESSION['source_uid'])) {
                        $source_uid = $_SESSION['source_uid'];
                        $_SESSION['source_shop_id'] = $this->instance_id;
                    } else {
                        $source_uid = 0;
                    }
                    $Userstr = json_decode($str);
                    $nickname = base64_encode($Userstr->nickname);
                    $nickname_decode = preg_replace('/[x{10000}-x{10FFFF}]/u', '', $Userstr->nickname);
                    $headimgurl = $Userstr->headimgurl;
                    $sex = $Userstr->sex;
                    $language = $Userstr->language;
                    $country = $Userstr->country;
                    $province = $Userstr->province;
                    $city = $Userstr->city;
                    $district = "无";
                    $openid = $Userstr->openid;
                    if (! empty($Userstr->unionid)) {
                        $unionid = $Userstr->unionid;
                    } else {
                        $unionid = '';
                    }
                    $subscribe_date = date('Y/n/j G:i:s', (int) $postObj->CreateTime);
                    $memo = $Userstr->remark;
                    $weichat_subscribe = $this->weixin_service->addWeixinFans((int) $source_uid, $this->instance_id, $nickname, $nickname_decode, $headimgurl, $sex, $language, $country, $province, $city, $district, $openid, '', 1, $memo, $unionid); // 关注
                                                                                                                                                                                                                                                         // 添加关注回复
                    $content = $this->weixin_service->getSubscribeReplay($this->instance_id);
                    if (! empty($content)) {
                        $contentStr = $content;
                    }
                    // 构造media数据并返回 */
                    break;
                case "unsubscribe": // 取消关注公众号
                    $openid = $postObj->FromUserName;
                    $weichat_unsubscribe = $this->weixin_service->WeixinUserUnsubscribe($this->instance_id, (string) $openid);
                    break;
                case "VIEW": // VIEW事件 - 点击菜单跳转链接时的事件推送
                    /* $this->wchat->weichat_menu_hits_view($postObj->EventKey); //菜单计数 */
                    $contentStr = "";
                    break;
                case "SCAN": // SCAN事件 - 用户已关注时的事件推送 - 扫描带参数二维码事件
                    $openid = $postObj->FromUserName;
                    $data = $postObj->EventKey;
                    $user_bound = $this->weixin_service->userBoundParent((string) $openid, $data);
                    $content = $this->weixin_service->getSubscribeReplay($this->instance_id);
                    if (! empty($content)) {
                        $contentStr = $content;
                    }
                    break;
                case "CLICK": // CLICK事件 - 自定义菜单事件
                    $menu_detail = $this->weixin_service->getWeixinMenuDetail($postObj->EventKey);
                    $media_info = $this->weixin_service->getWeixinMediaDetail($menu_detail['media_id']);
                    $contentStr = $this->weixin_service->getMediaWchatStruct($media_info); // 构造media数据并返回 */
                    break;
                default:
                    break;
            }
            // $contentStr = $postObj->Event."from_callback";//测试接口正式部署之后注释不要删除
            if (is_array($contentStr)) {
                $resultStr = $this->wchat->event_key_news($postObj, $contentStr);
            } else {
                $resultStr = $this->wchat->event_key_text($postObj, $contentStr);
            }
            return $resultStr;
        }
    
    /**
     * ************************************************************************微信公众号消息相关方法 结束******************************************************
     */
    }
    View Code

    微信接口调用

    <?php
    namespace dataextend;
    
    use thinkCache as cache;
    use dataserviceConfig;
    use think;
    use thinkLog;
    
    class WchatOauth
    {
    
        public $author_appid;
    
        public $token;
    
        /**
         * 构造函数
         *
         * @param unknown $shop_id            
         */
        public function __construct($appid = '')
        {
            $this->author_appid = 'instanceid_0';
        }
    
        /**
         * ***********************************************************************基础信息*************************************************
         */
        /**
         * 公众号获取access_token
         *
         * @return unknown
         */
        private function get_access_token()
        {
            // 公众平台模式获取token
            $token = $this->single_get_access_token();
            return $token;
        }
    
        /**
         * 公众平台账户获取token
         */
        private function single_get_access_token()
        {
            $config = new Config();
            $wchat_config = $config->getInstanceWchatConfig(0);
            $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . $wchat_config['value']['appid'] . '&secret=' . $wchat_config['value']['appsecret'];
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            $a = curl_exec($ch);
            $strjson = json_decode($a);
            if($strjson == false || empty($strjson))
            {
                return '';
            }else{
                $token = $strjson->access_token;
                if (empty($token)) {} else {
                    // 注意如果是多用户需要
                    cache::set('token-' . $this->author_appid, $token, 3600);
                }
                return $token;
            }
           
        }
    
        /**
         * 微信数据获取
         *
         * @param unknown $url            
         * @param unknown $data            
         * @param string $needToken            
         * @return string|unknown
         */
        private function get_url_return($url, $data = '', $needToken = false)
        {
            // 第一次为空,则从文件中读取
            if (empty($this->token)) {
                $this->token = cache::get('token-' . $this->author_appid);
            }
            // 为空则重新取值
            if (empty($this->token) or $needToken) {
                
                $this->get_access_token();
                $this->token = cache::get('token-' . $this->author_appid);
            }
            $newurl = sprintf($url, $this->token);
            $curl = curl_init(); // 创建一个新url资源
            curl_setopt($curl, CURLOPT_URL, $newurl);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
            if (! empty($data)) {
                curl_setopt($curl, CURLOPT_POST, 1);
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            }
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            $AjaxReturn = curl_exec($curl);
            // curl_close();
            $strjson = json_decode($AjaxReturn);
            if (! empty($strjson->errcode)) {
                switch ($strjson->errcode) {
                    case 40001:
                        return $this->get_url_return($url, $data, true); // 获取access_token时AppSecret错误,或者access_token无效
                        break;
                    case 40014:
                        return $this->get_url_return($url, $data, true); // 不合法的access_token
                        break;
                    case 42001:
                        return $this->get_url_return($url, $data, true); // access_token超时
                        break;
                    case 45009:
                        return json_encode(array(
                            "errcode" => - 45009,
                            "errmsg" => "接口调用超过限制:" . $strjson->errmsg
                        ));
                        break;
                    case 41001:
                        return json_encode(array(
                            "errcode" => - 41001,
                            "errmsg" => "缺少access_token参数:" . $strjson->errmsg
                        ));
                        break;
                    default:
                        return json_encode(array(
                            "errcode" => - 41000,
                            "errmsg" => $strjson->errmsg
                        )); // 其他错误,抛出
                        break;
                }
            } else {
                return $AjaxReturn;
            }
        }
    
        /**
         * ***********************************************************************基础信息*************************************************
         */
        /**
         * *************************************************微信回复消息部分 开始**************************************
         */
        /**
         * 返回文本消息组装xml
         *
         * @param unknown $postObj            
         * @param unknown $content            
         * @param number $funcFlag            
         * @return string
         */
        public function event_key_text($postObj, $content, $funcFlag = 0)
        {
            if (! empty($content)) {
                $xmlTpl = "<xml>
                                <ToUserName><![CDATA[%s]]></ToUserName>
                                <FromUserName><![CDATA[%s]]></FromUserName>
                                <CreateTime>%s</CreateTime>
                                <MsgType><![CDATA[text]]></MsgType>
                                <Content><![CDATA[%s]]></Content>
                                <FuncFlag>%d</FuncFlag>
                            </xml>";
                $resultStr = sprintf($xmlTpl, $postObj->FromUserName, $postObj->ToUserName, time(), $content, $funcFlag);
                return $resultStr;
            }else{
                return '';
            }
        }
    
        /**
         * 返回图文消息组装xml
         *
         * @param unknown $postObj            
         * @param unknown $arr_item            
         * @param number $funcFlag            
         * @return void|string
         */
        public function event_key_news($postObj, $arr_item, $funcFlag = 0)
        {
            // 首条标题28字,其他标题39字
            if (! is_array($arr_item)) {
                return;
            }
            $itemTpl = "<item>
                            <Title><![CDATA[%s]]></Title>
                            <Description><![CDATA[%s]]></Description>
                            <PicUrl><![CDATA[%s]]></PicUrl>
                            <Url><![CDATA[%s]]></Url>
                        </item>
                    ";
            $item_str = "";
            foreach ($arr_item as $item) {
                $item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);
            }
            $newsTpl = "<xml>
            <ToUserName><![CDATA[%s]]></ToUserName>
            <FromUserName><![CDATA[%s]]></FromUserName>
            <CreateTime>%s</CreateTime>
            <MsgType><![CDATA[news]]></MsgType>
            <Content><![CDATA[]]></Content>
            <ArticleCount>%s</ArticleCount>
            <Articles>
            $item_str</Articles>
            <FuncFlag>%s</FuncFlag>
            </xml>";
            $resultStr = sprintf($newsTpl, $postObj->FromUserName, $postObj->ToUserName, time(), count($arr_item), $funcFlag);
            return $resultStr;
        }
    
        /**
         * *************************************************微信回复消息部分 结束******************************************************************************
         */
        
        /**
         * **********************************************************************************微信获取粉丝信息 开始*********************************************
         */
        
        /**
         * 微信公众号拉取粉丝信息
         *
         * @param unknown $next_openid            
         * @return mixed
         */
        public function get_fans_list($next_openid)
        {
            $strjson = $this->get_url_return("https://api.weixin.qq.com/cgi-bin/user/get?access_token=%s&next_openid={$next_openid}");
            $strarray = json_decode($strjson, true);
            return $strarray;
        }
        /**
         * 批量获取用户粉丝信息
         * @return mixed
         */
        public function get_fans_info_list($openids)
        {
            $strjson = $this->get_url_return("https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=%s", $openids);
            $strarray = json_decode($strjson, true);
            return $strarray;
        }
    
        /**
         * 获取粉丝信息(通过openID)
         *
         * @param unknown $openid            
         * @return Ambigous <string, dataextendunknown, mixed>
         */
        public function get_fans_info($openid)
        {
            $url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=%s&openid={$openid}";
            return $this->get_url_return($url);
        }
    
        /**
         * 获取openid(前台会员)
         *
         * @return unknown
         */
        public function get_member_access_token()
        {
            if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger')) {
                // 通过code获得openid
                if (empty($_GET['code'])) {
                    // 触发微信返回code码
                    $baseUrl = request()->url(true);
                    $url = $this->get_single_authorize_url($baseUrl, "123");
                    
                    Header("Location: $url");
                    exit();
                } else {
                    // 获取code码,以获取openid
                    $code = $_GET['code'];
                    
                    $data = $this->get_single_access_token($code);
                    return $data;
                }
            }
        }
    
        /**
         * 获取OAuth2授权access_token(微信公众平台模式)
         *
         * @param string $code
         *            通过get_authorize_url获取到的code
         */
        public function get_single_access_token($code = '')
        {
            $config = new Config();
            $wchat_config = $config->getInstanceWchatConfig(0);
            $token_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $wchat_config['value']['appid'] . '&secret=' . $wchat_config['value']['appsecret'] . '&code=' . $code . '&grant_type=authorization_code';
            $data = $this->get_url_return($token_url);
            $token_data = json_decode($data, true);
            return $token_data;
        }
    
        /**
         * 获取微信OAuth2授权链接snsapi_base
         *
         * @param string $redirect_uri
         *            跳转地址
         * @param mixed $state
         *            参数
         *            不弹出授权页面,直接跳转,只能获取用户openid
         */
        public function get_single_authorize_url($redirect_url = '', $state = '')
        {
            $redirect_url = urlencode($redirect_url);
            $config = new Config();
            $wchat_config = $config->getInstanceWchatConfig(0);
            return "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" . $wchat_config['value']['appid'] . "&redirect_uri=" . $redirect_url . "&response_type=code&scope=snsapi_userinfo&state={$state}#wechat_redirect";
        }
    
        /**
         * 获取会员对于公众号信息
         *
         * @param unknown $appid            
         */
        public function get_oauth_member_info($token)
        {
            $token_url = "https://api.weixin.qq.com/sns/userinfo?access_token=" . $token['access_token'] . "&openid=" . $token['openid'] . "&lang=zh_CN";
            $data = $this->get_url_return($token_url);
            return $data;
        }
        // 单发消息
        public function send_message($openid, $msgtype, $content)
        {
            $json = '{"touser":"%s","msgtype":"%s","text":{"content":"%s"}}';
            $jsondata = sprintf($json, $openid, $msgtype, $content);
            $url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=%s";
            return $this->get_url_return($url, $jsondata);
        }
        // 群发消息
        public function send_group_message($jsondata)
        {
            $url = "https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=%s";
            return $this->get_url_return($url, $jsondata);
        }
        
        // 基础支持: 多媒体文件上传接口 /media/upload媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)
        // form-data中媒体文件标识,有filename、filelength、content-type等信息
        public function upload_media($type)
        {
            $url = "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=%s&type=" . $type;
            return $this->get_url_return($url);
        }
        // 基础支持: 下载多媒体文件接口 /media/get
        public function get_modia($media_id)
        {
            $url = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=%s&media_id=" . $media_id;
            return $this->get_url_return($url);
        }
    
        /**
         * **********************************************************************************微信获取粉丝信息 结束*********************************************
         */
        /**
         * 微信公众号自定义菜单
         *
         * @param unknown $appid            
         * @param unknown $jsonmenu            
         * @return Ambigous <string, dataextendunknown, mixed>
         */
        public function menu_create($jsonmenu)
        {
            $url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=%s";
            $result = $this->get_url_return($url, $jsonmenu);
            return $result;
        }
    
        /**
         * **********************************************************************************微信推广二维码 开始*********************************************
         */
        // 生成永久二维码图片地址
        public function ever_qrcode($data_id)
        {
            if (! empty($data_id)) {
                $data_array = array(
                    'action_name' => 'QR_LIMIT_STR_SCENE',
                    'action_info' => array(
                        'scene' => array(
                            'scene_str' => $data_id
                        )
                    )
                );
                
                $json = json_encode($data_array);
                return $this->qrcode_create($json);
            }
        }
    
        /**
         * 推广支持: 创建二维码ticket接口 /qrcode/create && 换取二维码 /showqrcode
         *
         * @return src [二维码图片地址]
         */
        // 生成二维码基类函数
        public function qrcode_create($json)
        {
            // 临时二维码请求说明POST-json:{"action_name": "QR_LIMIT_STR_SCENE", "action_info": {"scene": {"scene_str": "123"}}}
            // 永久二维码请求说明POST-json:POST数据例子:{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 123}}}
            // action_name 二维码类型,QR_SCENE为临时,QR_LIMIT_SCENE为永久,QR_LIMIT_STR_SCENE为永久的字符串参数值
            $url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=%s";
            
            $jsonReturn = $this->get_url_return($url, $json);
            $jsonReturn = json_decode($jsonReturn);
            if (! empty($jsonReturn->ticket)) {
                $ticket = $jsonReturn->ticket;
                // $QrCode = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=".$ticket;
                $QrCode = $jsonReturn->url;
            } else {
                $QrCode = '';
            }
            
            return $QrCode;
        }
    
        /**
         * 把微信生成的图片存入本地
         *
         * @param [type] $username
         *            [用户名]
         * @param [string] $LocalPath
         *            [要存入的本地图片地址]
         * @param [type] $weixinPath
         *            [微信图片地址]
         *            
         * @return [string] [$LocalPath]失败时返回 FALSE
         */
        public function save_weixin_img($local_path, $weixin_path)
        {
            $weixin_path_a = str_replace("https://", "http://", $weixin_path);
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $weixin_path_a);
            curl_setopt($ch, CURLOPT_TIMEOUT, 5);
            curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);
            curl_setopt($ch, CURLOPT_REFERER, _REFERER_);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            $r = curl_exec($ch);
            curl_close($ch);
            if (! empty($local_path) && ! empty($weixin_path_a)) {
                $msg = file_put_contents($local_path, $r);
            }
            // 执行图片压缩
            $image = thinkImage::open($local_path);
            $image->thumb(120, 120, 	hinkImage::THUMB_CENTER)->save($local_path);
            return $local_path;
        }
    
        /**
         * **********************************************************************************微信推广二维码 结束*********************************************
         */
        /**
         * 功能说明:从微信选择地址 - 创建签名SHA1
         *
         * @param array $Parameters
         *            string1加密
         */
        public function sha1_sign($Parameters)
        {
            $signPars = '';
            ksort($Parameters);
            foreach ($Parameters as $k => $v) {
                if ("" != $v && "sign" != $k) {
                    if ($signPars == '')
                        $signPars .= $k . "=" . $v;
                    else
                        $signPars .= "&" . $k . "=" . $v;
                }
            }
            $sign = sha1($signPars);
            return $sign;
        }
    
        /**
         * 产生随机字符串,不长于32位
         *
         * @param int $length            
         * @return 产生的随机字符串
         */
        public function get_nonce_str($length = 32)
        {
            $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
            $str = "";
            for ($i = 0; $i < $length; $i ++) {
                $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
            }
            return $str;
        }
    
        /**
         * 格式化参数格式化成url参数
         */
        public function to_url_param()
        {
            $buff = "";
            foreach ($this->values as $k => $v) {
                if ($k != "sign" && $v != "" && ! is_array($v)) {
                    $buff .= $k . "=" . $v . "&";
                }
            }
            $buff = trim($buff, "&");
            return $buff;
        }
    
        /**
         * *************分享接口*********************************************************************************************
         */
        // jsapi_ticket JS接口的临时票据
        public function jsapi_ticket()
        {
            $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi";
            $ticket = json_decode($this->get_url_return($url), true);
            return $ticket['ticket'];
        }
    
        /**
         * *************模板消息接口*********************************************************************************************
         */
        // 获取模板ID POST请求
        public function templateID($templateno)
        {
            $templateno_array = array(
                "template_id_short" => $templateno
            );
            $json = json_encode($templateno_array);
            $url = "https://api.weixin.qq.com/cgi-bin/template/api_add_template?access_token=%s";
            return $this->get_url_return($url, $json);
        }
        
        // 模版消息发送
        public function templateMessageSend($openid, $templateId, $url, $first, $keyword1, $keyword2, $keyword3, $keyword4, $remark)
        {
            $array = array(
                'touser' => $openid,
                'template_id' => $templateId,
                'url' => $url,
                'topcolor' => '#FF0000',
                'data' => array(
                    'first' => array(
                        'value' => $first,
                        'color' => '#173177'
                    ),
                    'keyword1' => array(
                        'value' => $keyword1,
                        'color' => '#173177'
                    ),
                    'keyword2' => array(
                        'value' => $keyword2,
                        'color' => '#173177'
                    ),
                    'keyword3' => array(
                        'value' => $keyword3,
                        'color' => '#173177'
                    ),
                    'keyword4' => array(
                        'value' => $keyword4,
                        'color' => '#173177'
                    ),
                    'remark' => array(
                        'value' => $remark,
                        'color' => '#173177'
                    )
                )
            );
            $json = json_encode($array);
            $url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=%s";
            return $this->get_url_return($url, $json);
        }
    
        public function MessageSendToUser($openid, $msg_type, $content)
        {
            $array = array(
                'touser' => $openid
            );
            switch ($msg_type) {
                case "text":
                    $array['msgtype'] = 'text';
                    $array['text'] = array(
                        'content' => $content
                    );
                    break;
            }
            $json = json_encode($array);
            $url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=%s";
            return $this->get_url_return($url, $json);
        }
        
        /**
         * 获取openid(前台会员)
         *
         * @return unknown
         */
        public function get_weixin_member_access_token($code)
        {
            // 通过code获得openid
            if (empty($code)) {
                // 触发微信返回code码
                $baseUrl = request()->url(true);
                $url = $this->get_single_authorize_url($baseUrl, "123");
        
                Header("Location: $url");
                exit();
            } else {
                // 获取code码,以获取openid
                $data = $this->get_single_access_token($code);
                return $data;
            }
        }
    }
    View Code

     微信统一消息

    官方文档

    参考

    微信清缓存
    http://debugx5.qq.com
    http://debugtbs.qq.com

  • 相关阅读:
    Javascript优化
    网页设计单页和多页的选择
    让404页面变得更加实用
    优秀的主页设计
    CSS常见布局解决方案
    前端极限性能优化
    记一次项目实训心得经验
    部署windows2008虚拟机
    httprunner学习总结
    意见汇总
  • 原文地址:https://www.cnblogs.com/huay/p/10553273.html
Copyright © 2020-2023  润新知