2025-08-01 11:39:06 +08:00

462 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 拉卡拉开放平台SDK集成
### 使用 autoload
在 composer.json 文件中,定义自动加载规则:
```config
{
"autoload": {
"psr-4": {
"Lakala\\OpenAPISDK\\V2\\" : "v2/src/",
"Lakala\\OpenAPISDK\\V3\\" : "v3/src/"
}
}
}
```
### 运行 dump-autoload
配置好 composer.json 后,运行以下命令生成自动加载文件:
```shell
> composer dump-autoload
```
### 在项目中引入 autoload 文件
```php
require __DIR__ . '/vendor/autoload.php';
```
### 拉卡拉开放平台SDK配置文件
拉卡拉开放平台SDK配置 .lklopensdk.env根据获取的开放平台信息设置
```config
#是否为测试环境
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
```
使用
```php
# 读取配置文件
$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
```php
/**
* Api请求体加密码需在第二个参数设置为true,默认为false
*
* @config 配置文件
* @useSM4ForRequestBody 请求体是否用sm4加密码
*/
$api = new \Lakala\OpenAPISDK\V3\Api\******Api($config, false);
```
## 主扫交易
```php
# 加载配置
$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();
}
```
## 被扫交易
```php
# 加载配置
$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();
}
```
## 退款交易
```php
$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();
}
```
## 查询交易
```php
$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();
}
```
## 通用接口调用 -> 查询交易
```php
$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();
}
```
## 使用报文体接口调用 -> 查询交易
```php
$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();
}
```
```php
$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();
}
```
## 拉卡拉开放平台回调示例
```php
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());
}
```
## 请求参数扩展
```php
$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();
}
```
## 响应字段扩展
```php
#扩展响应字段数类
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();
}
```