Browse Source

公众号类 增加JSAPI授权相关方法:
1、getJsTicket($appid='',$jsapi_ticket='') 获取JSAPI授权TICKET
2、getJsSign($url, $timeStamp, $nonceStr, $appid='') 获取JsApi使用签名
3、resetJsTicket($appid='') 删除JSAPI授权TICKET

此接口官方目前白名单域名测试,暂未正式开放

binsee 10 years ago
parent
commit
5777fa393f
4 changed files with 145 additions and 2 deletions
  1. 5 0
      README.md
  2. 70 1
      Thinkphp/Wechat.class.php
  3. 65 1
      wechat.class.php
  4. 5 0
      wiki/官方API类库.md

+ 5 - 0
README.md

@@ -53,6 +53,7 @@ https://mp.weixin.qq.com/cgi-bin/readtemplate?t=business/course2_tmpl&lang=zh_CN
 - 卡券管理(创建、修改、删除、发放、门店管理等) **(认证权限)**
 - 语义理解 **(服务号、认证权限)**
 - 获取微信服务器IP列表 **(初级权限)**  
+- 微信JSAPI授权(获取ticket、获取签名) **(初级权限`暂未确定`)**
 > 备注:  
 > 初级权限:基本权限,任何正常的公众号都有此权限  
 > 菜单权限:正常的服务号、认证后的订阅号拥有此权限  
@@ -157,6 +158,10 @@ https://mp.weixin.qq.com/cgi-bin/readtemplate?t=business/course2_tmpl&lang=zh_CN
 
 ### 主动接口方法:   
  *  checkAuth($appid,$appsecret,$token) 此处传入公众后台高级接口提供的appid和appsecret, 或者手动指定$token为access_token。函数将返回access_token操作令牌
