龚哥哥 爱生活、做自己!
PHP图片验证码生成
发表于 2016-5-5 | 浏览(976) | PHP
<?php

/**
 * 验证码驱动
 * @author  Devil
 * @version v_1.0.0
 */
class VerifyLibrary
{
	private $rand_string;
	private $img;

	/**
	 * [__construct 构造方法]
	 */
	public function __construct()
	{
		/* 验证码生成 */
		$this->rand_string = $this->GetRandString();
	}

	/**
	 * [GetVerify 获取当前验证码]
	 */
	public function GetVerify()
	{
		return $this->rand_string;
	}

	/**
	 * [GetVerifyImg 验证码生成]
	 * @return [string] [验证码]
	 */
	public function GetVerifyImg() {
		$this->img = imagecreatetruecolor(63, 22); //创建一个画布(真色彩)

		// 画背景
		$back_color = imagecolorallocate($this->img, 235, 236, 237); 
        imagefilledrectangle($this->img,0,0,63,22,$back_color);

		//加入干扰,画出多条线
		$this->InterferenceLine();
		
		//加入干扰,画出点    
		$this->InterferencePoint();

		//将生成好的字符串写入图像
		$fgcolor = imagecolorallocate($this->img, rand(0,200), rand(0,255), rand(0,255));
		imagestring($this->img, 5, 5, 5, strtoupper($this->rand_string), $fgcolor);

		//输出图像
		header('Content-Type: image/gif');
		imagegif($this->img);

		//销毁图像
		imagedestroy($this->img);
	}

	/**
	 * [InterferencePoint 加入干扰,画点]
	 */
	private function InterferencePoint()
	{
		for($i=0; $i<200; $i++){ 
			$bgcolor = imagecolorallocate($this->img, rand(0,255), rand(0,255), rand(0,255));  //产生随机的颜色
			imagesetpixel($this->img, rand()%90, rand()%30, $bgcolor); 
		}
	}

	/**
	 * [InterferenceLine 加入干扰,画出多条线]
	 */
	private function InterferenceLine()
	{
		for($i=0; $i<5; $i++)
		{
			$bgcolor=imagecolorallocate($this->img, rand(0,255), rand(0,255), rand(0,255));  //产生随机的颜色
			imageline($this->img, rand(10,90), 0, rand(10,90), 20, $bgcolor);
		}
	}

	/**
	 * [GetRandString 生成随机数值]
	 * @param [int] 	$number [随机数位数]
	 * @return[string] 			[返回小写的随机数值]
	 */
	private function GetRandString($number = 6)
	{
		$origstr = '3456789abxdefghijkmnprstuvwxy';
		$verifystring = '';
		$len = strlen($origstr);
		for($i=0; $i<$number; $i++) {
			$index = mt_rand(0, $len-1);
			$char = $origstr[$index];
			$verifystring .= $char;
		}
		return $verifystring;
	}

}
?>

阅读全文

mac PhotoshopCS6破解版
发表于 2016-4-29 | 浏览(836) | 资源

360云盘下载

https://yunpan.cn/cPPSLkE4Hv8dt (提取码:3a28)

阅读全文

mac 画流程图软件 XMind破解版 Omnigraffle破解版 ProcessOn
发表于 2016-4-29 | 浏览(1902) | 资源

360云盘下载

Omnigraffle

    https://yunpan.cn/cPLqy8yxmVA7z (提取码:0e84)

XMind
    https://yunpan.cn/cPPrvPJBAAYpp (提取码:e15d)


当然,喜欢web版的可以移步这里

ProcessOn https://www.processon.com/

阅读全文

mac 虚拟机软件 VMware破解版
发表于 2016-4-29 | 浏览(797) | 资源

360云盘下载

https://yunpan.cn/cLd37zwZWmRS8 (提取码:9cb1)

阅读全文

Shell使用教程
发表于 2016-4-12 | 浏览(808) | 服务器
#!/bin/sh


# # 用户输入数据获取
# echo "What is your name?"
# read PERSON
# echo "Hello, $PERSON"

# # 定义变量,在变量名前面不需要加¥符号,使用的时候才需要加
# # 定义变量
# ret="value"
# echo $ret

# # 重新定义变量
# ret="value-ssss"
# echo $ret

# # 数字型变量
# number=100
# echo $number # line 22: unset: `value-ssss': not a valid identifier

# # 删除变量
# unset $ret
# echo $ret

# # 字符串循环,变量与字符串混合使用的使用加{}花括号
# # 推荐使用变量的时候,加花括号
# str="Ada Coffa Action Java"
# for v in $str
# do
# 	echo "I am good at ${v}Script"
# done


# 字符串可以是单引号或者双引号,单引号中变量当做字符串输出,双引号中支持变量
# ret="ret string"
# # 单引号中不能带单引号,就是加了反斜杠转义也不可以
# # str='hello world \' $ret'
# str='hello world $ret ${ret}'
# echo $str
# str="Hello World Is \"$ret\""
# echo $str

