首页
关于
留言
友链
电台
壁纸
我的足迹
推荐
知易而行MCP
Search
1
乐橙CMS影视管理系统最全版本
109,325 阅读
2
VIP视频解析破解电影解析模拟破解影视解析
77,802 阅读
3
乐橙CMS影视管理系统4.0.18版本
16,941 阅读
4
新浪图片链接修复教程集合
15,129 阅读
5
反调试代码调试死机代码禁止F12代码
12,103 阅读
语言
PHP
Java
Go
JavaScript
CSS
Vue
资源教程
网络杂谈
技术文章
影视交流
软件工具
Mac
知易而行
登录
Search
标签搜索
PHP
AI
LINUX
微信
MYSQL
树莓派
OpenClaw
ESP32S3
小智AI
P2P
JS
破解
乐橙cms
支付
uniapp
人工智能
技术趋势
智能玩具
ESP32
DIY
子沐~
累计撰写
128
篇文章
累计收到
372
条评论
首页
栏目
语言
PHP
Java
Go
JavaScript
CSS
Vue
资源教程
网络杂谈
技术文章
影视交流
软件工具
Mac
知易而行
页面
关于
留言
友链
电台
壁纸
我的足迹
推荐
知易而行MCP
搜索到
59
篇与
的结果
2021-04-13
MacBook pro 新版系统如何设置vpn支持pptp类型
No bibi show code先 cd到你的maccd /etc/ppp/peers vim vpn.pplware //将下面的内容写进去保存[alt type="warning"]根据你自己的信息进行更改[/alt]plugin PPTP.ppp noauth # logfile /tmp/ppp.log remoteaddress "你的vpn地址" user "用户名" password "密码" redialcount 1 redialtimer 5 idle 1800 # mru 1368 # mtu 1368 receive-all novj 0:0 ipcp-accept-local ipcp-accept-remote # noauth refuse-eap refuse-pap refuse-chap-md5 hide-password mppe-stateless mppe-128 # require-mppe-128 looplocal nodetach # ms-dns 8.8.8.8 usepeerdns # ipparam gwvpn defaultroute debug 开启vpnsudo pppd call vpn.pplware关闭vnpsudo pkill pppd
2021年04月13日
1,604 阅读
2 评论
3 点赞
2021-04-12
免费内网穿透
如果你还没有公网域名,在本部分,你可以使用钉钉内网穿透工具,映射一个本地的公网域名使用。打开命令行工具,执行以下命令,下载内网穿透工具。git clone https://github.com/open-dingtalk/pierced.git执行以下命令,启动内网穿透。注意 Windows需使用cmd工具打开命令行。 Windows执行以下命令:cd windows_64 ding -config=ding.cfg -subdomain=abcde 8080MAC执行以下命令:cd mac_64 chmod 777 ./ding ./ding -config=./ding.cfg -subdomain=abcde 8080启动完客户端后,你访问http://abcde.vaiwan.com/xxxxx 都会映射到 http://127.0.0.1:8080/xxxxx。重启后端服务。
2021年04月12日
1,215 阅读
0 评论
2 点赞
2021-04-10
Redis中两种持久化机制RDB和AOF,工作上常用到
众所周知,Redis是一个内存数据库。但它与其它内存数据库(如memcache)等有一个很大的区别,就是Redis可以持久化到磁盘。有了持久化方案,Redis就可以对数据进行备份、恢复、复制。Redis提供了两种持久化方案:RDB和AOF。在Redis 4.0中,提供了一个新特性:两者的混合持久化。下面将介绍Redis的各种持久化方案的原理和配置。1.RDB持久化RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发。1)触发机制手动触发分别对应save和bgsave命令。save命令:阻塞当前Redis服务器,直到RDB过程完成为止,对于内存 比较大的实例会造成长时间阻塞,线上环境不建议使用。bgsave命令:Redis进程执行fork操作创建子进程,RDB持久化过程由子 进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。2)自动触发RDB的持久1)使用save相关配置,如“save m n”。表示m秒内数据集存在n次修改 时,自动触发bgsave。2)如果从节点执行全量复制操作,主节点自动执行bgsave生成RDB文件并发送给从节点,更多细节见6.3节介绍的复制原理。3)执行debug reload命令重新加载Redis时,也会自动触发save操作。4)默认情况下执行shutdown命令时,如果没有开启AOF持久化功能则 自动执行bgsave。bgsave是主流的触发RDB持久化方式1)执行bgsave命令,Redis父进程判断当前是否存在正在执行的子进 程,如RDB/AOF子进程,如果存在bgsave命令直接返回。2)父进程执行fork操作创建子进程,fork操作过程中父进程会阻塞,通 过info stats命令查看latest_fork_usec选项,可以获取最近一个fork操作的耗时,单位为微秒3)父进程fork完成后,bgsave命令返回“Background saving started”信息并不再阻塞父进程,可以继续响应其他命令。4)子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后 对原有文件进行原子替换。执行lastsave命令可以获取最后一次生成RDB的 时间,对应info统计的rdb_last_save_time选项。5)进程发送信号给父进程表示完成,父进程更新统计信息,具体见 info Persistence下的rdb_*相关选项。RDB文件的处理保存:RDB文件保存在dir配置指定的目录下,文件名通过dbfilename配 置指定。可以通过执行config set dir{newDir}和config set dbfilename{newFileName}运行期动态执行,当下次运行时RDB文件会保存到新目录。RDB的优缺点RDB的优点:1 RDB是一个紧凑压缩的二进制文件,代表Redis在某个时间点上的数据 快照。非常适用于备份,全量复制等场景。比如每6小时执行bgsave备份, 并把RDB文件拷贝到远程机器或者文件系统中(如hdfs),用于灾难恢复。2 Redis加载RDB恢复数据远远快于AOF的方式。RDB的缺点:1)RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运 行都要执行fork操作创建子进程,属于重量级操作,频繁执行成本过高。2)RDB文件使用特定二进制格式保存,Redis版本演进过程中有多个格式 的RDB版本,存在老版本Redis服务无法兼容新版RDB格式的问题。针对RDB不适合实时持久化的问题,Redis提供了AOF持久化方式来解决。2.AOF持久化AOF(append only file)持久化:以独立日志的方式记录每次写命令, 重启时再重新执行AOF文件中的命令达到恢复数据的目的。AOF的主要作用 是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式。1)使用AOF开启AOF功能需要设置配置:appendonly yes,默认不开启。AOF文件名 通过appendfilename配置设置,默认文件名是appendonly.aof。保存路径同 RDB持久化方式一致,通过dir配置指定。AOF的工作流程操作:命令写入 (append)、文件同步(sync)、文件重写(rewrite)、重启加载 (load)1)所有的写入命令会追加到aof_buf(缓冲区)中。2)AOF缓冲区根据对应的策略向硬盘做同步操作。AOF为什么把命令追加到aof_buf中?Redis使用单线程响应命令,如 果每次写AOF文件命令都直接追加到硬盘,那么性能完全取决于当前硬盘负 载。先写入缓冲区aof_buf中,还有另一个好处,Redis可以提供多种缓冲区同步硬盘的策略,在性能和安全性方面做出平衡3)随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩的目的。重写后的AOF文件为什么可以变小?有如下原因:1 进程内已经超时的数据不再写入文件。2 旧的AOF文件含有无效命令,如del key1、hdel key2、srem keys、set a111、set a222等。重写使用进程内数据直接生成,这样新的AOF文件只保留最终数据的写入命令。3 多条写命令可以合并为一个,如:lpush list a、lpush list b、lpush list c可以转化为:lpush list a b c。为了防止单条命令过大造成客户端缓冲区溢 出,对于list、set、hash、zset等类型操作,以64个元素为界拆分为多条。AOF重写降低了文件占用空间,除此之外,另一个目的是:更小的AOF 文件可以更快地被Redis加载AOF重写过程可以手动触发和自动触发:手动触发:直接调用bgrewriteaof命令。自动触发:根据auto-aof-rewrite-min-size和auto-aof-rewrite-percentage参数确定自动触发时机。auto-aof-rewrite-min-size:表示运行AOF重写时文件最小体积,默认 为64MB。auto-aof-rewrite-percentage:代表当前AOF文件空间 (aof_current_size)和上一次重写后AOF文件空间(aof_base_size)的比值。自动触发时机=aof_current_size>auto-aof-rewrite-minsize&&(aof_current_size-aof_base_size)/aof_base_size>=auto-aof-rewritepercentage。其中aof_current_size和aof_base_size可以在info Persistence统计信息中查看。4)当Redis服务器重启时,可以加载AOF文件进行数据恢复。流程说明:1)AOF持久化开启且存在AOF文件时,优先加载AOF文件,打印如下日志:DB loaded from append only file: 5.841 seconds2)AOF关闭或者AOF文件不存在时,加载RDB文件,打印如下日志:DB loaded from disk: 5.586 seconds3)加载AOF/RDB文件成功后,Redis启动成功。4)AOF/RDB文件存在错误时,Redis启动失败并打印错误信息。
2021年04月10日
850 阅读
0 评论
1 点赞
2021-04-09
破解宝塔所有插件只需一句代码即可
1.首先安装好宝塔面板2.找到文件/www/server/panel/data/plugin.json批量替换 "endtime": -1为"endtime": 9999999999999sed 's/\"endtime\": -1/\"endtime\": 9999999999999/g' /www/server/panel/data/plugin.json
2021年04月09日
1,319 阅读
2 评论
1 点赞
2021-01-18
颜色RGB转LAB算法
废话不多说,show my code//RGB转LAB public function RgbToLab($RED,$GREEN,$BLUE) { $x=0.95047; $y=1; $z=1.08883; if ($RED/255>0.04045){ $R=pow(($RED/255+0.055)/1.055,2.4); }else{ $R=($RED/255)/12.92; } if ($GREEN/255>0.04045){ $G=pow(($GREEN/255+0.055)/1.055,2.4); }else{ $G=($GREEN/255)/12.92; } if ($BLUE/255>0.04045){ $b=pow(($BLUE/255+0.055)/1.055,2.4); }else{ $b=($BLUE/255)/12.92; } $X=0.4124*$R+0.3576*$G+0.1805*$b; $Y=0.2126*$R+0.7152*$G+0.0722*$b; $Z=0.0193*$R+0.1192*$G+0.9505*$b; if (($Y/$y)>pow(6/29,3)){ $L=116*pow($Y/$y,1/3)-16; }else{ $L=116*((1/3)*pow(29/6,2)*($Y/1)+4/29)-16; } if(($X/$x)>pow(6/29,3)){ if(($Y/$y)>pow(6/29,3)){ $A=500*(pow($X/$x,1/3)-pow($Y/$y,1/3)); }else{ $A=500*(pow($X/$x,1/3)-((1/3)*pow(29/6,2)*($Y/$y)+4/29)); } }else{ if(($Y/$y)>pow(6/29,3)){ $A=500*(((1/3)*pow(29/6,2)*($X/$x)+4/29)-pow($Y/$y,1/3)); }else{ $A=500*(((1/3)*pow(29/6,2)*($X/$x)+4/29)-((1/3)*pow(29/6,2)*($Y/$y)+4/29)); } } if(($Y/$y)>pow(6/29,3)){ if(($Z/$z)>pow(6/29,3)){ $B=200*(pow($Y/$y,1/3)-pow($Z/$z,1/3)); }else{ $B=200*(pow($Y/$y,1/3)-((1/3)*pow(29/6,2)*($Z/$z)+4/29)); } }else{ if(($Z/$z)>pow(6/29,3)){ $B=200*(((1/3)*pow(29/6,2)*($Y/$y)+4/29)-pow($Z/$z,1/3)); }else{ $B=200*(((1/3)*pow(29/6,2)*($Y/$y)+4/29)-((1/3)*pow(29/6,2)*($Z/$z)+4/29)); } } return ['L'=>$L,'A'=>$A,'B'=>$B]; }
2021年01月18日
1,557 阅读
1 评论
1 点赞
2020-07-17
php时间换算适用于留言评论
function mac_friend_date($time) { if (!$time) return false; $fdate = ''; $d = time() - intval($time); $ld = $time - mktime(0, 0, 0, 0, 0, date('Y')); //得出年 $md = $time - mktime(0, 0, 0, date('m'), 0, date('Y')); //得出月 $byd = $time - mktime(0, 0, 0, date('m'), date('d') - 2, date('Y')); //前天 $yd = $time - mktime(0, 0, 0, date('m'), date('d') - 1, date('Y')); //昨天 $dd = $time - mktime(0, 0, 0, date('m'), date('d'), date('Y')); //今天 $td = $time - mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')); //明天 $atd = $time - mktime(0, 0, 0, date('m'), date('d') + 2, date('Y')); //后天 if ($d == 0) { $fdate = '刚刚'; } else { switch ($d) { case $d < $atd: $fdate = date('Y年m月d日', $time); break; case $d < $td: $fdate = '后天' . date('H:i', $time); break; case $d < 0: $fdate = '明天' . date('H:i', $time); break; case $d < 60: $fdate = $d . '秒前'; break; case $d < 3600: $fdate = floor($d / 60) . '分钟前'; break; case $d < $dd: $fdate = floor($d / 3600) . '小时前'; break; case $d < $yd: $fdate = '昨天' . date('H:i', $time); break; case $d < $byd: $fdate = '前天' . date('H:i', $time); break; case $d < $md: $fdate = date('m月d日 H:i', $time); break; case $d < $ld: $fdate = date('m月d日', $time); break; default: $fdate = date('Y年m月d日', $time); break; } } return $fdate; }
2020年07月17日
1,239 阅读
0 评论
0 点赞
2020-04-01
微信公众号支付jsapi
<?php header('Content-type:text/html; Charset=utf-8'); $mchid = 'xxxxx'; //微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送 $appid = 'xxxxx'; //微信支付申请对应的公众号的APPID $appKey = 'xxxxx'; //微信支付申请对应的公众号的APP Key $apiKey = 'xxxxx'; //https://pay.weixin.qq.com 帐户设置-安全设置-API安全-API密钥-设置API密钥 //①、获取用户openid $wxPay = new WxpayService($mchid,$appid,$appKey,$apiKey); $openId = $wxPay->GetOpenid(); //获取openid if(!$openId) exit('获取openid失败'); //②、统一下单 $outTradeNo = uniqid(); //你自己的商品订单号 $payAmount = 0.01; //付款金额,单位:元 $orderName = '支付测试'; //订单标题 $notifyUrl = 'https://www.xxx.com/wx/notify.php'; //付款成功后的回调地址(不要有问号) $payTime = time(); //付款时间 $jsApiParameters = $wxPay->createJsBizPackage($openId,$payAmount,$outTradeNo,$orderName,$notifyUrl,$payTime); $jsApiParameters = json_encode($jsApiParameters); ?> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>微信支付样例-支付</title> <script type="text/javascript"> //调用微信JS api 支付 function jsApiCall() { WeixinJSBridge.invoke( 'getBrandWCPayRequest', <?php echo $jsApiParameters; ?>, function(res){ WeixinJSBridge.log(res.err_msg); if(res.err_msg=='get_brand_wcpay_request:ok'){ alert('支付成功!'); }else{ alert('支付失败:'+res.err_code+res.err_desc+res.err_msg); } } ); } function callpay() { if (typeof WeixinJSBridge == "undefined"){ if( document.addEventListener ){ document.addEventListener('WeixinJSBridgeReady', jsApiCall, false); }else if (document.attachEvent){ document.attachEvent('WeixinJSBridgeReady', jsApiCall); document.attachEvent('onWeixinJSBridgeReady', jsApiCall); } }else{ jsApiCall(); } } </script> </head> <body> <br/> <font color="#9ACD32"><b>该笔订单支付金额为<span style="color:#f00;font-size:50px"><?php echo $payAmount?>元</span>钱</b></font><br/><br/> <div align="center"> <button style="width:210px; height:50px; border-radius: 15px;background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer; color:white; font-size:16px;" type="button" onclick="callpay()" >立即支付</button> </div> </body> </html> <?php class WxpayService { protected $mchid; protected $appid; protected $appKey; protected $apiKey; public $data = null; public function __construct($mchid, $appid, $appKey,$key) { $this->mchid = $mchid; //https://pay.weixin.qq.com 产品中心-开发配置-商户号 $this->appid = $appid; //微信支付申请对应的公众号的APPID $this->appKey = $appKey; //微信支付申请对应的公众号的APP Key $this->apiKey = $key; //https://pay.weixin.qq.com 帐户设置-安全设置-API安全-API密钥-设置API密钥 } /** * 通过跳转获取用户的openid,跳转流程如下: * 1、设置自己需要调回的url及其其他参数,跳转到微信服务器https://open.weixin.qq.com/connect/oauth2/authorize * 2、微信服务处理完成之后会跳转回用户redirect_uri地址,此时会带上一些参数,如:code * @return 用户的openid */ public function GetOpenid() { //通过code获得openid if (!isset($_GET['code'])){ //触发微信返回code码 $scheme = $_SERVER['HTTPS']=='on' ? 'https://' : 'http://'; $uri = $_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING']; if($_SERVER['REQUEST_URI']) $uri = $_SERVER['REQUEST_URI']; $baseUrl = urlencode($scheme.$_SERVER['HTTP_HOST'].$uri); $url = $this->__CreateOauthUrlForCode($baseUrl); Header("Location: $url"); exit(); } else { //获取code码,以获取openid $code = $_GET['code']; $openid = $this->getOpenidFromMp($code); return $openid; } } /** * 通过code从工作平台获取openid机器access_token * @param string $code 微信跳转回来带上的code * @return openid */ public function GetOpenidFromMp($code) { $url = $this->__CreateOauthUrlForOpenid($code); $res = self::curlGet($url); //取出openid $data = json_decode($res,true); $this->data = $data; $openid = $data['openid']; return $openid; } /** * 构造获取open和access_toke的url地址 * @param string $code,微信跳转带回的code * @return 请求的url */ private function __CreateOauthUrlForOpenid($code) { $urlObj["appid"] = $this->appid; $urlObj["secret"] = $this->appKey; $urlObj["code"] = $code; $urlObj["grant_type"] = "authorization_code"; $bizString = $this->ToUrlParams($urlObj); return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString; } /** * 构造获取code的url连接 * @param string $redirectUrl 微信服务器回跳的url,需要url编码 * @return 返回构造好的url */ private function __CreateOauthUrlForCode($redirectUrl) { $urlObj["appid"] = $this->appid; $urlObj["redirect_uri"] = "$redirectUrl"; $urlObj["response_type"] = "code"; $urlObj["scope"] = "snsapi_base"; $urlObj["state"] = "STATE"."#wechat_redirect"; $bizString = $this->ToUrlParams($urlObj); return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString; } /** * 拼接签名字符串 * @param array $urlObj * @return 返回已经拼接好的字符串 */ private function ToUrlParams($urlObj) { $buff = ""; foreach ($urlObj as $k => $v) { if($k != "sign") $buff .= $k . "=" . $v . "&"; } $buff = trim($buff, "&"); return $buff; } /** * 统一下单 * @param string $openid 调用【网页授权获取用户信息】接口获取到用户在该公众号下的Openid * @param float $totalFee 收款总费用 单位元 * @param string $outTradeNo 唯一的订单号 * @param string $orderName 订单名称 * @param string $notifyUrl 支付结果通知url 不要有问号 * @param string $timestamp 支付时间 * @return string */ public function createJsBizPackage($openid, $totalFee, $outTradeNo, $orderName, $notifyUrl, $timestamp) { $config = array( 'mch_id' => $this->mchid, 'appid' => $this->appid, 'key' => $this->apiKey, ); //$orderName = iconv('GBK','UTF-8',$orderName); $unified = array( 'appid' => $config['appid'], 'attach' => 'pay', //商家数据包,原样返回,如果填写中文,请注意转换为utf-8 'body' => $orderName, 'mch_id' => $config['mch_id'], 'nonce_str' => self::createNonceStr(), 'notify_url' => $notifyUrl, 'openid' => $openid, //rade_type=JSAPI,此参数必传 'out_trade_no' => $outTradeNo, 'spbill_create_ip' => '127.0.0.1', 'total_fee' => intval($totalFee * 100), //单位 转为分 'trade_type' => 'JSAPI', ); $unified['sign'] = self::getSign($unified, $config['key']); $responseXml = self::curlPost('https://api.mch.weixin.qq.com/pay/unifiedorder', self::arrayToXml($unified)); //禁止引用外部xml实体 libxml_disable_entity_loader(true); $unifiedOrder = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA); if ($unifiedOrder === false) { die('parse xml error'); } if ($unifiedOrder->return_code != 'SUCCESS') { die($unifiedOrder->return_msg); } if ($unifiedOrder->result_code != 'SUCCESS') { die($unifiedOrder->err_code); } $arr = array( "appId" => $config['appid'], "timeStamp" => "$timestamp", //这里是字符串的时间戳,不是int,所以需加引号 "nonceStr" => self::createNonceStr(), "package" => "prepay_id=" . $unifiedOrder->prepay_id, "signType" => 'MD5', ); $arr['paySign'] = self::getSign($arr, $config['key']); return $arr; } public static function curlGet($url = '', $options = array()) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 30); if (!empty($options)) { curl_setopt_array($ch, $options); } //https请求 不验证证书和host curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $data = curl_exec($ch); curl_close($ch); return $data; } public static function curlPost($url = '', $postData = '', $options = array()) { if (is_array($postData)) { $postData = http_build_query($postData); } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数 if (!empty($options)) { curl_setopt_array($ch, $options); } //https请求 不验证证书和host curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $data = curl_exec($ch); curl_close($ch); return $data; } public static function createNonceStr($length = 16) { $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; $str = ''; for ($i = 0; $i < $length; $i++) { $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); } return $str; } public static function arrayToXml($arr) { $xml = "<xml>"; foreach ($arr as $key => $val) { if (is_numeric($val)) { $xml .= "<" . $key . ">" . $val . "</" . $key . ">"; } else $xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">"; } $xml .= "</xml>"; return $xml; } public static function getSign($params, $key) { ksort($params, SORT_STRING); $unSignParaString = self::formatQueryParaMap($params, false); $signStr = strtoupper(md5($unSignParaString . "&key=" . $key)); return $signStr; } protected static function formatQueryParaMap($paraMap, $urlEncode = false) { $buff = ""; ksort($paraMap); foreach ($paraMap as $k => $v) { if (null != $v && "null" != $v) { if ($urlEncode) { $v = urlencode($v); } $buff .= $k . "=" . $v . "&"; } } $reqPar = ''; if (strlen($buff) > 0) { $reqPar = substr($buff, 0, strlen($buff) - 1); } return $reqPar; }
2020年04月01日
1,790 阅读
0 评论
0 点赞
2020-04-01
支付宝Jsapi支付源码
<?php error_reporting(0); header('Content-type:text/html; Charset=utf-8'); /*** 请填写以下配置信息 ***/ $appid = 'xxxxxx'; //https://open.alipay.com 账户中心->密钥管理->开放平台密钥,填写添加了电脑网站支付的应用的APPID $notifyUrl = 'http://www.xxx.com'; //付款成功后的异步回调地址 $outTradeNo = uniqid(); //你自己的商品订单号,不能重复 $payAmount = 0.1; //付款金额,单位:元 $orderName = '支付测试'; //订单标题 $signType = 'RSA2'; //签名算法类型,支持RSA2和RSA,推荐使用RSA2 //商户私钥 $rsaPrivateKey='xxxx'; /*** 配置结束 ***/ if(!isInAlipayClient()){ echo '<h3>请使用支付宝扫码打开该网页:</h3><img src="https://www.kuaizhan.com/common/encode-png?large=true&data='.getCurrentUrl().'" />'; exit(); } $aliPay = new AlipayService(); $aliPay->setAppid($appid); $aliPay->setScope('auth_base'); $aliPay->setRsaPrivateKey($rsaPrivateKey); $result = $aliPay->getToken(); $user = array(); if($baseInfo = $result['alipay_system_oauth_token_response']){ $userid = $baseInfo['user_id']; //支付用户的支付宝id }else{ echo '<h1>'.$result['error_response']['code'].':'.$result['error_response']['sub_msg'].'</h1>';exit(); } $aliPay->setNotifyUrl($notifyUrl); $aliPay->setTotalFee($payAmount); $aliPay->setOutTradeNo($outTradeNo); $aliPay->setOrderName($orderName); $aliPay->setBuyerId($userid); $orderStr = $aliPay->createOrder(); $tradeNo = $orderStr['alipay_trade_create_response']['trade_no']; if(!$tradeNo){ exit('获取订单号失败'); } ?> <!DOCTYPE html> <html lang="en"> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta charset="UTF-8"> <title>支付宝jsapi支付</title> <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcss.com/jquery/2.1.0/jquery.min.js"></script> <script src="https://gw.alipayobjects.com/as/g/h5-lib/alipayjsapi/3.1.1/alipayjsapi.min.js"></script> </head> <body> <div class="container"> <?php if(!isInAlipayClient()): ?> <h3>请使用支付宝扫码打开该网页:</h3> <img src="https://www.kuaizhan.com/common/encode-png?large=true&data=<?php echo getCurrentUrl()?>" /> <?php else: ?> <h3>点击唤起支付宝收银台</h3> <a href="javascript:void(0)" class="btn btn-primary btns-lg orderstrPay orderstr">点击支付</a> <div class="alert alert-success" role="alert" style="margin-top:30px;display: none"> </div> <?php endif; ?> </div> <p id="result"></p> <div class="alert alert-success" role="alert" style="margin-top:30px;display: none"> </div> <script type="application/javascript"> // 调试时可以通过在页面定义一个元素,打印信息,使用alert方法不够优雅 function log(obj) { $("#result").append(obj).append(" ").append("<br />"); } $(document).ready(function(){ // 页面载入完成后即唤起收银台 // 点击payButton按钮后唤起收银台 $(".orderstr").click(function() { tradePay("<?=$tradeNo?>"); }); // 通过jsapi关闭当前窗口,仅供参考,更多jsapi请访问 // /aod/54/104510 $("#closeButton").click(function() { AlipayJSBridge.call('closeWebview'); }); }); // 由于js的载入是异步的,所以可以通过该方法,当AlipayJSBridgeReady事件发生后,再执行callback方法 function ready(callback) { if (window.AlipayJSBridge) { callback && callback(); } else { document.addEventListener('AlipayJSBridgeReady', callback, false); } } function tradePay(tradeNO) { ready(function(){ // 通过传入交易号唤起快捷调用方式(注意tradeNO大小写严格) AlipayJSBridge.call("tradePay", { tradeNO: tradeNO }, function (data) { // log(JSON.stringify(data)); if(data.resultCode!=9000){ //支付失败 alert(data.resultCode+":"+data.memo); }else{ //支付成功 $(".alert-success").html("<strong>支付成功!</strong> 订单号:<?=$tradeNo?>"); $(".alert-success").show(); } }); }); } </script> </body> </html> <?php class AlipayService { protected $appId; protected $notifyUrl; protected $charset; //私钥值 protected $rsaPrivateKey; protected $totalFee; protected $outTradeNo; protected $orderName; protected $scope; protected $buyerId; protected $authCode; public function __construct() { $this->charset = 'utf8'; } public function setAppid($appid) { $this->appId = $appid; } public function setNotifyUrl($notifyUrl) { $this->notifyUrl = $notifyUrl; } public function setRsaPrivateKey($saPrivateKey) { $this->rsaPrivateKey = $saPrivateKey; } public function setTotalFee($payAmount) { $this->totalFee = $payAmount; } public function setOutTradeNo($outTradeNo) { $this->outTradeNo = $outTradeNo; } public function setOrderName($orderName) { $this->orderName = $orderName; } public function setScope($scope) { $this->scope = $scope; } public function setBuyerId($buyerId) { $this->buyerId = $buyerId; } public function setAuthCode($authCode) { $this->authCode = $authCode; } /** * 获取orderStr * @return array */ public function createOrder() { //请求参数 $requestConfigs = array( 'out_trade_no'=>$this->outTradeNo, 'total_amount'=>$this->totalFee, //单位 元 'subject'=>$this->orderName, //订单标题 'buyer_id'=>$this->buyerId, //购买者的userid 'timeout_express'=>'2h', //该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点, 如 1.5h,可转换为 90m。 // 'store_id'=>'', //商户门店编号。该参数用于请求参数中以区分各门店,非必传项。 //'terminal_id'=>'xxx', //'extend_params'=>array( //'sys_service_provider_id'=>'xxxx' //系统商编号,该参数作为系统商返佣数据提取的依据,请填写系统商签约协议的PID //) ); $commonConfigs = array( //公共参数 'app_id' => $this->appId, 'method' => 'alipay.trade.create', //接口名称 'format' => 'JSON', 'charset'=>$this->charset, 'sign_type'=>'RSA2', 'timestamp'=>date('Y-m-d H:i:s'), 'version'=>'1.0', 'notify_url' => $this->notifyUrl, 'biz_content'=>json_encode($requestConfigs), ); $commonConfigs["sign"] = $this->generateSign($commonConfigs, $commonConfigs['sign_type']); $result = $this->curlPost('https://openapi.alipay.com/gateway.do',$commonConfigs); return json_decode($result,true); } public function generateSign($params, $signType = "RSA") { return $this->sign($this->getSignContent($params), $signType); } protected function sign($data, $signType = "RSA") { $priKey=$this->rsaPrivateKey; $res = "-----BEGIN RSA PRIVATE KEY-----\n" . wordwrap($priKey, 64, "\n", true) . "\n-----END RSA PRIVATE KEY-----"; ($res) or die('您使用的私钥格式错误,请检查RSA私钥配置'); if ("RSA2" == $signType) { openssl_sign($data, $sign, $res, version_compare(PHP_VERSION,'5.4.0', '<') ? SHA256 : OPENSSL_ALGO_SHA256); //OPENSSL_ALGO_SHA256是php5.4.8以上版本才支持 } else { openssl_sign($data, $sign, $res); } $sign = base64_encode($sign); return $sign; } /** * 校验$value是否非空 * if not set ,return true; * if is null , return true; **/ protected function checkEmpty($value) { if (!isset($value)) return true; if ($value === null) return true; if (trim($value) === "") return true; return false; } public function getSignContent($params) { ksort($params); $stringToBeSigned = ""; $i = 0; foreach ($params as $k => $v) { if (false === $this->checkEmpty($v) && "@" != substr($v, 0, 1)) { // 转换成目标字符集 $v = $this->characet($v, $this->charset); if ($i == 0) { $stringToBeSigned .= "$k" . "=" . "$v"; } else { $stringToBeSigned .= "&" . "$k" . "=" . "$v"; } $i++; } } unset ($k, $v); return $stringToBeSigned; } /** * 转换字符集编码 * @param $data * @param $targetCharset * @return string */ function characet($data, $targetCharset) { if (!empty($data)) { $fileType = $this->charset; if (strcasecmp($fileType, $targetCharset) != 0) { $data = mb_convert_encoding($data, $targetCharset, $fileType); //$data = iconv($fileType, $targetCharset.'//IGNORE', $data); } } return $data; } public function buildOrderStr($data) { return http_build_query($data); } public function curlPost($url = '', $postData = '', $options = array()) { if (is_array($postData)) { $postData = http_build_query($postData); } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数 if (!empty($options)) { curl_setopt_array($ch, $options); } //https请求 不验证证书和host curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $data = curl_exec($ch); curl_close($ch); return $data; } /** * 获取access_token和user_id */ public function getToken() { //通过code获得access_token和user_id if (!isset($_GET['auth_code'])){ //触发微信返回code码 $scheme = $_SERVER['HTTPS']=='on' ? 'https://' : 'http://'; $uri = $_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING']; if($_SERVER['REQUEST_URI']) $uri = $_SERVER['REQUEST_URI']; $baseUrl = $scheme.$_SERVER['HTTP_HOST'].$uri; $url = $this->__CreateOauthUrlForCode($baseUrl); Header("Location: $url"); exit(); } else { //获取code码,以获取openid $this->setAuthCode($_GET['auth_code']); return $this->doAuth(); } } /** * 构造获取token的url连接 * @param string $redirectUrl 微信服务器回跳的url,需要url编码 * @return 返回构造好的url */ private function __CreateOauthUrlForCode($redirectUrl) { $urlObj["app_id"] = $this->appId; $urlObj["redirect_uri"] = urlencode($redirectUrl); $urlObj["scope"] = $this->scope; $urlObj["state"] = 123456; $bizString = $this->ToUrlParams($urlObj); return "https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?".$bizString; } /** * 拼接签名字符串 * @param array $urlObj * @return 返回已经拼接好的字符串 */ private function ToUrlParams($urlObj) { $buff = ""; foreach ($urlObj as $k => $v) { if($k != "sign") $buff .= $k . "=" . $v . "&"; } $buff = trim($buff, "&"); return $buff; } /** * 获取access_token和user_id * @return array */ public function doAuth() { $commonConfigs = array( //公共参数 'app_id' => $this->appId, 'method' => 'alipay.system.oauth.token',//接口名称 'format' => 'JSON', 'charset'=>$this->charset, 'sign_type'=>'RSA2', 'timestamp'=>date('Y-m-d H:i:s'), 'version'=>'1.0', 'grant_type'=>'authorization_code', 'code'=>$this->authCode, ); $commonConfigs["sign"] = $this->generateSign($commonConfigs, $commonConfigs['sign_type']); $result = $this->curlPost('https://openapi.alipay.com/gateway.do',$commonConfigs); $result = iconv('GBK','UTF-8',$result); return json_decode($result,true); } } // 是否支付宝客户端 function isInAlipayClient() { if( strpos($_SERVER['HTTP_USER_AGENT'], 'AlipayClient') !== false ) { return true; } return false; } function getCurrentUrl() { $scheme = $_SERVER['HTTPS']=='on' ? 'https://' : 'http://'; $uri = $_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING']; if($_SERVER['REQUEST_URI']) $uri = $_SERVER['REQUEST_URI']; $baseUrl = urlencode($scheme.$_SERVER['HTTP_HOST'].$uri); return $baseUrl;
2020年04月01日
2,198 阅读
0 评论
0 点赞
2020-01-14
宝塔面板 7.1.0破解专业版脚本
安装要求 内存:512M以上,推荐768M以上(纯面板约占系统60M内存) 硬盘:100M以上可用硬盘空间(纯面板约占20M磁盘空间) 系统:CentOS 7.1+ (Ubuntu16.04+.、Debian9.0+),确保是干净的操作系统,没有安装过其它环境带的Apache/Nginx/php/MySQL(已有环境不可安装) 编辑器问题已经修复,已经开心版的,请输入“bt”命令执行“9”清除面板缓存,以及手动清理浏览器缓存,即可正常使用! 宝塔面板 7.1.0 安装命令 Centos安装命令: [hide] yum install -y wget && wget -O install.sh http://download.miui.uk:25041/install/install_6.0.sh && sh install.sh [/hide] 试验性Centos/Ubuntu/Debian安装命令支持ipv6,注意使用root权限执行此命令 (支持Centos8) [hide] curl -sSO http://download.miui.uk:25041/install/new_install.sh && bash new_install.sh [/hide] Ubuntu/Deepin安装命令: wget -O install.sh http://download.miui.uk:25041/install/install-ubuntu_6.0.sh && sudo bash install.sh Debian安装命令: wget -O install.sh http://download.miui.uk:25041/install/install-ubuntu_6.0.sh && bash install.sh Fedora安装命令: wget -O install.sh http://download.miui.uk:25041/install/install_6.0.sh && bash install.sh Linux面板7.0.3升级命令: [hide] curl http://download.miui.uk:25041/install/update6.sh|bash [/hide] 插件相关脚本 收费Nginx防火墙(面板先安装在执行脚本): [hide] wget -O btwaf.sh http://download.miui.uk:25041/install/btwaf.sh && bash btwaf.sh install [/hide] 免费Nginx防火墙(无需面板安装): wget -O free_btwaf.sh http://download.miui.uk:25041/install/free_btwaf.sh && bash free_btwaf.sh install 收费Apache防火墙(面板先安装在执行脚本): wget -O btwaf_httpd.sh http://download.miui.uk:25041/install/btwaf_httpd.sh && bash btwaf_httpd.sh install 主机异常登录插件脚本 wget -O host_login.sh http://download.miui.uk:25041/install/host_login.sh && bash host_login.sh install 河马webshell查杀插件脚本 [hide] wget -O hm_shell_san.sh http://download.miui.uk:25041/install/hm_shell_san.sh && bash hm_shell_san.sh install [/hide] 修复工具 解除拉黑、解锁文件脚本: [hide] wget -O waf.sh http://download.miui.uk:25041/install/waf.sh && bash waf.sh [/hide]
2020年01月14日
5,292 阅读
15 评论
0 点赞
2019-12-10
一段代码简单防止别人扒自己的网页-优化版
基于上一篇文章站长又再次给代码进行了优化,这次的代码更加智能化,能够直接保护整个站,而不再是单个页面,直接把代码放到自己的网站上,如果是博客建议放到header,如果是单页面直接放到首页即可,也可以单独建一个js文件把代码放入进去,然后引入js文件就行了var a = 'retrtrfdcfvvvv'; var ym = window.location; var ym2 = '这里添加你需要保护的网站域名例如strjson.com不加http'; var ym3 = String(ym); function suan(a){ var re = a.substring(0,2); var tr = a.substring(2,4); var tr2 = a.substring(4,6); var fd = a.substring(6,8); var cf = a.substring(8,10); var vv = a.substring(10,12); var vv2 = a.substring(12,14); re = 'h'; tr = 't'; tr2 ='t'; fd = 'p'; cf = ':'; vv = '/'; vv2 = '/'; var p = re+tr+tr2+fd+cf+vv+vv2; return p; } if (ym3.indexOf(ym2) == -1 ) { alert(ym2); // var av = ym3; var b = suan(a) + '这里添加如果域名检测失败需要跳转的地址例如strjson.com不加http' + '/'; window.location = b; } </script>
2019年12月10日
2,049 阅读
0 评论
0 点赞
1
2
3
4
...
6