+ *  resetAuth($appid='') 删除验证数据
+ *  resetJsTicket($appid='') 删除JSAPI授权TICKET
+ *  getJsTicket($appid='',$jsapi_ticket='') 获取JSAPI授权TICKET
+ *  getJsSign($url, $timeStamp, $nonceStr, $appid='') 获取JsApi使用签名
  *  createMenu($data) 创建菜单 $data菜单结构详见 **[自定义菜单创建接口](http://mp.weixin.qq.com/wiki/index.php?title=自定义菜单创建接口)**
  *  getServerIp() 获取微信服务器IP地址列表 返回数组array('127.0.0.1','127.0.0.1')
  *  getMenu() 获取菜单 

+ 70 - 1
Thinkphp/Wechat.class.php

@@ -81,6 +81,7 @@ class Wechat
 	const MENU_CREATE_URL = '/menu/create?';
 	const MENU_GET_URL = '/menu/get?';
 	const MENU_DELETE_URL = '/menu/delete?';
+	const GET_TICKET_URL = '/ticket/getticket?';
 	const CALLBACKSERVER_GET_URL = '/getcallbackip?';
 	const QRCODE_CREATE_URL='/qrcode/create?';
 	const QR_SCENE = 0;
@@ -163,6 +164,7 @@ class Wechat
 	private $appid;
 	private $appsecret;
 	private $access_token;
+	private $jsapi_ticket;
 	private $user_token;
 	private $partnerid;
 	private $partnerkey;
@@ -1081,7 +1083,7 @@ class Wechat
 	}
 
 	/**
-	 * 通用auth验证方法,暂时仅用于菜单更新操作
+	 * 通用auth验证方法,获取access_token
 	 * @param string $appid
 	 * @param string $appsecret
 	 * @param string $token 手动指定access_token,非必要情况不建议用
@@ -1130,6 +1132,73 @@ class Wechat
 	}
 
 	/**
+	 * 删除JSAPI授权TICKET
+	 * @param string $appid 用于多个appid时使用
+	 */
+	public function resetJsTicket($appid=''){
+		if (!$appid) $appid = $this->appid;
+		$this->jsapi_ticket = '';
+		$authname = 'wechat_jsapi_ticket'.$appid;
+		S($authname,null);
+		return true;
+	}
+
+	/**
+	 * 获取JSAPI授权TICKET
+	 * @param string $appid 用于多个appid时使用,可空
+	 * @param string $jsapi_ticket 手动指定jsapi_ticket,非必要情况不建议用
+	 */
+	public function getJsTicket($appid='',$jsapi_ticket=''){
+		if (!$this->access_token && !$this->checkAuth()) return false;
+		if ($jsapi_ticket) { //手动指定token,优先使用
+		    $this->jsapi_ticket = $jsapi_ticket;
+		    return $this->access_token;
+		}
+		$authname = 'wechat_jsapi_ticket'.$appid;
+		if ($rs = S($authname))  {
+			$this->jsapi_ticket = $rs;
+			return $rs;
+		}
+		$result = $this->http_get(self::API_URL_PREFIX.self::GET_TICKET_URL.'access_token='.$this->access_token.'&type=jsapi');
+		if ($result)
+		{
+			$json = json_decode($result,true);
+			if (!$json || !empty($json['errcode'])) {
+				$this->errCode = $json['errcode'];
+				$this->errMsg = $json['errmsg'];
+				var_dump($json);
+				return false;
+			}
+			$this->jsapi_ticket = $json['ticket'];
+			$expire = $json['expires_in'] ? intval($json['expires_in'])-100 : 3600;
+			S($authname,$this->access_token,$expire);
+			return $this->jsapi_ticket;
+		}
+		return false;
+	}
+
+
+	/**
+	 * 获取JsApi使用签名
+	 * @param string $url 网页的URL,不包含#及其后面部分
+	 * @param string $timeStamp 当前时间戳(需与JS输出的一致)
+	 * @param string $nonceStr 随机串(需与JS输出的一致)
+	 * @param string $appid 用于多个appid时使用,可空
+	 * @return string 返回签名字串
+	 */
+	public function getJsSign($url, $timeStamp, $nonceStr, $appid=''){
+	    if (!$this->jsapi_ticket && !$this->getJsTicket($appid)) return false;
+	    $ret = strpos($url,'#');
+	    if ($ret)
+	        $url = strsub($url,0,$ret);
+	    $url = trim($url);
+	    if (empty($url))
+	        return false;
+	    $arrdata = array("timestamp" => $timeStamp, "noncestr" => $nonceStr, "url" => $url, "jsapi_ticket" => $this->jsapi_ticket);
+	    return $this->getSignature($arrdata);
+	}
+
+	/**
 	 * 微信api不支持中文转义的json结构
 	 * @param array $arr
 	 */

+ 65 - 1
wechat.class.php

@@ -81,6 +81,7 @@ class Wechat
 	const MENU_CREATE_URL = '/menu/create?';
 	const MENU_GET_URL = '/menu/get?';
 	const MENU_DELETE_URL = '/menu/delete?';
+	const GET_TICKET_URL = '/ticket/getticket?';
 	const CALLBACKSERVER_GET_URL = '/getcallbackip?';
 	const QRCODE_CREATE_URL='/qrcode/create?';
 	const QR_SCENE = 0;
@@ -163,6 +164,7 @@ class Wechat
 	private $appid;
 	private $appsecret;
 	private $access_token;
+	private $jsapi_ticket;
 	private $user_token;
 	private $partnerid;
 	private $partnerkey;