# # 字符串拼接
# xing='Fu'
# strs="Gong "$xing" Xiang"
# name="Gong ${xing} Xiang"

# echo $strs
# echo $name

# # 获取字符串长度
# echo ${#name}

# # 提取子字符串
# echo ${name:4} # Fu Xiang
# echo ${name:1:5} # ong F

# # 查找子字符串,有问题
# # echo `expr index "$name" Fu`


# # 数组
# # 数组名=(值1 值2 值3 ... 值n)
# # 如:arr=(1 2 3 4 5 6)
# arr=(11 2222 3 44 5 6)
# echo $arr # 默认第一个下标元素 11
# echo ${arr[0]} # 第一个元素 11
# echo ${arr[1]} # 第二个元素 2222
# echo ${arr[*]} # 所有元素 11 2222 3 44 5 6
# echo ${arr[@]} # 所有元素 11 2222 3 44 5 6
# echo ${#arr[*]} # 数组的长度(下标1开始) 6
# echo ${#arr[@]} # 数组的长度(下标1开始) 6
# echo ${#arr[1]} # 元素1的长度 4(下标0开始)
# arr[1]="new values heihei"
# echo ${arr[1]}


# # 传递参数,没有参数则空
# # sh testshell.sh 11 22 你好世界
# echo "第一个参数:${1}"  # 11
# echo "第二个参数:${2}"  # 22
# echo "第三个参数:${3}"  # 你好世界
# echo "参数个数:${#}"  # 3
# echo "以一个但字符串显示所有脚本传递的参数:${*}"  # 11 22 你好世界
# echo "脚本运行的当前进程ID号:${$}"  # 当前进程ID号
# echo "后台运行的最后一个进程的ID号:${!}"
# echo "与$*相同,但是使用时加引号,并在引号中返回每个参数:${@}"  # 11 22 你好世界
# echo "显示Shell使用的当前选项,与set命令功能相同:${-}"  # hB
# echo "显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误:${?}"  # 0或错误


# 基本运算符
# 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
# expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
# 完整的表达式需要被 ` 符号包含(不是单引号)
# 乘法 * 必须加反斜杠
# val=`expr 2 + 2` # 2+2是不对的,中间必须空格分开
# echo "两数之和为:${val}"
# num1=1
# num2=2
# num3=3
# echo "num1+num2:`expr ${num1} + ${num2}`"   # 3
# echo "num3-num1:`expr ${num3} - ${num1}`"   # 2
# echo "num2*num3:`expr ${num2} \* ${num3}`"  # 6
# echo "num3/num2:`expr ${num3} / ${num2}`"   # 1
# echo "num3%num2:`expr ${num3} % ${num2}`"   # 1

# # if判断语句
# if [ $num1 == $num2 ]
# then
# 	echo "num1等于num2"
# fi
# if [ $num1 != $num2 ]
# then
# 	echo "num1不等于num2"
# fi

# # 关系运算符、不支持字符串、只支持数字
# # -eq 等于、-ne 不等于、-gt 大于、-lt 小于、-ge 大于等于、-le 小于等于
# if [ $num1 -eq $num2 ]
# then
# 	echo "num1等于num2"
# fi
# if [ $num1 -ne $num2 ]
# then
# 	echo "num1不等于num2"
# fi
# if [ $num2 -gt $num1 ]
# then
# 	echo "num2大于num1"
# fi
# if [ $num1 -lt $num2 ]
# then
# 	echo "num1小于num1"
# fi

# # 布尔运算符
# # ! 非运算(取反)、-o 或运算(一个符合就true)、-a 与运算(需要都符合就true)
# if [ ! $num1 == $num2 ]
# then
# 	echo "num1不等于num2"
# fi
# if [ $num1 -ne $num2 -a $num2 -lt $num3 ]
# then
# 	echo "条件成立"
# fi

# # 字符串运算符
# str1="abc"
# str2="efg"
# str3="abc"
# if [ $str1 = $str3 ]
# then
# 	echo "str1等于str3"
# fi
# if [ $str1 != $str2 ]
# then
# 	echo "str1不等于str2"
# fi
# if [ -z $str1 ]
# then
# 	echo "str1长度为0"
# fi
# if [ -n $str1 ]
# then
# 	echo "str1长度不为0"
# fi
# if [ $str1 ]
# then
# 	echo "str1不为空"
# fi

# # 文件运算符
# dir="/data/"
# file="hello.txt"
# if [ -e ${dir}${file} ]
# then
# 	echo "${file}文件存在"
# else
# 	echo "${file}文件不存在"
# fi
# if [ -s ${dir}${file} ]
# then
# 	echo "${file}文件大小大于0"
# else
# 	echo "${file}文件大小等于0"
# fi
# if [ -x ${dir}${file} ]
# then
# 	echo "${file}文件可执行"
# else
# 	echo "${file}文件不可执行权限(755后几可执行了)"
# fi
# if [ -w ${dir}${file} ]
# then
# 	echo "${file}文件可写"
# else
# 	echo "${file}文件不可写"
# fi
# if [ -f ${dir}${file} ]
# then
# 	echo "${file}文件是普通文件"
# else
# 	echo "${file}文件不是普通文件"
# fi
# if [ -f "${dir}testshell.sh" ]
# then
# 	echo "testshell.sh文件是普通文件"
# else
# 	echo "testshell.sh文件不是普通文件"
# fi


