namespace Wechat\Controller; use Think\Controller; /** * 父类控制器,需要继承 * @file ParentController.class.php * @author Gary <lizhiyong2204@sina.com> * @date 2015年8月4日 * @todu */ class ParentController extends Controller { protected $options = array ( 'token' => '' , // 填写你设定的key 'encodingaeskey' => '' , // 填写加密用的EncodingAESKey 'appid' => '' , // 填写高级调用功能的app id 'appsecret' => '' , // 填写高级调用功能的密钥 'debug' => false, 'logcallback' => '' ); public $errCode = 40001; public $errMsg = "no access" ; /** * 获取access_token * @return mixed|boolean|unknown */ public function getToken(){ $cache_token = S( 'exp_wechat_pay_token' ); if (! empty ( $cache_token )){ return $cache_token ; } $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s' ; $url = sprintf( $url , $this ->options[ 'appid' ], $this ->options[ 'appsecret' ]); $result = $this ->http_get( $url ); $result = json_decode( $result ,true); if ( empty ( $result )){ return false; } S( 'exp_wechat_pay_token' , $result [ 'access_token' ], array ( 'type' => 'file' , 'expire' =>3600)); return $result [ 'access_token' ]; } /** * 发送客服消息 * @param array $data 消息结构{"touser":"OPENID","msgtype":"news","news":{...}} */ public function sendCustomMessage( $data ){ $token = $this ->getToken(); if ( empty ( $token )) return false; $url = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=%s' ; $url = sprintf( $url , $token ); $result = $this ->http_post( $url ,self::json_encode( $data )); if ( $result ) { $json = json_decode( $result ,true); if (! $json || ! empty ( $json [ 'errcode' ])) { $this ->errCode = $json [ 'errcode' ]; $this ->errMsg = $json [ 'errmsg' ]; return false; } return $json ; } return false; } /** * 发送模板消息 * @param unknown $data * @return boolean|unknown */ public function sendTemplateMessage( $data ){ $token = $this ->getToken(); if ( empty ( $token )) return false; $url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=%s" ; $url = sprintf( $url , $token ); $result = $this ->http_post( $url ,self::json_encode( $data )); if ( $result ) { $json = json_decode( $result ,true); if (! $json || ! empty ( $json [ 'errcode' ])) { $this ->errCode = $json [ 'errcode' ]; $this ->errMsg = $json [ 'errmsg' ]; return false; } return $json ; } return false; } public function getFileCache( $name ){ return S( $name ); } /** * 微信api不支持中文转义的json结构 * @param array $arr */ static function json_encode( $arr ) { $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 } /** +---------------------------------------------------------- * 生成随机字符串 +---------------------------------------------------------- * @param int $length 要生成的随机字符串长度 * @param string $type 随机码类型:0,数字+大小写字母;1,数字;2,小写字母;3,大写字母;4,特殊字符;-1,数字+大小写字母+特殊字符 +---------------------------------------------------------- * @return string +---------------------------------------------------------- */ static public function randCode( $length = 5, $type = 2){ $arr = array (1 => "0123456789" , 2 => "abcdefghijklmnopqrstuvwxyz" , 3 => "ABCDEFGHIJKLMNOPQRSTUVWXYZ" , 4 => "~@#$%^&*(){}[]|" ); if ( $type == 0) { array_pop ( $arr ); $string = implode( "" , $arr ); } elseif ( $type == "-1" ) { $string = implode( "" , $arr ); } else { $string = $arr [ $type ]; } $count = strlen ( $string ) - 1; $code = '' ; for ( $i = 0; $i < $length ; $i ++) { $code .= $string [rand(0, $count )]; } return $code ; } /** * GET 请求 * @param string $url */ private function http_get( $url ){ $oCurl = curl_init(); if ( stripos ( $url , "https://" )!==FALSE){ curl_setopt( $oCurl , CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt( $oCurl , CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt( $oCurl , CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1 } curl_setopt( $oCurl , CURLOPT_URL, $url ); curl_setopt( $oCurl , CURLOPT_RETURNTRANSFER, 1 ); $sContent = curl_exec( $oCurl ); $aStatus = curl_getinfo( $oCurl ); curl_close( $oCurl ); if ( intval ( $aStatus [ "http_code" ])==200){ return $sContent ; } else { return false; } } /** * POST 请求 * @param string $url * @param array $param * @param boolean $post_file 是否文件上传 * @return string content */ private function http_post( $url , $param , $post_file =false){ $oCurl = curl_init(); if ( stripos ( $url , "https://" )!==FALSE){ curl_setopt( $oCurl , CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt( $oCurl , CURLOPT_SSL_VERIFYHOST, false); curl_setopt( $oCurl , CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1 } if ( is_string ( $param ) || $post_file ) { $strPOST = $param ; } else { $aPOST = array (); foreach ( $param as $key => $val ){ $aPOST [] = $key . "=" .urlencode( $val ); } $strPOST = join( "&" , $aPOST ); } curl_setopt( $oCurl , CURLOPT_URL, $url ); curl_setopt( $oCurl , CURLOPT_RETURNTRANSFER, 1 ); curl_setopt( $oCurl , CURLOPT_POST,true); curl_setopt( $oCurl , CURLOPT_POSTFIELDS, $strPOST ); $sContent = curl_exec( $oCurl ); $aStatus = curl_getinfo( $oCurl ); curl_close( $oCurl ); if ( intval ( $aStatus [ "http_code" ])==200){ return $sContent ; } else { return false; } } } |