<?php /** * 微信公众号帮助类 */ include "request.php"; class WechatHelper { const APPID = 'wx8f7333e3f6c1d825'; const SECRET = '39ae48b8c47fbbe12eb7d34998f80927'; const WECHAT_DATA_TICKET = 'WechatData/ticket.txt'; const WECHAT_DATA_TOKEN = 'WechatData/token.txt'; // 获取微信token url const ACCESS_TOKEN_URL = 'https://api.weixin.qq.com/cgi-bin/token'; // 获取微信jsapi ticket url const JSAPI_TICKET_URL = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket'; // 获取openid const OPENID_URL = 'https://api.weixin.qq.com/sns/oauth2/access_token'; // 获取微信临时素材 const GET_MEDIA_URL = 'https://api.weixin.qq.com/cgi-bin/media/get'; // 微信端首页url const HOME_URL = '/party/mobile.html'; // 获取微信临时素材 public function getMedia($mediaId) { $token = $this->getToken(); $params = [ 'access_token' => $token, 'media_id' => $mediaId, ]; $url = self::GET_MEDIA_URL . '?'. http_build_query($params); $request = new Request(); $request->get($url); $text = $request->response; if (strlen($text) <300) { if (strstr($text, '40001')) { JsonResponse::error('图片上传失败:' . $text); } } return $text; } // 获取前端配置参数 public function getSignPackage($url) { // 获取token $token = $this->getToken(); // 获取ticket $ticket = $this->getTicket($token); // 时间戳 $timestamp = time(); // 随机字符串 $nonceStr = $this->_createNoncestr(); // 这里参数的顺序要按照 key 值 ASCII 码升序排序 j -> n -> t -> u $string = "jsapi_ticket=$ticket&noncestr=$nonceStr×tamp=$timestamp&url=$url"; $signature = sha1($string); $result = [ "appId" => self::APPID, "nonceStr" => $nonceStr, "timestamp" => $timestamp, "url" => $url, "signature" => $signature, "ticket" => $ticket, "token" => $token ]; return $result; } //获取ticket public function getTicket($token = ''){ if (empty($token)) { $token = $this->getToken(); } if (file_exists(self::WECHAT_DATA_TICKET)) { $text = file_get_contents(self::WECHAT_DATA_TICKET); $data = explode(',', $text); if (count($data) != 2) { JsonResponse::error('获取微信ticket失败:' . $text); } if ($data[1] + 7200 < time()) { return $this->_createJsApiTicket($token); } return $data[0]; } else { return $this->_createJsApiTicket($token); } return null; } //获取token public function getToken(){ if (file_exists(self::WECHAT_DATA_TOKEN)) { $text = file_get_contents(self::WECHAT_DATA_TOKEN); $data = explode(',', $text); if (count($data) != 2) { JsonResponse::error('获取微信token失败:' . $text); } if ($data[1] + 7000 < time()) { $token = $this->_createAccessToken(); return $token; } return $data[0]; } else { $token = $this->_createAccessToken(); return $token; } return null; } // 生成ticket private function _createJsApiTicket($token) { $params = [ 'type' => 'jsapi', 'access_token' => $token, ]; $url = self::JSAPI_TICKET_URL . '?' . http_build_query($params); $request = new Request(); $request->get($url); $text = $request->response; $result = json_decode($text, true); $data = $result['ticket']; if (!empty($data)) { file_put_contents(self::WECHAT_DATA_TICKET, $data . ',' . time()); } else JsonResponse::error('获取ticket失败:' . $text); return $data; } // 生成token private function _createAccessToken() { $params = [ 'grant_type' => 'client_credential', 'appid' => self::APPID, 'secret' => self::SECRET, ]; $url = self::ACCESS_TOKEN_URL . '?'. http_build_query($params); $request = new Request(); $request->get($url); $text = $request->response; $result = json_decode($text, true); $data = $result['access_token']; if (!empty($data)) { try { unlink(self::WECHAT_DATA_TICKET); unlink(self::WECHAT_DATA_TOKEN); file_put_contents(self::WECHAT_DATA_TOKEN, $data . ',' . time()); } catch (\Exception $ex) { JsonResponse::error('error:' . $ex); } } else JsonResponse::error('获取token失败:' . $text); return $data; } // 获取openid public function getOpenid($code) { $params = [ 'code' => $code, 'appid' => self::APPID, 'secret' => self::SECRET, 'grant_type' => 'authorization_code' ]; $url = self::OPENID_URL . '?'. http_build_query($params); $request = new Request(); $request->get($url); $text = $request->response; $result = json_decode($text, true); $data = $result['openid']; if (empty($data)) JsonResponse::error('获取openid失败:' . $text); return $data; } // 创建随机字符串 private function _createNoncestr($length = 16) { $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; $str = ""; for($i = 0; $i < $length; $i ++) { $str .= substr ( $chars, mt_rand ( 0, strlen ( $chars ) - 1 ), 1 ); } return $str; } // 当前页url public function curPageURL() { $pageURL = 'http'; if ($_SERVER["HTTPS"] == "on") { $pageURL .= "s"; } $pageURL .= "://"; if ($_SERVER["SERVER_PORT"] != "80") { $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"]; } else { $pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"]; } return $pageURL; } // 首页url public function IndexPageURL() { $pageURL = 'http'; if ($_SERVER["HTTPS"] == "on") { $pageURL .= "s"; } $pageURL .= "://"; $pageURL .= $_SERVER["SERVER_NAME"] . self::HOME_URL; return $pageURL; } }