# # echo 命令
# echo "it is s test"
# echo "\"id is a ' test\""
# read name # 接收键盘录入数据
# # > 覆盖文件中的内容、>>尾部追加内容
# echo "${name} it is a test `date`" >> ${dir}${file} # 讲内容写入文件
# cat ${dir}${file} # 查看文件中的内容


# # printf 命令
# echo "Hello World"
# printf "Hello World\n"

# printf "%-10s %-10s %-10s\n" 姓名 性别 体重kg
# printf "%-12s %-10s %-10.2f\n" 龚福祥 男 52.25453
# printf "%-12s %-10s %-10.2f\n" 潘玉龙 男 48.34566
# printf "%-11s %-10s %-10.2f\n" 杨过 男 60

# printf "%d %s\n" 100 "abc"
# printf '%d %s\n' 200 "efg"
# printf '%d %s %s %s\n' 300 "Hello" "World" "!"
# printf %s abc efg
# printf "\n\n"
# printf "%s\n" abcc efgg
# printf "www.gongfuxiang.com \n"


# # 控制流程
# num1=100
# num2=100
# if [ $num1 -eq $num2 ]
# then
# 	echo "num1等于num2"
# else
# 	echo "num1不等于num2"
# fi

# arr=(11 22 33 44 55)
# str="1 2 3 4 5"
# for index in ${arr[*]}
# #for index in $str
# do
# 	echo "index the is: ${index}"
# done
# for tmp in 'Hello World'
# do
# 	echo $tmp
# done

# int=0
# while(($int <= 5))
# do
# 	let "int++"

# 	# case 语句
# 	case $int in
# 		2 | 5)
# 			echo "case int is ${int}"
# 		;;
# 		4)
# 			echo "case int is ${int}"
# 		;;
# 	esac

# 	# int等于2的时候跳出当前循环
# 	if [ $int -eq 2 ]
# 	then
# 		continue
# 	fi

# 	# int等于4的时候结束循环
# 	if [ $int -eq 5 ]
# 	then
# 		break
# 	fi

# 	echo "int is ${int}"
# done


# # function 方法
# # 函数调用必须在调用之前
# function DemoFun()
# {
# 	echo "demofun()"
# }
# # 函数调用
# echo "函数执行开始"
# DemoFun
# echo "函数执行完毕"

# # 用户输入的值进行相加返回
# function WitchReturn()
# {
# 	echo "输入第一个数字:"
# 	read num

# 	echo "输入第二个数字:"
# 	read another
# 	return $(($num+$another))
# }
# # 函数返回值使用 $? 来获取
# WitchReturn
# echo $?

# # 函数参数传递获取
# function FunParam()
# {
# 	echo "第一个参数:${1}"
# 	echo "第二个参数:${2}"
# 	echo "第三个参数:${5}"
# 	echo "所有参数:${*}"
# 	echo "参数个数:${#}"
# }
# FunParam 11 22 33 "aa" "bb"


# # 输入/输出重定向
# file="hello.txt"

# # 尾部追加内容
# echo "gongfuxiang.com 龚福祥" > $file

# # 覆盖文件中的内容
# echo "gongfuxiang.org" >> $file

# # 文件中的内容行数
# #wc -l $file # 会输出文件名
# wc -l < $file # 不会输出文件名

# cat $file

# # 结果
# # 	Devil
# #	www.gongfuxiang.com
# cat << EOF
# 	Devil
# 	www.gongfuxiang.com
# EOF

# # 结果 2
# wc -l  << EOF
# 	Devil
# 	www.gongfuxiang.com
# EOF

# # 命令执行的内容不显示在终端上
# ls > /dev/null


# # 文件引入 source关键字或 .
# # testshell.sh testshell2.sh
# #. ./testshell2.sh
# source ./testshell2.sh

# # 使用变量
# echo $url

# # 使用方法
# ShellTestFun


# # (()) 双小括号的使用
# a=1
# b=2
# as=$((a+=1)) # 2
# echo $as
# echo $((a+=2)) # 4

# bs=$((b+1)) # 3
# echo $bs
# echo $((b+=2)) # 4

# # 表达式多个值
# c=1
# d=1
# e=1
# $((c++, d++, e--))
# # c,d,e 结果2,2,0
# echo $c
# echo $d
# echo $e

# # for循环
# for((i=0; i<=10; i++))
# do
# 	echo $i
# done


# 创建测试目录
dir_name="shell_test"

mkdir $dir_name

