首页
关于
Search
1
Fastadmin 美化后台样式
310,891 阅读
2
关于破解移动宽带光猫 型号: GS3101 超级管理员密码
26,918 阅读
3
给Thinkphp3用上composer
19,964 阅读
4
Wallpaper完美壁纸修复天气bug(无需申请API)
19,748 阅读
5
PECL无法安装时手动编译安装PHP扩展
19,606 阅读
Linux
Mysql
PHP
Nginx
归档
Android
Python
IOS
浴室沉思
C++
CCF CSP认证
Windows
C#
前端
登录
Search
标签搜索
php
git
Windows
wkhtmltopdf
短信
defense
API
Google Photos
python
wkhtmltoimage
网页快照
linux
ssr
https
mail
sms
小程序
封装
ComoBox
拼多多
Guooo
累计撰写
126
篇文章
累计收到
81
条评论
首页
栏目
Linux
Mysql
PHP
Nginx
归档
Android
Python
IOS
浴室沉思
C++
CCF CSP认证
Windows
C#
前端
页面
关于
搜索到
8
篇与
的结果
2020-11-05
PHP一个简单字符串拼接签名的方法(Join)
经常有需求类似于:第一步:设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。第二步:在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。以往都是$k=$v&,最后再把末尾的&去掉,比较麻烦。无意间发现了有个join函数,用法如下:/** * 获取签名 * @param $params array 数组 * @return string 拼接后的字符串MD5 */ public function getSign($params) { ksort($params); $str = []; foreach ($params as $k => $v){ if (empty($v)) continue; $str[] = "{$k}={$v}"; } return strtoupper(md5(join('&',$str))); }
2020年11月05日
7,359 阅读
0 评论
0 点赞
2020-10-07
PHP使用mkdir创建目录后无法写入问题
今天使用php的mkdir递归创建文件夹,创建完之后的文件夹权限是d-wxr----x也就是411,而且用chmod也没法改权限,只能sudo rm -rf 删除它原因:代码错误,mkdir函数的第二个参数不应使用字符串参数'0755',而是使用0755值错误代码:mkdir('dir_path','0755',true);正确代码:mkdir('dir_path',0755,true);
2020年10月07日
3,825 阅读
0 评论
0 点赞
2020-08-19
wkhtmltopdf中文不显示或者乱码问题
打开windows目录c:\Windows\fonts\simsun.ttc拷贝到 linux 服务器/usr/share/fonts/目录下,再次生成pdf中文显示正常点击下载SIMSUN.TTC
2020年08月19日
5,017 阅读
0 评论
0 点赞
2019-01-02
PHPStudy安装Redis扩展
1.首先把环境准备好,怎样准备环境就很容易了。首先直接去下载redis扩展:下载地址:http://pecl.php.net/package/redis任何适合你的php版本都可以2.下载完成以后解压,把php_redis.dll,php_redis.pdb,移动到php/ext的文件中,如下图3.然后在php的配置文件中,加上extension=php_redis.dll4.重启PHPStudy,打开phpinfo然后查看效果5.最后别忘了本地要有Redis服务程序才能运行,Windows版下载地址:https://github.com/microsoftarchive/redis/releases
2019年01月02日
4,409 阅读
0 评论
0 点赞
2018-09-18
PHP开启https后无法发送邮件问题
今天打开中国移动家的WIFI,然后进入我自己的科学小机场,发现里面!居然!出现了!广告!!首先我的网站是不可能投放广告的,(对,也没有人找我接广告),而服务器又是国外某大厂的,更不可能出现广告。所以只有一个情况,网络被某动运行商劫持了。于是我决定要给我的小机场加个小绿锁了。经过一通计算机基础操作,我把网站成功加上了https。于是我兴冲冲地把我的小网站拿去给朋友分享。然后朋友吐槽我邮件怎么那么慢,一分钟了都没发送成功我:????我为了稳定性(懒)直接用的巨硬家的邮件服务,端口开放,我的服务器倒了巨硬的都不会,为什么会邮件发送失败?昨天还好好的...我第一时间测试了一遍,果然!发送失败了....然后我又在本地用相同配置测试了一遍,一切正常。我第一时间怀疑的就是https的锅。将 SMTP 的 debug level 调整到 2 后,出现了更多的报错信息:SSL routines:ssl3_get_server_certificate:certificate verify failed证书验证失败。我开始笃定跟https有关,又拿不出证据。万能的Google啊啊....啊...啊..好了,找到了。Google :你PHP的OpenSSL扩展没开我 :扯犊子呢,我开了。再说,没开扩展我昨天怎么发送出去的。Google : Emmmmmm......我:Emmmmm????Google:你的PHP找不到默认的根证书导致的这个问题,一般OpenSSL不会自带根证书,需要你自己搞一个放到根目录我:去哪搞?Google:这有一个神奇的链接:http://curl.haxx.se/ca/cacert.pem我:下好了,放哪?Google:放到PHP的根证书的目录啊我:???目录在哪?Google:....你执行这一段就知道了php -r "print_r(openssl_get_cert_locations());"我:返回这个东西:[root@vultr ~]# php -r "print_r(openssl_get_cert_locations());" Array ( [default_cert_file] => /usr/local/openssl/ssl/cert.pem [default_cert_file_env] => SSL_CERT_FILE [default_cert_dir] => /usr/local/openssl/ssl/certs [default_cert_dir_env] => SSL_CERT_DIR [default_private_dir] => /usr/local/openssl/ssl/private [default_default_cert_area] => /usr/local/openssl/ssl [ini_cafile] => /etc/pki/tls/certs/ca-bundle.crt [ini_capath] => )Google:看到那个default_cert_file了吗?把你下载的文件改成相同名字的cert.pem,然后放到default_cert_file对应的目录下就行了我:我都看不到ssl文件夹....Google:没有文件夹就新建一个,别那么多废话我:诶?真的有用!真棒!不枉我整天费劲去上你Google:......至此,邮件功能又恢复正常了。
2018年09月18日
3,708 阅读
0 评论
0 点赞
2018-03-19
PHP 调用 拼多多 API 模板
拼多多的API模板就更简单了,前段时间刚放出来接口权限,上周开始对接完成。都是无需授权的接口,所以也就不需要刷新token之类的事。首先按照文档申请接入多多客(打开后选择左侧多多客接入指南):http://open.pinduoduo.com/#/document?auth=1<?php /*拼多多API类*/ class PDDApi { private $client_id = 'client_id'; // 你的client_id private $client_secret = 'client_secret'; // 你的client_secret /** * 获取拼多多接口数据 * @param string $apiType API 名称 如:pdd.ddk.direct.goods.query * @param array $param 公共参数 如:['page' => 1 , 'page_size' => 100] * @return mixed */ public function GetPDDApi($apiType, $param) { $url = 'http://gw-api.pinduoduo.com/api/router'; $param['client_id'] = $this->client_id; $param['type'] = $apiType; $param['data_type'] = 'JSON'; $param['timestamp'] = $this->getMillisecond(); ksort($param); // 排序 $str = ''; // 拼接的字符串 foreach ($param as $k => $v) $str .= $k . $v; $sign = strtoupper(md5($this->client_secret. $str . $this->client_secret)); // 生成签名 MD5加密转大写 $param['sign'] = $sign; return $this->curl_post($url, $param); } /** * 发送post请求 * @param $url * @param $curlPost * @return mixed */ private function curl_post($url, $curlPost) { $ch = curl_init(); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_REFERER, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost); $result = curl_exec($ch); curl_close($ch); return $result; } // 获取13位时间戳 private function getMillisecond() { list($t1, $t2) = explode(' ', microtime()); return sprintf('%.0f', (floatval($t1) + floatval($t2)) * 1000); } } // 调用方法 $p = new PDDApi(); echo $p->GetPDDApi('pdd.ddk.direct.goods.query',['page'=>1]);
2018年03月19日
6,231 阅读
0 评论
0 点赞
2018-03-19
PHP调用京东联盟开普勒、宙斯 API模板
京东开普勒的Appkey和AppSecret在这里可以看到(需要先创建应用):http://kepler.jd.com/console/app/app_list.action授权介绍在这里:http://kepler.jd.com/console/docCenterCatalog/docContent?channelId=17/*开普勒类*/ class KeplerApi{ private $appKey = 'YourKey'; // 你的Key private $appScret = 'YourSecret'; // 你的Secret private $app_token_json = '{}'; // 第一次需要手动授权获取京东Token然后粘贴到这里 /** * 获取开普勒接口数据 * @param string $apiUrl 要获取的api * @param string $param_json 该api需要的参数 * @param string $version 版本可选为 2.0 * @param bool $get 是否使用get,默认为post方式 * @return mixed 京东返回的json格式的数据 */ public function GetKelperApiData($apiUrl='',$param_json = array(),$version='1.0',$get=false){ $API['access_token'] = $this->refreshAccessToken(); // 生成的access_token,30天一换 $API['app_key'] = $this->appKey; $API['method'] = $apiUrl; $API['param_json'] = json_encode($param_json); $API['sign_method'] = 'md5'; $API['timestamp'] = date('Y-m-d H:i:s',time()); $API['v'] = $version; ksort($API); // 排序 $str = ''; // 拼接的字符串 foreach ($API as $k=>$v) $str.=$k.$v; $sign = strtoupper(md5($this->appScret.$str.$this->appScret)); // 生成签名 MD5加密转大写 if ($get){ // 用get方式拼接URL $url = "https://router.jd.com/api?"; foreach ($API as $k=>$v) $url .= urlencode($k) . '=' . urlencode($v) . '&'; // 把参数和值url编码 $url .= 'sign='.$sign; // 接上签名 $res = self::curl_get($url); }else{ // 用post方式获取数据 $url = "https://router.jd.com/api"; $API['sign'] = $sign; $res = self::curl_post($url,$API); } return $res; } // 刷新accessToken private function refreshAccessToken(){ $filePath = dirname(dirname(__FILE__)).'/Config/KelperToken.config'; // Token文本保存路径 if (file_exists($filePath)){ $handle = fopen($filePath,'r'); $tokenJson = fread($handle,8142); }else{ // 插入默认的token fwrite(fopen($filePath,'w'),$this->app_token_json); $tokenJson = $this->app_token_json; } if (substr($tokenJson, 0,3) == pack('CCC',0xef,0xbb,0xbf)) { $tokenJson = substr($tokenJson, 3); } $res = json_decode(trim($tokenJson),true); // 解析不了可能是文本出了问题,注意BOM头 // 判断 if ($res['code'] == 0){ if ($res['expires_in']*1000 + $res['time'] < self::getMillisecond() - 86400000){ // access_token失效前一天 // 获取刷新token的url $refreshUrl = "https://kploauth.jd.com/oauth/token?grant_type=oauth_refresh_token";//&app_key=yourappkey&app_secret=yourappsecret&refresh_token=xxxxxxxx $refreshUrl .= '&app_key='.$this->appKey; $refreshUrl .= '&app_secret='.$this->appScret; $refreshUrl .= '&refresh_token='.$res['refresh_token']; // 获取新的token数据 $newAccessTokenJson = self::curl_get($refreshUrl); // 写入文本 fwrite(fopen($filePath,'w'),$newAccessTokenJson); // 解析成数组 $newAccessTokenArr = json_decode($newAccessTokenJson,true); $accessToken = $newAccessTokenArr['access_token']; }else{ $accessToken = $res['access_token']; } return $accessToken; }else{ // 如果refresh_token过期,将会返回错误码code:2011;msg:refresh_token过期 return $res['msg']; } } // get请求 private static function curl_get($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_HEADER, FALSE); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_REFERER, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); $result = curl_exec($ch); curl_close($ch); return $result; } // post请求 private static function curl_post($url,$curlPost){ $ch = curl_init(); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_REFERER, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost); $result = curl_exec($ch); curl_close($ch); return $result; } // 获取13位时间戳 private static function getMillisecond(){ list($t1, $t2) = explode(' ', microtime()); return sprintf('%.0f',(floatval($t1)+floatval($t2))*1000); } }宙斯接口也是大同小异,无非是换了个域名和授权方式/** * Class ZeusApi 宙斯接口调用类 */ class ZeusApi { private $appKey = 'YourKey'; // 你的Key private $appScret = 'YourSecret'; // 你的Secret private $app_token_json = '{}'; // 第一次需要手动授权获取京东Token然后粘贴到这里 /** * 获取宙斯接口数据 * @param string $apiUrl 要获取的api * @param string $param_json 该api需要的参数,使用json格式,默认为 {} * @param string $version 版本可选为 2.0 * @param bool $get 是否使用get,默认为post方式 * @return mixed 京东返回的json格式的数据 */ public function GetZeusApiData($apiUrl='',$param_json = array(),$version='1.0',$get=false){ $API['access_token'] = $this->refreshAccessToken(); // 生成的access_token,30天一换 $API['app_key'] = $this->appKey; $API['method'] = $apiUrl; $API['360buy_param_json'] = json_encode($param_json); $API['timestamp'] = date('Y-m-d H:i:s',time()); $API['v'] = $version; ksort($API); // 排序 $str = ''; // 拼接的字符串 foreach ($API as $k=>$v) $str.=$k.$v; $sign = strtoupper(md5($this->appScret.$str.$this->appScret)); // 生成签名 MD5加密转大写 if ($get){ // 用get方式拼接URL $url = "https://api.jd.com/routerjson?"; foreach ($API as $k=>$v) $url .= urlencode($k) . '=' . $v . '&'; // 把参数和值url编码 $url .= 'sign='.$sign; $res = self::curl_get($url); }else{ // 用post方式获取数据 $url = "https://api.jd.com/routerjson?"; $API['sign'] = $sign; $res = self::curl_post($url,$API); } return $res; } // 刷新accessToken private function refreshAccessToken(){ $filePath = dirname(dirname(__FILE__)).'/Config/ZeusToken.config'; // Token文本保存路径 if (file_exists($filePath)){ $handle = fopen($filePath,'r'); $tokenJson = fread($handle,8142); }else{ // 插入默认的token fwrite(fopen($filePath,'w'),$this->app_token_json); $tokenJson = $this->app_token_json; } if (substr($tokenJson, 0,3) == pack('CCC',0xef,0xbb,0xbf)) { $tokenJson = substr($tokenJson, 3); } $res = json_decode(trim($tokenJson),true); // 解析不了可能是文本出了问题 // 判断 if ($res['code'] == 0){ if ($res['expires_in']*1000 + $res['time'] < self::getMillisecond() - 86400000){ // access_token失效前一天 // 获取刷新token的url $refreshUrl = "https://oauth.jd.com/oauth/token?"; $refreshUrl .= '&client_id='.$this->appKey; $refreshUrl .= '&client_secret='.$this->appScret; $refreshUrl .= '&grant_type=refresh_token'; $refreshUrl .= '&refresh_token='.$res['refresh_token']; // 获取新的token数据 $newAccessTokenJson = self::curl_get($refreshUrl); // 写入文本 fwrite(fopen($filePath,'w'),$newAccessTokenJson); // 解析成数组 $newAccessTokenArr = json_decode($newAccessTokenJson,true); $accessToken = $newAccessTokenArr['access_token']; }else{ $accessToken = $res['access_token']; } return $accessToken; }else{ // 如果refresh_token过期,将会返回错误码code:2011;msg:refresh_token过期 return $res['msg']; } } // get请求 private static function curl_get($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_HEADER, FALSE); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_REFERER, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); $result = curl_exec($ch); curl_close($ch); return $result; } // post请求 private static function curl_post($url,$curlPost){ $ch = curl_init(); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_REFERER, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost); $result = curl_exec($ch); curl_close($ch); return $result; } // 获取13位时间戳 private static function getMillisecond(){ list($t1, $t2) = explode(' ', microtime()); return sprintf('%.0f',(floatval($t1)+floatval($t2))*1000); } }
2018年03月19日
4,287 阅读
0 评论
0 点赞
2017-10-24
国内镜像安装Composer
已经有无数次看到Composer这个东西了。一直以来,我所看到的各大框架和一些开源项目的部署都提到了Composer这个东西,但是往往我都是(由于懒)直接使用git或者直接下载等方式获取源码,今天特地试着安装下Composer这个东西。官网简介Composer 是一个新的安装包管理工具,服务于 PHP 生态系统。它实际上包含了两个部分:Composer 和 Packagist。我就不详细解释它们的具体作用了,因为百度Google都有(而且我也不懂)。总的来说就提取出一句话,它可以自动帮你为项目安装所依赖的开发包。对了,运行Composer需要PHP5.3.2+Windows & Linux安装说实话安装这个东西我是搞了很久的,因为蓝某灯被和谐的原因,很多人没有不锈钢梯子,官网都打不开,很难下载 Composer。然后我找到了Composer中国镜像网如果你一定要选择官方的话,可以查看官网教程那么就用它安装吧if 你已经配置好了PHP环境变量什么是配置好了环境变量,就是你在CMD或者命令行执行php -v会有反应,那么就是已经配置好了。then打开CMD分别执行以下命令php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"php composer-setup.phpphp -r "unlink('composer-setup.php');"上述 3 条命令的作用依次是:下载安装脚本 - composer-setup.php - 到当前目录。执行安装过程。删除安装脚本。其实官网还有一句是用来检测Composer.phar的完整性,但是这里由于使用的是国内镜像,可能会出错,所以不推荐执行,不过也贴出来放到这里:php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"局部安装上述下载 Composer 的过程正确执行完毕后,可以将 composer.phar 文件复制到任意目录(比如项目根目录下),然后通过 php composer.phar 指令即可使用 Composer 了!全局安装(推荐)Mac或者Linux系统打开命令行窗口并执行如下命令将前面下载的 composer.phar 文件移动到 /usr/local/bin/ 目录下面:sudo mv composer.phar /usr/local/bin/composerWindows系统1、找到并进入PHP的安装目录(和你在命令行中执行的 php -v 指令应该是同一套 PHP)。2、将 composer.phar 复制到PHP 的安装目录下面,也就是和php.exe在同一级目录。3、在PHP 安装目录下新建一个 composer.bat 文件,把这一串代码保存到此文件中。@php "%~dp0composer.phar" %*4、双击执行创建的这个 composer.bat 文件5、最后重新打开一个命令行窗口试一试执行 composer --version 看看是否正确输出版本号即可。修改 composer 的全局配置文件在你准备使用Composer安装依赖之前,不如先把它切换到国内的镜像源吧,速度应该会快不少。打开命令行窗口(windows用户)或控制台(Linux、Mac 用户)并执行如下命令:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/更新Composer如果需要更新composer,执行 composer selfupdate 即可
2017年10月24日
3,287 阅读
0 评论
0 点赞