现在php很多加密解密生成的字符串都比较常,比如xxtea把数字1加密都可以生成12位字符串,10000更是高达16位。
如果简单的把产品ID加密生成较短的字符串,xxtea就不太适合的。对于这种简单的,要求不太高的加密解密,下面的函数就可以满足需求了。
经过测试发现,1位生成2位,2生成3位,3位生成4位,4位生成6位,5位生成7位,9位生成12位,还算ok

函数代码如下:

if( !function_exists(‘encrypt’) ){

/**
* 加密/解密函数
* @param $string 要解密/解密的字符串
* @param int $type 类型类1.产品 2.券 等等,参考app.php
* @param bool $operation 加密true/解密false
* @return bool|string 返回加密/解密结果
*/
function encrypt($string,$type=1,$operation=true){

$key_list = config(‘encrypt_key_list’);
if( !isset($key_list[$type]) ) {
return false;
}else{
$key=md5($key_list[$type]);
}
$data = trim($string);
if(empty($data)) return ”;

$x = 0;
$data = $operation ? $data : str_replace(‘_’,’+’,base64_decode($data)); //加密/解密数据
$len = strlen($data);
$l = strlen($key);

$char=”;
$str=”;

if($operation){ //加密

for ($i = 0; $i < $len; $i++)
{
if ($x == $l)
{
$x = 0;
}
$char .= $key{$x};
$x++;
}
for ($i = 0; $i < $len; $i++)
{
$str .= chr(ord($data{$i}) + (ord($char{$i})) % 256);
}

} else { //解密

for ($i = 0; $i < $len; $i++)
{
if ($x == $l)
{
$x = 0;
}
$char .= substr($key, $x, 1);
$x++;
}
for ($i = 0; $i < $len; $i++)
{
if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1)))
{
$str .= chr((ord(substr($data, $i, 1)) + 256) – ord(substr($char, $i, 1)));
}
else
{
$str .= chr(ord(substr($data, $i, 1)) – ord(substr($char, $i, 1)));
}
}

}

return $operation ? str_replace([‘+’,’=’],[‘_’,”],base64_encode($str)) : $str; //返回结果

}

}
由于此函数用的thinkphp 5.1 所以 $key_list = config(‘encrypt_key_list’); 在config/app.php 配置如下

retrun [
//省略很多代码

‘encrypt_key_list’ => [
1 => ‘gDVPwZr7iPWGISwX’,
2 => ‘JfKBdyfgfsRhTPXx’,
],

];

如果你用的不是此框架 对应的改成

$key_list = [
1 => ‘gDVPwZr7iPWGISwX’,
2 => ‘JfKBdyfgfsRhTPXx’,
],

当然随你改

PHP加密解密函数

201 起因是订单号重复提交了 out_trade_no

说一下电商遇到的问题:

1.用户可以切换优惠券(奇葩需求),但是订单号一样,会造成总结额total_fee不一致会出现201

2.用户在小程序中下单,但是在微信h5中支付,但是订单号一样,注意程序和h5中的用户的openid和商户的appid肯定不一样,然后造成签名不一致

问题1的解决方案是  生成订单号=本站订单号_总金额

问题2的解决方案是  生成订单号=本站订单号_唯一标识

如果网站遇到问题1和问题2其中之一,那轻松愉快的使用以上方案了,但是我们的网站同时出现以上两种问题

同理可得方案  生成订单号=本站订单号_总金额唯一标识

注意在微信通知给我们网站的时候,用_分割后处理一下我们的订单,再更新我们自己的站点

字符与字节
ASCII码:一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。如一个ASCII码就是一个字节。
UTF-8编码:一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。中文标点占三个字节,英文标点占一个字节
Unicode编码:一个英文等于两个字节,一个中文(含繁体)等于两个字节。中文标点占两个字节,英文标点占两个字节
不同数量级间
数据存储是以10进制表示,数据传输是以2进制表示的,所以1KB不等于1000B。
1KB=1024B;1MB=1024KB=1024×1024B。其中1024=210。
1B(byte,字节)= 8 bit(见下文);
1KB(Kibibyte,千字节)=1024B= 2^10 B;
1MB(Mebibyte,兆字节,百万字节,简称“兆”)=1024KB= 2^20 B;
1GB(Gigabyte,吉字节,十亿字节,又称“千兆”)=1024MB= 2^30 B;
1TB(Terabyte,万亿字节,太字节)=1024GB= 2^40 B;
1PB(Petabyte,千万亿字节,拍字节)=1024TB= 2^50 B;
1EB(Exabyte,百亿亿字节,艾字节)=1024PB= 2^60 B;
1ZB(Zettabyte,十万亿亿字节,泽字节)= 1024EB= 2^70 B;
1YB(Yottabyte,一亿亿亿字节,尧字节)= 1024ZB= 2^80 B;
1BB(Brontobyte,一千亿亿亿字节)= 1024YB= 2^90 B;
1NB(NonaByte,一百万亿亿亿字节) = 1024 BB = 2^100 B;
1DB(DoggaByte,十亿亿亿亿字节) = 1024 NB = 2^110 B;

Read More →

centos要安装imagick 首先安装ImageMagick

yum install -y ImageMagick ImageMagick-devel

然后安装imagick

wget http://pecl.php.net/get/imagick-3.4.3.tgz
tar zxvf imagick-3.4.3.tgz
cd imagick-3.4.3
/usr/local/php/bin/phpize
./configure –with-php-config=/usr/local/php/bin/php-config
make
make install

安装成功后写入php.ini并重启

/usr/local/php/etc/php.ini
extension=imagick.so

/etc/init.d/php-fpm reload

php-imagick的安装