read number
for((i=0; i<=$number; i++))
do
	# 在目录下循环创建多个文件
	touch "${dir_name}/test_file_${i}.txt"
done

阅读全文

微信支付接口,服务器端处理(新版)
发表于 2016-4-12 | 浏览(3538) | PHP
<?php

/**
 * 微信支付驱动
 * @author  Devil
 * @version V_1.0.0
 */
class WeiXinPay
{
    private $appid;
    private $secret;
    private $mch_id;
    private $key;

    /**
     * [__construct 构造方法]
     */
    private function __construct($config)
    {
        $this->appid = isset($config['appid']) ? $config['appid'] : '';
        $this->secret = isset($config['secret']) ? $config['secret'] : '';
        $this->mch_id = isset($config['mchid']) ? $config['mchid'] : '';
        $this->key = isset($config['key']) ? $config['key'] : '';
    }

    /**
     * [Instantiate 静态方法]
     * @param [array] $config   [微信配置信息]
     * @return[object]          [当前类对象]
     */
    public static function Instantiate($config)
    {
        $object = null;
        if(!is_object($object)) $object = new self($config);
        return $object;
    }

    /**
     * [WechatPay 微信支付]
     * @param [string]  $param['body']              [商品简要描述]
     * @param [string]  $param['out_trade_no']      [商户订单号]
     * @param [int]     $param['total_fee']         [订单总金额]
     * @param [string]  $param['notify_url']        [异步通知地址]
     * @param [string]  $param['trade_type']        [交易类型(默认JSAPI)JSAPI | APP]
     * @param [string]  $param['openid']            [openid]
     * @param [string]  $param['attach']            [原样返回的数据(可选)]
     * @return[array]                                  [微信支付数据]
     */
    public function WechatPay($param)
    {
        if(empty($param)) return '';

        $data = $this->GetPayParam($param);

        $xml = '<xml>
                <appid>'.$this->appid.'</appid>
                <body>'.$data['data']['body'].'</body>
                <mch_id>'.$this->mch_id.'</mch_id>
                <nonce_str>'.$data['data']['nonce_str'].'</nonce_str>
                <notify_url>'.$data['data']['notify_url'].'</notify_url>
                <openid>'.$data['data']['openid'].'</openid>
                <out_trade_no>'.$data['data']['out_trade_no'].'</out_trade_no>
                <spbill_create_ip>'.$data['data']['spbill_create_ip'].'</spbill_create_ip>
                <total_fee>'.$data['data']['total_fee'].'</total_fee>
                <trade_type>'.$data['data']['trade_type'].'</trade_type>
                <attach>'.$data['data']['attach'].'</attach>
                <sign>'.$data['sign'].'</sign>
            </xml>';

        $result = $this->Xml_Array($this->Curl_Post('https://api.mch.weixin.qq.com/pay/unifiedorder', $xml));
        if(!empty($result['prepay_id']))
        {
            // 返回数据
            $pay_data = array(
                    'appid'         =>  $this->appid,
                    'partnerid'     =>  $this->mch_id,
                    'prepayid'      =>  $result['prepay_id'],
                    'package'       =>  'Sign=WXPay',
                    'noncestr'      =>  md5(time().rand()),
                    'timestamp'     =>  time(),
                );
            $pay_data['sign'] = $this->GetParamSing($pay_data);
            return $pay_data;
        }
        return '';
    }

    /**
     * [Refund 退款接口]
     * @param   [array] $param  [退款的参数]
     * @return  [boolean]       [成功true, 则false]
     */
    public function Refund($param)
    {
        if(empty($param)) return false;

        $data = array(
                'appid'         =>  $this->appid,
                'mch_id'        =>  $this->mch_id,
                'nonce_str'     =>  md5(time().rand()),
                'transaction_id'=>  $param['transaction_id'],
                'out_refund_no' =>  md5($param['transaction_id'].$param['total_fee']),
                'total_fee'     =>  $param['total_fee'],
                'refund_fee'    =>  $param['refund_fee'],
                'op_user_id'    =>  $this->mch_id,
            );
        $data['sign'] = $this->GetParamSing($data);

        $result = $this->Xml_Array($this->Curl_Post('https://api.mch.weixin.qq.com/secapi/pay/refund', $this->GetParamXml($data), true));
        return (!empty($result['result_code']) && $result['result_code'] == 'SUCCESS' && !empty($result['return_msg']) && $result['return_msg'] == 'OK');
    }

    /**
     * [GetParamXml xml键值对拼接]
     * @param [array] $param [需要拼接xml的数组]
     * @return[string]       [xml数据]
     */
    private function GetParamXml($param)
    {
        if(empty($param) || !is_array($param)) return '';

        $xml = '';
        foreach($param as $k=>$v)
        {
            $xml .= '<'.$k.'>'.$v.'</'.$k.'>';
        }
        return '<xml>'.$xml.'</xml>';
    }