@@ -1076,7 +1078,7 @@ class Wechat
 	}
 
 	/**
-	 * 通用auth验证方法,暂时仅用于菜单更新操作
+	 * 通用auth验证方法,获取access_token
 	 * @param string $appid
 	 * @param string $appsecret
 	 * @param string $token 手动指定access_token,非必要情况不建议用
@@ -1120,6 +1122,68 @@ class Wechat
 	}
 
 	/**
+	 * 删除JSAPI授权TICKET
+	 * @param string $appid 用于多个appid时使用
+	 */
+	public function resetJsTicket($appid=''){
+		if (!$appid) $appid = $this->appid;
+		$this->jsapi_ticket = '';
+		//TODO: remove cache
+		return true;
+	}
+
+	/**
+	 * 获取JSAPI授权TICKET
+	 * @param string $appid 用于多个appid时使用,可空
+	 * @param string $jsapi_ticket 手动指定jsapi_ticket,非必要情况不建议用
+	 */
+	public function getJsTicket($appid='',$jsapi_ticket=''){
+		if (!$this->access_token && !$this->checkAuth()) return false;
+		if ($jsapi_ticket) { //手动指定token,优先使用
+		    $this->jsapi_ticket = $jsapi_ticket;
+		    return $this->access_token;
+		}
+		//TODO: get the cache jsapi_ticket
+		$result = $this->http_get(self::API_URL_PREFIX.self::GET_TICKET_URL.'access_token='.$this->access_token.'&type=jsapi');
+		if ($result)
+		{
+			$json = json_decode($result,true);
+			if (!$json || !empty($json['errcode'])) {
+				$this->errCode = $json['errcode'];
+				$this->errMsg = $json['errmsg'];
+				var_dump($json);
+				return false;
+			}
+			$this->jsapi_ticket = $json['ticket'];
+			$expire = $json['expires_in'] ? intval($json['expires_in'])-100 : 3600;
+			//TODO: cache jsapi_ticket
+			return $this->jsapi_ticket;
+		}
+		return false;
+	}
+
+
+	/**
+	 * 获取JsApi使用签名
+	 * @param string $url 网页的URL,不包含#及其后面部分
+	 * @param string $timeStamp 当前时间戳(需与JS输出的一致)
+	 * @param string $nonceStr 随机串(需与JS输出的一致)
+	 * @param string $appid 用于多个appid时使用,可空
+	 * @return string 返回签名字串
+	 */
+	public function getJsSign($url, $timeStamp, $nonceStr, $appid=''){
+	    if (!$this->jsapi_ticket && !$this->getJsTicket($appid)) return false;
+	    $ret = strpos($url,'#');
+	    if ($ret)
+	        $url = strsub($url,0,$ret);
+	    $url = trim($url);
+	    if (empty($url))
+	        return false;
+	    $arrdata = array("timestamp" => $timeStamp, "noncestr" => $nonceStr, "url" => $url, "jsapi_ticket" => $this->jsapi_ticket);
+	    return $this->getSignature($arrdata);
+	}
+
+	/**
 	 * 微信api不支持中文转义的json结构
 	 * @param array $arr
 	 */

+ 5 - 0
wiki/官方API类库.md

@@ -24,6 +24,7 @@
 - 卡券管理(创建、修改、删除、发放、门店管理等) **(认证权限)**
 - 语义理解 **(服务号、认证权限)**
 - 获取微信服务器IP列表 **(初级权限)**  
+- 微信JSAPI授权(获取ticket、获取签名) **(初级权限`暂未确定`)**
 > 备注:  
 > 初级权限:基本权限,任何正常的公众号都有此权限  
 > 菜单权限:正常的服务号、认证后的订阅号拥有此权限  
@@ -128,6 +129,10 @@
 
 ### 主动接口方法:   
  *  checkAuth($appid,$appsecret,$token) 此处传入公众后台高级接口提供的appid和appsecret, 或者手动指定$token为access_token。函数将返回access_token操作令牌
+ *  resetAuth($appid='') 删除验证数据
+ *  resetJsTicket($appid='') 删除JSAPI授权TICKET
+ *  getJsTicket($appid='',$jsapi_ticket='') 获取JSAPI授权TICKET
+ *  getJsSign($url, $timeStamp, $nonceStr, $appid='') 获取JsApi使用签名
  *  createMenu($data) 创建菜单 $data菜单结构详见 **[自定义菜单创建接口](http://mp.weixin.qq.com/wiki/index.php?title=自定义菜单创建接口)**
  *  getServerIp() 获取微信服务器IP地址列表 返回数组array('127.0.0.1','127.0.0.1')
  *  getMenu() 获取菜单