PHP获取微信公众号JS-SDK使用权限签名算法

#PHP获取微信公众号JS-SDK使用权限签名算法
1.参考以下文档获取access_token(有效期7200秒,开发者必须在自己的服务全局缓存access_token)
2.用第一步拿到的access_token 采用http GET方式请求获得jsapi_ticket(有效期7200秒,开发者必须在自己的服务全局缓存jsapi_ticket)

<?php
/*
 * 微信操作模块
 */
class Weixin{
	    private $data = array();
    private $token = 'weixintoken';
    private $access_token = '';
    public $appid="";
    public $appsecret="";
    /**
     * 构造方法,用于实例化微信SDK
     * @param string $token 微信开放平台设置的TOKEN
     */
    public function __construct() {
        $this->load->library('curl');//curl请求类
        $this->appid = $this->config->item('wx_AppID');
        $this->appsecret = $this->config->item('wx_AppSecret');
    }
    
    /**
     * 获取微信JS验证 信息
     * @return unknown
     */
    public function getSignData($url=null)
    {
        if (empty($url)) $url = "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
        $ticket=$this->getTicket();
		return $this->addSign($ticket, $url);
    }
    public function getTicket()
    {
        $key = $this->token."jsapi";
        $user_data = $this->cache->redis->get($key);
        if (!$user_data) {

            $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" . $this->getSiteToken() . "&type=jsapi";
            $result = $this->curl->get($url);
            $result = json_decode($result, true);
            if (!empty($result['errcode'])) return;
            $data = $result['ticket'];
            $time = 7000;
            $this->cache->redis->save($key,$data,$time);
            return  $data;
        }else{
            return  $user_data;
        }
    }
}

    public function getSiteToken(){ //获取主站的TOKEN
        $key = $this->token;
        $data = $this->cache->redis->get($key);
        if (!$data) {
            $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' .
                    $this->appid . '&secret=' .
                    $this->appsecret;
            //var_dump($this->config['weixin']);
            $result = $this->curl->get($url);
            $result = json_decode($result, true);
            if (!empty($result['errcode'])) return;
            $data = $result['access_token'];
            $time = 7000;
            $this->cache->redis->save($key,$data,$time);
        }
        return $data;
    }
    
    /**
     * 加入验证
     * @param unknown $ticket
     * @param unknown $url
     * @return multitype:unknown string NULL number
     */
    public function addSign($ticket, $url)
    {
        $timestamp = time();
        $nonceStr = rand(100000, 999999);
        $array = array("noncestr" => $nonceStr, "jsapi_ticket" => $ticket, "timestamp" => $timestamp, "url" => $url);
        ksort($array);
        $signPars = "";

        foreach ($array as $k => $v ) {
                if (("" != $v) && ("sign" != $k)) {
                        if ($signPars == "") {
                                $signPars .= $k . "=" . $v;
                        }
                        else {
                                $signPars .= "&" . $k . "=" . $v;
                        }
                }
        }

        $result = array("appId" => $this->appid, "timestamp" => $timestamp, "nonceStr" => $nonceStr, "url" => $url, "signature" => SHA1($signPars));
        return $result;
    }
}

    
/**
调用
*/
    public function getSignData()
    {
        $url = null;//签名用的url必须是调用JS接口页面的完整URL。
        if(!empty($this->input->post('url'))){
            $url = $this->input->post('url');
        }
        $this->load->library('weixin');
        $this->return['data'] = $this->weixin->getSignData ($url);
    }

猜你喜欢

转载自blog.csdn.net/weixin_41722647/article/details/89850795