    /**
     * [Xml_Array xml转数组]
     * @param [string] $xml [xml字符串]
     * @return[array]       [数组]
     */
    private function Xml_Array($xml)
    {
        if(!Xml_Parser($xml)) return '';

        return json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
    }

    /**
     * [GetPayParam 获取支付参数]
     * @param [array] $param [支付的数据]
     * @return[array] [支付的字符串和签名]
     */
    private function GetPayParam($param)
    {
        if(empty($param)) return '';

        $param['appid'] = $this->appid;
        $param['mch_id'] = $this->mch_id;
        $param['nonce_str'] = md5(time().rand().$param['out_trade_no']);
        $param['spbill_create_ip'] = get_client_ip();
        $param['trade_type'] = empty($param['trade_type']) ? 'JSAPI' : $param['trade_type'];
        $param['attach'] = empty($param['attach']) ? 'gongfuxiang' : $param['attach'];
        return array(
            'sign'  =>  $this->GetParamSing($param),
            'data'  =>  $param,
        );
    }

    /**
     * [GetParamSing 签名生成]
     * @param [array] $param    [需要参与签名的数据]
     * @return[string]          [签名]
     */
    private function GetParamSing($param)
    {
        if(empty($param)) return '';

        ksort($param);
        $sign  = '';
        foreach($param as $k=>$v)
        {
            if($k != 'sign') $sign .= "$k=$v&";
        }
        return strtoupper(md5($sign.'key='.$this->key));
    }

    /**
     * [Curl_Post curl模拟post]
     * @param  [string] $url        [请求地址]
     * @param  [array] $post        [发送的post数据]
     * @param  [boolean] $use_cert  [是否需要使用证书]
     */
    private function Curl_Post($url, $post, $use_cert = false)
    {
        $options = array(
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HEADER         => false,
            CURLOPT_POST           => true,
            CURLOPT_POSTFIELDS     => $post,
        );

        if($use_cert == true)
        {
            //设置证书
            //使用证书:cert 与 key 分别属于两个.pem文件
            $options[CURLOPT_SSLCERTTYPE] = 'PEM';
            $options[CURLOPT_SSLCERT] = WEB_ROOT.'cert/wechat_app_apiclient_cert.pem';
            $options[CURLOPT_SSLKEYTYPE] = 'PEM';
            $options[CURLOPT_SSLKEY] = WEB_ROOT.'cert/wechat_app_apiclient_key.pem';
        }
 
        $ch = curl_init($url);
        curl_setopt_array($ch, $options);
        $result = curl_exec($ch);
        curl_close($ch);
        return $result;
    }

    /**
     * [Notify 异步回调]
     * @return [array] [支付数据]
     */
    public function Notify()
    {
        $result = empty($GLOBALS['HTTP_RAW_POST_DATA']) ? '' : $this->Xml_Array($GLOBALS['HTTP_RAW_POST_DATA']);

        if(isset($result['sign']) && $result['sign'] == $this->GetParamSing($result)) return $result;
        return '';
    }
}
?>

阅读全文

微信公众号支付
发表于 2016-1-25 | 浏览(1650) | PHP
<?php

/**
 * 微信支付驱动
 * @author  Devil
 * @version V_1.0.0
 */
class WechatPayLibrary
{
    private $appid;
    private $secret;
    private $mch_id;
    private $key;

    /**
     * [__construct 构造方法]
     */
    private function __construct($config)
    {
        $this->appid = isset($config['appid']) ? $config['appid'] : '';
        $this->secret = isset($config['secret']) ? $config['secret'] : '';
        $this->mch_id = isset($config['mchid']) ? $config['mchid'] : '';
        $this->key = isset($config['key']) ? $config['key'] : '';
    }

    /**
     * [Instantiate 静态方法]
     * @param [array] $config   [微信配置信息]
     * @return[object]          [当前类对象]
     */
    public static function Instantiate($config)
    {
        $object = null;
        if(!is_object($object)) $object = new self($config);
        return $object;
    }

    /**
     * [WechatPay 微信支付]
     * @param [string] $param['body']           [商品简要描述]
     * @param [string] $param['out_trade_no']   [商户订单号]
     * @param [array] $param['total_fee']       [订单总金额]
     * @param [array] $param['notify_url']      [异步通知地址]
     * @param [array] $param['trade_type']      [交易JSAPI类型]
     * @return[array]                           [微信支付数据]
     */
    public function WechatPay($param)
    {
        if(empty($param)) return '';

        $data = $this->GetPayParam($param);

        $xml = '<xml>
                <appid>'.$this->appid.'</appid>
                <body>'.$data['data']['body'].'</body>
                <mch_id>'.$this->mch_id.'</mch_id>
                <nonce_str>'.$data['data']['nonce_str'].'</nonce_str>
                <notify_url>'.$data['data']['notify_url'].'</notify_url>
                <openid>'.$data['data']['openid'].'</openid>
                <out_trade_no>'.$data['data']['out_trade_no'].'</out_trade_no>
                <spbill_create_ip>'.$data['data']['spbill_create_ip'].'</spbill_create_ip>
                <total_fee>'.$data['data']['total_fee'].'</total_fee>
                <trade_type>'.$data['data']['trade_type'].'</trade_type>
                <sign>'.$data['sign'].'</sign>
            </xml>';

        $result = $this->Xml_Array($this->Curl_Post('https://api.mch.weixin.qq.com/pay/unifiedorder', $xml));
        if(!empty($result))
        {
            // 返回数据
            $pay_data = array(
                    'appId'         =>  $this->appid,
                    'timeStamp'     =>  time(),
                    'signType'      =>  'MD5',
                    'nonceStr'      =>  md5(time().rand()),
                    'package'       =>  'prepay_id='.$result['prepay_id'],
                );
            $pay_data['paySign'] = $this->GetParamSing($pay_data);

            return $pay_data;
        }
        return '';
    }

