/** * @descrpition 从微信服务器获取微信ACCESS_TOKEN * @return Ambigous|bool */ private static function _getAccessToken() { $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . WECHAT_APPID . '&secret=' . WECHAT_APPSECRET; $accessToken = Curl::callWebServer($url, '', 'GET'); if (!isset($accessToken['access_token'])) { return Msg::returnErrMsg(MsgConstant::ERROR_GET_ACCESS_TOKEN, '获取ACCESS_TOKEN失败'); } $accessToken['time'] = time(); $accessTokenJson = json_encode($accessToken); //存入数据库 $db = new mysql(); $db->connect(DBHOST, DBUSER, DBPASSWORD, DBNAME); $sql = "update accesstoken set access_token='" . $accessTokenJson . "' where id=1"; $db->query($sql); return $accessToken; }
/** * @descrpition 从微信服务器获取微信ACCESS_TOKEN * @return Ambigous|bool */ private function _getAccessToken() { $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . WECHAT_APPID . '&secret=' . WECHAT_APPSECRET; $accessToken = Curl::callWebServer($url, '', 'GET'); if (!isset($accessToken['access_token'])) { return Msg::returnErrMsg(MsgConstant::ERROR_GET_ACCESS_TOKEN, '获取ACCESS_TOKEN失败'); } $accessToken['time'] = time(); $accessTokenJson = json_encode($accessToken); //存入数据库 /** * 这里通常我会把access_token存起来,然后用的时候读取,判断是否过期,如果过期就重新调用此方法获取,存取操作请自行完成 * * 请将变量$accessTokenJson给存起来,这个变量是一个字符串 */ return $accessToken; }
/** * @descrpition 从微信服务器获取js sdk api_ticket * @return Ambigous|bool */ private static function _getJsapiTicket() { $accessToken = AccessToken::getAccessToken(); $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=" . $accessToken; $JsapiTicket = Curl::callWebServer($url, '', 'GET'); if (!isset($JsapiTicket['ticket'])) { return Msg::returnErrMsg(MsgConstant::ERROR_GET_ACCESS_TOKEN, '获取js ticket失败'); } $JsapiTicket['time'] = time(); $JsapiTicketJson = json_encode($JsapiTicket); //存入数据库 $db = new mysql(); $db->connect(DBHOST, DBUSER, DBPASSWORD, DBNAME); $sql = "update jsapiticket set ticket='" . $JsapiTicketJson . "' where id=1"; $db->query($sql); return $JsapiTicket; }
/** * @descrpition 从微信服务器获取微信API_TICKET * @return Ambigous|bool */ private static function _getApiTicket(){ $accessToken = AccessToken::getAccessToken(true); $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken"; $apiTicket = Curl::callWebServer($url, '', 'GET'); if(!isset($apiTicket['ticket'])){ return Msg::returnErrMsg(MsgConstant::ERROR_GET_API_TICKET, '获取API_TICKET失败'); } $apiTicket['time'] = time(); $apiTicketJson = json_encode($apiTicket); //存入数据库 /** * 这里通常我会把api_ticket存起来,然后用的时候读取,判断是否过期,如果过期就重新调用此方法获取,存取操作请自行完成 * * 请将变量$apiTicketJson给存起来,这个变量是一个字符串 */ $f = fopen(self::_fileName2Store(), 'w+'); fwrite($f, $apiTicketJson); fclose($f); return $apiTicket; }
/** *@descrpition 从文件中获取access_token * @return string */ private static function _getFromFile() { if (self::_existsToken()) { if (self::_expriseToken()) { //重新获取一次access_token,并且将文件删除,重新向文件里面写一次 $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . WECHAT_APPID . '&secret=' . WECHAT_APPSECRET; $accessToken = Curl::callWebServer($url, '', 'GET'); if (!isset($accessToken['access_token'])) { return Msg::returnErrMsg(MsgConstant::ERROR_GET_ACCESS_TOKEN, '获取ACCESS_TOKEN失败'); } unlink('token.txt'); file_put_contents('token.txt', $accessToken['access_token']); } else { $accessToken = file_get_contents('token.txt'); } } else { $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . WECHAT_APPID . '&secret=' . WECHAT_APPSECRET; $accessToken = Curl::callWebServer($url, '', 'GET'); if (!isset($accessToken['access_token'])) { return Msg::returnErrMsg(MsgConstant::ERROR_GET_ACCESS_TOKEN, '获取ACCESS_TOKEN失败'); } file_put_contents('token.txt', $accessToken['access_token']); } return $accessToken['access_token']; }
/** * @descrpition 图文 - 先调用self::newsItem()再调用本方法 * @param $fromusername * @param $tousername * @param $item 数组,每个项由self::newsItem()返回 * @param $funcFlag 默认为0,设为1时星标刚才收到的消息 * @return string */ public static function news($fromusername, $tousername, $item, $funcFlag = 0) { //多条图文消息信息,默认第一个item为大图,注意,如果图文数超过10,则将会无响应 if (count($item) >= 10) { $request = array('fromusername' => $fromusername, 'tousername' => $tousername); return Msg::returnErrMsg(MsgConstant::ERROR_NEWS_ITEM_COUNT_MORE_TEN, '图文消息的项数不能超过10条', $request); } $template = <<<XML <xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[news]]></MsgType> <ArticleCount>%s</ArticleCount> <Articles> %s </Articles> <FuncFlag>%s</FuncFlag> </xml> XML; return sprintf($template, $fromusername, $tousername, time(), count($item), implode($item), $funcFlag); }
/** * @descrpition 分发请求 * @param $request * @return array|string */ public static function switchType(&$request) { $data = array(); switch ($request['msgtype']) { //事件 case 'event': $request['event'] = strtolower($request['event']); switch ($request['event']) { //关注 case 'subscribe': //二维码关注 if (isset($request['eventkey']) && isset($request['ticket'])) { $data = self::eventQrsceneSubscribe($request); //普通关注 } else { $data = self::eventSubscribe($request); } break; //扫描二维码 //扫描二维码 case 'scan': $data = self::eventScan($request); break; //地理位置 //地理位置 case 'location': $data = self::eventLocation($request); break; //自定义菜单 - 点击菜单拉取消息时的事件推送 //自定义菜单 - 点击菜单拉取消息时的事件推送 case 'click': $data = self::eventClick($request); break; //自定义菜单 - 点击菜单跳转链接时的事件推送 //自定义菜单 - 点击菜单跳转链接时的事件推送 case 'view': $data = self::eventView($request); break; //自定义菜单 - 扫码推事件的事件推送 //自定义菜单 - 扫码推事件的事件推送 case 'scancode_push': $data = self::eventScancodePush($request); break; //自定义菜单 - 扫码推事件且弹出“消息接收中”提示框的事件推送 //自定义菜单 - 扫码推事件且弹出“消息接收中”提示框的事件推送 case 'scancode_waitmsg': $data = self::eventScancodeWaitMsg($request); break; //自定义菜单 - 弹出系统拍照发图的事件推送 //自定义菜单 - 弹出系统拍照发图的事件推送 case 'pic_sysphoto': $data = self::eventPicSysPhoto($request); break; //自定义菜单 - 弹出拍照或者相册发图的事件推送 //自定义菜单 - 弹出拍照或者相册发图的事件推送 case 'pic_photo_or_album': $data = self::eventPicPhotoOrAlbum($request); break; //自定义菜单 - 弹出微信相册发图器的事件推送 //自定义菜单 - 弹出微信相册发图器的事件推送 case 'pic_weixin': $data = self::eventPicWeixin($request); break; //自定义菜单 - 弹出地理位置选择器的事件推送 //自定义菜单 - 弹出地理位置选择器的事件推送 case 'location_select': $data = self::eventLocationSelect($request); break; //取消关注 //取消关注 case 'unsubscribe': $data = self::eventUnsubscribe($request); break; //群发接口完成后推送的结果 //群发接口完成后推送的结果 case 'masssendjobfinish': $data = self::eventMassSendJobFinish($request); break; //模板消息完成后推送的结果 //模板消息完成后推送的结果 case 'templatesendjobfinish': $data = self::eventTemplateSendJobFinish($request); break; default: return Msg::returnErrMsg(MsgConstant::ERROR_UNKNOW_TYPE, '收到了未知类型的消息', $request); break; } break; //文本 //文本 case 'text': $data = self::text($request); break; //图像 //图像 case 'image': $data = self::image($request); break; //语音 //语音 case 'voice': $data = self::voice($request); break; //视频 //视频 case 'video': $data = self::video($request); break; //小视频 //小视频 case 'shortvideo': $data = self::shortvideo($request); break; //位置 //位置 case 'location': $data = self::location($request); break; //链接 //链接 case 'link': $data = self::link($request); break; default: return ResponsePassive::text($request['fromusername'], $request['tousername'], '收到未知的消息,我不知道怎么处理'); break; } return $data; }
/** * @descrpition 分发请求 * @param $request * @return array|string */ public static function switchType(&$request) { $data = array(); switch ($request['msgtype']) { //事件 case 'event': switch ($request['event']) { //关注 case 'subscribe': //二维码关注 if (isset($request['eventkey']) && isset($request['ticket'])) { $data = self::eventQrsceneSubscribe($request); //普通关注 } else { $data = self::eventSubscribe($request); } break; //扫描二维码 //扫描二维码 case 'scan': $data = self::eventScan($request); break; //地理位置 //地理位置 case 'location': case 'LOCATION': $data = self::eventLocation($request); break; //自定义菜单 //自定义菜单 case 'click': case 'CLICK': $data = self::eventClick($request); break; //取消关注 //取消关注 case 'unsubscribe': $data = self::eventUnsubscribe($request); break; default: return Msg::returnErrMsg(MsgConstant::ERROR_UNKNOW_TYPE, '收到了未知类型的消息', $request); break; } break; //文本 //文本 case 'text': $data = self::text($request); break; //图像 //图像 case 'image': $data = self::image($request); break; //语音 //语音 case 'voice': $data = self::voice($request); break; //视频 //视频 case 'video': $data = self::video($request); break; //位置 //位置 case 'location': $data = self::location($request); break; //链接 //链接 case 'link': $data = self::link($request); break; default: return ResponsePassive::text($request['fromusername'], $request['tousername'], '收到未知的消息,我不知道怎么处理'); break; } return $data; }