462 lines
13 KiB
Markdown
462 lines
13 KiB
Markdown
# 拉卡拉开放平台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();
|
||
}
|
||
|
||
``` |