    /**
     * [Xml_Array xml转数组]
     * @param [string] $xml [xml字符串]
     * @return[array]       [数组]
     */
    private function Xml_Array($xml)
    {
        if(!Xml_Parser($xml)) return '';

        return json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
    }

    /**
     * [GetPayParam 获取支付参数]
     * @param [array] $param [支付的数据]
     * @return[array] [支付的字符串和签名]
     */
    private function GetPayParam($param)
    {
        if(empty($param)) return '';

        $param['appid'] = $this->appid;
        $param['mch_id'] = $this->mch_id;
        $param['nonce_str'] = md5(time().rand().$param['out_trade_no']);
        $param['spbill_create_ip'] = get_client_ip();
        $param['trade_type'] = 'JSAPI';
        return array(
            'sign'  =>  $this->GetParamSing($param),
            'data'  =>  $param,
        );
    }

    /**
     * [GetParamSing 签名生成]
     * @param [array] $param    [需要参与签名的数据]
     * @return[string]          [签名]
     */
    private function GetParamSing($param)
    {
        if(empty($param)) return '';

        ksort($param);
        $sign  = '';
        foreach($param as $k=>$v)
        {
            if($k != 'sign') $sign .= "$k=$v&";
        }
        return strtoupper(md5($sign.'key='.$this->key));
    }

    /**
     * [Curl_Post curl模拟post]
     * @param  [string] $url  [请求地址]
     * @param  [array] $post  [发送的post数据]
     */
    private function Curl_Post($url, $post)
    {
        $options = array(
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HEADER         => false,
            CURLOPT_POST           => true,
            CURLOPT_POSTFIELDS     => $post,
        );
 
        $ch = curl_init($url);
        curl_setopt_array($ch, $options);
        $result = curl_exec($ch);
        curl_close($ch);
        return $result;
    }

    /**
     * [Notify 异步回调]
     * @return [array] [支付数据]
     */
    public function Notify()
    {
        $result = empty($GLOBALS['HTTP_RAW_POST_DATA']) ? '' : $this->Xml_Array($GLOBALS['HTTP_RAW_POST_DATA']);

        if(isset($result['sign']) && $result['sign'] == $this->GetParamSing($result)) return $result;
        return '';
    }
}
?>

阅读全文

Shell脚本发布系统
发表于 2015-12-18 | 浏览(1377) | 服务器
#!/bin/sh

# desc		项目上线脚本
# time		2015-12-18
# author	Devil
# version	2.0

echo "---------- 准备中... ----------"
user=`whoami`
date=$(date +%Y%m%d%H%M%S)
time=$(date +%Y-%m-%d" "%H:%M:%S)
name="fangao"
tar_name="${date}_${name}.tar.gz"
test_dir="test/test_app"
bak_dir="bak"
bak_log_dir="bak_log/"$(date +%Y/%m)
date_name=$(date +%d)".txt"
time_start=$(date +%s)

# 日志写入方法
function LogInsert()
{
	echo "user:${user}, date:${time}, msg:${1}, code:${2}" >> "${bak_log_dir}/${date_name}"
	if [ $2 == "success" ]
	then
		echo -e "\e[1;32m ${1} \e[0m"
	else
		echo -e "\e[1;31m ${1} \e[0m"
		exit
	fi
}

# 恢复脚本是否正在运行
is_restore=$(ps -ef | grep "restore" | grep -v grep | wc -l)
if [ $is_restore != 0 ]
then
        LogInsert "恢复脚本正在运行,请先停止再上线项目" "error"
fi

# 当前脚本是否在运行多个
is_online=$(ps -ef | grep "online" | grep -v grep | wc -l)
if [ $is_online -gt 2 ]
then
        LogInsert "当前脚本正在多处运行,请确认一人操作" "error"
fi

# 备份路径不存在则创建
if [ ! -x "$bak_dir" ]
then
	mkdir -p $bak_dir
fi

# 日志目录不存在则创建
if [ ! -x "$bak_log_dir" ]
then
	mkdir -p $bak_log_dir
fi

