笔者最近对接建设银行的租房平台,住房链服务平台文档只有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; }