拉卡拉开放平台SDK集成
使用 autoload
在 composer.json 文件中,定义自动加载规则:
{
"autoload": {
"psr-4": {
"Lakala\\OpenAPISDK\\V2\\" : "v2/src/",
"Lakala\\OpenAPISDK\\V3\\" : "v3/src/"
}
}
}
运行 dump-autoload
配置好 composer.json 后,运行以下命令生成自动加载文件:
> composer dump-autoload
在项目中引入 autoload 文件
require __DIR__ . '/vendor/autoload.php';
拉卡拉开放平台SDK配置文件
拉卡拉开放平台SDK配置 .lklopensdk.env,根据获取的开放平台信息设置
#是否为测试环境
APP_DEBUG = true
[APP]
APP_ID = OP00000003
SERIAL_NO = 00dfba8194c41b84cf
# 生产主机地址
HOST_PRO = https://s2.lakala.com
# 测试主机地址
HOST_TEST = https://test.wsmsd.cn/sit
[CERT]
SM4_KEY = uIj6CPg1GZAY10dXFfsEAQ==
#相对当前配置文件的路径
MERCHANT_PRIVATE_KEY_PATH = ../DEV/private_key.pem
LKL_CERTIFICATE_PATH = ../DEV/lkl-apigw-v2.cer
使用
# 读取配置文件
$config = new \Lakala\OpenAPISDK\V3\Configuration();
# 指定配置,相对Configuration.php文件的路径
$config = new \Lakala\OpenAPISDK\V3\Configuration($configfile);
# 或直接传入配置信息,path为绝对路径
$config = new \Lakala\OpenAPISDK\V3\Configuration(
array(
'app_debug' => true,
'app_id' => 'OP00000003',
'serial_no' => '00dfba8194c41b84cf',
'host_pro' => 'https://s2.lakala.com',
'host_test' => 'https://test.wsmsd.cn/sit',
'sm4_key' => 'uIj6CPg1GZAY10dXFfsEAQ==',
'merchant_private_key_path' => '/path/example/RSAKeys/DEV/OP00000003_private_key.pem',
'lkl_certificate_path' => '/path/example/RSAKeys/DEV/lkl-apigw-v2.cer'
)
);
拉卡拉开放平台SDK使用
请求体加密码(SM4)
/**
* Api请求体加密码需在第二个参数设置为true,默认为false
*
* @config 配置文件
* @useSM4ForRequestBody 请求体是否用sm4加密码
*/
$api = new \Lakala\OpenAPISDK\V3\Api\******Api($config, false);
主扫交易
# 加载配置
$config = new \Lakala\OpenAPISDK\V3\Configuration();
# 多配置文件,传递config文件名,(可是相对于默认配置文件的相对路径,如:../../.lklopensdk2.env)
$config2 = new \Lakala\OpenAPISDK\V3\Configuration('.lklopensdk2.env');
$tradeLocationInfo = new \Lakala\OpenAPISDK\V3\Model\TradeLocationInfo('106.37.232.115');
/**
* 主扫交易
*
* @config 配置文件
* @useSM4ForRequestBody 请求体是否用sm4加密码
*/
$api = new \Lakala\OpenAPISDK\V3\Api\TransPreorderApi($config, false);
$request = new \Lakala\OpenAPISDK\V3\Model\TransPreorderRequest();
$request->setOutTradeNo(date('YmdHis', time()));
$request->setTotalAmount('100');
$request->setLocationInfo($tradeLocationInfo);
$request->setNotifyUrl('https://www.test.com/lakela/order/payment/callback.php');
$request->setRemark('5i - 订单支付');
# 支付宝主扫场景
$acc_busi_fields = new \Lakala\OpenAPISDK\V3\Model\TradePreorderAlipayAccBusiFields();
$acc_busi_fields->setUserId('2843132323');
$extend_params = new \Lakala\OpenAPISDK\V3\Model\TradePreorderAlipayExtendParams();
$extend_params->setSysServiceProviderId('12121');
$acc_busi_fields->setExtendParams($extend_params);
$goods_detail = new \Lakala\OpenAPISDK\V3\Model\TradePreorderAlipayGoodsDetail();
$goods_detail->setGoodsId('1042e1e1e');
$goods_detail1 = new \Lakala\OpenAPISDK\V3\Model\TradePreorderAlipayGoodsDetail();
$goods_detail1->setGoodsId('37024242');
$acc_busi_fields->setGoodsDetail([$goods_detail, $goods_detail1]);
$request->setAccBusiFields($acc_busi_fields);
/* 微信主扫场景
$acc_busi_fields = new \Lakala\OpenAPISDK\V3\Model\TradePreorderWechaAccBusiFields();
$acc_busi_fields->setUserId('2843132323');
$detail = new \Lakala\OpenAPISDK\V3\Model\TradePreorderWechaDetail;
$detail->setCostPrice('100');
$goods_detail = new \Lakala\OpenAPISDK\V3\Model\TradePreorderWechaGoodsDetail;
$goods_detail->setGoodsId('3452234');
$detail->setGoodsDetail([$goods_detail]);
$acc_busi_fields->setDetail($detail);
$request->setAccBusiFields($acc_busi_fields);
*/
/* 银联云闪付主扫场景
$acc_busi_fields = new \Lakala\OpenAPISDK\V3\Model\TradePreorderUnionPayAccBusiFields();
$acc_busi_fields->setUserId('2843132323');
$acqAddnDataOrderInfo = new \Lakala\OpenAPISDK\V3\Model\TradePreorderUnionPayAcqAddnDataOrderInfo();
$acqAddnDataOrderInfo->setTitle('标题');
$addnInfo = new \Lakala\OpenAPISDK\V3\Model\TradePreorderUnionPayAddnInfo();
$addnInfo->setLockplan('3');
$riskInfo = new \Lakala\OpenAPISDK\V3\Model\TradePreorderUnionPayRiskInfo();
$riskInfo->setItemNo('3');
$riskInfo->setOrderSource('枚举如下:微信APP扫一扫、京东金融、京东');
$riskInfo->setPayCodeId('商户收款码ID,可以是商家展业所应用的静态码/动态码所发生的终端设备唯一识别序列号');
$addnInfo->setRiskInfo($riskInfo);
$acqAddnDataOrderInfo->setAddnInfo($addnInfo);
$acc_busi_fields->setAcqAddnDataOrderInfo($acqAddnDataOrderInfo);
$acq_addn_data_goods_info = new \Lakala\OpenAPISDK\V3\Model\TradePreorderUnionPayAcqAddnDataGoodsInfo();
$acq_addn_data_goods_info->setId('1221212');
$acc_busi_fields->setAcqAddnDataGoodsInfo([$acq_addn_data_goods_info]);
$request->setAccBusiFields($acc_busi_fields);
*/
/* 网联小钱包主扫场景
$acc_busi_fields = new \Lakala\OpenAPISDK\V3\Model\TradePreorderNucspayAccBusiFields();
$acc_busi_fields->setNucIssrId('121213313');
$request->setAccBusiFields($acc_busi_fields);
*/
try {
$response = $api->transPreorder($request);
print_r($response->getRespData());
print_r($response->getAccRespFields());
echo $response->getCode();
# 响应头信息
print_r($response->getHeaders());
# 响应原文
echo $response->getOriginalText();
} catch (\Lakala\OpenAPISDK\V3\ApiException $e) {
echo $e->getMessage();
}
被扫交易
# 加载配置
$config = new \Lakala\OpenAPISDK\V3\Configuration();
$tradeLocationInfo = new \Lakala\OpenAPISDK\V3\Model\TradeLocationInfo('106.37.232.115');
/**
* 被扫交易
*
* @config 配置文件
* @useSM4ForRequestBody 请求体是否用sm4加密码
*/
$api = new \Lakala\OpenAPISDK\V3\Api\TransMicropayApi($config, false);
$request = new \Lakala\OpenAPISDK\V3\Model\TransMicropayRequest();
$request->setOutTradeNo(date('YmdHis', time()));
$request->setAuthCode('h30230nd9823f-w20189312f3ri0023jf0239423');
$request->setTotalAmount('100');
$request->setLocationInfo($tradeLocationInfo);
#支付宝被扫场景
$acc_busi_fields = new \Lakala\OpenAPISDK\V3\Model\TradeMicropayAccBusiFields();
$acc_busi_fields->setUserId('2843132323');
$extend_params = new \Lakala\OpenAPISDK\V3\Model\TradeMicropayExtendParams();
$extend_params->setSysServiceProviderId('12121');
$acc_busi_fields->setExtendParams($extend_params);
$goods_detail = new \Lakala\OpenAPISDK\V3\Model\TradeMicropayGoodsDetail();
$goods_detail->setGoodsId('1042e1e1e');
$goods_detail1 = new \Lakala\OpenAPISDK\V3\Model\TradeMicropayGoodsDetail();
$goods_detail1->setGoodsId('37024242');
$acc_busi_fields->setGoodsDetail([$goods_detail, $goods_detail1]);
$request->setAccBusiFields($acc_busi_fields);
# 微信被扫场景
/*
$acc_busi_fields = new \Lakala\OpenAPISDK\V3\Model\TradeMicropayWechaAccBusiFields();
$acc_busi_fields->setUserId('2843132323');
$detail = new \Lakala\OpenAPISDK\V3\Model\TradeMicropayWechaDetail;
$detail->setCostPrice('100');
$goods_detail = new \Lakala\OpenAPISDK\V3\Model\TradeMicropayWechaGoodsDetail;
$goods_detail->setGoodsId('3452234');
$detail->setGoodsDetail([$goods_detail]);
$acc_busi_fields->setDetail($detail);
$request->setAccBusiFields($acc_busi_fields);
*/
try {
$response = $api->transMicropay($request);
print_r($response->getRespData());
print_r($response->getAccRespFields());
echo $response->getCode();
} catch (\Lakala\OpenAPISDK\V3\ApiException $e) {
echo $e->getMessage();
}
退款交易
$api = new \Lakala\OpenAPISDK\V3\Api\RelationRefundApi($config);
$request = new \Lakala\OpenAPISDK\V3\Model\RelationRefundRequest();
$request->setOutTradeNo(date('YmdHis', time()));
$request->setRefundAmount('100');
$request->setLocationInfo($tradeLocationInfo);
try {
$response = $api->relationRefund($request);
print_r($response->getRespData());
echo $response->getCode();
} catch (\Lakala\OpenAPISDK\V3\ApiException $e) {
echo $e->getMessage();
}
查询交易
$api = new \Lakala\OpenAPISDK\V3\Api\QueryTradequeryApi($config);
$request = new \Lakala\OpenAPISDK\V3\Model\QueryTradequeryRequest();
$request->setOutTradeNo(date('YmdHis', time()));
try {
$response = $api->queryTradequery($request);
print_r($response->getRespData());
echo $response->getCode();
} catch (\Lakala\OpenAPISDK\V3\ApiException $e) {
echo $e->getMessage();
}
通用接口调用 -> 查询交易
$api = new \Lakala\OpenAPISDK\V3\Api\LakalaApi($config);
$request = new \Lakala\OpenAPISDK\V3\Model\ModelRequest();
# 请求字段
$request->setReqData([
'merchant_no' => $config->getMerchantNo(),
'term_no' => $config->getTermNo(),
'out_trade_no' => date('YmdHis', time()),
'trade_no' => '',
]);
try {
$response = $api->tradeApi('/api/v3/labs/query/tradequery', $request);
print_r($response->getRespData());
echo $response->getCode();
} catch (\Lakala\OpenAPISDK\V3\ApiException $e) {
echo $e->getMessage();
}
使用报文体接口调用 -> 查询交易
$api = new \Lakala\OpenAPISDK\V3\Api\LakalaApi($config);
try {
$body = '{"req_time":"20240929033128","version":"3.0","req_data":{"merchant_no":"822290070111135","term_no":"29034705","out_trade_no":"20240929033128","trade_no":""}}';
$response = $api->apiWithBody('/api/v3/labs/query/tradequery', $body);
print_r($response->getRespData());
echo $response->getCode();
} catch (\Lakala\OpenAPISDK\V3\ApiException $e) {
echo $e->getMessage();
}
或
$api = new \Lakala\OpenAPISDK\V3\Api\LakalaApi($config);
try {
$json = new stdClass;
$json->req_time = "20240929033128";
$json->version = "3.0";
$json->req_data = new stdClass;
$json->req_data->merchant_no = "822290070111135";
$json->req_data->term_no = "29034705";
$json->req_data->out_trade_no = "20240929033128";
$json->req_data->trade_no = "";
// json格式body
$response = $api->apiWithBody('/api/v3/labs/query/tradequery', $json);
print_r($response->getRespData());
echo $response->getCode();
} catch (\Lakala\OpenAPISDK\V3\ApiException $e) {
echo $e->getMessage();
}
拉卡拉开放平台回调示例
require_once '../../vendor/autoload.php';
$config = new \Lakala\OpenAPISDK\V3\Configuration();
$api = new \Lakala\OpenAPISDK\V3\Api\LakalaNotifyApi($config);
try {
$response = $api->notiApi();
# 响应头信息
$headers = $response->getHeaders();
# 响应原文
$originalText = $response->getOriginalText();
$obj = json_decode($originalText);
// 处理$obj中交易状态 -> 可能多次调用
// 通知拉卡拉业务处理成功
$api->success();
} catch (\Lakala\OpenAPISDK\V3\ApiException $e) {
// echo $e->getMessage();
// 通知拉卡拉发生异常
$api->fail($e->getMessage());
}
请求参数扩展
$api = new \Lakala\OpenAPISDK\V3\Api\RelationRefundApi($config);
#扩展请求参数类
class QueryTradequeryRequestExt extends \Lakala\OpenAPISDK\V3\Model\RelationRefundRequest implements \JsonSerializable
{
protected $ext1;
public function setExt1($ext1)
{
$this->ext1 = $ext1;
return $this;
}
public function getExt1()
{
return $this->ext1;
}
public function jsonSerialize()
{
$js = parent::jsonSerialize();
$js['ext1'] = $this->ext1;
return $js;
}
}
$request = new QueryTradequeryRequestExt();
#扩展请求参数赋值
$request->setExt1('hello ext 1');
try {
$response = $api->relationRefund($request);
} catch (\Lakala\OpenAPISDK\V3\ApiException $e) {
echo $e->getMessage();
}
响应字段扩展
#扩展响应字段数类
class RelationRefundResponseExt extends \Lakala\OpenAPISDK\V3\Model\RelationRefundResponse implements \JsonSerializable
{
protected $ext1;
public function setExt1($ext1)
{
$this->ext1 = $ext1;
return $this;
}
public function getExt1()
{
return $this->ext1;
}
}
#扩展请求类
class RelationRefundApiExt extends \Lakala\OpenAPISDK\V3\Api\RelationRefundApi
{
public function relationRefundExt($relationRefundRequest)
{
$resourcePath = '/api/v3/labs/relation/refund';
return $this->tradeApi($resourcePath, $relationRefundRequest, 'RelationRefundResponseExt');
}
}
$api = new RelationRefundApiExt($config);
$request = new \Lakala\OpenAPISDK\V3\Model\RelationRefundRequest();
try {
$response = $api->relationRefundExt($request);
} catch (\Lakala\OpenAPISDK\V3\ApiException $e) {
echo $e->getMessage();
}