# 需要上线的目录不存在则退出
if [ ! -x "$test_dir" ]
then
	LogInsert "$test_dir 目录不存在" "error"
fi

echo "---------- 准备结束 ----------"

echo -e
echo "---------- 确定需要上线么?确定:Y  取消:N ----------"
read start_state
if [[ $start_state != "Y" ]]
then
	LogInsert "你取消了操作" "error"
fi

echo -e
echo "---------- 开始压缩,请稍候... ----------"
tar -cf $tar_name --exclude=img --exclude=audio --exclude=tpl_c --exclude=db_log $name
if [ $? == 0 ]
then
	LogInsert "压缩成功" "success"
	echo "压缩包文件名 ${tar_name}" >> "${bak_log_dir}/${date_name}"
else
	LogInsert "压缩失败" "error"
fi
echo "---------- 压缩结束 ----------"

echo  -e
echo "---------- 开始移动压缩包,请稍候... ----------"
mv $tar_name $bak_dir
if [ $? == 0 ]
then
	LogInsert "压缩包移动成功" "success"
else
	LogInsert "压缩包移动失败" "error"
fi
echo "---------- 压缩包移动结束 ----------"

echo  -e
echo "---------- 开始更新项目代码,请稍候... ----------"
cd $test_dir
git checkout master
git pull origin master
if [ $? == 0 ]
then
	echo -e "\e[1;32m git更新master成功 \e[0m"
else
	echo -e "\e[1;31m git更新失败 \e[0m"
	exit
fi
echo "---------- 项目代码更新结束 ----------"

echo -e
echo "---------- 确定迁移项目么?确定:Y  取消:N ----------"
read success
if [[ $success != "Y" ]]
then
        echo -e "\e[1;31m 你终止了迁移操作 \e[0m"
	exit
fi
echo "---------- 开始迁移项目,请稍候... ----------"
cp -r `ls | grep -v config | xargs` ../../$name
cp_state=$?
cd ../../
if [ $cp_state == 0 ]
then
	time_total=$[$(date +%s)-$time_start]
	LogInsert "项目迁移成功 [耗时:${time_total}秒]" "success"
else
	LogInsert "项目迁移失败" "error"
fi
echo "---------- 项目迁移结束 ----------"
echo -e
echo -e "\e[1;36m config目录下的所有文件都未迁移,如有文件需要迁移,请手动操作 \e[0m"
echo -e

阅读全文

Linux常用命令
发表于 2015-12-14 | 浏览(1403) | 服务器
exit  或  按Ctrl+D组合键   退出管理。
shutdown now   系统关机。
init 0  关机
init 3  切换到黑屏命令模式
init 5  切换到图形模式
init 6  重启
clear   清屏
su    管理员与普通用户切换,操作:su 会员名称
ifconfig              查看本机ip
setup      ip dns 修改
whereis 命令名称    查看在那个目录位置

cd     进入目录命令。 操作:cd /***/***
cd ..  返回上一个目录,表示父目录。
ls     查看当前所在目录下的文件与目录。 操作:ls
ls -a    查看当前目录下所有文件包含隐藏文件。
ls *.txt  意思是只查看当前txt的文件类型。
ls ?.txt  意思是只显示一个名称的文件
pwd    查看当前所在目录。 操作:pwd
ls -al /home  操作加命令的方式

tail   查看文件内容

cp     复制文件命令。 进入文件所在目录后操作或者直接在根目录这样操作:cp /文件操作:cp /路径/路径/文件名称 / 路径/路径名称 /需要存放的目录/目录。  空格然后一点就是复制到当前目录。如:cp /a/b/c/88.txt .

fdisk /dev/sdb  m  n  p  1  +200M 按n开始安装第二个磁盘。
fdisk -l  查看磁盘分区
mkfs -t ext3     磁盘格式化。操作:mkfs -t ext3 /dev/磁盘名称
mount    磁盘挂载, 操作:mount /dev/磁盘名称 /mnt/需要挂载的文件名
umount   磁盘挂载卸载,操作:umount /dev/磁盘名称
开机自动挂载 vim /etc/fstab
/dev/vdb1 /dbdata ext3 defaults 0 0

touch      创建空文件。 操作:touch 文件名称
mkdir      创建目录。 操作:mkdir 目录名称。
mkdir -p   直接创建多个目录 如:mkdir -p /a/aa/aaa/aaaa

rmdir    删除目录。 操作:rmdir 目录名称
rm -fr  直接强制删除 不会提示 可以直接删除多层目录
rm -f   删除文件命令。 操作:rm -f /文件名称
mv      移动文件,文件或目录更名。操作:mv t.txt tt.txt
vim 文件名.txt   编辑器,或者打开文件编辑

先按esc键再输入命令
:w        保存
:q        退出
:q!       放弃修改退出
:wq       保存+退出
shutdown-r now     重启
shutdown -r+15     15分钟后关机
reboot       挂起
man ls       获得帮助,获得帮助手册。帮助手册返回按 q
history      命令操作记录
history -c   清空操作的所有命令记录。

