BSN平台类型:Fabric-2.3.2-secp256r1
创建一个区块链上链信息表保存上链记录
CREATE TABLE `bl_block_list` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`order_no` varchar(50) DEFAULT '' COMMENT '订单编号',
`txId` varchar(100) DEFAULT '' COMMENT '区块链交易id',
`block_hash` varchar(100) DEFAULT '' COMMENT '区块链块hash',
`block_num` int(10) DEFAULT NULL COMMENT '区块链块号',
`create_name` varchar(100) DEFAULT '' COMMENT '上链用户名',
`block_time` int(10) DEFAULT NULL COMMENT '区块链交易时间',
`createtime` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `txId` (`txId`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='区块链上链信息';
下载BSN代码压缩包BSN.zip然后将extend\venyuanbsn放到根目录extend文件夹中
在api/controller中创建BSN.php
<?php
namespace app\api\controller;
use app\common\controller\Api;
use think\Exception;
use think\Log;
use think\Request;
use venyuanbsn\Config;
use venyuanbsn\NodeServer;
use venyuanbsn\SendHelper;
class Bsn extends Api{
protected $config;
public function _initialize()
{
$this->config = Config::initConfig([
'reqUrl' => 'https://xxxx.bsngate.com:17602',//证书节点地址
'appInfo' => [
'AppCode' => 'xxxxxxxx'//证书的appcode
],
'userCode' => 'xxxxxx',//身份code
'mspDir' => './mspdir',
'httpsCert' => ''
]);
parent::_initialize();
}
public function registUser()
{
$node = new NodeServer($this->config);
try {
$res = $node->RegisterUser([
'name' => 'xxxx',//姓名
'secret' => 'xxxx'//密码
]);
$this->success('success',$res,0);
} catch (Exception $e) {
Log::error('错误:'.$e->getMessage().'行:'.$e->getLine());
$this->error('错误:'.$e->getMessage(),[],-1);
}
}
/**
* 保存区块链数据
*/
public function reqChainCode()
{
try {
$baseKey = 'PR202202251002';//订单id
$data = [
'order_no' => 'xxxxx',
'appoint_time' => '2023-12-16 00:00:00',
'goods_list' => []
];//待保存的数据
$node = new NodeServer($this->config);
$value = base64_encode(json_encode($data,JSON_UNESCAPED_UNICODE));
$res = $node->ReqChainCode([
'args' => ['{"baseKey":"'.$baseKey.'","baseValue":"'.$value.'"}'],
'nonce' => SendHelper::generateRandomString(),
'chainCode' => 'cc_app0001202203021319180253003_01',
'funcName' => 'set',
'userName' => '',
'transientData' => null
]);
$header = $res->header;
if ($header->code == -1) {
Log::error('保存区块链数据失败:'.$header->msg);
$this->error('保存区块链数据失败',[],-1);
}
return $res->body->blockInfo->txId;
} catch (Exception $e) {
Log::error('调用保存区块链数据接口失败:'.$e->getMessage().'行:'.$e->getLine());
$this->error('调用保存区块链数据接口失败:'.$e->getMessage(),[],-1);
}
}
/**
* 更新区块链数据
*/
public function upChainCode()
{
try {
$baseKey = 'PR202202251002';//订单编号
$data = [
'order_no' => 'xxxx',
'appoint_time' => '2023-12-17 00:00:00',
'stock_in_data': []
];//待更新的数据
$node = new NodeServer($this->config);
$value = base64_encode(json_encode($data,JSON_UNESCAPED_UNICODE));
$res = $node->ReqChainCode([
'args' => ['{"baseKey":"'.$baseKey.'","baseValue":"'.$value.'"}'],
'nonce' => SendHelper::generateRandomString(),
'chainCode' => 'cc_app0001202203021319180253003_01',
'funcName' => 'update',
'userName' => '',
'transientData' => null
]);
$header = $res->header;
if ($header->code == -1) {
Log::error('更新区块链数据失败:'.$header->msg);
$this->error('更新区块链数据失败',[],-1);
}
return $res->body->blockInfo->txId;
} catch (Exception $e) {
Log::error('调用更新区块链数据接口失败:'.$e->getMessage().'行:'.$e->getLine());
$this->error('调用更新区块链数据接口失败:'.$e->getMessage(),[],-1);
}
}
/**
* 获取区块链上传数据
*/
public function getChainCode()
{
try {
$baseKey = 'PR202202251002';//订单id
$node = new NodeServer($this->config);
$res = $node->ReqChainCode([
'args' => [$baseKey],
'nonce' => SendHelper::generateRandomString(),
'chainCode' => 'cc_app0001202203021319180253003_01',
'funcName' => 'get',
'userName' => '',
'transientData' => null
]);
$header = $res->header;
if ($header->code == -1) {
Log::error('获取区块链数据失败:'.$header->msg);
$this->error('获取区块链数据失败',[],-1);
}
$data = $res->body->ccRes->ccData;
$data = json_decode(base64_decode($data),TRUE);
$this->success('success',$data,0);
} catch (Exception $e) {
Log::error('调用获取区块链数据接口失败:'.$e->getMessage().'行:'.$e->getLine());
$this->error('调用获取区块链数据接口失败:'.$e->getMessage(),[],-1);
}
}
/**
* 获取区块链历史数据
*/
public function getHistoryChainCode()
{
try {
$baseKey = 'PR202202251002';//订单id
$node = new NodeServer($this->config);
$res = $node->ReqChainCode([
'args' => [$baseKey],
'nonce' => SendHelper::generateRandomString(),
'chainCode' => 'cc_app0001202203021319180253003_01',
'funcName' => 'getHistory',
'userName' => '',
'transientData' => null
]);
$header = $res->header;
if ($header->code == -1) {
Log::error('获取区块链数据失败:'.$header->msg);
$this->error('获取区块链数据失败',[],-1);
}
$data = $res->body->ccRes->ccData;
$data = json_decode($data,TRUE);
$history = [];
foreach ($data as $item) {
$txId = $item['txId'];
array_push($history,$txId);
}
$this->success('success',$history,0);
} catch (Exception $e) {
Log::error('调用获取区块链数据接口失败:'.$e->getMessage().'行:'.$e->getLine());
$this->error('调用获取区块链数据接口失败:'.$e->getMessage(),[],-1);
}
}
/**
* 获取区块链交易信息
* @param $txId //区块链交易id
*/
public function getTransaction()
{
$txId = 'xxxxxx';//区块链交易id
$node = new NodeServer($this->config);
try {
$res = $node->GetTransaction([
'txId' => $txId
]);
$header = $res->header;
if ($header->code == -1) {
Log::error('获取区块链数据失败:'.$header->msg);
$this->error('获取区块链数据失败',[],-1);
}
return $res->body;
} catch (Exception $e) {
Log::error('错误:'.$e->getMessage().'行:'.$e->getLine());
$this->error('错误:'.$e->getMessage(),[],-1);
}
}
/**
* 获取区块链交易数据
*/
public function getTransdata()
{
$txId = 'xxxxxx';//区块链交易id
$node = new NodeServer($this->config);
try {
$res = $node->GetTransdata([
'txId' => $txId
]);
$header = $res->header;
if ($header->code == -1) {
Log::error('获取区块链数据失败:'.$header->msg);
$this->error('获取区块链数据失败',[],-1);
}
$res = $res->body;
$this->success('success',$res,0);
} catch (Exception $e) {
Log::error('错误:'.$e->getMessage().'行:'.$e->getLine());
$this->error('错误:'.$e->getMessage(),[],-1);
}
}
/**
* 获取区块链块信息
*/
public function getBlockInfo()
{
$txId = 'xxxxxxxxx';//区块链交易id
$node = new NodeServer($this->config);
try {
$res = $node->GetBlockInfo([
'blockNumber' => 0,
'blockHash' => '',
'txId' => $txId
]);
$header = $res->header;
if ($header->code == -1) {
Log::error('获取区块链块信息失败:'.$header->msg);
$this->error('获取区块链块信息失败',[],-1);
}
$res = $res->body;
$this->success('success',$res,0);
} catch (Exception $e) {
Log::error('调用获取区块链块信息失败:'.$e->getMessage().'行:'.$e->getLine());
$this->error('调用获取区块链块信息失败:'.$e->getMessage(),[],-1);
}
}
/**
* 获取区块链块数据
*/
public function getBlockData()
{
$txId = 'xxxxxxxx';//区块链交易id
$node = new NodeServer($this->config);
try {
$res = $node->GetBlockData([
'blockNumber' => 0,
'blockHash' => '',
'txId' => $txId,
'dataType' => ''
]);
$header = $res->header;
if ($header->code == -1) {
Log::error('获取区块链块数据失败:'.$header->msg);
$this->error('获取区块链块数据失败',[],-1);
}
$res = $res->body;
$this->success('success',$res,0);
} catch (Exception $e) {
Log::error('调用获取区块链块数据失败:'.$e->getMessage().'行:'.$e->getLine());
$this->error('调用获取区块链块数据失败:'.$e->getMessage(),[],-1);
}
}
/**
* 获取区块链最新账本信息
*/
public function getLedgerInfo()
{
$node = new NodeServer($this->config);
try {
$res = $node->GetLedgerInfo();
$header = $res->header;
if ($header->code == -1) {
Log::error('获取区块链最新账本信息失败:'.$header->msg);
$this->error('获取区块链最新账本信息失败',[],-1);
}
$res = $res->body;
$this->success('success',$res,0);
} catch (Exception $e) {
Log::error('调用获取区块链最新账本信息失败:'.$e->getMessage().'行:'.$e->getLine());
$this->error('调用获取区块链最新账本信息失败:'.$e->getMessage(),[],-1);
}
}
}
使用
public function addBlockInfo($order_no,$trace_info)
{
$bsn = new Bsn();
$block_info = db('block_list')
->field('id')
->where('order_no',$order_no)
->order('createtime','desc')
->find();
if ($block_info) {
$res = $bsn->upChainCode($order_no,$trace_info);
} else {
$res = $bsn->reqChainCode($order_no,$trace_info);
}
$txId = $res;
$trans = $bsn->getTransaction($txId);
$block_data = [
'order_no' => $order_no,
'txId' => $txId,
'block_hash' => $trans->blockHash,
'block_num' => $trans->blockNumber,
'create_name' => $trans->createName,
'block_time' => $trans->timeSpanSec,
'createtime' => date('Y-m-d H:i:s')
];
db('block_list')->insert($block_data);
}