#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);
}