PHP 做 RSA 签名 生成订单
admin
2023-06-12 06:02:04
0
//组合签名
$a=time();
$b=substr($a, 1);
//生成随机订单号
$orderid= $b.mt_rand(10000,99999);
//合作身份者id,以2088开头的16位纯数字
$mygoods['partner']="2088011744308664";
//商家账号
$mygoods['seller']="2088011744308664";
//订单号
$mygoods['out_trade_no']=$orderid;
//主题
$mygoods['subject']=$goods_name;
//商品描述信息
$mygoods['body']=$goods_infro;
//商品价格
$mygoods['total_fee']=$score;
//服务器端异步响应地址
$mygoods['notify_url']= "http://211.149.220.47/php/notify_url.php";
//排序
$mygoods = argSort($mygoods);
//拼接
$mystr = createLinkstring($mygoods);
//签名
$sign = rsaSign($mystr);
//对签名进行urlencode转码
$sign = urlencode($sign);
//生成最终签名信息
$orderInfor = $mystr."&sign=".$sign."&sign_type=RSA";

/*******特殊的 验签支付宝反馈给App的签名信息*******/
//支付宝反馈给App端信息拆解如下
$str = 'body=%E7%B2%BE%E5%93%81%E5%84%BF%E7%AB%A5%E4%B9%A6%E5%8C%85%E5%96%9C%E6%B4%8B%E6%B4%8B%E7%9A%84¬ify_url=http%3A%2F%2F211.149.220.47%2Fphp%2Fnotify_url.php&out_trade_no=40609294027478&partner=2088011744308664&seller=2088011744308664&subject=%E4%B9%A6%E5%8C%85&success=true&total_fee=0.01';

//被拆解后的支付宝签名
$sign = 'Itorzqous2F7kYWWOpmoB%2FJUYgySRzh%2FOOKMhVhv%2BM48CnFk%2BQCp2cKcSsNGcDTs2AsAk%2BRYTuyMYZkGH56t8jcV2GGFkrJr%2FPxcGRlEK08QadAhImYzy9piVjoW0102lhSJYapiXGBTl5eiZ88RiyRA62D2nJEtH%2FBVXpuq63A%3D';

 //得到签名
$sign = urldecode($sign);
//得到待签名字符串
$str = urldecode($str);
//验签数据,验签成功将返回true 否则 flase
var_dump(verify($str, $sign));


/*************************需要使用到的方法*******************************/
/**
 * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
 * @param $para 需要拼接的数组
 * return 拼接完成以后的字符串
 */
function createLinkstring($para) {
    $arg  = "";
    while (list ($key, $val) = each ($para)) {
        $arg.=$key."=".$val."&";
    }
    //去掉最后一个&字符
    $arg = substr($arg,0,count($arg)-2);
     
    //如果存在转义字符,那么去掉转义
    if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
     
    return $arg;
}
/**
 * 对数组排序
 * @param $para 排序前的数组
 * return 排序后的数组
 */
function argSort($para) {
    ksort($para);
    reset($para);
    return $para;
}
 
/**
 * RSA签名
 * @param $data 待签名数据
 * @param $private_key_path 商户私钥文件路径
 * return 签名结果
 */
function rsaSign($data, $private_key_path) {
    $priKey = file_get_contents($private_key_path);
    $res = openssl_get_privatekey($priKey);
    openssl_sign($data, $sign, $res);
    openssl_free_key($res);
    //base64编码
    $sign = base64_encode($sign);
    return $sign;
}



/**RSA验签
 * $data待签名数据
 * $sign需要验签的签名
 * 验签用支付宝公钥
 * return 验签是否通过 bool值
 */
function verify($data, $sign)  {
    //读取支付宝公钥文件
    $pubKey = file_get_contents('key/alipay_public_key.pem');

    //转换为openssl格式密钥
    $res = openssl_get_publickey($pubKey);

    //调用openssl内置方法验签,返回bool值
    $result = (bool)openssl_verify($data, base64_decode($sign), $res);
	
    //释放资源
    openssl_free_key($res);

    //返回资源是否成功
    return $result;
}


上一篇:php使用zeromq

下一篇:Memcached安装方法

相关内容

热门资讯

国家两部门:开展矿山机器人应用... 国家矿山安全监察局综合司 工业和信息化部办公厅关于开展矿山机器人应用验证试点工作的通知 国家矿山安全...
打造“终身学习之城”,杭州积极... 潮新闻客户端 记者 徐婷 俞刘东 通讯员 许慧敏 人工智能时代日新月异,培养适应时代生存发展的人才,...
荣耀平板20问世 内置1010... 【CNMO科技消息】5月25日晚间,CNMO科技注意到,荣耀平板20已正式发布,新品首销价1899元...
华为芯片破局!五年干到1.4n... 说起何庭波这个名字,想必各位IT之家家友是既熟悉又陌生。 熟悉在于她坐拥华为公司董事、半导体业务部总...
美加州故障化学品储罐爆炸风险排... 新华社洛杉矶5月25日电(记者高山 谭晶晶)美国加利福尼亚州奥兰治县官员25日说,当地此前发生泄漏的...
雷军:小米汽车电池安全测试项目... 来源:环球网 【环球网科技综合报道】5月25日消息,小米创办人、董事长兼 CEO 雷军发布了小米汽...
2026续航“顶级”的全能旗舰... 要说近两年手机行业感知最强的技术进步,电池肯定算一个,毕竟今年连影像旗舰和小屏机都能把电池堆到700...
在德国失联的23岁中国留学生,... 近日,有网友发帖称,一名23岁中国男留学生在德国失联数日,其家属正在紧急寻人,引发关注。据极目新闻报...
美光HBM4增产进展顺利,HB... IT之家 5 月 25 日消息,据韩媒 The Elec 今日报道,美光科技第六代高带宽内存 HBM...
AIROBO正式发布“冲刺全球... 全球机器人产业,正在经历一次比“智能手机时代”更深层的产业迁移。 过去十年,机器人行业的竞争核心始终...