123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 |
- <?php
- // +----------------------------------------------------------------------
- // | wechat-php-sdk
- // +----------------------------------------------------------------------
- // | 版权所有 2014~2017 广州楚才信息科技有限公司 [ http://www.cuci.cc ]
- // +----------------------------------------------------------------------
- // | 官方文档: https://www.kancloud.cn/zoujingli/wechat-php-sdk
- // +----------------------------------------------------------------------
- // | 开源协议 ( https://mit-license.org )
- // +----------------------------------------------------------------------
- // | github开源项目:https://github.com/zoujingli/wechat-php-sdk
- // +----------------------------------------------------------------------
- namespace Wechat\Lib;
- use CURLFile;
- /**
- * 微信接口通用类
- *
- * @category WechatSDK
- * @subpackage library
- * @author Anyon <zoujingli@qq.com>
- * @date 2016/05/28 11:55
- */
- class Tools
- {
- /**
- * 产生随机字符串
- * @param int $length 指定字符长度
- * @param string $str 字符串前缀
- * @return string
- */
- static public function createNoncestr($length = 32, $str = "")
- {
- $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
- for ($i = 0; $i < $length; $i++) {
- $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
- }
- return $str;
- }
- /**
- * 数据生成签名
- * @param array $data 签名数组
- * @param string $method 签名方法
- * @return bool|string 签名值
- */
- static public function getSignature($data, $method = "sha1")
- {
- if (!function_exists($method)) {
- return false;
- }
- ksort($data);
- $params = array();
- foreach ($data as $key => $value) {
- $params[] = "{$key}={$value}";
- }
- return $method(join('&', $params));
- }
- /**
- * 生成支付签名
- * @param array $option
- * @param string $partnerKey
- * @return string
- */
- static public function getPaySign($option, $partnerKey)
- {
- ksort($option);
- $buff = '';
- foreach ($option as $k => $v) {
- $buff .= "{$k}={$v}&";
- }
- return strtoupper(md5("{$buff}key={$partnerKey}"));
- }
- /**
- * XML编码
- * @param mixed $data 数据
- * @param string $root 根节点名
- * @param string $item 数字索引的子节点名
- * @param string $id 数字索引子节点key转换的属性名
- * @return string
- */
- static public function arr2xml($data, $root = 'xml', $item = 'item', $id = 'id')
- {
- return "<{$root}>" . self::_data_to_xml($data, $item, $id) . "</{$root}>";
- }
- /**
- * XML内容生成
- * @param array $data 数据
- * @param string $item 子节点
- * @param string $id 节点ID
- * @param string $content 节点内容
- * @return string
- */
- static private function _data_to_xml($data, $item = 'item', $id = 'id', $content = '')
- {
- foreach ($data as $key => $val) {
- is_numeric($key) && $key = "{$item} {$id}=\"{$key}\"";
- $content .= "<{$key}>";
- if (is_array($val) || is_object($val)) {
- $content .= self::_data_to_xml($val);
- } elseif (is_numeric($val)) {
- $content .= $val;
- } else {
- $content .= '<![CDATA[' . preg_replace("/[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f]/", '', $val) . ']]>';
- }
- list($_key,) = explode(' ', $key . ' ');
- $content .= "</$_key>";
- }
- return $content;
- }
- /**
- * 将xml转为array
- * @param string $xml
- * @return array
- */
- static public function xml2arr($xml)
- {
- return json_decode(Tools::json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
- }
- /**
- * 生成安全JSON数据
- * @param array $array
- * @return string
- */
- static public function json_encode($array)
- {
- return preg_replace_callback('/\\\\u([0-9a-f]{4})/i', function ($matches) {
- return mb_convert_encoding(pack("H*", $matches[1]), "UTF-8", "UCS-2BE");
- }, json_encode($array));
- }
- /**
- * 以get方式提交请求
- * @param $url
- * @return bool|mixed
- */
- static public function httpGet($url)
- {
- $curl = curl_init();
- if (stripos($url, "https") === 0) {
- curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
- curl_setopt($curl, CURLOPT_SSLVERSION, 1);
- }
- curl_setopt($curl, CURLOPT_URL, $url);
- curl_setopt($curl, CURLOPT_TIMEOUT, 30);
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
- list($content, $status) = array(curl_exec($curl), curl_getinfo($curl), curl_close($curl));
- return (intval($status["http_code"]) === 200) ? $content : false;
- }
- /**
- * 以post方式提交请求
- * @param string $url
- * @param array|string $data
- * @return bool|mixed
- */
- static public function httpPost($url, $data)
- {
- $curl = curl_init();
- curl_setopt($curl, CURLOPT_URL, $url);
- curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($curl, CURLOPT_HEADER, false);
- curl_setopt($curl, CURLOPT_POST, true);
- curl_setopt($curl, CURLOPT_POSTFIELDS, self::_buildPost($data));
- list($content, $status) = array(curl_exec($curl), curl_getinfo($curl), curl_close($curl));
- return (intval($status["http_code"]) === 200) ? $content : false;
- }
- /**
- * 使用证书,以post方式提交xml到对应的接口url
- * @param string $url POST提交的内容
- * @param array $data 请求的地址
- * @param string $ssl_cer 证书Cer路径 | 证书内容
- * @param string $ssl_key 证书Key路径 | 证书内容
- * @param int $second 设置请求超时时间
- * @return bool|mixed
- */
- static public function httpsPost($url, $data, $ssl_cer = null, $ssl_key = null, $second = 30)
- {
- $curl = curl_init();
- curl_setopt($curl, CURLOPT_URL, $url);
- curl_setopt($curl, CURLOPT_TIMEOUT, $second);
- curl_setopt($curl, CURLOPT_HEADER, false);
- curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
- if (!is_null($ssl_cer) && file_exists($ssl_cer) && is_file($ssl_cer)) {
- curl_setopt($curl, CURLOPT_SSLCERTTYPE, 'PEM');
- curl_setopt($curl, CURLOPT_SSLCERT, $ssl_cer);
- }
- if (!is_null($ssl_key) && file_exists($ssl_key) && is_file($ssl_key)) {
- curl_setopt($curl, CURLOPT_SSLKEYTYPE, 'PEM');
- curl_setopt($curl, CURLOPT_SSLKEY, $ssl_key);
- }
- curl_setopt($curl, CURLOPT_POST, true);
- curl_setopt($curl, CURLOPT_POSTFIELDS, self::_buildPost($data));
- list($content, $status) = array(curl_exec($curl), curl_getinfo($curl), curl_close($curl));
- return (intval($status["http_code"]) === 200) ? $content : false;
- }
- /**
- * POST数据过滤处理
- * @param array $data
- * @return array
- */
- static private function _buildPost(&$data)
- {
- if (is_array($data)) {
- foreach ($data as &$value) {
- if (is_string($value) && $value[0] === '@' && class_exists('CURLFile', false)) {
- $filename = realpath(trim($value, '@'));
- file_exists($filename) && $value = new CURLFile($filename);
- }
- }
- }
- return $data;
- }
- /**
- * 读取微信客户端IP
- * @return null|string
- */
- static public function getAddress()
- {
- foreach (array('HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP', 'HTTP_X_CLIENT_IP', 'HTTP_X_CLUSTER_CLIENT_IP', 'REMOTE_ADDR') as $header) {
- if (!isset($_SERVER[$header]) || ($spoof = $_SERVER[$header]) === null) {
- continue;
- }
- sscanf($spoof, '%[^,]', $spoof);
- if (!filter_var($spoof, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
- $spoof = null;
- } else {
- return $spoof;
- }
- }
- return '0.0.0.0';
- }
- /**
- * 设置缓存,按需重载
- * @param string $cachename
- * @param mixed $value
- * @param int $expired
- * @return bool
- */
- static public function setCache($cachename, $value, $expired = 0)
- {
- return Cache::set($cachename, $value, $expired);
- }
- /**
- * 获取缓存,按需重载
- * @param string $cachename
- * @return mixed
- */
- static public function getCache($cachename)
- {
- return Cache::get($cachename);
- }
- /**
- * 清除缓存,按需重载
- * @param string $cachename
- * @return bool
- */
- static public function removeCache($cachename)
- {
- return Cache::del($cachename);
- }
- /**
- * SDK日志处理方法
- * @param string $msg 日志行内容
- * @param string $type 日志级别
- */
- static public function log($msg, $type = 'MSG')
- {
- Cache::put($type . ' - ' . $msg);
- }
- }
|