浏览代码

公众号类、企业号类优化获取JsApi签名方法:
只提供url地址即可,自动生成时间戳及随机字串,将返回完整的签名信息数组

公众号错误码类 增加两个错误码记录

企业号类 修复一处调用常量错误(来自@erasin)

binsee 10 年之前
父节点
当前提交
9f552be38e
共有 6 个文件被更改,包括 57 次插入25 次删除
  1. 2 2
      README.md
  2. 2 0
      errCode.php
  3. 24 9
      qywechat.class.php
  4. 27 12
      wechat.class.php
  5. 1 1
      wiki/企业号API类库.md
  6. 1 1
      wiki/官方API类库.md

+ 2 - 2
README.md

@@ -155,7 +155,7 @@ https://mp.weixin.qq.com/cgi-bin/readtemplate?t=business/course2_tmpl&lang=zh_CN
  *  resetAuth($appid='') 删除验证数据
  *  resetJsTicket($appid='') 删除JSAPI授权TICKET
  *  getJsTicket($appid='',$jsapi_ticket='') 获取JSAPI授权TICKET
- *  getJsSign($url, $timeStamp, $nonceStr, $appid='') 获取JsApi使用签名
+ *  getJsSign($url, $timeStamp=0, $nonceStr='', $appid='') 获取JsApi使用签名信息数组,可只提供url地址 
  *  createMenu($data) 创建菜单 $data菜单结构详见 **[自定义菜单创建接口](http://mp.weixin.qq.com/wiki/index.php?title=自定义菜单创建接口)**
  *  getServerIp() 获取微信服务器IP地址列表 返回数组array('127.0.0.1','127.0.0.1')
  *  getMenu() 获取菜单 
@@ -411,7 +411,7 @@ $options = array(
 * resetAuth($appid='') 清除记录的ACCESS_TOKEN
 * resetJsTicket($appid='') 删除JSAPI授权TICKET
 * getJsTicket($appid='',$jsapi_ticket='') 获取JSAPI授权TICKET
-* getJsSign($url, $timeStamp, $nonceStr, $appid='') 获取JsApi使用签名
+* getJsSign($url, $timeStamp=0, $nonceStr='', $appid='') 获取JsApi使用签名信息数组,可只提供url地址 
 * getSignature($arrdata,'sha1') 生成签名字串  
 * generateNonceStr($length=16) 获取随机字串  
 * createMenu($data,$agentid='') 创建菜单,参数:菜单内容数组,要创建菜单应用id

+ 2 - 0
errCode.php

@@ -107,6 +107,8 @@ class ErrCode
         '61455'=>'客服账号名包含非法字符(英文+数字)',
         '61456'=>'客服账号个数超过限制(10个客服账号)',
         '61457'=>'无效头像文件类型',
+        '61500'=>'日期格式错误',
+        '61501'=>'日期范围错误',
         '7000000'=>'请求正常,无语义结果',
         '7000001'=>'缺失请求参数',
         '7000002'=>'signature 参数无效',

+ 24 - 9
qywechat.class.php

@@ -929,6 +929,7 @@ class Wechat
 	 */
 	public function getJsTicket($appid='',$jsapi_ticket=''){
 		if (!$this->access_token && !$this->checkAuth()) return false;
+		if (!$appid) $appid = $this->appid;
 		if ($jsapi_ticket) { //手动指定token,优先使用
 		    $this->jsapi_ticket = $jsapi_ticket;
 		    return $this->access_token;
@@ -958,14 +959,18 @@ class Wechat
 
 	/**
 	 * 获取JsApi使用签名
-	 * @param string $url 网页的URL,不包含#及其后面部分
-	 * @param string $timeStamp 当前时间戳(需与JS输出的一致)
-	 * @param string $nonceStr 随机串(需与JS输出的一致)
+	 * @param string $url 网页的URL,自动处理#及其后面部分
+	 * @param string $timeStamp 当前时间戳 (为空则自动生成)
+	 * @param string $nonceStr 随机串 (为空则自动生成)
 	 * @param string $appid 用于多个appid时使用,可空
-	 * @return string 返回签名字串
-	 */
-	public function getJsSign($url, $timeStamp, $nonceStr, $appid=''){
-	    if (!$this->jsapi_ticket && !$this->getJsTicket($appid)) return false;
+	 * @return array|bool 返回签名字串
+	 */
+	public function getJsSign($url, $timeStamp=0, $nonceStr='', $appid=''){
+	    if (!$this->jsapi_ticket && !$this->getJsTicket($appid) || !$url) return false;
+	    if (!$timeStamp)
+	        $timeStamp = time();
+	    if (!$nonceStr)
+	        $nonceStr = $this->generateNonceStr();
 	    $ret = strpos($url,'#');
 	    if ($ret)
 	        $url = substr($url,0,$ret);
@@ -973,7 +978,17 @@ class Wechat
 	    if (empty($url))
 	        return false;
 	    $arrdata = array("timestamp" => $timeStamp, "noncestr" => $nonceStr, "url" => $url, "jsapi_ticket" => $this->jsapi_ticket);
-	    return $this->getSignature($arrdata);
+	    $sign = $this->getSignature($arrdata);
+	    if (!$sign)
+	        return false;
+	    $signPackage = array(
+	            "appId"     => $this->appid,
+	            "nonceStr"  => $nonceStr,
+	            "timestamp" => $timestamp,
+	            "url"       => $url,
+	            "signature" => $sign
+	    );
+	    return $signPackage;
 	}
 
 	/**
@@ -1148,7 +1163,7 @@ class Wechat
 	 */
 	public function uploadMedia($data, $type){
 		if (!$this->access_token && !$this->checkAuth()) return false;
-		$result = $this->http_post(self::API_URL_PREFIX.self::MEDIA_UPLOAD.'access_token='.$this->access_token.'&type='.$type,$data,true);
+		$result = $this->http_post(self::API_URL_PREFIX.self::MEDIA_UPLOAD_URL.'access_token='.$this->access_token.'&type='.$type,$data,true);
 		if ($result)
 		{
 			$json = json_decode($result,true);

+ 27 - 12
wechat.class.php

@@ -1073,7 +1073,7 @@ class Wechat
 			return false;
 		}
 	}
-	
+
 	/**
 	 * 设置缓存,按需重载
 	 * @param string $cachename
@@ -1095,7 +1095,7 @@ class Wechat
 		//TODO: get cache implementation
 		return false;
 	}
-	
+
 	/**
 	 * 清除缓存,按需重载
 	 * @param string $cachename
@@ -1121,13 +1121,13 @@ class Wechat
 		    $this->access_token=$token;
 		    return $this->access_token;
 		}
-		
+
 		$authname = 'wechat_access_token'.$appid;
 		if ($rs = $this->getCache($authname))  {
 			$this->access_token = $rs;
 			return $rs;
 		}
-		
+
 		$result = $this->http_get(self::API_URL_PREFIX.self::AUTH_URL.'appid='.$appid.'&secret='.$appsecret);
 		if ($result)
 		{
@@ -1176,6 +1176,7 @@ class Wechat
 	 */
 	public function getJsTicket($appid='',$jsapi_ticket=''){
 		if (!$this->access_token && !$this->checkAuth()) return false;
+		if (!$appid) $appid = $this->appid;
 		if ($jsapi_ticket) { //手动指定token,优先使用
 		    $this->jsapi_ticket = $jsapi_ticket;
 		    return $this->access_token;
@@ -1205,14 +1206,18 @@ class Wechat
 
 	/**
 	 * 获取JsApi使用签名
-	 * @param string $url 网页的URL,不包含#及其后面部分
-	 * @param string $timeStamp 当前时间戳(需与JS输出的一致)
-	 * @param string $nonceStr 随机串(需与JS输出的一致)
+	 * @param string $url 网页的URL,自动处理#及其后面部分
+	 * @param string $timeStamp 当前时间戳 (为空则自动生成)
+	 * @param string $nonceStr 随机串 (为空则自动生成)
 	 * @param string $appid 用于多个appid时使用,可空
-	 * @return string 返回签名字串
-	 */
-	public function getJsSign($url, $timeStamp, $nonceStr, $appid=''){
-	    if (!$this->jsapi_ticket && !$this->getJsTicket($appid)) return false;
+	 * @return array|bool 返回签名字串
+	 */
+	public function getJsSign($url, $timeStamp=0, $nonceStr='', $appid=''){
+	    if (!$this->jsapi_ticket && !$this->getJsTicket($appid) || !$url) return false;
+	    if (!$timeStamp)
+	        $timeStamp = time();
+	    if (!$nonceStr)
+	        $nonceStr = $this->generateNonceStr();
 	    $ret = strpos($url,'#');
 	    if ($ret)
 	        $url = substr($url,0,$ret);
@@ -1220,7 +1225,17 @@ class Wechat
 	    if (empty($url))
 	        return false;
 	    $arrdata = array("timestamp" => $timeStamp, "noncestr" => $nonceStr, "url" => $url, "jsapi_ticket" => $this->jsapi_ticket);
-	    return $this->getSignature($arrdata);
+	    $sign = $this->getSignature($arrdata);
+	    if (!$sign)
+	        return false;
+	    $signPackage = array(
+	            "appId"     => $this->appid,
+	            "nonceStr"  => $nonceStr,
+	            "timestamp" => $timestamp,
+	            "url"       => $url,
+	            "signature" => $sign
+	    );
+	    return $signPackage;
 	}
 
 	/**

+ 1 - 1
wiki/企业号API类库.md

@@ -99,7 +99,7 @@ $options = array(
 * resetAuth($appid='') 清除记录的ACCESS_TOKEN
 * resetJsTicket($appid='') 删除JSAPI授权TICKET
 * getJsTicket($appid='',$jsapi_ticket='') 获取JSAPI授权TICKET
-* getJsSign($url, $timeStamp, $nonceStr, $appid='') 获取JsApi使用签名
+* getJsSign($url, $timeStamp=0, $nonceStr='', $appid='') 获取JsApi使用签名信息数组,可只提供url地址 
 * getSignature($arrdata,'sha1') 生成签名字串  
 * generateNonceStr($length=16) 获取随机字串  
 * createMenu($data,$agentid='') 创建菜单,参数:菜单内容数组,要创建菜单应用id

+ 1 - 1
wiki/官方API类库.md

@@ -124,7 +124,7 @@
  *  resetAuth($appid='') 删除验证数据
  *  resetJsTicket($appid='') 删除JSAPI授权TICKET
  *  getJsTicket($appid='',$jsapi_ticket='') 获取JSAPI授权TICKET
- *  getJsSign($url, $timeStamp, $nonceStr, $appid='') 获取JsApi使用签名
+ *  getJsSign($url, $timeStamp=0, $nonceStr='', $appid='') 获取JsApi使用签名信息数组,可只提供url地址 
  *  createMenu($data) 创建菜单 $data菜单结构详见 **[自定义菜单创建接口](http://mp.weixin.qq.com/wiki/index.php?title=自定义菜单创建接口)**
  *  getServerIp() 获取微信服务器IP地址列表 返回数组array('127.0.0.1','127.0.0.1')
  *  getMenu() 获取菜单