diff --git a/qywechat.class.php b/qywechat.class.php index b9198bf5a87e332cabaa722c599442f1472e3023..1b63f2c9fa95dd1675edd2e79bb53c3bf9adadf2 100644 --- a/qywechat.class.php +++ b/qywechat.class.php @@ -272,7 +272,11 @@ class Wechat curl_setopt($oCurl, CURLOPT_URL, $url); curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt($oCurl, CURLOPT_POST,true); + 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); diff --git a/test/test-upload-shake-around-media.php b/test/test-upload-shake-around-media.php new file mode 100644 index 0000000000000000000000000000000000000000..c063ea67244e6d42f92d8716e5d78b7df24738b1 --- /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 diff --git a/wechat.class.php b/wechat.class.php index 78df628030c328458d13ca31705d2cfffa538b64..ef00fbc666540c35adc39ec03762905286962f66 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'; //扫描带参数二维码 @@ -1128,7 +1129,24 @@ class Wechat 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(); @@ -2697,7 +2715,8 @@ class Wechat */ public function sendTemplateMessage($data){ if (!$this->access_token && !$this->checkAuth()) return false; - $result = $this->http_post(self::API_URL_PREFIX.self::TEMPLATE_SEND_URL.'access_token='.$this->access_token,self::json_encode($data)); + $send_data = str_replace('\\\n', '\n', self::json_encode($data)); + $result = $this->http_post(self::API_URL_PREFIX.self::TEMPLATE_SEND_URL.'access_token='.$this->access_token,$send_data); if($result){ $json = json_decode($result,true); if (!$json || !empty($json['errcode'])) { @@ -3996,7 +4015,7 @@ class Wechat */ 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); @@ -4627,89 +4646,63 @@ class Prpcrypt $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位字符串