lynx localhost         测试  返回按Q
service httpd start    服务器启动
service httpd restart  服务器重启

service vsftpd start     FTP开启。
service vsftpd restart   FTP重启
service network restart   重启网卡。

anonymous       查看FTP
service smb start  测试服务器
service mysqld start   开启myspl 数据库
myspl -u root -p      登录数据库
cd /var/www/html      进入PHP
vim index.php         打开文件添加内容

tab键    自动补齐
反斜杠“\”强制换行
快捷键:ctrl+u   清空
快捷键:ctrl+l   清屏
快捷键:ctrl+k   清空至尾行
快捷键:ctrl+c   奇效本次命令编辑
ls > **.txt      重定向输出
wc < /etc/passwd 重定向输入
less    查看文件内容,操作:less 文件名称

useradd -d 创建FTP用户直接给目录登录权限
操作:useradd -d 目录名 会员名
useradd    创建用户,用户都在在home目录下。
passwd    设置用户密码。操作:passwd 用户名 回车后还要按两次密码。
userdel -r   删除会员及所有数据表

setup     图形查看

:set nu     显示文本行数
:set nonu   去掉文本行数
groupadd   创建用户组
gpasswd    往用户组里面添加一个用户操作:gpasswd -a 会员名 用户名名。

tar -czvf t.tar文件或目录名 -C /       解压缩
tar -xzvf t.tar -C /需要存放的目录     解压
unzip 压缩包名称  zip格式解压

chmod   设置文件或目录权限,操作:chmod 777 文件或目录名称。

/etc/resolv.conf
/etc/sysconfig/network
/etc/sysconfig/network-scripts/ifcfg-eth0   网关IP配置文件
/etc/sysconfig/network    网卡配置文件
/etc/resolv.conf       DNS配置文件 ip 配置
ggVG   d   清空vim 文件里面的所有内容  恢复 按 u

cat /dev/null > log.txt      清空文件里面的所有内容

grep -rn "hello" ./     在当前目录下(包括子目录)查找所有文件包含hello的文件
find / -name hello.txt  查看文件
find / -name hello -type d   查看目录所在位置
netstat -tnlp  查看正在运行的服务

硬盘管理
fdisk -l  查看还未挂载的硬盘
monut 需要挂载的硬盘 指定挂载的目录名称
如: mount test data
umount 需要被卸载硬盘目录名称
如: umount test

进程查看
 netstat -ntlp | grep 80     //查看指定进程
killall nginx    //杀死进程

vim内容替换
:s/hello/newhello/g
:%s/hello/newhello/g

在指定目录下所有文件中的内容替换
sed -i "s/content/newcontent/g" `grep content -rl /dir/path`
原始字符串 content
新的字符串 newcontent
替换的路径 /dir/path


查看进程
	所有进程:ps -ef
	指定nginx进程:ps -ef | grep nginx

杀死进程
	kill 进程号(如:kill 8899)

查看负载(进程,内存,硬盘,CPU信息,运行时间)
	top

查看占用CPU最高的5个进程
ps -aux | sort -k3nr | head `5`

查看前10个占用内存最高的程序
ps aux | sort -k4,4nr | head -n 10

查看网路请求
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

正常数据传输状态-并发
    netstat -nat|grep ESTABLISHED|wc -l
    6945

无连接是活动的或正在进行
    netstat -nat|grep CLOSED|wc -l
    0

服务器在等待进入呼叫
    netstat -nat|grep LISTEN|wc -l
    9

一个连接请求已经到达,等待确认
    netstat -nat|grep SYN_RECV|wc -l
    236

应用已经开始,打开一个连接
    netstat -nat|grep SYN_SENT|wc -l
    56

应用说它已经完成
    netstat -nat|grep FIN_WAIT1|wc -l
    1400

另一边已同意释放
    netstat -nat|grep FIN_WAIT2|wc -l
    422

等待所有分组死掉
    netstat -nat|grep ITMED_WAIT|wc -l
    0

两边同时尝试关闭
    netstat -nat|grep CLOSING|wc -l
    64

另一边已初始化一个释放,处理完毕,等待超时结束的请求数
    netstat -nat|grep TIME_WAIT|wc -l
    56090

等待所有分组死掉
    netstat -nat|grep LAST_ACK|wc -l
    3627

阅读全文

MySQL常用操作
发表于 2015-12-4 | 浏览(1146) | 数据库
查看正在执行的sql语句
	show processlist;

停止正在执行的sql语句
	kill id(正在执行的sqlID);

查询的时候增加一个字符串一起返回
    SELECT CONCAT("strvalue") AS str table;

表修复
  myisamchk -r table

获取表字段名称和注释
  select COLUMN_NAME,COLUMN_COMMENT from INFORMATION_SCHEMA.Columns where table_name='table_name';

查询表结构, 所有字段和属性
  select * from INFORMATION_SCHEMA.Columns where table_name='table_name' 

阅读全文

TOP