冰貂主人
首页
网络安全
dedecms
会员
漏洞
织梦
技术文章
数据库
其他
微信小程序
区别
python
服务器
PHP
谈天说地
优惠券
新闻
手册
thinkphp5手册
laravel8手册
thinkphp6
前端
首页
PHP
正文
PHP的RSA签名和验签
未知
2020-10-29 10:32:59
0
次
//
签名生成
public function SHA256withRSA($datas){
// $datas='{"merc_order":"234234","pay_price":"130","pay_date":"15685985","imei":"25252525","pay_type":"scan"}';//对方获取加油站单个站点数据
$data=json_encode($datas);
//可以百度在线生成rsa,
也可以使用php生成
$privateKeypath="E:/phpstudy/WWW/gtzyc_api/config/certs/posterminal/cert_private.pem";
$privateKeyfile = file_get_contents($privateKeypath);
$pKeyId = openssl_pkey_get_private($privateKeyfile); // 加载私匙;
$digest=openssl_digest($data,'sha256');//生成摘要
$signature='';
openssl_sign($digest, $signature, $pKeyId,OPENSSL_ALGO_SHA256); //签名
openssl_free_key($pKeyId);
return base64_encode($signature);
}
//验签//用对方公钥验签
public function checkrsa($signstr){
$jsontoarr=json_decode($signstr,true);
$signature=$jsontoarr['hfsign'];
array_pop($jsontoarr);
$data=json_encode($jsontoarr,JSON_UNESCAPED_UNICODE);
log::info('checkrsa()获取的待签名串转译之后: '.$data);
// 接入方公钥
$publickeyFile='E:/phpstudy/WWW/gtzyc_api/config/certs/posterminal/other_cert_public.key';
//摘要及签名的算法
$digestAlgo='sha256';
$algo=OPENSSL_ALGO_SHA256;
//加载公钥
$publickey=openssl_pkey_get_public(file_get_contents($publickeyFile));
//生成摘要
$digest=openssl_digest($data,$digestAlgo);
//验签
$verify=openssl_verify($digest,base64_decode($signature),$publickey,$algo);
return $verify;
}
//接收对方订单数据,
接入方调用我们的接口
public function getPosOrder(Request $req){
$orderstr=$req->getContent();//获取对方数据
$orderarr=json_decode($orderstr,true); //json格式转成数组
//判断数组是否为空,如果为空就不是json格式,因为json_decode()只转译json格式
if(is_null($orderarr)){
return response()->json(['code'=>'1003','msg'=>'待签名串不是json格式']);
}
//验证数据是否为授权方发送
$rsares=$this->checkrsa($orderstr);
if($rsares!=1){
return response()->json(['code'=>'1001','msg'=>'验签失败','merc_order'=>$orderarr['merc_order']]);
}
//验证所有字段是否符合数据库约束
// $datas='{"merc_order":"234234","pay_price":"130","pay_date":"15685985","imei":"25252525","pay_type":"scan"}';
$data=['merc_order'=>$orderarr['merc_order'],'pay_price'=>$orderarr['pay_price'],'pay_date'=>$orderarr['pay_date'],'worker_id'=>$orderarr['imei'],'pay_type'=>$orderarr['pay_type']];
$validate=Validator::make($data,[
'merc_order'=>'required|min:3|max:32'
,'pay_price'=>'required|numeric'
,'pay_date'=>'required|numeric'
,'worker_id'=>'required'
,'pay_type'=>'required|numeric'
]);
if($validate->fails()){
return response()->json(['code'=>'1004','msg'=>$validate->errors()->first()]);
}
$data['confirm_date']=$orderarr['pay_date'];
$data['pay_terminal']=4;
$data['is_type']=3;//1产品2积分3加油4洗车
$data['order_state']=2;//订单状态 0:待付款 1:已付款,2已完成
$data['info']='一卡通pos机支付全部加油订单金额';
$orderid=DB::table('gczyc_wxcx_order')->where('merc_order',$orderarr['merc_order'])->value('id');
if($orderid){
return response()->json(['code'=>'1005','msg'=>'订单编号重复']);
}
$db=DB::table('gczyc_wxcx_order')->insert($data);
if($db){
$back=['code'=>'1000','msg'=>'SUCCESS','merc_order'=>$orderarr['merc_order']];
$signature=$this->SHA256withRSA($back);//签名
return response()->json(['code'=>'1000','msg'=>'SUCCESS','merc_order'=>$orderarr['merc_order'],'hfsign'=>$signature]);
}else{
return response()->json(['code'=>'1002','msg'=>'保存失败']);
}
}
//
我方调用接入方的接口
。推送数据给接入方,
public function reqExceptionOrder(Request $req){
$array=array("merc_order"=>$req->merc_order,"is_normal"=>"1","order_price"=>$req->order_price,"kou_price"=>$req->pay_price,"back_price"=>$req->back_price);
//签名
$sign=$this->
SHA256withRSA
($array);
$array['hfsign']=$sign;
$data = json_encode($array,
JSON_UNESCAPED_UNICODE
);
$headerArray =array("Content-type:application/json","Accept:application/json");
$url=‘/admin/pos/senddata’;
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl,CURLOPT_HTTPHEADER,$headerArray);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($curl);
log::info('调用商户退款接口::::'.PHP_EOL.date('Y-m-d H:i:s').PHP_EOL.'发送'.PHP_EOL.var_export($data, true));
$err = curl_error($curl);
if ($err) {
log::info('请求商户异常接口 cURL Error #:'. $err);
return response()->json(['result'=>200,'msg'=>$err]);
}
if(empty($output)){
log::info('请求商户异常接口,返回的$output为空,可能银行系统出错');
return response()->json(['result'=>200,'msg'=>'返回数据为空']);
}
curl_close($curl);
$res=json_decode($output,true);
if($res['code']==1){
log::info('请求商户完成接口,返回的为1');
// 验签
$verify=$this->
checkrsa
($output,$mercfile);
if($verify==1){
return response()->json(['result'=>100,'msg'=>$res['msg']]);
}else{
log::info('请求商户异常订单接口完成,但是验签失败。。。');
return response()->json(['result'=>200,'msg'=>'验签失败']);
}
}else{
log::info('请求商户异常订单接口完成,但是返还结果处理失败。。。'.$res['msg']);
return response()->json(['result'=>200,'msg'=>$res['msg']]);
}
}
php
sha256withrsa
上一篇:
php如何生成RSA公钥私钥
下一篇:
laravel 显示419错误
相关内容
PHP与SQLSRV数据库...
摘要:本文介绍了PHP与SQLSRV数据库迁移的步骤和注意事项,包...
2024-11-20 11:46:42
PHP与SQLSRV连接数...
PHP与SQLSRV连接SQL Server数据库教程,介绍安装配...
2024-11-20 11:23:44
PHP与SQLSRV连接M...
本文介绍了使用PHP和SQLSRV扩展连接MySQL数据库的实例,...
2024-11-20 11:00:46
PHP中SQLSRV处理大...
摘要:在PHP中使用SQLSRV处理大数据量时,可通过数据库端索引...
2024-11-20 10:46:41
PHP SQLSRV数据库...
本文介绍了使用PHP SQLSRV扩展进行数据库操作的示例,包括连...
2024-11-20 10:23:47
PHP与SQLSRV连接数...
摘要:本文介绍了PHP与SQLSRV连接数据库的性能优化策略,包括...
2024-11-20 10:00:52
热门资讯
淘宝优惠券
淘宝优惠券先领券后下单,更加省钱
京东优惠券
京东优惠券先领券后下单,更加省钱
唯品会优惠券
唯品会优惠券先领券后下单,更加省钱
拼多多优惠券
拼多多优惠券先领券后下单,更加省钱
tp5 jquery判断手机端...
application--common.php中添加如下代码 //函数作用是判断用户打开的是手机端还...
Laravel 5.5 .No...
创建了新的laravel项目后, 运行提示:No application encryption ke...
php 打印date函数出现错...
问题描述: 我使用的是phpstudy,在练习时间函数的时候,打印出现在的时间,date(Y-m-d...
生成随机字符唯一标识符guid...
/** * @param $length * @return string * 生成随机字符串 */...
layui缩略图
div class=layui-form-item label class=layui-form-l...
php函数substr_rep...
php函数substr_replace从某个位置替换或删除或插入字符串
Laravel 引入自定义类库...
强烈建议引入的类 都是含有命名空间的,这样使用起来就不会出现重名的情况。!!当然,没有命名空间也可以...
object json转化为数...
//调用api 程序,通知商户订单异常 20200314 public function callt...
Laravel 查看SQL操作...
方法一:临时打印操作记录 DB::connection()-enableQueryLog(); # ...
php银行开放平台接口:pfx...
问题描述: 对接易通银行,他们的服务开放平台是java开发,而我的是php,现在需要php版本的SD...