接口文档
文档给过来的案例是java程序的,参照其思路,造一个php版本
构造aes对称加密
public static function encry($data){
$data = "要加密的数据";
$key = '你的256位密钥'; // 密钥应该是16字节(128位),24字节(192位)或32字节(256位)
$method = 'AES-256-CBC';
// $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($method)); // 生成随机IV
$iv = '';
// PKCS5Padding 补齐数据
$padding = 16 - (strlen($data) % 16);
$data .= str_repeat(chr($padding), $padding);
// 使用 CBC 模式加密
$encrypted = openssl_encrypt($data, method, $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv);
// 进行 base64 编码
return base64_encode($encrypted);
}
参考了以下文章:
今天在做一个和java程序接口的架接,java那边需要我这边(PHP)对传过去的值进行AES对称加密,接口返回的结果也是加密过的(就要用到解密),然后试了很多办法,也一一对应了AES的key密钥值,偏移量(IV)的值,都还是不能和java加密解密的结果一样,我很郁闷,我很焦躁。接着我就去找了一些文档,结果发现PHP里面补码方式只有:ZeroPadding这一种方式,而java接口那边是用PKCS5Padding补码方式,发现了问题所在,就编写了如下PHP实现AES/CBC/PKCS5Padding的加密解密方式。如有错误,还请指正!下面贴出详细代码
构造请求参数
public function d(){
$sql = "查询数据的sql语句";
$row = self::db3()->query($sql);
if(!$row) $this->error('没有需要同步的数据');
$array = [];
$ids = [];
foreach ($row as $val) {
$ids[] = $val['ID'];
$arr = [];
$arr['naming'] = $val['姓名'];
$arr['phone'] = $val['手机'];
if(strlen($val['身份证']) != 18) continue;
$arr['idcard'] = $val['身份证'];
$arr['actNaming'] = '大湾区汽车周';
$arr['entryTime'] = $val['入场时间'];
$arr['appointmentTime'] = $val['预约日期'];
$array[] = $arr;
}
$array = self::encry(json_encode($array,JSON_UNESCAPED_UNICODE));
$data = ['pushType'=>'1', 'persons'=>$array];
$data = json_encode($data,JSON_UNESCAPED_UNICODE);
//发送一个POST请求并设置Content-Type并获取返回结果
$result = \fast\Http::post("http://120.234.34.7:13305/person/compare", $data, [CURLOPT_TIMEOUT => 30, CURLOPT_HTTPHEADER => ['Content-Type: application/json','keyt: fbb1cd7c7d4a45609cf11a8c934311c0']]);
// dump($result);exit;
$res = json_decode($result);
if($res->success){
$message = $res->message;
// 成功后的逻辑
$ids = implode(',',$ids);
$sql = "update [data_time] SET 是否同步公安='1' WHERE id IN ($ids)";
// dump($sql);
$update = self::db3()->execute($sql);
// dump($update);
$this->success($message);
}else{
$this->error();
}
}