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();
|
|||
|
}
|
|||
|
|
|||
|
```
|