From 776e63d6e5052d0162d7d9d408a80efde8a2afe3 Mon Sep 17 00:00:00 2001 From: Ji Guang Date: Fri, 3 Jun 2016 11:57:14 +0800 Subject: [PATCH 1/9] add shortvideo type MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加小视频类型,其他函数无影响 --- wechat.class.php | 1 + 1 file changed, 1 insertion(+) diff --git a/wechat.class.php b/wechat.class.php index ff16755..a0502af 100755 --- a/wechat.class.php +++ b/wechat.class.php @@ -52,6 +52,7 @@ class Wechat const MSGTYPE_NEWS = 'news'; const MSGTYPE_VOICE = 'voice'; const MSGTYPE_VIDEO = 'video'; + const MSGTYPE_SHORTVIDEO = 'shortvideo'; const EVENT_SUBSCRIBE = 'subscribe'; //订阅 const EVENT_UNSUBSCRIBE = 'unsubscribe'; //取消订阅 const EVENT_SCAN = 'SCAN'; //扫描带参数二维码 From 32447fd61ca4b203b6433254846ae01cecfbf82b Mon Sep 17 00:00:00 2001 From: ZhengWeiDong Date: Wed, 3 Aug 2016 00:17:57 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E5=9C=A8=E6=91=87=E4=B8=80=E6=91=87=E9=A1=B5=E9=9D=A2=E5=B1=95?= =?UTF-8?q?=E7=A4=BA=E7=9A=84=E5=9B=BE=E7=89=87=E7=B4=A0=E6=9D=90=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=9C=B0=E5=9D=80=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wechat.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wechat.class.php b/wechat.class.php index 8f340cb..d35cd7f 100755 --- a/wechat.class.php +++ b/wechat.class.php @@ -3838,7 +3838,7 @@ public function bindPageShakeAroundDevice($device_id,$page_ids=array(),$bind=1,$ */ public function uploadShakeAroundMedia($data){ if (!$this->access_token && !$this->checkAuth()) return false; - $result = $this->http_post(self::API_URL_PREFIX.self::SHAKEAROUND_MATERIAL_ADD.'access_token='.$this->access_token,$data,true); + $result = $this->http_post(self::API_BASE_URL_PREFIX.self::SHAKEAROUND_MATERIAL_ADD.'access_token='.$this->access_token,$data,true); if ($result) { $json = json_decode($result,true); From 408677cbc105e01c9fb32f534601928f70efcaf0 Mon Sep 17 00:00:00 2001 From: ZhengWeiDong Date: Wed, 3 Aug 2016 00:18:15 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=91=87=E4=B8=80?= =?UTF-8?q?=E6=91=87=E4=B8=8A=E4=BC=A0=E7=B4=A0=E6=9D=90=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test-upload-shake-around-media.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 test/test-upload-shake-around-media.php diff --git a/test/test-upload-shake-around-media.php b/test/test-upload-shake-around-media.php new file mode 100644 index 0000000..c063ea6 --- /dev/null +++ b/test/test-upload-shake-around-media.php @@ -0,0 +1,13 @@ + '', //填写高级调用功能的app id, 请在微信开发模式后台查询 + 'appsecret' => '', //填写高级调用功能的密钥 + ); + $weObj = new Wechat($options); + $weObj->uploadShakeAroundMedia(array('media'=>'@')); \ No newline at end of file From 84074b74d6b7ca6aecf20b192d16c3362308c8b3 Mon Sep 17 00:00:00 2001 From: hpp Date: Fri, 5 Aug 2016 18:58:48 +0800 Subject: [PATCH 4/9] fix media upload bug --- qywechat.class.php | 3 +++ wechat.class.php | 3 +++ 2 files changed, 6 insertions(+) diff --git a/qywechat.class.php b/qywechat.class.php index b9198bf..fba45bb 100644 --- a/qywechat.class.php +++ b/qywechat.class.php @@ -273,6 +273,9 @@ private function http_post($url,$param,$post_file=false){ curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt($oCurl, CURLOPT_POST,true); curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST); + if(PHP_VERSION_ID >= 50500){ + curl_setopt($oCurl, CURLOPT_SAFE_UPLOAD, FALSE); + } $sContent = curl_exec($oCurl); $aStatus = curl_getinfo($oCurl); curl_close($oCurl); diff --git a/wechat.class.php b/wechat.class.php index 8f340cb..1c0e0c7 100755 --- a/wechat.class.php +++ b/wechat.class.php @@ -1136,6 +1136,9 @@ private function http_post($url,$param,$post_file=false){ curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt($oCurl, CURLOPT_POST,true); curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST); + if(PHP_VERSION_ID >= 50500){ + curl_setopt($oCurl, CURLOPT_SAFE_UPLOAD, FALSE); + } $sContent = curl_exec($oCurl); $aStatus = curl_getinfo($oCurl); curl_close($oCurl); From 6a7186a2bee9392c52aae1eb9d0da9debebe63d4 Mon Sep 17 00:00:00 2001 From: XiaoXuanBing Date: Mon, 15 Aug 2016 11:30:32 +0800 Subject: [PATCH 5/9] =?UTF-8?q?=E4=BF=AE=E6=AD=A35.6+curl=E5=8E=BB?= =?UTF-8?q?=E6=8E=89=E7=9A=84@?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wechat.class.php | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/wechat.class.php b/wechat.class.php index ff94dcf..b8b3644 100755 --- a/wechat.class.php +++ b/wechat.class.php @@ -1129,7 +1129,24 @@ private function http_post($url,$param,$post_file=false){ curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1 } - if (is_string($param) || $post_file) { + if (PHP_VERSION_ID >= 50500 && class_exists('\CURLFile')) { + $is_curlFile = true; + } else { + $is_curlFile = false; + if (defined('CURLOPT_SAFE_UPLOAD')) { + curl_setopt($oCurl, CURLOPT_SAFE_UPLOAD, false); + } + } + if (is_string($param)) { + $strPOST = $param; + }elseif($post_file) { + if($is_curlFile) { + foreach ($param as $key => $val) { + if (substr($val, 0, 1) == '@') { + $param[$key] = new \CURLFile(realpath(substr($val,1))); + } + } + } $strPOST = $param; } else { $aPOST = array(); @@ -1142,9 +1159,6 @@ private function http_post($url,$param,$post_file=false){ curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt($oCurl, CURLOPT_POST,true); curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST); - if(PHP_VERSION_ID >= 50500){ - curl_setopt($oCurl, CURLOPT_SAFE_UPLOAD, FALSE); - } $sContent = curl_exec($oCurl); $aStatus = curl_getinfo($oCurl); curl_close($oCurl); From 192d2f6fd862799d00495cb4e7ad603f83151e25 Mon Sep 17 00:00:00 2001 From: see365 Date: Fri, 26 Aug 2016 10:42:23 +0800 Subject: [PATCH 6/9] CURLOPT_SAFE_UPLOAD should before CURLOPT_POSTFIELDS --- qywechat.class.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qywechat.class.php b/qywechat.class.php index fba45bb..1b63f2c 100644 --- a/qywechat.class.php +++ b/qywechat.class.php @@ -272,10 +272,11 @@ private function http_post($url,$param,$post_file=false){ curl_setopt($oCurl, CURLOPT_URL, $url); curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt($oCurl, CURLOPT_POST,true); - curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST); if(PHP_VERSION_ID >= 50500){ curl_setopt($oCurl, CURLOPT_SAFE_UPLOAD, FALSE); } + curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST); + $sContent = curl_exec($oCurl); $aStatus = curl_getinfo($oCurl); curl_close($oCurl); From 75049c81dc6aa9d2ca257c7b5c6b6f3f95af6c09 Mon Sep 17 00:00:00 2001 From: Gavin Foo Date: Wed, 30 Aug 2017 16:33:34 +0800 Subject: [PATCH 7/9] FIX "Function mcrypt_module_open() is deprecated in PHP 7.1" --- wechat.class.php | 136 +++++++++++++++++++---------------------------- 1 file changed, 55 insertions(+), 81 deletions(-) diff --git a/wechat.class.php b/wechat.class.php index b8b3644..6494e14 100755 --- a/wechat.class.php +++ b/wechat.class.php @@ -4645,89 +4645,63 @@ function Prpcrypt($k) $this->key = base64_decode($k . "="); } - /** - * 对明文进行加密 - * @param string $text 需要加密的明文 - * @return string 加密后的密文 - */ - public function encrypt($text, $appid) - { - - try { - //获得16位随机字符串,填充到明文之前 - $random = $this->getRandomStr();//"aaaabbbbccccdddd"; - $text = $random . pack("N", strlen($text)) . $text . $appid; - // 网络字节序 - $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); - $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); - $iv = substr($this->key, 0, 16); - //使用自定义的填充方式对明文进行补位填充 - $pkc_encoder = new PKCS7Encoder; - $text = $pkc_encoder->encode($text); - mcrypt_generic_init($module, $this->key, $iv); - //加密 - $encrypted = mcrypt_generic($module, $text); - mcrypt_generic_deinit($module); - mcrypt_module_close($module); - - // print(base64_encode($encrypted)); - //使用BASE64对加密后的字符串进行编码 - return array(ErrorCode::$OK, base64_encode($encrypted)); - } catch (Exception $e) { - //print $e; - return array(ErrorCode::$EncryptAESError, null); - } + /** + * 对明文进行加密 + * @param string $text 需要加密的明文 + * @return string 加密后的密文 + */ + public function encrypt($text, $appid){ + try { + //获得16位随机字符串,填充到明文之前 + $random = $this->getRandomStr(); + $text = $random . pack("N", strlen($text)) . $text . $appid; + $iv = substr($this->key, 0, 16); + $pkc_encoder = new PKCS7Encoder; + $text = $pkc_encoder->encode($text); + $encrypted = openssl_encrypt($text,'AES-256-CBC',substr($this->key, 0, 32),OPENSSL_ZERO_PADDING,$iv); + return array(ErrorCode::$OK, $encrypted); + } catch (Exception $e) { + //print $e; + return array(ErrorCode::$EncryptAESError, null); } - - /** - * 对密文进行解密 - * @param string $encrypted 需要解密的密文 - * @return string 解密得到的明文 - */ - public function decrypt($encrypted, $appid) - { - - try { - //使用BASE64对需要解密的字符串进行解码 - $ciphertext_dec = base64_decode($encrypted); - $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); - $iv = substr($this->key, 0, 16); - mcrypt_generic_init($module, $this->key, $iv); - //解密 - $decrypted = mdecrypt_generic($module, $ciphertext_dec); - mcrypt_generic_deinit($module); - mcrypt_module_close($module); - } catch (Exception $e) { - return array(ErrorCode::$DecryptAESError, null); - } - - - try { - //去除补位字符 - $pkc_encoder = new PKCS7Encoder; - $result = $pkc_encoder->decode($decrypted); - //去除16位随机字符串,网络字节序和AppId - if (strlen($result) < 16) - return ""; - $content = substr($result, 16, strlen($result)); - $len_list = unpack("N", substr($content, 0, 4)); - $xml_len = $len_list[1]; - $xml_content = substr($content, 4, $xml_len); - $from_appid = substr($content, $xml_len + 4); - if (!$appid) - $appid = $from_appid; - //如果传入的appid是空的,则认为是订阅号,使用数据中提取出来的appid - } catch (Exception $e) { - //print $e; - return array(ErrorCode::$IllegalBuffer, null); - } - if ($from_appid != $appid) - return array(ErrorCode::$ValidateAppidError, null); - //不注释上边两行,避免传入appid是错误的情况 - return array(0, $xml_content, $from_appid); //增加appid,为了解决后面加密回复消息的时候没有appid的订阅号会无法回复 - + } + /** + * 对密文进行解密 + * @param string $encrypted 需要解密的密文 + * @return string 解密得到的明文 + */ + public function decrypt($encrypted, $appid){ + try { + $iv = substr($this->key, 0, 16); + $decrypted = openssl_decrypt($encrypted,'AES-256-CBC',substr($this->key, 0, 32),OPENSSL_ZERO_PADDING,$iv); + } catch (Exception $e) { + return array(ErrorCode::$DecryptAESError, null); } - + try { + //去除补位字符 + $pkc_encoder = new PKCS7Encoder; + $result = $pkc_encoder->decode($decrypted); + //去除16位随机字符串,网络字节序和AppId + if (strlen($result) < 16) + return ""; + $content = substr($result, 16, strlen($result)); + $len_list = unpack("N", substr($content, 0, 4)); + $xml_len = $len_list[1]; + $xml_content = substr($content, 4, $xml_len); + $from_appid = substr($content, $xml_len + 4); + if (!$appid) + $appid = $from_appid; + //如果传入的appid是空的,则认为是订阅号,使用数据中提取出来的appid + } catch (Exception $e) { + //print $e; + return array(ErrorCode::$IllegalBuffer, null); + } + if ($from_appid != $appid) + return array(ErrorCode::$ValidateAppidError, null); + //不注释上边两行,避免传入appid是错误的情况 + return array(0, $xml_content, $from_appid); + //增加appid,为了解决后面加密回复消息的时候没有appid的订阅号会无法回复 + } /** * 随机生成16位字符串 From 2b97d960fa642718de7510de9622a57467eab7a9 Mon Sep 17 00:00:00 2001 From: githubxp Date: Tue, 7 Sep 2021 16:14:54 +0800 Subject: [PATCH 8/9] Update wechat.class.php fix variable --- wechat.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wechat.class.php b/wechat.class.php index 6494e14..2bccec8 100755 --- a/wechat.class.php +++ b/wechat.class.php @@ -4596,7 +4596,7 @@ function encode($text) //计算需要填充的位数 $amount_to_pad = PKCS7Encoder::$block_size - ($text_length % PKCS7Encoder::$block_size); if ($amount_to_pad == 0) { - $amount_to_pad = PKCS7Encoder::block_size; + $amount_to_pad = PKCS7Encoder::$block_size; } //获得补位所用的字符 $pad_chr = chr($amount_to_pad); From 38f8c2e945667f516cc5d476a534ab78bbc9f930 Mon Sep 17 00:00:00 2001 From: HeTao Date: Fri, 18 Nov 2022 16:02:27 +0800 Subject: [PATCH 9/9] Update wechat.class.php MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 使用官方的json_encode --- wechat.class.php | 43 +------------------------------------------ 1 file changed, 1 insertion(+), 42 deletions(-) diff --git a/wechat.class.php b/wechat.class.php index 2bccec8..20af647 100755 --- a/wechat.class.php +++ b/wechat.class.php @@ -1369,48 +1369,7 @@ public function getCardSign($card_type='',$card_id='',$code='',$location_id='',$ * @param array $arr */ static function json_encode($arr) { - if (count($arr) == 0) return "[]"; - $parts = array (); - $is_list = false; - //Find out if the given array is a numerical array - $keys = array_keys ( $arr ); - $max_length = count ( $arr ) - 1; - if (($keys [0] === 0) && ($keys [$max_length] === $max_length )) { //See if the first key is 0 and last key is length - 1 - $is_list = true; - for($i = 0; $i < count ( $keys ); $i ++) { //See if each key correspondes to its position - if ($i != $keys [$i]) { //A key fails at position check. - $is_list = false; //It is an associative array. - break; - } - } - } - foreach ( $arr as $key => $value ) { - if (is_array ( $value )) { //Custom handling for arrays - if ($is_list) - $parts [] = self::json_encode ( $value ); /* :RECURSION: */ - else - $parts [] = '"' . $key . '":' . self::json_encode ( $value ); /* :RECURSION: */ - } else { - $str = ''; - if (! $is_list) - $str = '"' . $key . '":'; - //Custom handling for multiple data types - if (!is_string ( $value ) && is_numeric ( $value ) && $value<2000000000) - $str .= $value; //Numbers - elseif ($value === false) - $str .= 'false'; //The booleans - elseif ($value === true) - $str .= 'true'; - else - $str .= '"' . addslashes ( $value ) . '"'; //All other things - // :TODO: Is there any more datatype we should be in the lookout for? (Object?) - $parts [] = $str; - } - } - $json = implode ( ',', $parts ); - if ($is_list) - return '[' . $json . ']'; //Return numerical JSON - return '{' . $json . '}'; //Return associative JSON + return json_encode($arr,JSON_UNESCAPED_UNICODE); } /**