WechatHelper.php 6.73 KB
<?php
/**
 * 微信公众号帮助类
 */
include "request.php";
class WechatHelper
{
    const APPID = 'wx0b48573ec1daefba';
    const SECRET = '59a7d194e119547334a461f782b7358f';
    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&timestamp=$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;
    }

}