在和第三方支付接口对接时经常会对数据进行签名和验签,sha1WithRSA也算是比较常用的一种签名加密算法。php开启openssl库后实现起来也算比较简单。
我在这里使用sha1withRSA算法来实现数据的加密签名和验签,其中公钥和私钥均读取自接口方提供的.pfx证书文件。

以下是使用私钥进行签名的代码示例,注意其中在return前对生成的签名密文进行base64编码:

/**
* 签名 生成签名串 基于sha1withRSA
* @param string $data 签名前的字符串
* @return string 签名串
* @link www.zh30.com
*/
function sign($data) {
$certs = array();
openssl_pkcs12_read(file_get_contents(“你的.pfx文件路径”), $certs, “password”); //其中password为你的证书密码
if(!$certs) return ;
$signature = ”;
openssl_sign($data, $signature, $certs[‘pkey’]);
return base64_encode($signature);
}
验签时使用公钥,也就是.pfx文件中的cert KEY:

/**
* 验签 验证签名 基于sha1withRSA
* @param $data 签名前的原字符串
* @param $signature 签名串
* @return bool
* @link www.zh30.com
*/
function verify($data, $signature) {
$certs = array();
openssl_pkcs12_read(file_get_contents(“你的.pfx文件路径”), $certs, “password”);
if(!$certs) return ;
$result = (bool) openssl_verify($data, $signature, $certs[‘cert’]); //openssl_verify验签成功返回1,失败0,错误返回-1
return $result;
}

转载: https://www.zh30.com/php-sha1withrsa-sign-verify-pfx.html

 

sha1withrsa

如果用php的+-*/计算浮点数的时候,可能会遇到一些计算结果错误的问题,比如echo intval( 0.58*100 );会打印57,而不是58

这个其实是计算机底层二进制无法精确表示浮点数的一个bug,是跨语言的

可以用精度函数库解决问题

bcadd — 将两个高精度数字相加

bccomp — 比较两个高精度数字,返回-1, 0, 1

bcdiv — 将两个高精度数字相除

bcmod — 求高精度数字余数

bcmul — 将两个高精度数字相乘

bcpow — 求高精度数字乘方

bcpowmod — 求高精度数字乘方求模,数论里非常常用

bcscale — 配置默认小数点位数,相当于就是Linux bc中的”scale=”

bcsqrt — 求高精度数字平方根

bcsub — 将两个高精度数字相减
比较两个高精度数字
var_dump(bccomp($left=4.45, $right=5.54, 2));
// -1

两个高精度数相加
var_dump(bcadd($left=1.0321456, $right=0.0243456, 2));
//1.04

两个高精度数相减
var_dump(bcsub($left=1.0321456, $right=3.0123456, 2));
//-1.98

两个高精度数相除
var_dump(bcdiv($left=6, $right=5, 2));
//1.20

两个高精度数相乘
var_dump(bcmul($left=3.1415926, $right=2.4569874566, 2));
//7.71
设置bc函数的小数点位数
bcscale(3);
var_dump(bcdiv(‘105′, ‘6.55957’));
// 16.007

PHP float加减乘除

其实这个问题跟用什么语言导出csv文件没有关系。Excel显示数字时,如果数字大于12位,它会自动转化为科学计数法;如果数字大于15位,它不仅用于科学技术费表示,还会只保留高15位,其他位都变0。
解决这个问题:
只要把数字字段后面加上显示上看不见的字符即可,字符串前面或者结尾加上制表符”\t”.
php 程序可以这样判断,注意一定是”\t”,不是’\t’.

来自:https://www.cnblogs.com/kobigood/p/5535676.html

/**
* 获取图片的Base64编码(不支持url)
* @date 2017-02-20 19:41:22
*
* @param $img_file 传入本地图片地址
*
* @return string
*/
function imgToBase64($img_file) {

$img_base64 = ”;
if (file_exists($img_file)) {
$app_img_file = $img_file; // 图片路径
$img_info = getimagesize($app_img_file); // 取得图片的大小,类型等

//echo ‘<pre>’ . print_r($img_info, true) . ‘</pre><br>';
$fp = fopen($app_img_file, “r”); // 图片是否可读权限

if ($fp) {
$filesize = filesize($app_img_file);
$content = fread($fp, $filesize);
$file_content = chunk_split(base64_encode($content)); // base64编码
switch ($img_info[2]) { //判读图片类型
case 1: $img_type = “gif”;
break;
case 2: $img_type = “jpg”;
break;
case 3: $img_type = “png”;
break;
}

$img_base64 = ‘data:image/’ . $img_type . ‘;base64,’ . $file_content;//合成图片的base64编码

}
fclose($fp);
}

return $img_base64; //返回图片的base64
}
//调用使用的方法
$img_dir = dirname(__FILE__) . ‘/uploads/img/11213223.jpg';
$img_base64 = imgToBase64($img_dir);
echo ‘<img src=”‘ . $img_base64 . ‘”>'; //图片形式展示
echo ‘<hr>';
echo $img_base64; //输出Base64编码
文章来源:https://www.cnblogs.com/cloudshadow/p/php_img_to_base64.html

php 将图片转成base64

现在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加密解密函数