笔者最近对接建设银行的租房平台,住房链服务平台文档只有java的签名例子 ,没有php对接的例子,所以整理了一下用php的对接方法,以备以后使用。
/**
* 住房链服务平台公共函数
* ============================================================================
*/
注:请求api接口(向住房链服务平台发送请求):
/**
* 请求api接口
* Enter description here ...
* @param int $data //请求数据
array(
'PARTICIPATEID' => CCB_BUSINESS_UNIQUE_ID, //房屋所属企业唯一标识 需由住房链平台提供 类似:'E000002'
'HOUSEID' => '41013985331', //企业内部房源唯一编号
'STATE' => '01' //01:上架 02:锁定 03:签约出租中 04:平台主动下架
);
* @param str $url //向住房链服务平台接口请求地址
* @param array $bianhao //需要8位数字最好有意义
*/
function httpApi($data,$url,$bianhao='70985121'){
$param = json_encode($data);
$sign = rsaSign($param); //加密
$params = base64_encode($param); //参数
$time = time();
$header = array();
$header[] = 'C-Business-Id: '.CCB_BUSINESS_UNIQUE_ID.$time.$bianhao; //请求唯一标识 唯一标识25位,生成规则:企业唯一标识编码(7位,不足7位补0,超过7位缩减为7位)+18位(建议由时间戳、序列号及其他有标识意义字段组成,保证唯一,方便问题排查)
$header[] = 'C-Timestamp: '.$time; //请求时间
//$header[] = 'C-Env-Type: ' ; //请求应用的环境类型,如新系统、老系统等
$header[] = 'C-Signature: '.$sign; //签名信息 将请求体签名后的签名信息
$header[] = 'C-App-Id: '.CCB_BUSINESS_UNIQUE_ID; //请求方应用编号 作为请求方的唯一标识,填写企业唯一标识编码,请参考企业唯一标识编码sheet页的定义
$header[] = 'C-Version: v2'; //访问的API的版本号 调用区块链服务的版本号,1.0版本填写v1; 2.0版本填写v2;
$header[] = 'C-Tenancy-Id: BSP0001'; //租户id 访问区块链平台的租户ID,填写BSP0001
//$header[] = 'C-Custom-Header:';//自定义请求头
//$header[] = 'C-Dynamic-Password:';//动态口令
$r = curl_post_contents_header($url, $params, 3000,$header);
//var_dump($r);die;
$return_data = base64_decode($r);
$r_de = json_decode($return_data, true);
//日志
//...
return $r_de;
}
/**
* RSA签名
* @param $data 待签名数据
* return 签名结果
*/
function rsaSign($data) {
$sigdat = '';
$privkeypass = CCB_PRIVATE_PASS; // 私钥签名密码
$pem = 'ccbroom';
$priv_key = file_get_contents(CACHE_PATH.$pem."/user_private_key_test.pfx"); //获取密钥文件内容 根据自己的文件目录修改路径
openssl_pkcs12_read($priv_key, $certs, $privkeypass); //读取公钥、私钥
$prikeyid = $certs['pkey']; //私钥
openssl_sign($data, $sigdat, $prikeyid ,'SHA256');
$sign = base64_encode($sigdat);
return $sign;
}
/**
* curl提交raw数据
* @param $url
* @param $data_string
* @return mixed
*/
function curl_post_contents_header($url, $data_string,$timeout=30,$header=array()) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout );
if(!empty($header)) curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}