首页
关于
Search
1
Fastadmin 美化后台样式
310,893 阅读
2
关于破解移动宽带光猫 型号: GS3101 超级管理员密码
26,918 阅读
3
给Thinkphp3用上composer
19,965 阅读
4
Wallpaper完美壁纸修复天气bug(无需申请API)
19,750 阅读
5
PECL无法安装时手动编译安装PHP扩展
19,607 阅读
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#
前端
页面
关于
搜索到
28
篇与
的结果
2019-10-15
HTML+PHP支付自动提交 示例代码
有很多时候支付都需要把参数和签名一起发送到支付平台网站,get方式还可以直接跳转,可有些网站返回的是HTML页面,这时候post方式就不能用curl了,需要自己组合html自动提交。每次这种事情都要自己从头开始,所以在这写一个简单的跳转代码备份一下。// 生成HTML文件 // @params $params array 需要提交的二维数组段 // @return string 返回Html格式字符串,可以直接输出到浏览器 public function createHtml($params) { $url = "https://note.coccoo.cc/pay.html";// todo 修改你要提交的url $HTML = "<form action='{$url}' method='post' id='dataForm' name='dataForm'>"; foreach ($params as $k => $v){ $HTML .= "<input name='$k' value='$v' type='hidden'>"; } $HTML .= "<input type='submit' id='submit' value='ok' style='display:none;'>"; $HTML .= "</form>"; $HTML .= "<script type='text/javascript'>document.forms['dataForm'].submit();</script>"; return $HTML; }
2019年10月15日
5,291 阅读
0 评论
0 点赞
2019-05-14
PHPSTORM实时修改线上代码
1. 打开PHPStorm,点击工具栏Tools->Depolyment->Configuration2. 填写对应配置,格式默认SFTP。配置完毕后可以点击 Test SFTP connection 测试连接3. 点击Mappings选项卡,配置站点对应路径,然后保存即可4. 这时点击Tools->Depolyment->Browse Remote Host即可浏览服务器文件,勾选Automatic Upload即自动上传本地修改的文件服务器上的文件5. 你也可以手动上传下载ext第一次上传时建议先把项目压缩后完整上传到服务器在操作,否则大量小文件上传会很耗时间
2019年05月14日
2,241 阅读
0 评论
0 点赞
2019-01-14
互亿短信调用模板 php
调用方法//调用方法 $code = mt_rand(1000, 9999); $sms = new Huyisms(); // 发送验证码 $result = $sms->mobile($mobile)->code($code)->send(); // 或者自定义短信内容 // $result = $sms->mobile($mobile)->content('恭喜您的材料已经审核成功,请及时查看。')->send(); if ($result === TRUE){ //短信验证码发送成功 }else{ //短信验证码发送失败 echo $sms->getError(); } 把短信扩展保存成php文件,修改其中的配置信息即可<?php /** * 互忆短信发送 * Class Huyisms * @package admin\huyisms\library */ class Huyisms { private $config = []; private $_params = []; public $error = ''; public function __construct($options = []) { $config = [ 'huyi_appid' => '', // todo 修改为你的 APPID 'huyi_appsecret' => '', // todo 修改为你的 APPSECRET 'huyi_temp' => '您的短信验证码为{$code},请勿向任何人提供此验证码。' // 默认短信验证码模板,不用备案,可以不修改 ]; $this->config = array_merge($config, is_array($options) ? $options : []); } /** * 发送短信方法 */ public function send() { $this->error = ''; $params = $this->_params(); $send_url = 'http://106.ihuyi.cn/webservice/sms.php?method=Submit&'; $response = $this->_curl($send_url,$params); if ($response !== FALSE){ $res = (array) json_decode($response,true); if (isset($res['code'])){ if ( $res['code'] == 2){ return TRUE; } } $this->error = isset($res['msg']) ? $res['msg'] : 'InvalidResultMsg'; }else{ $this->error = 'InvalidResult'; } return FALSE; } /** * 获取剩余短信条数 * @return mixed|string */ public function getNum() { $this->error = ''; $params = $this->_params(); $get_url = 'http://106.ihuyi.com/webservice/sms.php?method=GetNum&'; $response = $this->_curl($get_url,$params); if ($response !== FALSE){ $res = (array) json_decode($response,true); if (isset($res['code']) && $res['code'] == 2){ return $res['num']; } return $res['msg']; } return ''; } /** * 接收验证码值,不能和content同时使用 * @param string $code * @return $this */ public function code($code = '') { $content = str_replace('{$code}',$code,$this->config['huyi_temp']); $this->_params['content'] = $content; return $this; } /** * 接收短信内容 * @param string $content * @return $this */ public function content($content = '') { $this->_params['content'] = $content; return $this; } /** * 设置参数 * @param array $param * @return Huyisms */ public function param(array $param = []) { foreach ($param as $k => &$v) { $v = (string) $v; } unset($v); return $this; } /** * 接收手机 * @param string $mobile 手机号码 * @return Huyisms */ public function mobile($mobile = '') { $this->_params['mobile'] = $mobile; return $this; } /** * 返回错误信息 * @return string */ public function getError() { return $this->error; } private function _params() { return array_merge([ 'account' => $this->config['huyi_appid'], 'password' => $this->config['huyi_appsecret'], 'time' => time(), 'format' => 'json' ],$this->_params); } //请求数据到短信接口,检查环境是否 开启 curl init。 private function _curl($url,$params) { $uri = $url . http_build_query($params); $ch = curl_init(); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_URL, $uri); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.98 Safari/537.36"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); $reponse = curl_exec($ch); curl_close($ch); return $reponse; } }
2019年01月14日
3,088 阅读
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-08-06
短信接口防刷保护
之前遇到客户得罪人,被人恶意攻击,批量刷项目的短信接口,导致一天内被刷了上千条短信。当时项目已有的防刷机制只大概包括:验证手机号格式检测该手机号请求频率,最高一分钟一次,一天最多发送三次检测IP的请求频率,一小时内最多请求五次但是这种情况下还是被一天刷了上千条。后台看了下请求记录,发现攻击者使用了高匿代理轮询请求服务器,就是相当于模拟不同用户的手机号和不同IP发送请求,这让我们很难判断来请求的究竟是真实用户还是机器人。但是我从记录发现了一点:对方是直接攻击的API接口这样一来就有了个初步的解决办法:让程序在请求短信接口前 先从服务器获取一个特征码,然后在请求短信接口的时候把这个特征码和手机号一起发送到接口,服务器再根据这个特征码验证是否成功。最直接的方法就是生成一个随机码存到Session中,然后前端请求短信接口时服务器判断Session中的随机码和前端请求时发送过来的随机码是否相同,为空或者不同则验证不通过但是这样一来也有个问题,当攻击者不了解请求流程还好,如果攻击者理解了参数含义,还是能直接拿到特征码再提交过来,同样防止不了刷短信的问题。于是又衍生出了另一种解决方案:图形验证码像网易等大厂注册时也是采用了这种方法服务器先生成图形验证码返回到前端,在请求短信接口前先验证图形验证码,然后再决定是否发送短信这种方法生成的图形验证码一般机器人识别起来有一定难度,虽然同样有被破解的可能(AI训练和打码平台),但是也无形中增加了攻击者的攻击成本,能大大减少被攻击的概率。只不过这种方式在手机端相对于用户体验可能不是很好,不过安全至上,也无伤大雅吧
2018年08月06日
4,598 阅读
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 点赞
1
2
3
4