Compare commits

..
15 Commits
Author SHA1 Message Date
black1552 9126cbf2c4 Merge branch 'menu' of https://github.com/black1552/lkl_sdk into menu 2025-10-21 19:33:14 +08:00
black1552 786dbf7ce9 新增微支付交易基础文件结构
添加微支付交易模块的基础文件,包括api、请求和响应文件
2025-10-21 19:27:26 +08:00
maguodong 54917f8985 feat(basePay): 添加测试环境支持和新功能
- 为 transPreorder 和 relationClose 添加测试环境请求方法
- 更新所有模块导入路径,统一使用新的 common 包
- 重构多个结构体和服务命名以提高一致性
- 新增 labs 包整合基础支付相关功能模块
- 创建 SDK 入口文件便于统一管理和调用
- 在 consts 中增加 BASE_TEST_URL 常量定义
- 优化请求数据结构体字段注释和文档标签
- 移除冗余代码并调整部分函数签名以增强可读性
2025-10-21 14:34:42 +08:00
black1552 7b9657a9e8 重构账户与商户服务模块
- 移除旧版 account.go 文件中的账户服务实现
- 新增聚合扫码关单、退款、撤销等接口实现
- 新增聚合被扫、主扫及加密接口实现
- 新增交易查询与支付宝吱口令申请接口
- 重构统一退货及退货查询接口,优化泛型使用
- 移除旧版商户进件相关接口实现
- 调整部分服务结构体命名与参数传递方式
- 统一请求时间格式并优化代码结构
2025-10-21 13:24:24 +08:00
maguodong 7777630306 修改商户附件字段名称
- 将 FileData 结构体中的 AttField 字段重命名为 AttFileId
- 保持 AttType 字段不变
- 更新相关注释说明文件编号的含义
2025-10-16 16:46:07 +08:00
maguodong de64d7b076 优化JSON日志输出格式
- 将reqJson的日志输出格式从%+v改为%v
- 使用string()方法确保JSON数据以字符串形式输出
- 避免复杂结构体的冗余字段展示
2025-10-16 16:08:31 +08:00
maguodong 02cab5fbde refactor(common):优化JSON清理和签名生成逻辑
- 移除多余的json.Marshal调用,直接传递结构体给签名函数
- 修改CleanJSON函数返回类型从string改为[]byte
- 更新日志输出格式,使用%+v显示完整结构体内容
- 简化请求数据处理流程,提高代码可读性
- 修复潜在的JSON序列化性能问题
2025-10-16 16:05:06 +08:00
maguodong adabb186f0 重构客户端引用以使用公共包
- 将 lklsdk.Client 替换为 common.Client
- 更新所有服务初始化方法参数类型
- 修改配置字段访问方式从 c.config 到 c.Config
- 统一请求方法调用为 DoRequest
- 移除重复的 client.go 文件实现
- 调整 trade.go 中 OutOrgCode 的获取路径
2025-10-16 15:46:09 +08:00
maguodong 90f319f763 添加请求JSON日志记录功能
- 引入g.Log()模块用于日志记录
- 在JSON序列化前添加清理后JSON数据的日志输出
- 提升调试和问题排查能力
2025-10-16 15:36:38 +08:00
maguodong 9813be8873 实现JSON请求数据自动清理空值功能
- 在DoRequest方法中集成JSON数据清理逻辑
- 新增CleanJSON函数用于移除JSON中的空值和0值字段
- 添加递归清理map和slice数据结构的支持
- 实现isEmptyValue函数检测各种类型的空值
- 添加isCleanedValueEmpty函数检查清理后数据是否为空
- 引入gjson库用于JSON编解码操作
2025-10-16 15:26:47 +08:00
maguodong de77aa78b1 更新商户相关模型结构体字段
- 修改 MerchantApplyRequest 中 req_data 的 json 标签为 reqData
- 在 MerchantApplyResponse 中新增 Md 字段
- 在 MerValidateResponse 中新增 Md 和 RespData 字段
- 新增 MerValidateResponseData 结构体定义
- 在 QueryMerResponse 中新增 Md 字段
- 调整 QueryMerResponseData 字段顺序并新增 OrgCode 和 ContractId 字段
- 在 ReConfSubmitResponse 中新增 Md 和 RespData 字段
- 新增 ReConfSubmitResponseData 结构体定义
2025-10-15 10:22:25 +08:00
maguodong 290d3e6ba7 实现统一退货相关API功能
- 新增合单退货、退货、退货查询等API接口
- 使用gtime替代time包处理时间格式
- 新增客户端签名生成和HTTP请求发送逻辑
- 定义统一退货相关请求和响应数据结构
- 实现拉卡拉SDK统一退货服务实例化方法
2025-10-11 18:12:52 +08:00
maguodong 7974b4d570 feat(account): 新增账户管理标志类型定义
- 在 consts/account.go 中新增 MgtFlag 类型及其常量定义
- 将 model/balanceQuery.go 中的 MgtFlag 字段类型从 string 改为 consts.MgtFlag
- 更新 README.md 中的目录结构,新增 merchant.go 和 uploadFile.go 文件说明
- 在 README.md 示例代码中使用 consts 包中的常量替换硬编码字符串
- 添加详细的错误处理说明及多个新功能使用示例到 README.md
- 引入 github.com/google/uuid 依赖包并更新 go.mod 文件
- 在示例代码中增加对支付类型、管理标志等字段的具体常量引用
2025-10-11 10:25:41 +08:00
maguodong 38b8d577cc 添加地址码常量定义文件
- 新增 addrCode.go 文件,定义全国及各省市县级地区码常量
- 地区码常量命名采用拼音大写加下划线格式
- 常量值对应 NEW.xlsx 表格中的地区编码
- 包含从国家级到县级的完整行政区域代码枚举
- 每个常量均附带详细注释说明所属地区名称
2025-10-10 19:32:58 +08:00
maguodong 5824ed7eef 引入账户相关常量和类型定义
- 新增附件类型(AttType)常量定义,包括身份证、银行卡、营业执照等16种类型
- 新增分账范围(SplitRange)常量,支持全部交易分账和标记交易分账
- 新增分账资金来源(SepFundSource)常量,区分交易分账和余额分账
- 新增分账发起模式(SplitLaunchMode)常量,支持自动、规则指定和手动分账
- 新增分账结算类型(SplitSettleType)常量,支持主扫现结和交易自动结算
- 新增分账规则来源(SplitRuleSource)常量,区分商户规则和平台规则
- 新增账户类型码(AcctTypeCode)常量,支持对公和对私账户- 新增账户证件类型(AcctCertificateType)常量,支持身份证、护照等多种证件
- 新增分账计算类型(CalType)常量,支持固定金额和比例分账
- 新增支付类型(PayType)常量,支持收款、付款、分账等6种账户类型
- 修改ApplyBindAttachment.AttachType类型为consts.AttType
- 修改ApplyLedgerMerRequest.SplitRange类型为consts.SplitRange
- 修改ApplyLedgerMerRequest.SepFundSource类型为consts.SepFundSource- 修改ApplyLedgerMerRequest.SplitLaunchMode类型为consts.SplitLaunchMode
- 修改ApplyLedgerMerRequest.SettleType类型为consts.SplitSettleType- 修改ApplyLedgerMerRequest.SplitRuleSource类型为consts.SplitRuleSource- 修改ApplyLedgerReceiverRequest.AcctTypeCode类型为consts.AcctTypeCode
- 修改BalanceQueryRequest.PayType类型为consts.PayType
- 修改MergePreorderReqData.AccountType类型为consts.AccountType
- 修改MergePreorderReqData.TransType类型为consts.TransType
- 修改PreorderReqData.AccountType类型为consts.AccountType
- 修改PreorderReqData.TransType类型为consts.TransType
- 修改PreorderReqData.SettleType类型为consts.SettleType
- 修改RefundReqData.RefundAccMode类型为consts.RefundAccMode
- 修改RefundReqData.RefundAmtSts类型为consts.RefundAmtSts
- 新增AccountType常量定义,支持微信、支付宝、银联等10种账户类型
- 新增TransType常量定义,支持NATIVE、JSAPI、小程序等4种接入方式
- 新增SettleType常量定义,支持常规结算和分账通结算- 新增RefundAccMode常量定义,支持4种退款账户模式
- 新增RefundAmtSts常量定义,支持分账前后退款状态区分
2025-10-10 14:47:25 +08:00
81 changed files with 3502 additions and 1490 deletions
+301 -9
View File
@@ -6,13 +6,15 @@
```
lklsdk/
├── client.go # 核心客户端
├── client.go # 核心客户端
├── split_ledger.go # 分账基本功能
├── split_ledger_more.go # 分账扩展功能
├── trade.go # 交易相关功能
├── account.go # 账户相关功能
├── merge_pre.go # 主扫合单交易功能
└── sdk.go # SDK主入口
├── trade.go # 交易相关功能
├── account.go # 账户相关功能
├── merge_pre.go # 主扫合单交易功能
├── sdk.go # SDK主入口
├── merchant.go # 商户相关功能
└── uploadFile.go # 文件上传相关功能
```
## 安装
@@ -30,6 +32,7 @@ go get -u github.com/black1552/lkl_sdk
import (
"github.com/black1552/lkl_sdk/lklsdk"
"github.com/black1552/lkl_sdk/model"
"github.com/black1552/lkl_sdk/consts"
"github.com/gogf/gf/v2/os/gctx"
)
@@ -122,7 +125,7 @@ applyLedgerReq := &model.ApplyLedgerMerReqData{
SplitLowestRatio: 3.51, // 最低分账比例
SplitEntrustFileName: "授权委托书.pdf", // 授权委托书文件名
SplitEntrustFilePath: "path", // 授权委托书文件路径
SplitRange: "ALL", // 分账范围(ALL全部交易分账,MARK标记交易分账)
SplitRange: consts.SPLIT_RANGE_ALL, // 分账范围(ALL全部交易分账,MARK标记交易分账)
RetUrl: "notifyUrl.com", // 回调URL
}
@@ -181,7 +184,7 @@ splitLedgerReq := &model.OrderSplitLedgerReqData{
OutSeparateNo: "", // 商户分账指令流水号
TotalAmt: "", // 分账总金额,单位为分
LklOrgNo: "", // 拉卡拉机构编号
CalType: "", // 分账计算类型(0-按金额,1-按比例)
CalType: consts.CAL_TYPE_AMOUNT, // 分账计算类型(0-按金额,1-按比例)
NotifyUrl: "", // 回调地址
RecvDatas: recvDatas, // 分账接收方数据
}
@@ -242,8 +245,8 @@ balanceQueryReq := &model.BalanceQueryReqData{
MerchantNo: config.MerchantNo,
OrgNo: "", // 机构号
PayNo: "", // 支付单号
PayType: "", // 支付类型
MgtFlag: "", // 管理标志
PayType: consts.PAY_TYPE_CARD, // 支付类型(CARD-卡支付,COUPON-优惠券支付,DISCOUNT-折扣支付,POINT-积分支付,MIX-混合支付)
MgtFlag: consts.MGT_FLAG_NO, // 管理标志(NO-普通交易,YES-管理交易)
}
// 调用接口
@@ -282,6 +285,295 @@ if !resp.SuccessOrFail() {
// 使用resp获取返回的数据
```
### 7. 账户提现
```go
// 初始化特定响应类型的SDK
sdk := lklsdk.NewSDK[model.WithdrawResponse](gctx.New(), cfgJson)
// 构建请求参数
withdrawReq := &model.WithdrawReqData{
MerchantNo: "your_merchant_no", // 商户号
TermNo: "your_term_no", // 终端号
OutTradeNo: "your_withdraw_out_trade_no", // 提现商户流水号
Amount: "10000", // 提现金额,单位为分
Currency: "CNY", // 货币类型
AccountType: "WECHAT", // 账户类型
}
// 调用接口
withdrawResp, err := sdk.Withdraw(withdrawReq)
if err != nil {
log.Printf("账户提现失败: %v\n", err)
}
// 使用SuccessOrFail方法判断请求是否成功
if !withdrawResp.SuccessOrFail() {
log.Printf("账户提现失败: %s\n", withdrawResp.Msg)
}
```
### 8. 商户进件
```go
// 初始化特定响应类型的SDK
sdk := lklsdk.NewSDK[model.MerchantApplyResponse](gctx.New(), cfgJson)
// 构建请求参数
merchantApplyReq := &model.MerchantApplyReqData{
// 填写商户进件所需的各项参数
MerchantName: "商户名称",
ContactName: "联系人姓名",
ContactPhone: "联系电话",
// ... 其他必要参数
}
// 调用接口
merchantApplyResp, err := sdk.AddMer(merchantApplyReq)
if err != nil {
log.Printf("商户进件失败: %v\n", err)
}
// 使用SuccessOrFail方法判断请求是否成功
if !merchantApplyResp.SuccessOrFail() {
log.Printf("商户进件失败: %s\n", merchantApplyResp.Msg)
}
```
### 9. 商户进件信息查询
```go
// 初始化特定响应类型的SDK
sdk := lklsdk.NewSDK[model.QueryMerResponse](gctx.New(), cfgJson)
// 构建请求参数
queryMerReq := &model.QueryMerRequestData{
MerchantNo: "your_merchant_no", // 商户号
// ... 其他必要参数
}
// 调用接口
queryMerResp, err := sdk.QueryMerchant(queryMerReq)
if err != nil {
log.Printf("商户进件信息查询失败: %v\n", err)
}
// 使用SuccessOrFail方法判断请求是否成功
if !queryMerResp.SuccessOrFail() {
log.Printf("商户进件信息查询失败: %s\n", queryMerResp.Msg)
}
```
### 10. 商户进件信息校验
```go
// 初始化特定响应类型的SDK
sdk := lklsdk.NewSDK[model.MerValidateResponse](gctx.New(), cfgJson)
// 构建请求参数
merValidateReq := &model.MerValidateRequestData{
// 填写商户进件校验所需的各项参数
MerchantName: "商户名称",
// ... 其他必要参数
}
// 调用接口
merValidateResp, err := sdk.MerValidate(merValidateReq)
if err != nil {
log.Printf("商户进件信息校验失败: %v\n", err)
}
// 使用SuccessOrFail方法判断请求是否成功
if !merValidateResp.SuccessOrFail() {
log.Printf("商户进件信息校验失败: %s\n", merValidateResp.Msg)
}
```
### 11. 商户进件复议提交
```go
// 初始化特定响应类型的SDK
sdk := lklsdk.NewSDK[model.ReConfSubmitResponse](gctx.New(), cfgJson)
// 构建请求参数
reConfSubmitReq := &model.ReConfSubmitRequestData{
// 填写商户进件复议所需的各项参数
MerchantNo: "your_merchant_no",
// ... 其他必要参数
}
// 调用接口
reConfSubmitResp, err := sdk.ReconsiderSubmit(reConfSubmitReq)
if err != nil {
log.Printf("商户进件复议提交失败: %v\n", err)
}
// 使用SuccessOrFail方法判断请求是否成功
if !reConfSubmitResp.SuccessOrFail() {
log.Printf("商户进件复议提交失败: %s\n", reConfSubmitResp.Msg)
}
```
### 12. 聚合预下单
```go
// 初始化特定响应类型的SDK
sdk := lklsdk.NewSDK[model.PreorderResponse](gctx.New(), cfgJson)
// 构建请求参数
preOrderReq := &model.PreorderReqData{
MerchantNo: "your_merchant_no", // 商户号
TermNo: "your_term_no", // 终端号
OutTradeNo: "your_out_trade_no", // 商户交易流水号
AccountType: "WECHAT", // 账户类型
TransType: "71", // 交易类型
Amount: "100", // 金额,单位为分
Subject: "测试订单", // 订单标题
NotifyUrl: "https://your-notify-url.com", // 回调地址
}
// 调用接口
preOrderResp, err := sdk.PreOrder(preOrderReq)
if err != nil {
log.Printf("聚合预下单失败: %v\n", err)
}
// 使用SuccessOrFail方法判断请求是否成功
if !preOrderResp.SuccessOrFail() {
log.Printf("聚合预下单失败: %s\n", preOrderResp.Msg)
}
```
### 13. 文件上传查询
```go
// 初始化特定响应类型的SDK
sdk := lklsdk.NewSDK[model.UploadFileResponse](gctx.New(), cfgJson)
// 构建请求参数
uploadFileReq := &model.UploadFileReqData{
// 填写文件上传查询所需的各项参数
// ...
}
// 调用接口
uploadFileResp, err := sdk.UploadFileQuery(uploadFileReq)
if err != nil {
log.Printf("文件上传查询失败: %v\n", err)
}
// 使用SuccessOrFail方法判断请求是否成功
if !uploadFileResp.SuccessOrFail() {
log.Printf("文件上传查询失败: %s\n", uploadFileResp.Msg)
}
```
### 14. 分账接收方创建申请
```go
// 初始化特定响应类型的SDK
sdk := lklsdk.NewSDK[model.ApplyLedgerReceiverResponse](gctx.New(), cfgJson)
// 构建请求参数
applyLedgerReceiverReq := &model.ApplyLedgerReceiverReqData{
MerchantNo: "your_merchant_no", // 商户号
TermNo: "your_term_no", // 终端号
ReceiverType: "PERSON", // 接收方类型
ReceiverName: "接收方名称", // 接收方名称
ReceiverNo: "接收方编号", // 接收方编号
ReceiverAccNo: "接收方账号", // 接收方账号
// ... 其他必要参数
}
// 调用接口
applyLedgerReceiverResp, err := sdk.ApplyLedgerReceiver(applyLedgerReceiverReq)
if err != nil {
log.Printf("分账接收方创建申请失败: %v\n", err)
}
// 使用SuccessOrFail方法判断请求是否成功
if !applyLedgerReceiverResp.SuccessOrFail() {
log.Printf("分账接收方创建申请失败: %s\n", applyLedgerReceiverResp.Msg)
}
```
### 15. 分账关系绑定申请
```go
// 初始化特定响应类型的SDK
sdk := lklsdk.NewSDK[model.ApplyBindResponse](gctx.New(), cfgJson)
// 构建请求参数
applyBindReq := &model.ApplyBindReqData{
MerchantNo: "your_merchant_no", // 商户号
TermNo: "your_term_no", // 终端号
ReceiverType: "PERSON", // 接收方类型
ReceiverNo: "接收方编号", // 接收方编号
BindType: "1", // 绑定类型
// ... 其他必要参数
}
// 调用接口
applyBindResp, err := sdk.ApplyBind(applyBindReq)
if err != nil {
log.Printf("分账关系绑定申请失败: %v\n", err)
}
// 使用SuccessOrFail方法判断请求是否成功
if !applyBindResp.SuccessOrFail() {
log.Printf("分账关系绑定申请失败: %s\n", applyBindResp.Msg)
}
```
### 16. 可分账金额查询
```go
// 初始化特定响应类型的SDK
sdk := lklsdk.NewSDK[model.SplitBalanceResponse](gctx.New(), cfgJson)
// 构建请求参数
splitBalanceReq := &model.SplitBalanceReqData{
MerchantNo: "your_merchant_no", // 商户号
TermNo: "your_term_no", // 终端号
// ... 其他必要参数
}
// 调用接口
splitBalanceResp, err := sdk.QuerySplitBalance(splitBalanceReq)
if err != nil {
log.Printf("可分账金额查询失败: %v\n", err)
}
// 使用SuccessOrFail方法判断请求是否成功
if !splitBalanceResp.SuccessOrFail() {
log.Printf("可分账金额查询失败: %s\n", splitBalanceResp.Msg)
}
```
## 错误处理
SDK使用两层错误处理机制,请确保同时检查网络错误和业务响应状态:
```go
// 1. 首先检查网络或SDK层面的错误
resp, err := sdk.SomeFunction(req)
if err != nil {
log.Printf("调用接口失败: %v\n", err)
// 处理网络错误或SDK内部错误
return err
}
// 2. 然后使用SuccessOrFail()方法判断业务响应是否成功
if !resp.SuccessOrFail() {
log.Printf("业务处理失败: %s\n", resp.Msg) // 或resp.RetMsg
// 处理业务失败情况
return errors.New("业务处理失败")
}
// 处理成功响应
// 使用resp获取返回的数据
```
## 注意事项
1. 请妥善保管您的AppID、商户号、密钥等敏感信息
+34
View File
@@ -0,0 +1,34 @@
package transpreorder
import (
"github.com/black1552/lkl_sdk/common"
"github.com/black1552/lkl_sdk/consts"
"github.com/gogf/gf/v2/os/gtime"
)
type TransPreorder struct {
client *common.Client[TransPreorderResponse]
}
func NewTransPreorderApi(client *common.Client[TransPreorderResponse]) *TransPreorder {
return &TransPreorder{client: client}
}
func (tp *TransPreorder) TransPreorder(reqData *TransPreorderRequestData) (*TransPreorderResponse, error) {
// 构建请求结构体
request := &TransPreorderRequest{
ReqTime: gtime.Now().Format("YmdHis"),
Version: "3.0",
ReqData: reqData,
}
return tp.client.DoRequest(consts.BASE_URL+consts.LKL_DCP_TRANS_PREORDER_URL, request)
}
func (tp *TransPreorder) TransPreorderTest(reqData *TransPreorderRequestData) (*TransPreorderResponse, error) {
// 构建请求结构体
request := &TransPreorderRequest{
ReqTime: gtime.Now().Format("YmdHis"),
Version: "3.0",
ReqData: reqData,
}
return tp.client.DoRequest(consts.BASE_TEST_URL+consts.LKL_DCP_TRANS_PREORDER_URL, request)
}
+16
View File
@@ -0,0 +1,16 @@
package transpreorder
type TransPreorderRequest struct {
ReqTime string `json:"req_time"`
Version string `json:"version"`
ReqData *TransPreorderRequestData `json:"req_data"`
}
type TransPreorderRequestData struct {
OutTradeNo string `json:"out_trade_no"`
TotalAmount string `json:"total_amount"`
Subject string `json:"subject"`
Body string `json:"body"`
NotifyUrl string `json:"notify_url"`
ExpireTime string `json:"expire_time"`
}
+4
View File
@@ -0,0 +1,4 @@
package transpreorder
type TransPreorderResponse struct {
}
+39
View File
@@ -0,0 +1,39 @@
package labs
import (
"context"
relationclose "github.com/black1552/lkl_sdk/basePay/labs/relationClose"
"github.com/black1552/lkl_sdk/basePay/labs/relationRefund"
"github.com/black1552/lkl_sdk/basePay/labs/relationRevoked"
transmicropay "github.com/black1552/lkl_sdk/basePay/labs/transMicropay"
"github.com/black1552/lkl_sdk/basePay/labs/transMicropayEncry"
"github.com/black1552/lkl_sdk/basePay/labs/transPreorder"
"github.com/black1552/lkl_sdk/basePay/labs/transPreorederEncry"
transquery "github.com/black1552/lkl_sdk/basePay/labs/transQuery"
"github.com/black1552/lkl_sdk/common"
)
type Labs struct {
RelationClose *relationclose.RelationCloseServer
RelationRefund *relationRefund.RelationRefundServer
RelationRevoked *relationRevoked.RelationRevokedServer
TransMicropay *transmicropay.TransMicropayServer
TransMicropayEncry *transMicropayEncry.TransMicropayEncryServer
TransPreorder *transPreorder.TransPreorderServer
TransPreorderEncry *transPreorederEncry.TransPreorderEncryServer
TransQuery *transquery.TransQueryServer
}
func NewLabs(ctx context.Context, cfgJson string) *Labs {
return &Labs{
RelationClose: relationclose.NewRelationCloseServer(common.NewClient[relationclose.RelationCloseResponse](ctx, cfgJson)),
RelationRefund: relationRefund.NewRelationRefundServer(common.NewClient[relationRefund.RelationRefundResponse](ctx, cfgJson)),
RelationRevoked: relationRevoked.NewRelationRevokedServer(common.NewClient[relationRevoked.RelationRevokedResponse](ctx, cfgJson)),
TransMicropay: transmicropay.NewTransMicropayServer(common.NewClient[transmicropay.TransMicropayResponse](ctx, cfgJson)),
TransMicropayEncry: transMicropayEncry.NewTransMicropayEncryServer(common.NewClient[transMicropayEncry.TransMicropayEncryResponse](ctx, cfgJson)),
TransPreorder: transPreorder.NewTransPreorderServer(common.NewClient[transPreorder.TransPreorderResponse](ctx, cfgJson)),
TransPreorderEncry: transPreorederEncry.NewTransPreorderEncryServer(common.NewClient[transPreorederEncry.TransPreorederEncryResponse](ctx, cfgJson)),
TransQuery: transquery.NewTransQueryServer(common.NewClient[transquery.TransQueryResponse](ctx, cfgJson)),
}
}
+51
View File
@@ -0,0 +1,51 @@
package relationclose
import (
"github.com/black1552/lkl_sdk/common"
"github.com/black1552/lkl_sdk/consts"
"github.com/gogf/gf/v2/os/gtime"
)
// RelationCloseServer 聚合扫码关单API结构体
type RelationCloseServer struct {
Client *common.Client[RelationCloseResponse]
}
// NewAPI 创建聚合扫码关单API实例
func NewRelationCloseServer(client *common.Client[RelationCloseResponse]) *RelationCloseServer {
return &RelationCloseServer{
Client: client,
}
}
// RelationClose 执行聚合扫码关单请求
// - merchantNo: 商户号
// - termNo: 终端号
// - 原交易标识:originOutTradeNo、originTradeNo、(originOutOrderSource+originOutOrderNo) 三者必选其一
// - locationInfo: 地址位置信息(风控要求必送)
func (a *RelationCloseServer) RelationClose(reqData *RelationCloseRequestData) (*RelationCloseResponse, error) {
// 构建请求结构体
request := &RelationCloseRequest{
ReqTime: gtime.Now().Format("YmdHis"),
Version: "3.0",
ReqData: reqData,
}
// 发送请求 - 使用consts中定义的聚合扫码关单URL
return a.Client.DoRequest(consts.BASE_URL+consts.LKL_BASE_URL_RELATION_CLOSE_URL, request)
}
// RelationCloseTest 执行聚合扫码关单测试请求
// - merchantNo: 商户号
// - termNo: 终端号
// - 原交易标识:originOutTradeNo、originTradeNo、(originOutOrderSource+originOutOrderNo) 三者必选其一
// - locationInfo: 地址位置信息(风控要求必送)
func (a *RelationCloseServer) RelationCloseTest(reqData *RelationCloseRequestData) (*RelationCloseResponse, error) {
// 构建请求结构体
request := &RelationCloseRequest{
ReqTime: gtime.Now().Format("YmdHis"),
Version: "3.0",
ReqData: reqData,
}
// 发送请求 - 使用consts中定义的聚合扫码关单URL
return a.Client.DoRequest(consts.BASE_TEST_URL+consts.LKL_BASE_URL_RELATION_CLOSE_URL, request)
}
+26
View File
@@ -0,0 +1,26 @@
package relationclose
// LocationInfo 地址位置信息结构体
type LocationInfo struct {
RequestIP string `json:"request_ip"` // 请求方IP地址 (必填)
BaseStation string `json:"base_station,omitempty"` // 基站信息 (可选)
Location string `json:"location,omitempty"` // 纬度,经度 (可选)
}
// RelationCloseRequestData 聚合扫码关单请求数据结构体
type RelationCloseRequestData struct {
MerchantNo string `json:"merchant_no" dc:"商户号 (必填)"` // 商户号 (必填)
TermNo string `json:"term_no" dc:"终端号 (必填)"` // 终端号 (必填)
OriginOutTradeNo string `json:"origin_out_trade_no,omitempty" dc:"原商户交易流水号 (可选)"` // 原商户交易流水号 (可选)
OriginTradeNo string `json:"origin_trade_no,omitempty" dc:"原交易拉卡拉交易流水号 (可选)"` // 原交易拉卡拉交易流水号 (可选)
OriginOutOrderSource string `json:"origin_out_order_source,omitempty" dc:"原订单外部订单来源 (可选)"` // 原订单外部订单来源 (可选)
OriginOutOrderNo string `json:"origin_out_order_no,omitempty" dc:"原订单外部商户订单号 (可选)"` // 原订单外部商户订单号 (可选)
LocationInfo *LocationInfo `json:"location_info" dc:"地址位置信息 (必填)"` // 地址位置信息 (必填)
}
// RelationCloseRequest 聚合扫码关单请求结构体
type RelationCloseRequest struct {
ReqTime string `json:"req_time"`
Version string `json:"version"`
ReqData *RelationCloseRequestData `json:"req_data"`
}
+23
View File
@@ -0,0 +1,23 @@
package relationclose
// RelationCloseResponseData 聚合扫码关单响应数据结构体
type RelationCloseResponseData struct {
OriginTradeNo string `json:"origin_trade_no"` // 原拉卡拉订单号
OriginOutTradeNo string `json:"origin_out_trade_no"` // 原商户请求流水号
OriginOutOrderSource string `json:"origin_out_order_source,omitempty"` // 原订单外部订单来源
OriginOutOrderNo string `json:"origin_out_order_no,omitempty"` // 原订单外部商户订单号
TradeTime string `json:"trade_time"` // 交易时间
}
// RelationCloseResponse 聚合扫码关单响应结构体
type RelationCloseResponse struct {
RespTime string `json:"resp_time"`
Code string `json:"code"`
Msg string `json:"msg"`
RespData *RelationCloseResponseData `json:"resp_data,omitempty"`
}
// SuccessOrFail 判断响应是否成功
func (r *RelationCloseResponse) SuccessOrFail() bool {
return r.Code == "BBS00000"
}
+33
View File
@@ -0,0 +1,33 @@
package relationRefund
import (
"github.com/black1552/lkl_sdk/common"
"github.com/black1552/lkl_sdk/consts"
"github.com/gogf/gf/v2/os/gtime"
)
// RelationRefundServer 聚合扫码退款API结构体
type RelationRefundServer struct {
Client *common.Client[RelationRefundResponse]
}
// NewRelationRefundServer 创建聚合扫码退款API实例
func NewRelationRefundServer(client *common.Client[RelationRefundResponse]) *RelationRefundServer {
return &RelationRefundServer{
Client: client,
}
}
// RelationRefund 聚合扫码退款方法
// - reqData: 退款请求数据
func (a *RelationRefundServer) RelationRefund(reqData *RelationRefundRequestData) (*RelationRefundResponse, error) {
// 构建请求结构体
request := &RelationRefundRequest{
ReqTime: gtime.Now().Format("20060102150405"),
Version: "3.0",
ReqData: reqData,
}
// 调用Client发送请求
return a.Client.DoRequest(consts.BASE_URL+consts.LKL_BASE_URL_RELATION_REFUND_URL, request)
}
+29
View File
@@ -0,0 +1,29 @@
package relationRefund
// LocationInfo 地址位置信息结构体
type LocationInfo struct {
RequestIP string `json:"request_ip"` // 请求方IP地址,必填
BaseStation string `json:"base_station,omitempty"` // 基站信息,可选
Location string `json:"location,omitempty"` // 维度,经度,可选
}
// RelationRefundRequestData 聚合扫码退款请求数据结构体
type RelationRefundRequestData struct {
MerchantNo string `json:"merchant_no"` // 商户号,必填
TermNo string `json:"term_no"` // 终端号,必填
OutTradeNo string `json:"out_trade_no"` // 商户交易流水号,必填
RefundAmount string `json:"refund_amount"` // 退款金额,必填
RefundReason string `json:"refund_reason"` // 退款原因,必填
OriginOutTradeNo string `json:"origin_out_trade_no,omitempty"` // 原商户交易流水号,可选(退款时origin_out_trade_no,origin_trade_no,origin_log_no必送其一)
OriginTradeNo string `json:"origin_trade_no,omitempty"` // 原拉卡拉交易流水号,可选
OriginLogNo string `json:"origin_log_no,omitempty"` // 原对账单流水号,可选
TradeReqDate string `json:"trade_req_date,omitempty"` // 交易请求日期,可选(送原商户交易流水号退款时必填)
LocationInfo LocationInfo `json:"location_info"` // 地址位置信息,必填
}
// RelationRefundRequest 聚合扫码退款请求结构体
type RelationRefundRequest struct {
ReqTime string `json:"req_time"`
Version string `json:"version"`
ReqData *RelationRefundRequestData `json:"req_data"`
}
+34
View File
@@ -0,0 +1,34 @@
package relationRefund
// RelationRefundResponseData 聚合扫码退款响应数据结构体
type RelationRefundResponseData struct {
MerchantNo string `json:"merchant_no"` // 商户号
OutTradeNo string `json:"out_trade_no"` // 商户请求流水号
TradeNo string `json:"trade_no"` // 拉卡拉退款单号
LogNo string `json:"log_no"` // 拉卡拉对账单流水号
AccTradeNo string `json:"acc_trade_no,omitempty"` // 账户端交易订单号
AccountType string `json:"account_type,omitempty"` // 钱包类型
TotalAmount string `json:"total_amount"` // 交易金额
RefundAmount string `json:"refund_amount"` // 申请退款金额
PayerAmount string `json:"payer_amount"` // 实际退款金额
TradeTime string `json:"trade_time,omitempty"` // 退款时间
OriginTradeNo string `json:"origin_trade_no,omitempty"` // 原拉卡拉订单号
OriginOutTradeNo string `json:"origin_out_trade_no,omitempty"` // 原商户请求流水号
UpIssAddnData string `json:"up_iss_addn_data,omitempty"` // 单品营销附加数据
UpCouponInfo string `json:"up_coupon_info,omitempty"` // 银联优惠信息、出资方信息
TradeInfo string `json:"trade_info,omitempty"` // 出资方信息
FundBillList string `json:"fund_bill_list,omitempty"` // 交易支付使用的资金渠道
}
// RelationRefundResponse 聚合扫码退款响应结构体
type RelationRefundResponse struct {
Code string `json:"code"`
Msg string `json:"msg"`
RespTime string `json:"resp_time"`
RespData *RelationRefundResponseData `json:"resp_data,omitempty"`
}
// SuccessOrFail 判断响应是否成功
func (r *RelationRefundResponse) SuccessOrFail() bool {
return r.Code == "BBS00000"
}
+33
View File
@@ -0,0 +1,33 @@
package relationRevoked
import (
"github.com/black1552/lkl_sdk/common"
"github.com/black1552/lkl_sdk/consts"
"github.com/gogf/gf/v2/os/gtime"
)
// RelationRevokedServer 聚合扫码撤销API结构体
type RelationRevokedServer struct {
Client *common.Client[RelationRevokedResponse]
}
// NewRelationRevokedServer 创建聚合扫码撤销API实例
func NewRelationRevokedServer(client *common.Client[RelationRevokedResponse]) *RelationRevokedServer {
return &RelationRevokedServer{
Client: client,
}
}
// RelationRevoked 聚合扫码撤销方法
// - reqData: 撤销请求数据
func (a *RelationRevokedServer) RelationRevoked(reqData *RelationRevokedRequestData) (*RelationRevokedResponse, error) {
// 构建请求结构体
request := &RelationRevokedRequest{
ReqTime: gtime.Now().Format("20060102150405"),
Version: "3.0",
ReqData: reqData,
}
// 调用Client发送请求
return a.Client.DoRequest(consts.BASE_URL+consts.LKL_BASE_URL_RELATION_REVOKED_URL, request)
}
+25
View File
@@ -0,0 +1,25 @@
package relationRevoked
// LocationInfo 地址位置信息结构体
type LocationInfo struct {
RequestIP string `json:"request_ip"` // 请求方IP地址,必填
BaseStation string `json:"base_station,omitempty"` // 基站信息,可选
Location string `json:"location,omitempty"` // 维度,经度,可选
}
// RelationRevokedRequestData 聚合扫码撤销请求数据结构体
type RelationRevokedRequestData struct {
MerchantNo string `json:"merchant_no"` // 商户号,必填
TermNo string `json:"term_no"` // 终端号,必填
OutTradeNo string `json:"out_trade_no"` // 商户交易流水号,必填
OriginOutTradeNo string `json:"origin_out_trade_no,omitempty"` // 原商户交易流水号,可选(撤销时origin_out_trade_no,origin_trade_no必送其一)
OriginTradeNo string `json:"origin_trade_no,omitempty"` // 原拉卡拉交易流水号,可选(撤销时origin_out_trade_no,origin_trade_no必送其一)
LocationInfo LocationInfo `json:"location_info"` // 地址位置信息,必填
}
// RelationRevokedRequest 聚合扫码关单请求结构体
type RelationRevokedRequest struct {
ReqTime string `json:"req_time"`
Version string `json:"version"`
ReqData *RelationRevokedRequestData `json:"req_data"`
}
+28
View File
@@ -0,0 +1,28 @@
package relationRevoked
// RelationRevokedResponseData 聚合扫码撤销响应数据结构体
type RelationRevokedResponseData struct {
MerchantNo string `json:"merchant_no"` // 商户号
OutTradeNo string `json:"out_trade_no"` // 商户请求流水号
TradeNo string `json:"trade_no,omitempty"` // 拉卡拉商户订单号
LogNo string `json:"log_no"` // 拉卡拉对账单流水号
AccTradeNo string `json:"acc_trade_no,omitempty"` // 账户端交易订单号
AccountType string `json:"account_type"` // 钱包类型
TotalAmount string `json:"total_amount"` // 交易金额
TradeTime string `json:"trade_time"` // 交易完成时间
OriginOutTradeNo string `json:"origin_out_trade_no,omitempty"` // 原商户请求流水号
OriginTradeNo string `json:"origin_trade_no,omitempty"` // 原拉卡拉交易流水号
}
// RelationRevokedResponse 聚合扫码撤销响应结构体
type RelationRevokedResponse struct {
Code string `json:"code"` // 响应码
Msg string `json:"msg"` // 响应信息
RespTime string `json:"resp_time"` // 响应时间
RespData RelationRevokedResponseData `json:"resp_data,omitempty"` // 响应数据
}
// SuccessOrFail 判断响应是否成功
func (r *RelationRevokedResponse) SuccessOrFail() bool {
return r.Code == "BBS00000"
}
+39
View File
@@ -0,0 +1,39 @@
package transmicropay
import (
"github.com/black1552/lkl_sdk/common"
"github.com/black1552/lkl_sdk/consts"
"github.com/gogf/gf/v2/os/gtime"
)
// API 聚合被扫API结构体
type TransMicropayServer struct {
Client *common.Client[TransMicropayResponse]
}
// NewAPI 创建聚合被扫API实例
func NewTransMicropayServer(client *common.Client[TransMicropayResponse]) *TransMicropayServer {
return &TransMicropayServer{
Client: client,
}
}
// TransMicropay 执行聚合被扫请求
// - merchantNo: 商户号
// - termNo: 终端号
// - outTradeNo: 商户交易流水号
// - authCode: 支付授权码
// - totalAmount: 金额
// - locationInfo: 地址位置信息
// - 其他可选参数通过TransMicropayRequestData的其他字段设置
func (a *TransMicropayServer) TransMicropay(reqData *TransMicropayRequestData) (*TransMicropayResponse, error) {
// 构建请求结构体
request := &TransMicropayRequest{
ReqTime: gtime.Now().Format("YmdHis"),
Version: "3.0",
ReqData: reqData,
}
// 发送请求 - 使用consts中定义的聚合被扫URL
return a.Client.DoRequest(consts.BASE_URL+consts.LKL_BASE_URL_TRANS_MICROPAY_URL, request)
}
+56
View File
@@ -0,0 +1,56 @@
package transmicropay
// LocationInfo 地址位置信息结构体
type LocationInfo struct {
RequestIP string `json:"request_ip"` // 请求方IP地址 (必填)
BaseStation string `json:"base_station,omitempty"` // 基站信息 (可选)
Location string `json:"location,omitempty"` // 纬度,经度 (银联二维码交易必填)
}
// GoodsInfo 商品信息结构体
type GoodsInfo struct {
GoodsId string `json:"goods_id,omitempty"` // 商品ID (可选)
GoodsName string `json:"goods_name,omitempty"` // 商品名称 (可选)
Price string `json:"price,omitempty"` // 商品单价 (可选)
Quantity string `json:"quantity,omitempty"` // 商品数量 (可选)
CategoryId string `json:"category_id,omitempty"` // 商品类目ID (可选)
Body string `json:"body,omitempty"` // 商品描述 (可选)
}
// AccBusiFields 账户端业务信息域结构体
type AccBusiFields struct {
ExtendParams string `json:"extend_params,omitempty"` // 业务扩展参数 (可选)
GoodsDetail string `json:"goods_detail,omitempty"` // 商品详情 (可选)
StoreId string `json:"store_id,omitempty"` // 商户门店编号 (可选)
AlipayStoreId string `json:"alipay_store_id,omitempty"` // 支付宝店铺编号 (不再使用)
TimeoutExpress string `json:"timeout_express,omitempty"` // 交易有效时间 (可选)
DisablePayChannels string `json:"disable_pay_channels,omitempty"` // 支付宝禁用支付渠道 (可选)
BusinessParams string `json:"business_params,omitempty"` // 商户传入业务信息 (可选)
MinAge string `json:"min_age,omitempty"` // 允许的最小买家年龄 (可选)
PromoParams string `json:"promo_params,omitempty"` // 优惠明细 (可选)
}
// TransMicropayRequestData 聚合被扫请求数据结构体
type TransMicropayRequestData struct {
MerchantNo string `json:"merchant_no"` // 商户号 (必填)
TermNo string `json:"term_no"` // 终端号 (必填)
OutTradeNo string `json:"out_trade_no"` // 商户交易流水号 (必填)
AuthCode string `json:"auth_code"` // 支付授权码 (必填)
TotalAmount string `json:"total_amount"` // 金额 (必填)
LocationInfo *LocationInfo `json:"location_info"` // 地址位置信息 (必填)
BusiMode string `json:"busi_mode,omitempty"` // 业务模式 (可选)
Subject string `json:"subject,omitempty"` // 订单标题 (可选,微信支付必送)
PayOrderNo string `json:"pay_order_no,omitempty"` // 支付业务订单号 (可选)
NotifyURL string `json:"notify_url,omitempty"` // 商户通知地址 (可选)
SettleType string `json:"settle_type,omitempty"` // 结算类型 (可选)
Remark string `json:"remark,omitempty"` // 备注 (可选)
ScanType string `json:"scan_type,omitempty"` // 扫码类型 (可选)
AccBusiFields *AccBusiFields `json:"acc_busi_fields,omitempty"` // 账户端业务信息域 (可选)
}
// TransMicropayRequest 聚合被扫请求结构体
type TransMicropayRequest struct {
ReqTime string `json:"req_time"`
Version string `json:"version"`
ReqData *TransMicropayRequestData `json:"req_data"`
}
+31
View File
@@ -0,0 +1,31 @@
package transmicropay
// TransMicropayResponseData 聚合被扫响应数据结构体
type TransMicropayResponseData struct {
MerchantNo string `json:"merchant_no"` // 商户号
TermNo string `json:"term_no"` // 终端号
OutTradeNo string `json:"out_trade_no"` // 商户交易流水号
TradeNo string `json:"trade_no"` // 拉卡拉交易流水号
LogNo string `json:"log_no"` // 拉卡拉对账单流水号
TotalAmount string `json:"total_amount"` // 交易总金额
TradeTime string `json:"trade_time"` // 交易时间
PayStatus string `json:"pay_status"` // 支付状态
OrderDesc string `json:"order_desc,omitempty"` // 订单描述
PayAmount string `json:"pay_amount,omitempty"` // 实际支付金额
PayChannel string `json:"pay_channel,omitempty"` // 支付渠道
ChannelTradeNo string `json:"channel_trade_no,omitempty"` // 渠道交易号
AuthCode string `json:"auth_code,omitempty"` // 支付授权码
}
// TransMicropayResponse 聚合被扫响应结构体
type TransMicropayResponse struct {
RespTime string `json:"resp_time"`
Code string `json:"code"`
Msg string `json:"msg"`
RespData *TransMicropayResponseData `json:"resp_data,omitempty"`
}
// SuccessOrFail 判断响应是否成功
func (r *TransMicropayResponse) SuccessOrFail() bool {
return r.Code == "BBS00000"
}
+32
View File
@@ -0,0 +1,32 @@
package transMicropayEncry
import (
"github.com/black1552/lkl_sdk/common"
"github.com/black1552/lkl_sdk/consts"
"github.com/gogf/gf/v2/os/gtime"
)
// TransMicropayEncryServer 聚合扫码被扫接口(全报文加密)服务结构体
type TransMicropayEncryServer struct {
Client *common.Client[TransMicropayEncryResponse]
}
// NewTransMicropayEncryServer 创建聚合扫码被扫接口(全报文加密)服务实例
func NewTransMicropayEncryServer(client *common.Client[TransMicropayEncryResponse]) *TransMicropayEncryServer {
return &TransMicropayEncryServer{
Client: client,
}
}
// TransMicropayEncry 聚合扫码被扫接口(全报文加密)接口
func (a *TransMicropayEncryServer) TransMicropayEncry(reqData *TransMicropayEncryRequestData) (*TransMicropayEncryResponse, error) {
// 构建请求体
request := &TransMicropayEncryRequest{
ReqTime: gtime.Now().Format("20060102150405"),
Version: "3.0",
ReqData: reqData,
}
// 调用Client发送请求
return a.Client.DoRequest(consts.BASE_URL+consts.LKL_BASE_URL_TRANS_MICROPAY_ENCRY_URL, request)
}
@@ -0,0 +1,46 @@
package transMicropayEncry
// LocationInfo 地址位置信息,风控要求必送
type LocationInfo struct {
RequestIP string `json:"request_ip"` // 请求方IP地址,必填
BaseStation string `json:"base_station"` // 客户端设备的基站信息
Location string `json:"location"` // 商户终端的地理位置,整体格式:纬度,经度
}
// AccBusiFields 账户端业务信息域
type AccBusiFields struct {
ExtendParams map[string]interface{} `json:"extend_params"` // 支付宝业务扩展参数,主要用于花呗分期
BusinessParams string `json:"business_params"` // 商户传入业务信息
GoodsDetail string `json:"goods_detail"` // 订单包含的商品列表信息,Json数组
StoreID string `json:"store_id"` // 商户门店编号
TimeoutExpress string `json:"timeout_express"` // 交易有效时间,以分钟为单位
DisablePayChannels string `json:"disable_pay_channels"` // 支付宝禁用支付渠道
MinAge string `json:"min_age"` // 允许的最小买家年龄
PriorityPayAssets map[string]interface{} `json:"priority_pay_assets"` // 优先使用资产
}
// TransMicropayEncryRequestData 聚合扫码被扫接口(全报文加密)请求数据
type TransMicropayEncryRequestData struct {
MerchantNo string `json:"merchant_no"` // 商户号,必填
TermNo string `json:"term_no"` // 终端号,必填
OutTradeNo string `json:"out_trade_no"` // 商户交易流水号,必填
AuthCode string `json:"auth_code"` // 支付授权码,必填
TotalAmount string `json:"total_amount"` // 金额,必填,单位分,整数型字符
LocationInfo LocationInfo `json:"location_info"` // 地址位置信息,必填
BusiMode string `json:"busi_mode"` // 业务模式,可选:ACQ-收单,不填默认为"ACQ-收单"
Subject string `json:"subject"` // 订单标题,可选,微信支付必送
PayOrderNo string `json:"pay_order_no"` // 拉卡拉支付业务订单号,可选
NotifyURL string `json:"notify_url"` // 商户通知地址,可选
SettleType string `json:"settle_type"` // 结算类型,可选:"0"或者空,常规结算方式
Remark string `json:"remark"` // 备注,可选
ScanType string `json:"scan_type"` // 扫码类型,可选:0或不填:扫码支付,1:支付宝刷脸支付,2: 微信刷脸支付
IdentityInfo string `json:"identity_info"` // 实名支付信息,可选,json字符串
AccBusiFields AccBusiFields `json:"acc_busi_fields"` // 账户端业务信息域,可选
}
// TransMicropayEncryRequest 聚合扫码被扫接口(全报文加密)请求结构
type TransMicropayEncryRequest struct {
ReqTime string `json:"req_time"` // 请求时间
Version string `json:"version"` // 版本号
ReqData *TransMicropayEncryRequestData `json:"req_data"` // 请求数据
}
@@ -0,0 +1,27 @@
package transMicropayEncry
// TransMicropayEncryResponseData 聚合扫码被扫接口(全报文加密)响应数据
type TransMicropayEncryResponseData struct {
MerchantNo string `json:"merchant_no"` // 商户号
TermNo string `json:"term_no"` // 终端号
OutTradeNo string `json:"out_trade_no"` // 商户交易流水号
TotalAmount string `json:"total_amount"` // 金额,单位分
PayOrderNo string `json:"pay_order_no"` // 拉卡拉订单系统订单号
TradeType string `json:"trade_type"` // 交易类型
Status string `json:"status"` // 交易状态
PayTime string `json:"pay_time"` // 支付完成时间
}
// TransMicropayEncryResponse 聚合扫码被扫接口(全报文加密)响应结构
type TransMicropayEncryResponse struct {
RespTime string `json:"resp_time"` // 响应时间
Version string `json:"version"` // 版本号
Code string `json:"code"` // 响应码
Msg string `json:"msg"` // 响应信息
RespData *TransMicropayEncryResponseData `json:"resp_data"` // 响应数据
}
// SuccessOrFail 判断响应是否成功
func (r *TransMicropayEncryResponse) SuccessOrFail() bool {
return r.Code == "BBS00000"
}
+32
View File
@@ -0,0 +1,32 @@
package transPreorder
import (
"github.com/black1552/lkl_sdk/common"
"github.com/black1552/lkl_sdk/consts"
"github.com/gogf/gf/v2/os/gtime"
)
// TransPreorderServer 聚合主扫API结构体
type TransPreorderServer struct {
client *common.Client[TransPreorderResponse]
}
// NewTransPreorderServer 创建聚合主扫API实例
func NewTransPreorderServer(client *common.Client[TransPreorderResponse]) *TransPreorderServer {
return &TransPreorderServer{
client: client,
}
}
// TransPreorder 执行聚合主扫交易
func (a *TransPreorderServer) TransPreorder(req *TransPreorderRequestData) (*TransPreorderResponse, error) {
// 构建BaseModel请求
baseReq := TransPreorderRequest{
ReqTime: gtime.Now().Format("YmdHis"),
Version: "3.0",
ReqData: req,
}
// 发送请求
return a.client.DoRequest(consts.BASE_URL+consts.LKL_BASE_URL_TRANS_PREORDER_URL, baseReq)
}
+59
View File
@@ -0,0 +1,59 @@
package transPreorder
// LocationInfo 地址位置信息结构体
type LocationInfo struct {
RequestIP string `json:"request_ip"` // 请求方IP地址 (必填)
BaseStation string `json:"base_station,omitempty"` // 基站信息 (可选)
Location string `json:"location,omitempty"` // 纬度,经度 (可选,银联二维码交易必填)
}
// GoodsInfo 商品信息结构体
type GoodsInfo struct {
GoodsId string `json:"goods_id,omitempty"` // 商品ID (可选)
GoodsName string `json:"goods_name,omitempty"` // 商品名称 (可选)
Price string `json:"price,omitempty"` // 商品单价 (可选)
Quantity string `json:"quantity,omitempty"` // 商品数量 (可选)
CategoryId string `json:"category_id,omitempty"` // 商品类目ID (可选)
Body string `json:"body,omitempty"` // 商品描述 (可选)
}
// AccBusiFields 账户端业务信息域结构体
type AccBusiFields struct {
UserId string `json:"user_id,omitempty"` // 买家在支付宝的用户id (支付宝JSAPI支付必填)
TimeoutExpress string `json:"timeout_express,omitempty"` // 预下单有效时间 (可选)
ExtendParams string `json:"extend_params,omitempty"` // 业务扩展参数 (可选)
GoodsDetail string `json:"goods_detail,omitempty"` // 商品详情 (可选)
StoreId string `json:"store_id,omitempty"` // 商户门店编号 (可选)
BusinessParams string `json:"business_params,omitempty"` // 商户传入业务信息 (可选)
MinAge string `json:"min_age,omitempty"` // 允许的最小买家年龄 (可选)
PromoParams string `json:"promo_params,omitempty"` // 优惠明细 (可选)
EnablePayChannels string `json:"enable_pay_channels,omitempty"` // 支付通道 (可选)
}
// TransPreorderRequestData 预订单请求数据结构体
type TransPreorderRequestData struct {
MerchantNo string `json:"merchant_no"` // 商户号 (必填)
TermNo string `json:"term_no"` // 终端号 (必填)
OutTradeNo string `json:"out_trade_no"` // 商户交易流水号 (必填)
AccountType string `json:"account_type"` // 钱包类型 (必填)
TransType string `json:"trans_type"` // 接入方式 (必填)
TotalAmount string `json:"total_amount"` // 金额 (必填)
LocationInfo *LocationInfo `json:"location_info"` // 地址位置信息 (必填)
BusiMode string `json:"busi_mode,omitempty"` // 业务模式 (可选)
Subject string `json:"subject,omitempty"` // 订单标题 (可选,微信支付必送)
PayOrderNo string `json:"pay_order_no,omitempty"` // 支付业务订单号 (可选)
NotifyURL string `json:"notify_url,omitempty"` // 商户通知地址 (可选)
SettleType string `json:"settle_type,omitempty"` // 结算类型 (可选)
Remark string `json:"remark,omitempty"` // 备注 (可选)
AccBusiFields *AccBusiFields `json:"acc_busi_fields,omitempty"` // 账户端业务信息域 (可选)
CompleteNotifyURL string `json:"complete_notify_url,omitempty"` // 发货确认通知地址 (可选)
GoodsTag string `json:"goods_tag,omitempty"` // 商品标签 (可选)
GoodsInfo []*GoodsInfo `json:"goods_info,omitempty"` // 商品信息 (可选)
}
// TransPreorderRequest 预订单请求结构体
type TransPreorderRequest struct {
ReqTime string `json:"req_time"`
Version string `json:"version"`
ReqData *TransPreorderRequestData `json:"req_data"`
}
+36
View File
@@ -0,0 +1,36 @@
package transPreorder
// ResponseData 聚合主扫响应数据结构体
type ResponseData struct {
MerchantNo string `json:"merchant_no"` // 商户号
TermNo string `json:"term_no"` // 终端号
OutTradeNo string `json:"out_trade_no"` // 商户交易流水号
TradeNo string `json:"trade_no"` // 拉卡拉交易流水号
LogNo string `json:"log_no"` // 拉卡拉对账单流水号
TotalAmount string `json:"total_amount"` // 交易总金额
TradeTime string `json:"trade_time"` // 交易时间
PayStatus string `json:"pay_status"` // 支付状态
OrderDesc string `json:"order_desc,omitempty"` // 订单描述
PayAmount string `json:"pay_amount,omitempty"` // 实际支付金额
PayChannel string `json:"pay_channel,omitempty"` // 支付渠道
ChannelTradeNo string `json:"channel_trade_no,omitempty"` // 渠道交易号
QrCode string `json:"qr_code,omitempty"` // 支付二维码内容 (NATIVE支付时返回)
CodeURL string `json:"code_url,omitempty"` // 二维码链接 (NATIVE支付时返回)
PayParams string `json:"pay_params,omitempty"` // 支付参数 (JSAPI/APP支付时返回)
AppId string `json:"app_id,omitempty"` // 应用ID
MchId string `json:"mch_id,omitempty"` // 商户号
PrepayId string `json:"prepay_id,omitempty"` // 预支付交易会话ID
}
// TransPreorderResponse 预订单响应结构体
type TransPreorderResponse struct {
RespTime string `json:"resp_time"`
Code string `json:"code"`
Msg string `json:"msg"`
RespData *ResponseData `json:"resp_data,omitempty"`
}
// SuccessOrFail 判断响应是否成功
func (r *TransPreorderResponse) SuccessOrFail() bool {
return r.Code == "BBS00000"
}
+32
View File
@@ -0,0 +1,32 @@
package transPreorederEncry
import (
"github.com/black1552/lkl_sdk/common"
"github.com/black1552/lkl_sdk/consts"
"github.com/gogf/gf/v2/os/gtime"
)
// TransPreorderEncryServer 聚合扫码主扫交易(全报文加密)服务结构体
type TransPreorderEncryServer struct {
Client *common.Client[TransPreorederEncryResponse]
}
// NewTransPreorderEncryServer 创建聚合扫码主扫交易(全报文加密)服务实例
func NewTransPreorderEncryServer(client *common.Client[TransPreorederEncryResponse]) *TransPreorderEncryServer {
return &TransPreorderEncryServer{
Client: client,
}
}
// TransPreorderEncry 聚合扫码主扫交易(全报文加密)接口
func (a *TransPreorderEncryServer) TransPreorderEncry(reqData *TransPreorederEncryRequestData) (*TransPreorederEncryResponse, error) {
// 构建请求体
request := &TransPreorederEncryRequest{
ReqTime: gtime.Now().Format("20060102150405"),
Version: "3.0",
ReqData: reqData,
}
// 调用Client发送请求
return a.Client.DoRequest(consts.BASE_URL+consts.LKL_BASE_URL_TRANS_PREORDER_ENCRY_URL, request)
}
@@ -0,0 +1,46 @@
package transPreorederEncry
// LocationInfo 地址位置信息,风控要求必送
type LocationInfo struct {
RequestIP string `json:"request_ip"` // 请求方IP地址,必填
BaseStation string `json:"base_station"` // 客户端设备的基站信息(主扫时基站信息使用该字段)
Location string `json:"location"` // 商户终端的地理位置,整体格式:纬度,经度
}
// AccBusiFields 账户端业务信息域
type AccBusiFields struct {
UserID string `json:"user_id"` // 买家在支付宝的用户id
TimeoutExpress string `json:"timeout_express"` // 预下单有效时间,以分钟为单位
ExtendParams map[string]interface{} `json:"extend_params"` // 支付宝业务扩展参数
GoodsDetail string `json:"goods_detail"` // 订单包含的商品列表信息,Json数组
StoreID string `json:"store_id"` // 商户门店编号
DisablePayChannels string `json:"disable_pay_channels"` // 支付宝禁用支付渠道
BusinessParams string `json:"business_params"` // 商户传入业务信息
MinAge string `json:"min_age"` // 允许的最小买家年龄
}
// RequestData 聚合扫码主扫交易(全报文加密)请求数据
type TransPreorederEncryRequestData struct {
MerchantNo string `json:"merchant_no"` // 商户号,必填
TermNo string `json:"term_no"` // 终端号,必填
OutTradeNo string `json:"out_trade_no"` // 商户交易流水号,必填
AccountType string `json:"account_type"` // 钱包类型,必填:WECHAT、ALIPAY、UQRCODEPAY等
TransType string `json:"trans_type"` // 接入方式,必填:41:NATIVE、51:JSAPI、71:微信小程序支付、61:APP支付
TotalAmount string `json:"total_amount"` // 金额,必填,单位分,整数型字符
LocationInfo *LocationInfo `json:"location_info"` // 地址位置信息,必填
BusiMode string `json:"busi_mode"` // 业务模式,可选:ACQ-收单,不填默认为"ACQ-收单"
Subject string `json:"subject"` // 订单标题,可选,微信支付必送
PayOrderNo string `json:"pay_order_no"` // 支付业务订单号,可选
NotifyURL string `json:"notify_url"` // 商户通知地址,可选
SettleType string `json:"settle_type"` // 结算类型,可选:"0"或者空为常规结算,"1"为拉卡拉分账
Remark string `json:"remark"` // 备注,可选
IdentityInfo string `json:"identity_info"` // 实名支付信息,可选,json字符串
AccBusiFields *AccBusiFields `json:"acc_busi_fields"` // 账户端业务信息域,可选
}
// Request 聚合扫码主扫交易(全报文加密)请求结构
type TransPreorederEncryRequest struct {
ReqTime string `json:"req_time"` // 请求时间
Version string `json:"version"` // 版本号
ReqData *TransPreorederEncryRequestData `json:"req_data"` // 请求数据
}
@@ -0,0 +1,26 @@
package transPreorederEncry
// TransPreorederEncryResponseData 聚合扫码主扫交易(全报文加密)响应数据
type TransPreorederEncryResponseData struct {
MerchantNo string `json:"merchant_no"` // 商户号
TermNo string `json:"term_no"` // 终端号
OutTradeNo string `json:"out_trade_no"` // 商户交易流水号
TotalAmount string `json:"total_amount"` // 金额,单位分
PayOrderNo string `json:"pay_order_no"` // 拉卡拉订单系统订单号
CodeUrl string `json:"code_url"` // 二维码内容,用于生成支付二维码
TradeType string `json:"trade_type"` // 交易类型
}
// TransPreorederEncryResponse 聚合扫码主扫交易(全报文加密)响应结构
type TransPreorederEncryResponse struct {
RespTime string `json:"resp_time"` // 响应时间
Version string `json:"version"` // 版本号
Code string `json:"code"` // 响应码
Msg string `json:"msg"` // 响应信息
RespData TransPreorederEncryResponseData `json:"resp_data"` // 响应数据
}
// SuccessOrFail 判断响应是否成功
func (r *TransPreorederEncryResponse) SuccessOrFail() bool {
return r.Code == "BBS00000"
}
+36
View File
@@ -0,0 +1,36 @@
package transquery
import (
"github.com/black1552/lkl_sdk/common"
"github.com/black1552/lkl_sdk/consts"
"github.com/gogf/gf/v2/os/gtime"
)
// API 聚合扫码交易查询API结构体
type TransQueryServer struct {
Client *common.Client[TransQueryResponse]
}
// NewAPI 创建聚合扫码交易查询API实例
func NewTransQueryServer(client *common.Client[TransQueryResponse]) *TransQueryServer {
return &TransQueryServer{
Client: client,
}
}
// TransQuery 执行聚合扫码交易查询请求
// - merchantNo: 商户号
// - termNo: 终端号
// - outTradeNo: 商户交易流水号(可选,与tradeNo二选一)
// - tradeNo: 拉卡拉交易流水号(可选,与outTradeNo二选一)
func (a *TransQueryServer) TransQuery(reqData *TransQueryRequestData) (*TransQueryResponse, error) {
// 构建请求结构体
request := &TransQueryRequest{
ReqTime: gtime.Now().Format("YmdHis"),
Version: "3.0",
ReqData: reqData,
}
// 发送请求 - 使用consts中定义的聚合扫码交易查询URL
return a.Client.DoRequest(consts.BASE_URL+consts.LKL_BASE_URL_TRANS_QUERY_URL, request)
}
+16
View File
@@ -0,0 +1,16 @@
package transquery
// TransQueryRequestData 聚合扫码交易查询请求数据结构体
type TransQueryRequestData struct {
MerchantNo string `json:"merchant_no"` // 商户号 (必填)
TermNo string `json:"term_no"` // 终端号 (必填)
OutTradeNo string `json:"out_trade_no,omitempty"` // 商户交易流水号 (可选,与trade_no二选一)
TradeNo string `json:"trade_no,omitempty"` // 拉卡拉交易流水号 (可选,与out_trade_no二选一)
}
// TransQueryRequest 聚合扫码交易查询请求结构体
type TransQueryRequest struct {
ReqTime string `json:"req_time"`
Version string `json:"version"`
ReqData *TransQueryRequestData `json:"req_data"`
}
+78
View File
@@ -0,0 +1,78 @@
package transquery
// SplitInfo 拆单信息结构体
type SplitInfo struct {
SubTradeNo string `json:"sub_trade_no"` // 子单交易流水号
SubLogNo string `json:"sub_log_no"` // 子单对账单流水号
OutSubTradeNo string `json:"out_sub_trade_no"` // 外部子交易流水号
MerchantNo string `json:"merchant_no"` // 商户号
MerchantName string `json:"merchant_name"` // 商户名称
TermNo string `json:"term_no"` // 终端号
Amount string `json:"amount"` // 金额
}
// RefundSplitInfo 合单退款拆单信息结构体
type RefundSplitInfo struct {
OutSubTradeNo string `json:"out_sub_trade_no"` // 外部子退款交易流水号
MerchantNo string `json:"merchant_no"` // 商户号
TermNo string `json:"term_no"` // 终端号
RefundAmount string `json:"refund_amount"` // 申请退款金额
SubTradeNo string `json:"sub_trade_no,omitempty"` // 拉卡拉子交易流水号
SubLogNo string `json:"sub_log_no,omitempty"` // 对账单子流水号
TradeState string `json:"trade_state,omitempty"` // 子交易状态
ResultCode string `json:"result_code,omitempty"` // 处理结果码
ResultMsg string `json:"result_msg,omitempty"` // 处理描述
}
// AccRespFields 账户端返回信息域结构体
type AccRespFields struct {
UserId string `json:"user_id,omitempty"` // 买家在支付宝的用户id
StoreId string `json:"store_id,omitempty"` // 商户门店编号
AlipayStoreId string `json:"alipay_store_id,omitempty"` // 支付宝店铺编号(不再使用)
FundBillList string `json:"fund_bill_list,omitempty"` // 交易支付使用的资金渠道
VoucherDetailList string `json:"voucher_detail_list,omitempty"` // 所有优惠券信息
HbFqPayInfo string `json:"hb_fq_pay_info,omitempty"` // 花呗分期支付信息
}
// TransQueryResponseData 聚合扫码交易查询响应数据结构体
type TransQueryResponseData struct {
MerchantNo string `json:"merchant_no"` // 拉卡拉分配的商户号
OutTradeNo string `json:"out_trade_no"` // 商户请求流水号
TradeNo string `json:"trade_no"` // 拉卡拉商户订单号
LogNo string `json:"log_no"` // 拉卡拉对账单流水号
TradeMainType string `json:"trade_main_type,omitempty"` // 交易大类
SplitAttr string `json:"split_attr,omitempty"` // 拆单属性
SplitInfo []*SplitInfo `json:"split_info,omitempty"` // 拆单信息
AccTradeNo string `json:"acc_trade_no"` // 账户端交易订单号
AccountType string `json:"account_type"` // 钱包类型
TradeState string `json:"trade_state"` // 交易状态
TradeStateDesc string `json:"trade_state_desc,omitempty"` // 交易状态描述
TotalAmount string `json:"total_amount"` // 订单金额
PayerAmount string `json:"payer_amount,omitempty"` // 付款人实付金额
AccSettleAmount string `json:"acc_settle_amount,omitempty"` // 账户端结算金额
AccMDiscountAmount string `json:"acc_mdiscount_amount,omitempty"` // 商户侧优惠金额(账户端)
AccDiscountAmount string `json:"acc_discount_amount,omitempty"` // 账户端优惠金额
AccOtherDiscountAmount string `json:"acc_other_discount_amount,omitempty"` // 账户端其它优惠金额
TradeTime string `json:"trade_time"` // 交易完成时间
UserId1 string `json:"user_id1,omitempty"` // 用户标识1
UserId2 string `json:"user_id2,omitempty"` // 用户标识2
BankType string `json:"bank_type,omitempty"` // 付款银行
CardType string `json:"card_type,omitempty"` // 银行卡类型
AccActivityId string `json:"acc_activity_id,omitempty"` // 活动ID
TradeReqDate string `json:"trade_req_date"` // 交易请求日期
AccRespFields *AccRespFields `json:"acc_resp_fields,omitempty"` // 账户端返回信息域
RefundSplitInfo []*RefundSplitInfo `json:"refund_split_info,omitempty"` // 合单退款拆单信息
}
// TransQueryResponse 聚合扫码交易查询响应结构体
type TransQueryResponse struct {
RespTime string `json:"resp_time"`
Code string `json:"code"`
Msg string `json:"msg"`
RespData *TransQueryResponseData `json:"resp_data,omitempty"`
}
// SuccessOrFail 判断响应是否成功
func (r *TransQueryResponse) SuccessOrFail() bool {
return r.Code == "BBS00000"
}
+30
View File
@@ -0,0 +1,30 @@
package transShareCode
import (
"github.com/black1552/lkl_sdk/common"
"github.com/black1552/lkl_sdk/consts"
"github.com/gogf/gf/v2/os/gtime"
)
// TransShareCodeServer 聚合扫码申请支付宝吱口令服务
type TransShareCodeServer struct {
client *common.Client[TransShareCodeResponse]
}
// NewTransShareCodeServer 创建聚合扫码申请支付宝吱口令服务实例
func NewTransShareCodeServer(client *common.Client[TransShareCodeResponse]) *TransShareCodeServer {
return &TransShareCodeServer{
client: client,
}
}
// TransShareCode 聚合扫码申请支付宝吱口令
func (s *TransShareCodeServer) TransShareCode(reqData *TransShareCodeRequestData) (*TransShareCodeResponse, error) {
// 构建请求
request := &TransShareCodeRequest{
ReqTime: gtime.Now().Format("20060102150405"),
Version: "3.0",
ReqData: reqData,
}
return s.client.DoRequest(consts.BASE_URL+consts.LKL_BASE_URL_TRANS_SHARE_CODE_URL, request)
}
+41
View File
@@ -0,0 +1,41 @@
package transShareCode
// LocationInfo 地址位置信息
type LocationInfo struct {
RequestIP string `json:"request_ip"` // 请求方IP地址,必填
BaseStation string `json:"base_station"` // 客户端设备的基站信息
Location string `json:"location"` // 商户终端的地理位置,整体格式:纬度,经度
}
// ExtInfo 扩展内容,主要满足花呗分期相关的额鉴权验等功能
type ExtInfo struct {
FqNumber string `json:"fq_number"` // 花呗分期期数,支付宝花呗分期必送字段: 花呗分期数 3:3期 6:6期 12:12期
FqSellerPercent string `json:"fq_seller_percent"` // 卖家承担手续费比例,支付宝花呗分期必送字段: 卖家承担收费比例,商家承担手续费传入100,用户承担手续费传入0
}
// AccBusiFields 账户端业务信息域
type AccBusiFields struct {
Source string `json:"source"` // 业务来源,必填
BizLink string `json:"biz_link"` // 跳转业务链接,必填
SellerID string `json:"seller_id"` // 卖家支付宝ID,可选
ExtInfo *ExtInfo `json:"ext_info"` // 扩展内容,可选
}
// TransShareCodeRequestData 请求数据
type TransShareCodeRequestData struct {
MerchantNo string `json:"merchant_no"` // 商户号,必填
TermNo string `json:"term_no"` // 终端号,必填
OutTradeNo string `json:"out_trade_no"` // 商户交易流水号,必填
AccountType string `json:"account_type"` // 钱包类型,必填,支付宝:ALIPAY
TotalAmount string `json:"total_amount"` // 金额,必填,单位分,整数型字符
LocationInfo LocationInfo `json:"location_info"` // 地址位置信息,必填
CodeValidPeriod string `json:"code_valid_period"` // 码有效期,可选,秒为单位,整型
AccBusiFields *AccBusiFields `json:"acc_busi_fields"` // 账户端业务信息域,可选
}
// TransShareCodeRequest 整体请求结构
type TransShareCodeRequest struct {
ReqTime string `json:"req_time"` // 请求时间
Version string `json:"version"` // 版本号
ReqData *TransShareCodeRequestData `json:"req_data"` // 请求数据
}
+28
View File
@@ -0,0 +1,28 @@
package transShareCode
// AccRespFields 账户端返回信息域
type AccRespFields struct {
ShareToken string `json:"share_token"` // 吱口令,必填
ExpireDate string `json:"expire_date"` // 吱口令失效时间,可选,若为空则表示永久有效
}
// TransShareCodeResponseData 响应数据
type TransShareCodeResponseData struct {
MerchantNo string `json:"merchant_no"` // 商户号
OutTradeNo string `json:"out_trade_no"` // 商户请求流水号
TradeNo string `json:"trade_no"` // 拉卡拉交易流水号
AccRespFields *AccRespFields `json:"acc_resp_fields"` // 账户端返回信息域
}
// TransShareCodeResponse 整体响应结构
type TransShareCodeResponse struct {
Code string `json:"code"` // 响应码
Msg string `json:"msg"` // 响应信息
RespTime string `json:"resp_time"` // 响应时间
RespData *TransShareCodeResponseData `json:"resp_data"` // 响应数据
}
// SuccessOrFail 判断请求是否成功
func (r *TransShareCodeResponse) SuccessOrFail() bool {
return r.Code == "BBS00000"
}
+19 -27
View File
@@ -1,4 +1,4 @@
package lklsdk
package common
import (
"context"
@@ -8,33 +8,21 @@ import (
"crypto/sha256"
"crypto/x509"
"encoding/base64"
"encoding/json"
"encoding/pem"
"fmt"
ran "math/rand"
"time"
"github.com/black1552/base-common/utils"
"github.com/gogf/gf/v2/encoding/gjson"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gfile"
"github.com/gogf/gf/v2/util/gconv"
)
// Config 拉卡拉SDK配置
type Config struct {
PublicKey string `json:"public_key" dc:"公钥字符串"`
PrivateKey string `json:"private_key" dc:"私钥字符串"`
AppId string `json:"app_id" dc:"lakala应用ID"`
SerialNo string `json:"serial_no" dc:"序列号"`
SubAppId string `json:"sub_app_id" dc:"子应用ID 微信AppId"`
Version string `json:"version" dc:"lakala版本号"`
AccountType string `json:"account_type" dc:"账户类型"`
TransType string `json:"trans_type" dc:"交易类型"`
NotifyUrl string `json:"notify_url" dc:"回调地址"`
}
// Client 拉卡拉SDK客户端
type Client[T any] struct {
config *Config
Config *Config
response T
ctx context.Context
}
@@ -47,7 +35,7 @@ func NewClient[T any](ctx context.Context, cfgJson string) *Client[T] {
return nil
}
return &Client[T]{
config: config,
Config: config,
ctx: ctx,
}
}
@@ -68,7 +56,7 @@ func (c *Client[T]) generateSign(request []byte) (string, error) {
timestamp := fmt.Sprintf("%d", time.Now().Unix())
// 构建待签名报文
signData := fmt.Sprintf("%s\n%s\n%s\n%s\n%s\n", c.config.AppId, c.config.SerialNo, timestamp, nonceStr, string(request))
signData := fmt.Sprintf("%s\n%s\n%s\n%s\n%s\n", c.Config.AppId, c.Config.SerialNo, timestamp, nonceStr, string(request))
// 计算签名
hashed := sha256.Sum256([]byte(signData))
@@ -85,12 +73,12 @@ func (c *Client[T]) generateSign(request []byte) (string, error) {
// 构建Authorization头
authorization := fmt.Sprintf("LKLAPI-SHA256withRSA appid=\"%s\",serial_no=\"%s\",timestamp=\"%s\",nonce_str=\"%s\",signature=\"%s\"",
c.config.AppId, c.config.SerialNo, timestamp, nonceStr, signatureBase64)
c.Config.AppId, c.Config.SerialNo, timestamp, nonceStr, signatureBase64)
return authorization, nil
}
func (c *Client[T]) loadPrivateKey() (*rsa.PrivateKey, error) {
block, _ := pem.Decode(gfile.GetBytes(c.config.PrivateKey))
block, _ := pem.Decode(gfile.GetBytes(c.Config.PrivateKey))
if block == nil {
return nil, fmt.Errorf("无法解码私钥PEM数据")
}
@@ -102,15 +90,19 @@ func (c *Client[T]) loadPrivateKey() (*rsa.PrivateKey, error) {
return privateKey.(*rsa.PrivateKey), nil
}
// doRequest 发送HTTP请求
func (c *Client[T]) doRequest(url string, reqData interface{}) (*T, error) {
// 序列化为JSON
jsonData, err := json.Marshal(reqData)
// DoRequest 发送HTTP请求
func (c *Client[T]) DoRequest(url string, reqData interface{}) (*T, error) {
jsonStr, err := gjson.EncodeString(reqData)
if err != nil {
return nil, fmt.Errorf("序列化请求数据失败: %v", err)
return nil, fmt.Errorf("请求参数转JSON字符串失败: %v", err)
}
reqJson, err := CleanJSON(jsonStr)
if err != nil {
return nil, fmt.Errorf("清理JSON空值失败: %v", err)
}
g.Log().Infof(c.ctx, "清理后的json: %v", string(reqJson))
auth, err := c.generateSign(jsonData)
auth, err := c.generateSign(reqJson)
if err != nil {
return nil, fmt.Errorf("生成签名失败: %v", err)
}
@@ -121,5 +113,5 @@ func (c *Client[T]) doRequest(url string, reqData interface{}) (*T, error) {
}
// 设置其他必要的请求头
return utils.NewClient[T](jsonData, url, header).Post(c.ctx)
return utils.NewClient[T](reqJson, url, header).Post(c.ctx)
}
+118
View File
@@ -0,0 +1,118 @@
package common
import (
"encoding/json"
"reflect"
)
// CleanJSON 清理JSON字符串中的空值和0值字段
func CleanJSON(jsonStr string) ([]byte, error) {
var data interface{}
// 解析JSON字符串
if err := json.Unmarshal([]byte(jsonStr), &data); err != nil {
return nil, err
}
// 递归清理数据
cleaned := cleanData(data)
// 转换回JSON字符串
result, err := json.Marshal(cleaned)
if err != nil {
return nil, err
}
return result, nil
}
// cleanData 递归清理map或slice中的空值和0值
func cleanData(data interface{}) interface{} {
if data == nil {
return nil
}
v := reflect.ValueOf(data)
switch v.Kind() {
case reflect.Map:
cleanedMap := make(map[string]interface{})
for _, key := range v.MapKeys() {
val := v.MapIndex(key)
if val.Interface() != nil && !isEmptyValue(val) {
cleanedVal := cleanData(val.Interface())
// 只有清理后的值不为空才添加
if !isCleanedValueEmpty(cleanedVal) {
cleanedMap[key.String()] = cleanedVal
}
}
}
return cleanedMap
case reflect.Slice:
cleanedSlice := make([]interface{}, 0)
for i := 0; i < v.Len(); i++ {
item := v.Index(i)
if item.Interface() != nil && !isEmptyValue(item) {
cleanedItem := cleanData(item.Interface())
if !isCleanedValueEmpty(cleanedItem) {
cleanedSlice = append(cleanedSlice, cleanedItem)
}
}
}
// 如果slice为空,则返回nil而不是空slice
if len(cleanedSlice) == 0 {
return nil
}
return cleanedSlice
default:
return data
}
}
// isEmptyValue 检查值是否为空值或0值
func isEmptyValue(v reflect.Value) bool {
switch v.Kind() {
case reflect.Interface, reflect.Ptr:
return v.IsNil()
case reflect.Slice, reflect.Map:
return v.Len() == 0
case reflect.String:
return v.String() == "" || v.String() == "0"
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
return v.Int() == 0
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
return v.Uint() == 0
case reflect.Float32, reflect.Float64:
return v.Float() == 0
case reflect.Bool:
return !v.Bool()
}
// 特殊处理nil值
if !v.IsValid() {
return true
}
return false
}
// isCleanedValueEmpty 检查清理后的值是否为空
func isCleanedValueEmpty(val interface{}) bool {
if val == nil {
return true
}
v := reflect.ValueOf(val)
switch v.Kind() {
case reflect.Map:
return v.Len() == 0
case reflect.Slice:
return v.Len() == 0
case reflect.String:
return val == ""
}
return false
}
+14
View File
@@ -0,0 +1,14 @@
package common
// Config 拉卡拉SDK配置
type Config struct {
PublicKey string `json:"public_key" dc:"公钥字符串"`
PrivateKey string `json:"private_key" dc:"私钥字符串"`
AppId string `json:"app_id" dc:"lakala应用ID"`
SerialNo string `json:"serial_no" dc:"序列号"`
SubAppId string `json:"sub_app_id" dc:"子应用ID 微信AppId"`
Version string `json:"version" dc:"lakala版本号"`
AccountType string `json:"account_type" dc:"账户类型"`
TransType string `json:"trans_type" dc:"交易类型"`
NotifyUrl string `json:"notify_url" dc:"回调地址"`
}
+141
View File
@@ -0,0 +1,141 @@
package consts
type AttType string
const (
ATT_TYPE_FR_ID_CARD_FRONT AttType = "FR_ID_CARD_FRONT" // 法人身份证正面
ATT_TYPE_FR_ID_CARD_BEHIND AttType = "FR_ID_CARD_BEHIND" // 法人身份证反面
ATT_TYPE_ID_CARD_FRONT AttType = "ID_CARD_FRONT" // 结算人身份证正面
ATT_TYPE_ID_CARD_BEHIND AttType = "ID_CARD_BEHIND" // 结算人身份证反面
ATT_TYPE_BANK_CARD AttType = "BANK_CARD" // 银行卡
ATT_TYPE_BUSINESS_LICENCE AttType = "BUSINESS_LICENCE" // 营业执照
ATT_TYPE_MERCHANT_PHOTO AttType = "MERCHANT_PHOTO" // 商户门头照片
ATT_TYPE_SHOPINNER AttType = "SHOPINNER" // 商铺内部照片
ATT_TYPE_XY AttType = "XY" // 线下纸质协议
ATT_TYPE_NETWORK_XY AttType = "NETWORK_XY" // 电子协议
ATT_TYPE_HT AttType = "HT" // 租赁合同
ATT_TYPE_COOPERATION_QUALIFICATION_PROOF AttType = "COOPERATION_QUALIFICATION_PROOF" // 合作资质证明
ATT_TYPE_FOOD_QUALIFICATION_PROOF AttType = "FOOD_QUALIFICATION_PROOF" // 食品经营相关资质
ATT_TYPE_NO_LEGAL_PERSON_SETT_AUTH_LETTER AttType = "NO_LEGAL_PERSON_SETT_AUTH_LETTER" // 非法人结算授权书
ATT_TYPE_SPLIT_ENTRUST_FILE AttType = "SPLIT_ENTRUST_FILE" // 结算授权委托书
ATT_TYPE_RENTAL_AGREEMENT AttType = "RENTAL_AGREEMENT" // 集市方与场地方间的租赁协议
ATT_TYPE_SPLIT_COOPERATION_FILE AttType = "SPLIT_COOPERATION_FILE" // 集市方与摊主间的合作协议
ATT_TYPE_OTHERS AttType = "OTHERS" // 其他
)
func (at AttType) Ptr() string {
return string(at)
}
type MgtFlag string
const (
MGT_FLAG_AVERAGE MgtFlag = "01" // 一般账户
MGT_FLAG_HOUSEHOLD MgtFlag = "03" // 虚户
)
type SplitRange string
const (
SPLIT_RANGE_ALL SplitRange = "ALL" // 全部交易分账
SPLIT_RANGE_MARK SplitRange = "MARK" // 标记交易分账
)
func (sr SplitRange) Ptr() string {
return string(sr)
}
type SepFundSource string
const (
SEP_FUND_SOURCE_TR SepFundSource = "TR" // 交易分账
SEP_FUND_SOURCE_BA SepFundSource = "BR" // 余额分账
)
func (sf SepFundSource) Ptr() string {
return string(sf)
}
type SplitLaunchMode string
const (
SPLIT_LAUNCH_MODE_AUTO SplitLaunchMode = "AUTO" // 自动触发分账
SPLIT_LAUNCH_MODE_POINTRULE SplitLaunchMode = "POINTRULE" // 指定规则分账
SPLIT_LAUNCH_MODE_MANUAL SplitLaunchMode = "MANUAL" // 手动分账
)
func (slm SplitLaunchMode) Ptr() string {
return string(slm)
}
type SplitSettleType string
const (
SPLIT_SETTLE_TYPE_01 SplitSettleType = "01" // 主扫现结
SPLIT_SETTLE_TYPE_03 SplitSettleType = "03" // 交易自动结算
)
func (sst SplitSettleType) Ptr() string {
return string(sst)
}
type SplitRuleSource string
const (
SPLIT_RULE_SOURCE_MER SplitRuleSource = "MER" // 商户分账规则
SPLIT_RULE_SOURCE_PLATFORM SplitRuleSource = "PLATFORM" // 平台分账规则
)
func (srs SplitRuleSource) Ptr() string {
return string(srs)
}
type AcctTypeCode string
const (
ACCT_TYPE_CODE_57 AcctTypeCode = "57" // 对公
ACCT_TYPE_CODE_58 AcctTypeCode = "58" // 对私
)
func (act AcctTypeCode) Ptr() string {
return string(act)
}
type AcctCertificateType string
const (
ACCT_CERTIFICATE_TYPE_ID_CARD AcctCertificateType = "17" // 身份证
ACCT_CERTIFICATE_TYPE_PASSPORT AcctCertificateType = "18" // 护照
ACCT_CERTIFICATE_TYPE_HONGKONG_MACAO AcctCertificateType = "19" // 港澳居民来往内地通行证
ACCT_CERTIFICATE_TYPE_TRAVEL AcctCertificateType = "20" // 台湾居民来往内地通行证
)
func (act AcctCertificateType) Ptr() string {
return string(act)
}
type CalType string
const (
CAL_TYPE_0 CalType = "0" // 按固定金额分账
CAL_TYPE_1 CalType = "1" // 按比例分账
)
func (ct CalType) Ptr() string {
return string(ct)
}
type PayType string
const (
PAY_TYPE_01 PayType = "01" // 收款账户
PAY_TYPE_02 PayType = "02" // 付款账户
PAY_TYPE_03 PayType = "03" // 分账商户账户
PAY_TYPE_04 PayType = "04" // 分账接收方账户
PAY_TYPE_05 PayType = "05" // 充值代付账户
PAY_TYPE_06 PayType = "06" // 结算代付账户
)
func (pt PayType) Ptr() string {
return string(pt)
}
+745
View File
@@ -0,0 +1,745 @@
// Package consts 提供常量定义
package consts
// AddrCode 地区码枚举
type AddrCode string
const (
// 地区码常量定义,根据地区码表NEW.xlsx生成
// 常量命名规则:大写字母加下划线格式,使用表格B列值的拼音
// 常量值:表格A列的值
// ADDR_CODE_QUAN_GUO 全国
ADDR_CODE_QUAN_GUO AddrCode = "1"
// ADDR_CODE_BEI_JING_SHI 北京市
ADDR_CODE_BEI_JING_SHI AddrCode = "1000"
// ADDR_CODE_MI_YUN_QU 密云区
ADDR_CODE_MI_YUN_QU AddrCode = "1027"
// ADDR_CODE_YAN_QING_QU 延庆区
ADDR_CODE_YAN_QING_QU AddrCode = "1028"
// ADDR_CODE_TIAN_JIN_SHI 天津市
ADDR_CODE_TIAN_JIN_SHI AddrCode = "1100"
// ADDR_CODE_NING_HE_QU 宁河区
ADDR_CODE_NING_HE_QU AddrCode = "1121"
// ADDR_CODE_JING_HAI_QU 静海区
ADDR_CODE_JING_HAI_QU AddrCode = "1123"
// ADDR_CODE_TIAN_JIN_SHI_JI_ZHOU_QU 蓟州区
ADDR_CODE_TIAN_JIN_SHI_JI_ZHOU_QU AddrCode = "1125"
// ADDR_CODE_BIN_HAI_XIN_QU 滨海新区
ADDR_CODE_BIN_HAI_XIN_QU AddrCode = "1127"
// ADDR_CODE_HE_BEI_SHENG 河北省
ADDR_CODE_HE_BEI_SHENG AddrCode = "1200"
// ADDR_CODE_SHI_JIA_ZHUANG_SHI 石家庄市
ADDR_CODE_SHI_JIA_ZHUANG_SHI AddrCode = "1210"
// ADDR_CODE_JING_XING_XIAN 井陉县
ADDR_CODE_JING_XING_XIAN AddrCode = "1211"
// ADDR_CODE_LU_QUAN_QU 鹿泉区
ADDR_CODE_LU_QUAN_QU AddrCode = "1212"
// ADDR_CODE_ZHENG_DING_XIAN 正定县
ADDR_CODE_ZHENG_DING_XIAN AddrCode = "1213"
// ADDR_CODE_LUAN_CHENG_QU 栾城区
ADDR_CODE_LUAN_CHENG_QU AddrCode = "1214"
// ADDR_CODE_CHANG_AN_QU 长安区
ADDR_CODE_CHANG_AN_QU AddrCode = "1215"
// ADDR_CODE_JIA_ZHUANG_SHI_QIAO_XI_QU 桥西区
ADDR_CODE_JIA_ZHUANG_SHI_QIAO_XI_QU AddrCode = "1216"
// ADDR_CODE_SHI_JIA_ZHUANG_SHI_XIN_HUA_QU 新华区
ADDR_CODE_SHI_JIA_ZHUANG_SHI_XIN_HUA_QU AddrCode = "1217"
// ADDR_CODE_JING_XING_KUANG_QU 井陉矿区
ADDR_CODE_JING_XING_KUANG_QU AddrCode = "1218"
// ADDR_CODE_YU_HUA_QU 裕华区
ADDR_CODE_YU_HUA_QU AddrCode = "1219"
// ADDR_CODE_XIN_JI_SHI 辛集市
ADDR_CODE_XIN_JI_SHI AddrCode = "1221"
// ADDR_CODE_JIN_ZHOU_SHI 晋州市
ADDR_CODE_JIN_ZHOU_SHI AddrCode = "1222"
// ADDR_CODE_SHEN_ZE_XIAN 深泽县
ADDR_CODE_SHEN_ZE_XIAN AddrCode = "1223"
// ADDR_CODE_WU_JI_XIAN 无极县
ADDR_CODE_WU_JI_XIAN AddrCode = "1224"
// ADDR_CODE_GAO_CHENG_QU 藁城区
ADDR_CODE_GAO_CHENG_QU AddrCode = "1225"
// ADDR_CODE_ZHAO_XIAN 赵县
ADDR_CODE_ZHAO_XIAN AddrCode = "1226"
// ADDR_CODE_XIN_LE_SHI 新乐市
ADDR_CODE_XIN_LE_SHI AddrCode = "1227"
// ADDR_CODE_GAO_YI_XIAN 高邑县
ADDR_CODE_GAO_YI_XIAN AddrCode = "1228"
// ADDR_CODE_YUAN_SHI_XIAN 元氏县
ADDR_CODE_YUAN_SHI_XIAN AddrCode = "1229"
// ADDR_CODE_ZAN_HUANG_XIAN 赞皇县
ADDR_CODE_ZAN_HUANG_XIAN AddrCode = "1231"
// ADDR_CODE_PING_SHAN_XIAN 平山县
ADDR_CODE_PING_SHAN_XIAN AddrCode = "1232"
// ADDR_CODE_LING_SHOU_XIAN 灵寿县
ADDR_CODE_LING_SHOU_XIAN AddrCode = "1233"
// ADDR_CODE_XING_TANG_XIAN 行唐县
ADDR_CODE_XING_TANG_XIAN AddrCode = "1234"
// ADDR_CODE_TANG_SHAN_SHI 唐山市
ADDR_CODE_TANG_SHAN_SHI AddrCode = "1240"
// ADDR_CODE_LU_NAN_QU 路南区
ADDR_CODE_LU_NAN_QU AddrCode = "1241"
// ADDR_CODE_LU_BEI_QU 路北区
ADDR_CODE_LU_BEI_QU AddrCode = "1242"
// ADDR_CODE_LUAN_ZHOU_SHI 滦州市
ADDR_CODE_LUAN_ZHOU_SHI AddrCode = "1243"
// ADDR_CODE_LUAN_NAN_XIAN 滦南县
ADDR_CODE_LUAN_NAN_XIAN AddrCode = "1244"
// ADDR_CODE_LE_TING_XIAN 乐亭县
ADDR_CODE_LE_TING_XIAN AddrCode = "1245"
// ADDR_CODE_QIAN_AN_SHI 迁安市
ADDR_CODE_QIAN_AN_SHI AddrCode = "1246"
// ADDR_CODE_QIAN_XI_XIAN 迁西县
ADDR_CODE_QIAN_XI_XIAN AddrCode = "1247"
// ADDR_CODE_ZUN_HUA_SHI 遵化市
ADDR_CODE_ZUN_HUA_SHI AddrCode = "1248"
// ADDR_CODE_YU_TIAN_XIAN 玉田县
ADDR_CODE_YU_TIAN_XIAN AddrCode = "1249"
// ADDR_CODE_FENG_NAN_QU 丰南区
ADDR_CODE_FENG_NAN_QU AddrCode = "1251"
// ADDR_CODE_GU_YE_QU 古冶区
ADDR_CODE_GU_YE_QU AddrCode = "1252"
// ADDR_CODE_KAI_PING_QU 开平区
ADDR_CODE_KAI_PING_QU AddrCode = "1253"
// ADDR_CODE_FENG_RUN_QU 丰润区
ADDR_CODE_FENG_RUN_QU AddrCode = "1254"
// ADDR_CODE_CAO_FEI_DIAN_QU 曹妃甸区
ADDR_CODE_CAO_FEI_DIAN_QU AddrCode = "1255"
// ADDR_CODE_QIN_HUANG_DAO_SHI 秦皇岛市
ADDR_CODE_QIN_HUANG_DAO_SHI AddrCode = "1260"
// ADDR_CODE_QING_LONG_MAN_ZU_ZI_ZHI_XIAN 青龙满族自治县
ADDR_CODE_QING_LONG_MAN_ZU_ZI_ZHI_XIAN AddrCode = "1261"
// ADDR_CODE_CHANG_LI_XIAN 昌黎县
ADDR_CODE_CHANG_LI_XIAN AddrCode = "1262"
// ADDR_CODE_FU_NING_QU 抚宁区
ADDR_CODE_FU_NING_QU AddrCode = "1263"
// ADDR_CODE_LU_LONG_XIAN 卢龙县
ADDR_CODE_LU_LONG_XIAN AddrCode = "1264"
// ADDR_CODE_HAI_GANG_QU 海港区
ADDR_CODE_HAI_GANG_QU AddrCode = "1265"
// ADDR_CODE_SHAN_HAI_GU_QU 山海关区
ADDR_CODE_SHAN_HAI_GU_QU AddrCode = "1266"
// ADDR_CODE_BEI_DAI_HE_QU 北戴河区
ADDR_CODE_BEI_DAI_HE_QU AddrCode = "1267"
// ADDR_CODE_HAN_DAN_SHI 邯郸市
ADDR_CODE_HAN_DAN_SHI AddrCode = "1270"
// ADDR_CODE_HAN_DAN_XIAN 邯郸县
ADDR_CODE_HAN_DAN_XIAN AddrCode = "1271"
// ADDR_CODE_HAN_SHAN_QU 邯山区
ADDR_CODE_HAN_SHAN_QU AddrCode = "1272"
// ADDR_CODE_CONG_TAI_QU 丛台区
ADDR_CODE_CONG_TAI_QU AddrCode = "1273"
// ADDR_CODE_FU_XING_QU 复兴区
ADDR_CODE_FU_XING_QU AddrCode = "1274"
// ADDR_CODE_FENG_FENG_KUANG_QU 峰峰矿区
ADDR_CODE_FENG_FENG_KUANG_QU AddrCode = "1275"
// ADDR_CODE_DA_MING_XIAN 大名县
ADDR_CODE_DA_MING_XIAN AddrCode = "1281"
// ADDR_CODE_HAN_DAN_SHI_WEI_XIAN 魏县
ADDR_CODE_HAN_DAN_SHI_WEI_XIAN AddrCode = "1282"
// ADDR_CODE_QU_ZHOU_XIAN 曲周县
ADDR_CODE_QU_ZHOU_XIAN AddrCode = "1283"
// ADDR_CODE_QIU_XIAN 邱县
ADDR_CODE_QIU_XIAN AddrCode = "1284"
// ADDR_CODE_JI_ZE_XIAN 鸡泽县
ADDR_CODE_JI_ZE_XIAN AddrCode = "1285"
// ADDR_CODE_FEI_XIANG_QU 肥乡区
ADDR_CODE_FEI_XIANG_QU AddrCode = "1286"
// ADDR_CODE_GUANG_PING_XIAN 广平县
ADDR_CODE_GUANG_PING_XIAN AddrCode = "1287"
// ADDR_CODE_CHENG_AN_XIAN 成安县
ADDR_CODE_CHENG_AN_XIAN AddrCode = "1288"
// ADDR_CODE_LIN_ZHANG_XIAN 临漳县
ADDR_CODE_LIN_ZHANG_XIAN AddrCode = "1289"
// ADDR_CODE_CI_XIAN 磁县
ADDR_CODE_CI_XIAN AddrCode = "1291"
// ADDR_CODE_SHE_XIAN 涉县
ADDR_CODE_SHE_XIAN AddrCode = "1292"
// ADDR_CODE_YONG_NIAN_QU 永年区
ADDR_CODE_YONG_NIAN_QU AddrCode = "1293"
// ADDR_CODE_GUAN_TAO_XIAN 馆陶县
ADDR_CODE_GUAN_TAO_XIAN AddrCode = "1294"
// ADDR_CODE_WU_AN_SHI 武安市
ADDR_CODE_WU_AN_SHI AddrCode = "1295"
// ADDR_CODE_XING_TAI_SHI 邢台市
ADDR_CODE_XING_TAI_SHI AddrCode = "1310"
// ADDR_CODE_XING_TAI_XIAN 邢台县
ADDR_CODE_XING_TAI_XIAN AddrCode = "1311"
// ADDR_CODE_XIANG_DOU_QU 襄都区
ADDR_CODE_XIANG_DOU_QU AddrCode = "1312"
// ADDR_CODE_XIN_DU_QU 信都区
ADDR_CODE_XIN_DU_QU AddrCode = "1313"
// ADDR_CODE_NAN_GONG_SHI 南宫市
ADDR_CODE_NAN_GONG_SHI AddrCode = "1321"
// ADDR_CODE_SHA_HE_SHI 沙河市
ADDR_CODE_SHA_HE_SHI AddrCode = "1322"
// ADDR_CODE_LIN_CHENG_XIAN 临城县
ADDR_CODE_LIN_CHENG_XIAN AddrCode = "1323"
// ADDR_CODE_NEI_QIU_XIAN 内丘县
ADDR_CODE_NEI_QIU_XIAN AddrCode = "1324"
// ADDR_CODE_BAI_XIANG_XIAN 柏乡县
ADDR_CODE_BAI_XIANG_XIAN AddrCode = "1325"
// ADDR_CODE_LONG_YAO_XIAN 隆尧县
ADDR_CODE_LONG_YAO_XIAN AddrCode = "1326"
// ADDR_CODE_REN_ZE_QU 任泽区
ADDR_CODE_REN_ZE_QU AddrCode = "1327"
// ADDR_CODE_NAN_HE_QU 南和区
ADDR_CODE_NAN_HE_QU AddrCode = "1328"
// ADDR_CODE_NING_JIN_XIAN 宁晋县
ADDR_CODE_NING_JIN_XIAN AddrCode = "1329"
// ADDR_CODE_JU_LU_XIAN 巨鹿县
ADDR_CODE_JU_LU_XIAN AddrCode = "1331"
// ADDR_CODE_XIN_HE_XIAN 新河县
ADDR_CODE_XIN_HE_XIAN AddrCode = "1332"
// ADDR_CODE_GUANG_ZONG_XIAN 广宗县
ADDR_CODE_GUANG_ZONG_XIAN AddrCode = "1333"
// ADDR_CODE_PING_XIANG_XIAN 平乡县
ADDR_CODE_PING_XIANG_XIAN AddrCode = "1334"
// ADDR_CODE_WEI_XIAN 威县
ADDR_CODE_XING_TAI_SHI_WEI_XIAN AddrCode = "1335"
// ADDR_CODE_QING_HE_XIAN 清河县
ADDR_CODE_QING_HE_XIAN AddrCode = "1336"
// ADDR_CODE_SHA_HE_SHI_LIN_XI_XIAN 临西县
ADDR_CODE_SHA_HE_SHI_LIN_XI_XIAN AddrCode = "1337"
// ADDR_CODE_BAO_DING_SHI 保定市
ADDR_CODE_BAO_DING_SHI AddrCode = "1340"
// ADDR_CODE_MAN_CHENG_QU 满城区
ADDR_CODE_MAN_CHENG_QU AddrCode = "1341"
// ADDR_CODE_QING_YUAN_QU 清苑区
ADDR_CODE_QING_YUAN_QU AddrCode = "1342"
// ADDR_CODE_JING_XIU_QU 竞秀区
ADDR_CODE_JING_XIU_QU AddrCode = "1343"
// ADDR_CODE_LIAN_CHI_QU 莲池区
ADDR_CODE_LIAN_CHI_QU AddrCode = "1344"
// ADDR_CODE_DING_ZHOU_SHI 定州市
ADDR_CODE_DING_ZHOU_SHI AddrCode = "1351"
// ADDR_CODE_ZHUO_ZHOU_SHI 涿州市
ADDR_CODE_ZHUO_ZHOU_SHI AddrCode = "1352"
// ADDR_CODE_YI_XIAN 易县
ADDR_CODE_YI_XIAN AddrCode = "1353"
// ADDR_CODE_XU_SHUI_QU 徐水区
ADDR_CODE_XU_SHUI_QU AddrCode = "1354"
// ADDR_CODE_LAI_YUAN_XIAN 涞源县
ADDR_CODE_LAI_YUAN_XIAN AddrCode = "1355"
// ADDR_CODE_DING_XING_XIAN 定兴县
ADDR_CODE_DING_XING_XIAN AddrCode = "1356"
// ADDR_CODE_SHUN_PING_XIAN 顺平县
ADDR_CODE_SHUN_PING_XIAN AddrCode = "1357"
// ADDR_CODE_TANG_XIAN 唐县
ADDR_CODE_TANG_XIAN AddrCode = "1358"
// ADDR_CODE_WANG_DU_XIAN 望都县
ADDR_CODE_WANG_DU_XIAN AddrCode = "1359"
// ADDR_CODE_LAI_SHUI_XIAN 涞水县
ADDR_CODE_LAI_SHUI_XIAN AddrCode = "1361"
// ADDR_CODE_GAO_YANG_XIAN 高阳县
ADDR_CODE_GAO_YANG_XIAN AddrCode = "1362"
// ADDR_CODE_AN_XIN_XIAN 安新县
ADDR_CODE_AN_XIN_XIAN AddrCode = "1363"
// ADDR_CODE_XIONG_XIAN 雄县
ADDR_CODE_XIONG_XIAN AddrCode = "1364"
// ADDR_CODE_RONG_CHENG_XIAN 容城县
ADDR_CODE_RONG_CHENG_XIAN AddrCode = "1365"
// ADDR_CODE_GAO_BEI_DIAN_SHI 高碑店市
ADDR_CODE_GAO_BEI_DIAN_SHI AddrCode = "1366"
// ADDR_CODE_QU_YANG_XIAN 曲阳县
ADDR_CODE_QU_YANG_XIAN AddrCode = "1367"
// ADDR_CODE_FU_PING_XIAN 阜平县
ADDR_CODE_FU_PING_XIAN AddrCode = "1368"
// ADDR_CODE_AN_GUO_SHI 安国市
ADDR_CODE_AN_GUO_SHI AddrCode = "1369"
// ADDR_CODE_BO_YE_XIAN 博野县
ADDR_CODE_BO_YE_XIAN AddrCode = "1371"
// ADDR_CODE_LI_XIAN 蠡县
ADDR_CODE_LI_XIAN AddrCode = "1372"
// ADDR_CODE_ZHANG_JIA_KOU_SHI 张家口市
ADDR_CODE_ZHANG_JIA_KOU_SHI AddrCode = "1380"
// ADDR_CODE_XUAN_HUA_XIAN 宣化县
ADDR_CODE_XUAN_HUA_XIAN AddrCode = "1381"
// ADDR_CODE_QIAO_DONG_QU 桥东区
ADDR_CODE_QIAO_DONG_QU AddrCode = "1382"
// ADDR_CODE_JIA_KOU_SHI_QIAO_XI_QU 桥西区
ADDR_CODE_JIA_KOU_SHI_QIAO_XI_QU AddrCode = "1383"
// ADDR_CODE_XUAN_HUA_QU 宣化区
ADDR_CODE_XUAN_HUA_QU AddrCode = "1384"
// ADDR_CODE_XIA_HUA_YUAN_QU 下花园区
ADDR_CODE_XIA_HUA_YUAN_QU AddrCode = "1385"
// ADDR_CODE_ZHANG_BEI_XIAN 张北县
ADDR_CODE_ZHANG_BEI_XIAN AddrCode = "1391"
// ADDR_CODE_KANG_BAO_XIAN 康保县
ADDR_CODE_KANG_BAO_XIAN AddrCode = "1392"
// ADDR_CODE_GU_YUAN_XIAN 沽源县
ADDR_CODE_GU_YUAN_XIAN AddrCode = "1393"
// ADDR_CODE_SHANG_YI_XIAN 尚义县
ADDR_CODE_SHANG_YI_XIAN AddrCode = "1394"
// ADDR_CODE_ZHANG_JIA_KOU_SHI_YU_XIAN 蔚县
ADDR_CODE_ZHANG_JIA_KOU_SHI_YU_XIAN AddrCode = "1395"
// ADDR_CODE_YANG_YUAN_XIAN 阳原县
ADDR_CODE_YANG_YUAN_XIAN AddrCode = "1396"
// ADDR_CODE_HUAI_AN_XIAN 怀安县
ADDR_CODE_HUAI_AN_XIAN AddrCode = "1397"
// ADDR_CODE_WAN_QUAN_QU 万全区
ADDR_CODE_WAN_QUAN_QU AddrCode = "1398"
// ADDR_CODE_HUAI_LAI_XIAN 怀来县
ADDR_CODE_HUAI_LAI_XIAN AddrCode = "1399"
// ADDR_CODE_ZHUO_LU_XIAN 涿鹿县
ADDR_CODE_ZHUO_LU_XIAN AddrCode = "1401"
// ADDR_CODE_CHI_CHENG_XIAN 赤城县
ADDR_CODE_CHI_CHENG_XIAN AddrCode = "1402"
// ADDR_CODE_CHONG_LI_QU 崇礼区
ADDR_CODE_CHONG_LI_QU AddrCode = "1403"
// ADDR_CODE_CHENG_DE_SHI 承德市
ADDR_CODE_CHENG_DE_SHI AddrCode = "1410"
// ADDR_CODE_CHENG_DE_XIAN 承德县
ADDR_CODE_CHENG_DE_XIAN AddrCode = "1411"
// ADDR_CODE_SHUANG_LUAN_QU 双滦区
ADDR_CODE_SHUANG_LUAN_QU AddrCode = "1413"
// ADDR_CODE_YING_SHOU_YING_ZI_KUANG_QU 鹰手营子矿区
ADDR_CODE_YING_SHOU_YING_ZI_KUANG_QU AddrCode = "1414"
// ADDR_CODE_KUAN_CHENG_MAN_ZU_ZI_ZHI_XIAN 宽城满族自治县
ADDR_CODE_KUAN_CHENG_MAN_ZU_ZI_ZHI_XIAN AddrCode = "1421"
// ADDR_CODE_XING_LONG_XIAN 兴隆县
ADDR_CODE_XING_LONG_XIAN AddrCode = "1422"
// ADDR_CODE_PING_QUAN_SHI 平泉市
ADDR_CODE_PING_QUAN_SHI AddrCode = "1423"
// ADDR_CODE_LUAN_PING_XIAN 滦平县
ADDR_CODE_LUAN_PING_XIAN AddrCode = "1424"
// ADDR_CODE_FENG_NING_MAN_ZU_ZI_ZHI_XIAN 丰宁满族自治县
ADDR_CODE_FENG_NING_MAN_ZU_ZI_ZHI_XIAN AddrCode = "1425"
// ADDR_CODE_LONG_HUA_XIAN 隆化县
ADDR_CODE_LONG_HUA_XIAN AddrCode = "1426"
// ADDR_CODE_WEI_CHANG_MAN_ZU_MENG_GU_ZU_ZI_ZHI_XIAN 围场满族蒙古族自治县
ADDR_CODE_WEI_CHANG_MAN_ZU_MENG_GU_ZU_ZI_ZHI_XIAN AddrCode = "1427"
// ADDR_CODE_CANG_ZHOU_SHI 沧州市
ADDR_CODE_CANG_ZHOU_SHI AddrCode = "1430"
// ADDR_CODE_CANG_XIAN 沧县
ADDR_CODE_CANG_XIAN AddrCode = "1431"
// ADDR_CODE_QING_XIAN 青县
ADDR_CODE_QING_XIAN AddrCode = "1432"
// ADDR_CODE_XIN_HUA_QU_TWO 新华区
ADDR_CODE_XIN_HUA_QU_TWO AddrCode = "1433"
// ADDR_CODE_PO_TOU_SHI 泊头市
ADDR_CODE_PO_TOU_SHI AddrCode = "1441"
// ADDR_CODE_REN_QIU_SHI 任丘市
ADDR_CODE_REN_QIU_SHI AddrCode = "1442"
// ADDR_CODE_HE_JIAN_SHI 河间市
ADDR_CODE_HE_JIAN_SHI AddrCode = "1443"
// ADDR_CODE_SU_NING_XIAN 肃宁县
ADDR_CODE_SU_NING_XIAN AddrCode = "1444"
// ADDR_CODE_XIAN_XIAN 献县
ADDR_CODE_XIAN_XIAN AddrCode = "1445"
// ADDR_CODE_WU_QIAO_XIAN 吴桥县
ADDR_CODE_WU_QIAO_XIAN AddrCode = "1446"
// ADDR_CODE_DONG_GUANG_XIAN 东光县
ADDR_CODE_DONG_GUANG_XIAN AddrCode = "1447"
// ADDR_CODE_NAN_PI_XIAN 南皮县
ADDR_CODE_NAN_PI_XIAN AddrCode = "1448"
// ADDR_CODE_YAN_SHAN_XIAN 盐山县
ADDR_CODE_YAN_SHAN_XIAN AddrCode = "1449"
// ADDR_CODE_HUANG_HUA_SHI 黄骅市
ADDR_CODE_HUANG_HUA_SHI AddrCode = "1451"
// ADDR_CODE_MENG_CUN_HUI_ZU_ZI_ZHI_XIAN 孟村回族自治县
ADDR_CODE_MENG_CUN_HUI_ZU_ZI_ZHI_XIAN AddrCode = "1452"
// ADDR_CODE_HAI_XING_XIAN 海兴县
ADDR_CODE_HAI_XING_XIAN AddrCode = "1453"
// ADDR_CODE_YUN_HE_QU 运河区
ADDR_CODE_YUN_HE_QU AddrCode = "1454"
// ADDR_CODE_LANG_FANG_SHI 廊坊市
ADDR_CODE_LANG_FANG_SHI AddrCode = "1460"
// ADDR_CODE_SAN_HE_SHI 三河市
ADDR_CODE_SAN_HE_SHI AddrCode = "1461"
// ADDR_CODE_GU_AN_XIAN 固安县
ADDR_CODE_GU_AN_XIAN AddrCode = "1462"
// ADDR_CODE_YONG_QING_XIAN 永清县
ADDR_CODE_YONG_QING_XIAN AddrCode = "1463"
// ADDR_CODE_XIANG_HE_XIAN 香河县
ADDR_CODE_XIANG_HE_XIAN AddrCode = "1464"
// ADDR_CODE_DA_CHENG_XIAN 大城县
ADDR_CODE_DA_CHENG_XIAN AddrCode = "1465"
// ADDR_CODE_WEN_AN_XIAN 文安县
ADDR_CODE_WEN_AN_XIAN AddrCode = "1466"
// ADDR_CODE_BA_ZHOU_SHI 霸州市
ADDR_CODE_BA_ZHOU_SHI AddrCode = "1467"
// ADDR_CODE_DA_CHANG_HUI_ZU_ZI_ZHI_XIAN 大厂回族自治县
ADDR_CODE_DA_CHANG_HUI_ZU_ZI_ZHI_XIAN AddrCode = "1468"
// ADDR_CODE_AN_CI_QU 安次区
ADDR_CODE_AN_CI_QU AddrCode = "1469"
// ADDR_CODE_GUANG_YANG_QU 广阳区
ADDR_CODE_GUANG_YANG_QU AddrCode = "1471"
// ADDR_CODE_HENG_SHUI_SHI 衡水市
ADDR_CODE_HENG_SHUI_SHI AddrCode = "1480"
// ADDR_CODE_JI_ZHOU_QU_TWO 冀州区
ADDR_CODE_JI_ZHOU_QU_TOW AddrCode = "1482"
// ADDR_CODE_ZAO_QIANG_XIAN 枣强县
ADDR_CODE_ZAO_QIANG_XIAN AddrCode = "1483"
// ADDR_CODE_WU_YI_XIAN 武邑县
ADDR_CODE_WU_YI_XIAN AddrCode = "1484"
// ADDR_CODE_SHEN_ZHOU_SHI 深州市
ADDR_CODE_SHEN_ZHOU_SHI AddrCode = "1485"
// ADDR_CODE_WU_QIANG_XIAN 武强县
ADDR_CODE_WU_QIANG_XIAN AddrCode = "1486"
// ADDR_CODE_RAO_YANG_XIAN 饶阳县
ADDR_CODE_RAO_YANG_XIAN AddrCode = "1487"
// ADDR_CODE_AN_PING_XIAN 安平县
ADDR_CODE_AN_PING_XIAN AddrCode = "1488"
// ADDR_CODE_GU_CHENG_XIAN 故城县
ADDR_CODE_GU_CHENG_XIAN AddrCode = "1489"
// ADDR_CODE_JING_XIAN 景县
ADDR_CODE_JING_XIAN AddrCode = "1491"
// ADDR_CODE_FU_CHENG_XIAN 阜城县
ADDR_CODE_FU_CHENG_XIAN AddrCode = "1492"
// ADDR_CODE_SHAN_XI_SHENG 山西省
ADDR_CODE_SHAN_XI_SHENG AddrCode = "1600"
// ADDR_CODE_TAI_YUAN_SHI 太原市
ADDR_CODE_TAI_YUAN_SHI AddrCode = "1610"
// ADDR_CODE_QING_XU_XIAN 清徐县
ADDR_CODE_QING_XU_XIAN AddrCode = "1611"
// ADDR_CODE_YANG_QU_XIAN 阳曲县
ADDR_CODE_YANG_QU_XIAN AddrCode = "1612"
// ADDR_CODE_LOU_FAN_XIAN 娄烦县
ADDR_CODE_LOU_FAN_XIAN AddrCode = "1613"
// ADDR_CODE_GU_JIAO_SHI 古交市
ADDR_CODE_GU_JIAO_SHI AddrCode = "1614"
// ADDR_CODE_JIAN_CAO_PING_QU 尖草坪区
ADDR_CODE_JIAN_CAO_PING_QU AddrCode = "1615"
// ADDR_CODE_XIAO_DIAN_QU 小店区
ADDR_CODE_XIAO_DIAN_QU AddrCode = "1616"
// ADDR_CODE_YING_ZE_QU 迎泽区
ADDR_CODE_YING_ZE_QU AddrCode = "1617"
// ADDR_CODE_XING_HUA_LING_QU 杏花岭区
ADDR_CODE_XING_HUA_LING_QU AddrCode = "1618"
// ADDR_CODE_WAN_BAI_LIN_QU 万柏林区
ADDR_CODE_WAN_BAI_LIN_QU AddrCode = "1619"
// ADDR_CODE_DA_TONG_SHI 大同市
ADDR_CODE_DA_TONG_SHI AddrCode = "1620"
// ADDR_CODE_JIN_YUAN_QU 晋源区
ADDR_CODE_JIN_YUAN_QU AddrCode = "1621"
// ADDR_CODE_YANG_GAO_XIAN 阳高县
ADDR_CODE_YANG_GAO_XIAN AddrCode = "1631"
// ADDR_CODE_TIAN_ZHEN_XIAN 天镇县
ADDR_CODE_TIAN_ZHEN_XIAN AddrCode = "1632"
// ADDR_CODE_GUANG_LING_XIAN 广灵县
ADDR_CODE_GUANG_LING_XIAN AddrCode = "1633"
// ADDR_CODE_LING_QIU_XIAN 灵丘县
ADDR_CODE_LING_QIU_XIAN AddrCode = "1634"
// ADDR_CODE_HUN_YUAN_XIAN 浑源县
ADDR_CODE_HUN_YUAN_XIAN AddrCode = "1635"
// ADDR_CODE_ZUO_YUN_XIAN 左云县
ADDR_CODE_ZUO_YUN_XIAN AddrCode = "1637"
// ADDR_CODE_NAN_JIAO_QU 南郊区
ADDR_CODE_NAN_JIAO_QU AddrCode = "1638"
// ADDR_CODE_YUN_ZHOU_QU 云州区
ADDR_CODE_YUN_ZHOU_QU AddrCode = "1639"
// ADDR_CODE_PING_CHENG_QU 平城区
ADDR_CODE_PING_CHENG_QU AddrCode = "1641"
// ADDR_CODE_YUN_GANG_QU 云冈区
ADDR_CODE_YUN_GANG_QU AddrCode = "1642"
// ADDR_CODE_XIN_RONG_QU 新荣区
ADDR_CODE_XIN_RONG_QU AddrCode = "1643"
// ADDR_CODE_YANG_QUAN_SHI 阳泉市
ADDR_CODE_YANG_QUAN_SHI AddrCode = "1650"
// ADDR_CODE_PING_DING_XIAN 平定县
ADDR_CODE_PING_DING_XIAN AddrCode = "1651"
// ADDR_CODE_YU_XIAN_TWO 盂县
ADDR_CODE_YU_XIAN_TWO AddrCode = "1652"
// ADDR_CODE_CHENG_QU 城区
ADDR_CODE_YU_XIAN_TWO_CHENG_QU AddrCode = "1653"
// ADDR_CODE_YU_XIAN_TWO_KUANG_QU 矿区
ADDR_CODE_YU_XIAN_TWO_KUANG_QU AddrCode = "1654"
// ADDR_CODE_JIAO_QU 郊区
ADDR_CODE_YU_XIAN_TWO_JIAO_QU AddrCode = "1655"
// ADDR_CODE_CHANG_ZHI_SHI 长治市
ADDR_CODE_CHANG_ZHI_SHI AddrCode = "1660"
// ADDR_CODE_SHANG_DANG_QU 上党区
ADDR_CODE_SHANG_DANG_QU AddrCode = "1661"
// ADDR_CODE_LU_CHENG_QU 潞城区
ADDR_CODE_LU_CHENG_QU AddrCode = "1662"
// ADDR_CODE_XIANG_YUAN_XIAN 襄垣县
ADDR_CODE_XIANG_YUAN_XIAN AddrCode = "1663"
// ADDR_CODE_TUN_LIU_QU 屯留区
ADDR_CODE_TUN_LIU_QU AddrCode = "1664"
// ADDR_CODE_PIN_SHUN_XIAN 平顺县
ADDR_CODE_PIN_SHUN_XIAN AddrCode = "1665"
// ADDR_CODE_LI_CHENG_XIAN 黎城县
ADDR_CODE_LI_CHENG_XIAN AddrCode = "1666"
// ADDR_CODE_HU_GUAN_XIAN 壶关县
ADDR_CODE_HU_GUAN_XIAN AddrCode = "1667"
// ADDR_CODE_ZHANG_ZI_XIAN 长子县
ADDR_CODE_ZHANG_ZI_XIAN AddrCode = "1668"
// ADDR_CODE_WU_XIANG_XIAN 武乡县
ADDR_CODE_WU_XIANG_XIAN AddrCode = "1669"
// ADDR_CODE_QIN_XIAN 沁县
ADDR_CODE_QIN_XIAN AddrCode = "1671"
// ADDR_CODE_QIN_YUAN_XIAN 沁源县
ADDR_CODE_QIN_YUAN_XIAN AddrCode = "1672"
// ADDR_CODE_LU_ZHOU_QU 潞州区
ADDR_CODE_LU_ZHOU_QU AddrCode = "1673"
// ADDR_CODE_JIAO_QU 郊区
ADDR_CODE_JIAO_QU AddrCode = "1674"
// ADDR_CODE_JIN_CHENG_SHI 晋城市
ADDR_CODE_JIN_CHENG_SHI AddrCode = "1680"
// ADDR_CODE_QIN_SHUI_XIAN 沁水县
ADDR_CODE_QIN_SHUI_XIAN AddrCode = "1681"
// ADDR_CODE_YANG_CHENG_XIAN 阳城县
ADDR_CODE_YANG_CHENG_XIAN AddrCode = "1682"
// ADDR_CODE_GAO_PING_SHI 高平市
ADDR_CODE_GAO_PING_SHI AddrCode = "1683"
// ADDR_CODE_LING_CHUAN_XIAN 陵川县
ADDR_CODE_LING_CHUAN_XIAN AddrCode = "1684"
// ADDR_CODE_ZE_ZHOU_XIAN 泽州县
ADDR_CODE_ZE_ZHOU_XIAN AddrCode = "1685"
// ADDR_CODE_CHENG_QU 城区
ADDR_CODE_CHENG_QU AddrCode = "1686"
// ADDR_CODE_SHUO_ZHOU_SHI 朔州市
ADDR_CODE_SHUO_ZHOU_SHI AddrCode = "1690"
// ADDR_CODE_SHAN_YIN_XIAN 山阴县
ADDR_CODE_SHAN_YIN_XIAN AddrCode = "1691"
// ADDR_CODE_YING_XIAN 应县
ADDR_CODE_YING_XIAN AddrCode = "1692"
// ADDR_CODE_YOU_YU_XIAN 右玉县
ADDR_CODE_YOU_YU_XIAN AddrCode = "1693"
// ADDR_CODE_HUAI_REN_SHI 怀仁市
ADDR_CODE_HUAI_REN_SHI AddrCode = "1694"
// ADDR_CODE_SHUO_CHENG_QU 朔城区
ADDR_CODE_SHUO_CHENG_QU AddrCode = "1695"
// ADDR_CODE_PING_LU_QU 平鲁区
ADDR_CODE_PING_LU_QU AddrCode = "1696"
// ADDR_CODE_XIN_ZHOU_SHI 忻州市
ADDR_CODE_XIN_ZHOU_SHI AddrCode = "1710"
// ADDR_CODE_DING_XIANG_XIAN 定襄县
ADDR_CODE_DING_XIANG_XIAN AddrCode = "1712"
// ADDR_CODE_WU_TAI_XIAN 五台县
ADDR_CODE_WU_TAI_XIAN AddrCode = "1713"
// ADDR_CODE_YUAN_PING_SHI 原平市
ADDR_CODE_YUAN_PING_SHI AddrCode = "1714"
// ADDR_CODE_DAI_XIAN 代县
ADDR_CODE_DAI_XIAN AddrCode = "1715"
// ADDR_CODE_FAN_SHI_XIAN 繁峙县
ADDR_CODE_FAN_SHI_XIAN AddrCode = "1716"
// ADDR_CODE_NING_WU_XIAN 宁武县
ADDR_CODE_NING_WU_XIAN AddrCode = "1717"
// ADDR_CODE_JING_LE_XIAN 静乐县
ADDR_CODE_JING_LE_XIAN AddrCode = "1718"
// ADDR_CODE_SHEN_CHI_XIAN 神池县
ADDR_CODE_SHEN_CHI_XIAN AddrCode = "1719"
// ADDR_CODE_WU_ZHAI_XIAN 五寨县
ADDR_CODE_WU_ZHAI_XIAN AddrCode = "1721"
// ADDR_CODE_KE_LAN_XIAN 岢岚县
ADDR_CODE_KE_LAN_XIAN AddrCode = "1722"
// ADDR_CODE_HE_QU_XIAN 河曲县
ADDR_CODE_HE_QU_XIAN AddrCode = "1723"
// ADDR_CODE_BAO_DE_XIAN 保德县
ADDR_CODE_BAO_DE_XIAN AddrCode = "1724"
// ADDR_CODE_PIAN_GUAN_XIAN 偏关县
ADDR_CODE_PIAN_GUAN_XIAN AddrCode = "1725"
// ADDR_CODE_XIN_FU_QU 忻府区
ADDR_CODE_XIN_FU_QU AddrCode = "1726"
// ADDR_CODE_LV_LIANG_SHI 吕梁市
ADDR_CODE_LV_LIANG_SHI AddrCode = "1730"
// ADDR_CODE_FEN_YANG_SHI 汾阳市
ADDR_CODE_FEN_YANG_SHI AddrCode = "1731"
// ADDR_CODE_WEN_SHUI_XIAN 文水县
ADDR_CODE_WEN_SHUI_XIAN AddrCode = "1732"
// ADDR_CODE_JIAO_CHENG_XIAN 交城县
ADDR_CODE_JIAO_CHENG_XIAN AddrCode = "1733"
// ADDR_CODE_XIAO_YI_SHI 孝义市
ADDR_CODE_XIAO_YI_SHI AddrCode = "1734"
// ADDR_CODE_XING_XIAN 兴县
ADDR_CODE_XING_XIAN AddrCode = "1735"
// ADDR_CODE_LIN_XIAN 临县
ADDR_CODE_LIN_XIAN AddrCode = "1736"
// ADDR_CODE_LIU_LIN_XIAN 柳林县
ADDR_CODE_LIU_LIN_XIAN AddrCode = "1737"
// ADDR_CODE_SHI_LOU_XIAN 石楼县
ADDR_CODE_SHI_LOU_XIAN AddrCode = "1738"
// ADDR_CODE_LAN_XIAN 岚县
ADDR_CODE_LAN_XIAN AddrCode = "1739"
// ADDR_CODE_FANG_SHAN_XIAN 方山县
ADDR_CODE_FANG_SHAN_XIAN AddrCode = "1741"
// ADDR_CODE_ZHONG_YANG_XIAN 中阳县
ADDR_CODE_ZHONG_YANG_XIAN AddrCode = "1743"
// ADDR_CODE_JIAO_KOU_XIAN 交口县
ADDR_CODE_JIAO_KOU_XIAN AddrCode = "1744"
// ADDR_CODE_LI_SHI_QU 离石区
ADDR_CODE_LI_SHI_QU AddrCode = "1745"
// ADDR_CODE_JIN_ZHONG_SHI 晋中市
ADDR_CODE_JIN_ZHONG_SHI AddrCode = "1750"
// ADDR_CODE_YU_CI_QU 榆次区
ADDR_CODE_YU_CI_QU AddrCode = "1751"
// ADDR_CODE_YU_SHE_XIAN 榆社县
ADDR_CODE_YU_SHE_XIAN AddrCode = "1752"
// ADDR_CODE_ZUO_QUAN_XIAN 左权县
ADDR_CODE_ZUO_QUAN_XIAN AddrCode = "1753"
// ADDR_CODE_HE_SHUN_XIAN 和顺县
ADDR_CODE_HE_SHUN_XIAN AddrCode = "1754"
// ADDR_CODE_XI_YANG_XIAN 昔阳县
ADDR_CODE_XI_YANG_XIAN AddrCode = "1755"
// ADDR_CODE_SHOU_YANG_XIAN 寿阳县
ADDR_CODE_SHOU_YANG_XIAN AddrCode = "1756"
// ADDR_CODE_TAI_GU_QU 太谷区
ADDR_CODE_TAI_GU_QU AddrCode = "1757"
// ADDR_CODE_QI_XIAN 祁县
ADDR_CODE_QI_XIAN AddrCode = "1758"
// ADDR_CODE_PING_YAO_XIAN 平遥县
ADDR_CODE_PING_YAO_XIAN AddrCode = "1759"
// ADDR_CODE_JIE_XIU_SHI 介休市
ADDR_CODE_JIE_XIU_SHI AddrCode = "1761"
// ADDR_CODE_LING_SHI_XIAN 灵石县
ADDR_CODE_LING_SHI_XIAN AddrCode = "1762"
// ADDR_CODE_LIN_FEN_SHI 临汾市
ADDR_CODE_LIN_FEN_SHI AddrCode = "1770"
// ADDR_CODE_YAO_DU_QU 尧都区
ADDR_CODE_YAO_DU_QU AddrCode = "1771"
// ADDR_CODE_HOU_MA_SHI 侯马市
ADDR_CODE_HOU_MA_SHI AddrCode = "1772"
// ADDR_CODE_QU_WO_XIAN 曲沃县
ADDR_CODE_QU_WO_XIAN AddrCode = "1773"
// ADDR_CODE_YI_CHENG_XIAN 翼城县
ADDR_CODE_YI_CHENG_XIAN AddrCode = "1774"
// ADDR_CODE_XIANG_FEN_XIAN 襄汾县
ADDR_CODE_XIANG_FEN_XIAN AddrCode = "1775"
// ADDR_CODE_HONG_TONG_XIAN 洪洞县
ADDR_CODE_HONG_TONG_XIAN AddrCode = "1776"
// ADDR_CODE_HUO_ZHOU_SHI 霍州市
ADDR_CODE_HUO_ZHOU_SHI AddrCode = "1777"
// ADDR_CODE_GU_XIAN 古县
ADDR_CODE_GU_XIAN AddrCode = "1778"
// ADDR_CODE_AN_ZE_XIAN 安泽县
ADDR_CODE_AN_ZE_XIAN AddrCode = "1779"
// ADDR_CODE_FU_SHAN_XIAN 浮山县
ADDR_CODE_FU_SHAN_XIAN AddrCode = "1781"
// ADDR_CODE_JI_XIAN 吉县
ADDR_CODE_JI_XIAN AddrCode = "1782"
// ADDR_CODE_XIANG_NING_XIAN 乡宁县
ADDR_CODE_XIANG_NING_XIAN AddrCode = "1783"
// ADDR_CODE_PU_XIAN 蒲县
ADDR_CODE_PU_XIAN AddrCode = "1784"
// ADDR_CODE_DA_NING_XIAN 大宁县
ADDR_CODE_DA_NING_XIAN AddrCode = "1785"
// ADDR_CODE_YONG_HE_XIAN 永和县
ADDR_CODE_YONG_HE_XIAN AddrCode = "1786"
// ADDR_CODE_XI_XIAN 隰县
ADDR_CODE_XI_XIAN AddrCode = "1787"
// ADDR_CODE_FEN_XI_XIAN 汾西县
ADDR_CODE_FEN_XI_XIAN AddrCode = "1788"
// ADDR_CODE_YUN_CHENG_SHI 运城市
ADDR_CODE_YUN_CHENG_SHI AddrCode = "1810"
// ADDR_CODE_YAN_HU_QU 盐湖区
ADDR_CODE_YAN_HU_QU AddrCode = "1811"
// ADDR_CODE_YONG_JI_SHI 永济市
ADDR_CODE_YONG_JI_SHI AddrCode = "1812"
// ADDR_CODE_RUI_CHENG_XIAN 芮城县
ADDR_CODE_RUI_CHENG_XIAN AddrCode = "1813"
// ADDR_CODE_LIN_YI_XIAN 临猗县
ADDR_CODE_LIN_YI_XIAN AddrCode = "1814"
// ADDR_CODE_WAN_RONG_XIAN 万荣县
ADDR_CODE_WAN_RONG_XIAN AddrCode = "1815"
// ADDR_CODE_XIN_JIANG_XIAN 新绛县
ADDR_CODE_XIN_JIANG_XIAN AddrCode = "1816"
// ADDR_CODE_JI_SHAN_XIAN 稷山县
ADDR_CODE_JI_SHAN_XIAN AddrCode = "1817"
// ADDR_CODE_HE_JIN_SHI 河津市
ADDR_CODE_HE_JIN_SHI AddrCode = "1818"
// ADDR_CODE_WEN_XI_XIAN 闻喜县
ADDR_CODE_WEN_XI_XIAN AddrCode = "1819"
// ADDR_CODE_XIA_XIAN 夏县
ADDR_CODE_XIA_XIAN AddrCode = "1821"
// ADDR_CODE_JIANG_XIAN 绛县
ADDR_CODE_JIANG_XIAN AddrCode = "1822"
// ADDR_CODE_PING_LU_XIAN 平陆县
ADDR_CODE_PING_LU_XIAN AddrCode = "1823"
// ADDR_CODE_YUAN_QU_XIAN 垣曲县
ADDR_CODE_YUAN_QU_XIAN AddrCode = "1824"
// ADDR_CODE_NEI_MENG_GU_ZI_ZHI_QU 内蒙古自治区
ADDR_CODE_NEI_MENG_GU_ZI_ZHI_QU AddrCode = "1900"
// ADDR_CODE_HU_HE_HAO_TE_SHI 呼和浩特市
ADDR_CODE_HU_HE_HAO_TE_SHI AddrCode = "1910"
// ADDR_CODE_TU_MO_TE_ZUO_QI 土默特左旗
ADDR_CODE_TU_MO_TE_ZUO_QI AddrCode = "1911"
// ADDR_CODE_TUO_KE_TUO_XIAN 托克托县
ADDR_CODE_TUO_KE_TUO_XIAN AddrCode = "1912"
// ADDR_CODE_WU_CHUAN_XIAN 武川县
ADDR_CODE_WU_CHUAN_XIAN AddrCode = "1913"
// ADDR_CODE_HE_LIN_GE_ER_XIAN 和林格尔县
ADDR_CODE_HE_LIN_GE_ER_XIAN AddrCode = "1914"
// ADDR_CODE_QING_SHUI_HE_XIAN 清水河县
ADDR_CODE_QING_SHUI_HE_XIAN AddrCode = "1915"
// ADDR_CODE_HUI_MIN_QU 回民区
ADDR_CODE_HUI_MIN_QU AddrCode = "1916"
// ADDR_CODE_RU_YI_KAI_FA_QU 如意开发区
ADDR_CODE_RU_YI_KAI_FA_QU AddrCode = "1917"
// ADDR_CODE_SAI_HAN_QU 赛罕区
ADDR_CODE_SAI_HAN_QU AddrCode = "1918"
// ADDR_CODE_XIN_CHENG_QU 新城区
ADDR_CODE_XIN_CHENG_QU AddrCode = "1919"
// ADDR_CODE_BAO_TOU_SHI 包头市
ADDR_CODE_BAO_TOU_SHI AddrCode = "1920"
// ADDR_CODE_TU_MO_TE_YOU_QI 土默特右旗
ADDR_CODE_TU_MO_TE_YOU_QI AddrCode = "1921"
// ADDR_CODE_GU_YANG_XIAN 固阳县
ADDR_CODE_GU_YANG_XIAN AddrCode = "1922"
// ADDR_CODE_DA_ER_HAN_MAO_MING_AN_LIAN_HE_QI 达尔罕茂明安联合旗
ADDR_CODE_DA_ER_HAN_MAO_MING_AN_LIAN_HE_QI AddrCode = "1923"
// ADDR_CODE_DONG_HE_QU 东河区
ADDR_CODE_DONG_HE_QU AddrCode = "1924"
// ADDR_CODE_KUN_DOU_LUN_QU 昆都仑区
ADDR_CODE_KUN_DOU_LUN_QU AddrCode = "1925"
// ADDR_CODE_QING_SHAN_QU 青山区
ADDR_CODE_QING_SHAN_QU AddrCode = "1926"
// ADDR_CODE_SHI_GUAI_QU 石拐区
ADDR_CODE_SHI_GUAI_QU AddrCode = "1927"
// ADDR_CODE_BAI_YUN_E_BO_KUANG_QU 白云鄂博矿区
ADDR_CODE_BAI_YUN_E_BO_KUANG_QU AddrCode = "1928"
// ADDR_CODE_JIU_YUAN_QU 九原区
ADDR_CODE_JIU_YUAN_QU AddrCode = "1929"
// ADDR_CODE_WU_HAI_SHI 乌海市
ADDR_CODE_WU_HAI_SHI AddrCode = "1930"
// ADDR_CODE_HAI_BO_WAN_QU 海勃湾区
ADDR_CODE_HAI_BO_WAN_QU AddrCode = "1931"
// ADDR_CODE_HAI_NAN_QU 海南区
ADDR_CODE_HAI_NAN_QU AddrCode = "1932"
// ADDR_CODE_WU_DA_QU 乌达区
ADDR_CODE_WU_DA_QU AddrCode = "1933"
// ADDR_CODE_CHI_FENG_SHI 赤峰市
ADDR_CODE_CHI_FENG_SHI AddrCode = "1940"
// ADDR_CODE_A_LU_KE_ER_QIN_QI 阿鲁科尔沁旗
ADDR_CODE_A_LU_KE_ER_QIN_QI AddrCode = "1941"
// ADDR_CODE_BA_LIN_ZUO_QI 巴林左旗
ADDR_CODE_BA_LIN_ZUO_QI AddrCode = "1942"
// ADDR_CODE_BA_LIN_YOU_QI 巴林右旗
ADDR_CODE_BA_LIN_YOU_QI AddrCode = "1943"
// ADDR_CODE_LIN_XI_XIAN_TWO 林西县
ADDR_CODE_LIN_XI_XIAN_TWO AddrCode = "1944"
// ADDR_CODE_KE_SHI_KE_TENG_QI 克什克腾旗
ADDR_CODE_KE_SHI_KE_TENG_QI AddrCode = "1945"
// ADDR_CODE_WENG_NIU_TE_QI 翁牛特旗
ADDR_CODE_WENG_NIU_TE_QI AddrCode = "1946"
// ADDR_CODE_KA_LA_QIN_QI 喀喇沁旗
ADDR_CODE_KA_LA_QIN_QI AddrCode = "1947"
// ADDR_CODE_NING_CHENG_XIAN 宁城县
ADDR_CODE_NING_CHENG_XIAN AddrCode = "1948"
// ADDR_CODE_AO_HAN_QI 敖汉旗
ADDR_CODE_AO_HAN_QI AddrCode = "1949"
// ADDR_CODE_HONG_SHAN_QU 红山区
ADDR_CODE_HONG_SHAN_QU AddrCode = "1951"
// ADDR_CODE_YUAN_BAO_SHAN_QU 元宝山区
ADDR_CODE_YUAN_BAO_SHAN_QU AddrCode = "1952"
// ADDR_CODE_SONG_SHAN_QU 松山区
ADDR_CODE_SONG_SHAN_QU AddrCode = "1953"
// ADDR_CODE_HU_LUN_BEIER_SHI 呼伦贝尔市
ADDR_CODE_HU_LUN_BEIER_SHI AddrCode = "1960"
// ADDR_CODE_HAI_LA_ER_QU 海拉尔区
ADDR_CODE_HAI_LA_ER_QU AddrCode = "1961"
// ADDR_CODE_MAN_ZHOU_LI_SHI 满洲里市
ADDR_CODE_MAN_ZHOU_LI_SHI AddrCode = "1962"
// ADDR_CODE_ZHA_LAN_TUN_SHI 扎兰屯市
ADDR_CODE_ZHA_LAN_TUN_SHI AddrCode = "1963"
// ADDR_CODE_YA_KE_SHI_SHI 牙克石市
ADDR_CODE_YA_KE_SHI_SHI AddrCode = "1964"
// ADDR_CODE_ER_LUN_CHUN_ZU_ZI_ZHI_QI 额尔古纳市
ADDR_CODE_ER_LUN_CHUN_ZU_ZI_ZHI_QI AddrCode = "1965"
)
// Pre 将AddrCode枚举转换为字符串
func (ac AddrCode) Pre() string {
return string(ac)
}
+67
View File
@@ -0,0 +1,67 @@
package consts
type AccountType string
const (
ACCOUNT_TYPE_WECHAT AccountType = "WECHAT" // 微信
ACCOUNT_TYPE_ALIPAY AccountType = "ALIPAY" // 支付宝
ACCOUNT_TYPE_UQRCODEPAY AccountType = "UQRCODEPAY" // 银联
ACCOUNT_TYPE_BASTPAY AccountType = "BASTPAY" // 翼支付
ACCOUNT_TYPE_SUNING AccountType = "SUNING" // 苏宁
ACCOUNT_TYPE_LKLACC AccountType = "LKLACC" // 拉卡拉支付账户
ACCOUNT_TYPE_NUCSPAY AccountType = "NUCSPAY" // 网联小钱包
ACCOUNT_TYPE_JD AccountType = "JD"
)
func (at AccountType) Ptr() string {
return string(at)
}
type TransType string
const (
TRANS_TYPE_NATIVE TransType = "41" // NATIVE(ALIPAY, 云闪付支持, 京东白条分期)
TRANS_TYPE_JSAPI TransType = "51" // JSAPI(微信公众号支付, 支付宝服务窗、JS支付, 翼支付JS支付, 拉卡拉钱包支付, 京东白条分期)
TRANS_TYPE_WECHATPAY TransType = "71" // 微信小程序支付
TRANS_TYPE_APP TransType = "61" // APP支付(微信APP支付),String(2)
)
func (tt TransType) Ptr() string {
return string(tt)
}
type SettleType string
const (
SETTLE_TYPE_NORMAL SettleType = "0" // 常规结算
SETTLE_TYPE_SPECIAL SettleType = "1" // 拉卡拉分账通结算
)
func (st SettleType) Ptr() string {
return string(st)
}
type RefundAccMode string
// 00退货账户余额 05商户余额 06终端余额 30终点账户
const (
REFUND_ACC_MODE_USER_BALANCE RefundAccMode = "00" // 退货账户余额
REFUND_ACC_MODE_MERCHANT_BALANCE RefundAccMode = "05" // 商户余额
REFUND_ACC_MODE_TERMINAL_BALANCE RefundAccMode = "06" // 终端余额
REFUND_ACC_MODE_ACCOUNT RefundAccMode = "30" // 终点账户
)
func (rat RefundAccMode) Ptr() string {
return string(rat)
}
type RefundAmtSts string
const (
REFUND_AMT_STS_NORMAL RefundAmtSts = "00" // 分账前
REFUND_AMT_STS_SPLIT RefundAmtSts = "01" // 分账后
)
func (ras RefundAmtSts) Ptr() string {
return string(ras)
}
+249
View File
@@ -0,0 +1,249 @@
// Package consts 提供常量定义
package consts
// Mcc 商户类别代码枚举
type Mcc string
const (
// MCC_0742 兽医服务
MCC_0742 Mcc = "0742"
// MCC_0763 农业合作
MCC_0763 Mcc = "0763"
// MCC_0780 景观美化及园艺服务
MCC_0780 Mcc = "0780"
// MCC_1520 一般承包商-住宅与商业楼
MCC_1520 Mcc = "1520"
// MCC_4011 铁路运输
MCC_4011 Mcc = "4011"
// MCC_4111 本市和市郊通勤旅客运输(包括轮渡)
MCC_4111 Mcc = "4111"
// MCC_4112 铁路客运
MCC_4112 Mcc = "4112"
// MCC_4119 救护车服务
MCC_4119 Mcc = "4119"
// MCC_4121 出租车服务
MCC_4121 Mcc = "4121"
// MCC_4131 公路客运
MCC_4131 Mcc = "4131"
// MCC_4214 货物搬运和托运—当地和长途,移动和存储公司,以及当地递送服务
MCC_4214 Mcc = "4214"
// MCC_4215 快递服务(空运、地面运输或海运)
MCC_4215 Mcc = "4215"
// MCC_4225 公共仓储服务-农产品、冷冻品和家用产品
MCC_4225 Mcc = "4225"
// MCC_4411 轮船及巡游航线服务
MCC_4411 Mcc = "4411"
// MCC_4457 出租船只
MCC_4457 Mcc = "4457"
// MCC_4468 船舶、海运服务提供商
MCC_4468 Mcc = "4468"
// MCC_4511 航空公司
MCC_4511 Mcc = "4511"
// MCC_4582 机场服务
MCC_4582 Mcc = "4582"
// MCC_4722 旅行社
MCC_4722 Mcc = "4722"
// MCC_4733 大型景区售票
MCC_4733 Mcc = "4733"
// MCC_4784 路桥通行费
MCC_4784 Mcc = "4784"
// MCC_4789 未列入其他代码的运输服务
MCC_4789 Mcc = "4789"
// MCC_4812 通讯设备和电话销售
MCC_4812 Mcc = "4812"
// MCC_4814 电信服务,包括本地和长途电话、信用卡电话、磁卡电话和传真
MCC_4814 Mcc = "4814"
// MCC_4816 计算机网络/信息服务
MCC_4816 Mcc = "4816"
// MCC_4821 电报服务
MCC_4821 Mcc = "4821"
// MCC_4899 有线和其他付费电视服务
MCC_4899 Mcc = "4899"
// MCC_4900 公共事业(电力、煤气、自来水、清洁服务)
MCC_4900 Mcc = "4900"
// MCC_5094 贵重珠宝、首饰,钟表零售
MCC_5094 Mcc = "5094"
// MCC_5211 木材和各类建材卖场
MCC_5211 Mcc = "5211"
// MCC_5231 玻璃、油漆涂料、墙纸零售
MCC_5231 Mcc = "5231"
// MCC_5251 五金商店
MCC_5251 Mcc = "5251"
// MCC_5261 草坪、花园用品商店
MCC_5261 Mcc = "5261"
// MCC_5309 免税商店
MCC_5309 Mcc = "5309"
// MCC_5310 折扣商店
MCC_5310 Mcc = "5310"
// MCC_5311 百货商店
MCC_5311 Mcc = "5311"
// MCC_5331 各类杂货店、便利店
MCC_5331 Mcc = "5331"
// MCC_5399 其他综合零售
MCC_5399 Mcc = "5399"
// MCC_5411 大型仓储式超级市场
MCC_5411 Mcc = "5411"
// MCC_5422 各类肉类零售商
MCC_5422 Mcc = "5422"
// MCC_5441 糖果及坚果商店
MCC_5441 Mcc = "5441"
// MCC_5451 乳制品店、冷饮店
MCC_5451 Mcc = "5451"
// MCC_5462 面包房、糕点商店
MCC_5462 Mcc = "5462"
// MCC_5499 各类食品店及专门食品零售店
MCC_5499 Mcc = "5499"
// MCC_5511 汽车货车经销商-新旧车的销售、服务、维修、零件及出租
MCC_5511 Mcc = "5511"
// MCC_5521 汽车货车经销商-专门从事旧车的销售、服务、维修、零件及出租
MCC_5521 Mcc = "5521"
// MCC_5532 汽车轮胎经销商
MCC_5532 Mcc = "5532"
// MCC_5533 汽车零配件商店
MCC_5533 Mcc = "5533"
// MCC_5541 加油站、服务站
MCC_5541 Mcc = "5541"
// MCC_5542 自助加油站
MCC_5542 Mcc = "5542"
// MCC_5551 船只销售商
MCC_5551 Mcc = "5551"
// MCC_5561 旅行拖车、娱乐用车销售商
MCC_5561 Mcc = "5561"
// MCC_5571 摩托车商店和经销商
MCC_5571 Mcc = "5571"
// MCC_5592 露营、房车销售商
MCC_5592 Mcc = "5592"
// MCC_5598 雪车商
MCC_5598 Mcc = "5598"
// MCC_5599 汽车、飞行器、农用机车综合经营商
MCC_5599 Mcc = "5599"
// MCC_5611 男子和男童服装及用品商店
MCC_5611 Mcc = "5611"
// MCC_5621 妇女成衣商店
MCC_5621 Mcc = "5621"
// MCC_5631 女性用品商店
MCC_5631 Mcc = "5631"
// MCC_5641 婴儿、儿童服装店
MCC_5641 Mcc = "5641"
// MCC_5651 家庭服装商店
MCC_5651 Mcc = "5651"
// MCC_5655 运动服饰商店
MCC_5655 Mcc = "5655"
// MCC_5661 鞋店
MCC_5661 Mcc = "5661"
// MCC_5681 皮货店
MCC_5681 Mcc = "5681"
// MCC_5722 家用电器商店
MCC_5722 Mcc = "5722"
// MCC_5811 包办伙食,宴会承包商
MCC_5811 Mcc = "5811"
// MCC_5812 就餐场所和餐馆
MCC_5812 Mcc = "5812"
// MCC_5813 饮酒场所(酒吧、酒馆、夜总会、鸡尾酒大厅、迪斯科舞厅)
MCC_5813 Mcc = "5813"
// MCC_5932 古玩店——出售、维修及还原
MCC_5932 Mcc = "5932"
// MCC_5933 典当、拍卖、信托
MCC_5933 Mcc = "5933"
// MCC_5937 古玩复制店
MCC_5937 Mcc = "5937"
// MCC_5944 银器店
MCC_5944 Mcc = "5944"
// MCC_5950 玻璃器皿和水晶饰品店
MCC_5950 Mcc = "5950"
// MCC_5960 直销-保险直销
MCC_5960 Mcc = "5960"
// MCC_5970 工艺美术商店
MCC_5970 Mcc = "5970"
// MCC_5971 艺术商和画廊
MCC_5971 Mcc = "5971"
// MCC_5994 报亭、报摊
MCC_5994 Mcc = "5994"
// MCC_5998 其他批发商
MCC_5998 Mcc = "5998"
// MCC_6012 金融机构-商品和服务
MCC_6012 Mcc = "6012"
// MCC_6300 保险销售、保险业和保险金
MCC_6300 Mcc = "6300"
// MCC_7011 住宿服务(旅馆、酒店、汽车旅馆、度假村等)
MCC_7011 Mcc = "7011"
// MCC_7012 分时使用的别墅或度假用房
MCC_7012 Mcc = "7012"
// MCC_7013 不动产代理——房地产经纪
MCC_7013 Mcc = "7013"
// MCC_7032 运动和娱乐露营地
MCC_7032 Mcc = "7032"
// MCC_7033 活动房车场及露营场所
MCC_7033 Mcc = "7033"
// MCC_7297 按摩店
MCC_7297 Mcc = "7297"
// MCC_7298 保健及美容SPA
MCC_7298 Mcc = "7298"
// MCC_7523 停车场
MCC_7523 Mcc = "7523"
// MCC_7631 手表、钟表和首饰维修店
MCC_7631 Mcc = "7631"
// MCC_7829 电影和录像创作、发行
MCC_7829 Mcc = "7829"
// MCC_7911 歌舞厅
MCC_7911 Mcc = "7911"
// MCC_7922 戏剧制片(不含电影)、演出和票务
MCC_7922 Mcc = "7922"
// MCC_7929 未列入其他代码的乐队、文艺表演
MCC_7929 Mcc = "7929"
// MCC_7932 台球、撞球场所
MCC_7932 Mcc = "7932"
// MCC_7933 保龄球馆
MCC_7933 Mcc = "7933"
// MCC_7941 商业体育场馆、职业体育俱乐部、运动场和体育推广公司
MCC_7941 Mcc = "7941"
// MCC_7992 公共高尔夫球场
MCC_7992 Mcc = "7992"
// MCC_7994 大型游戏机和游戏场所
MCC_7994 Mcc = "7994"
// MCC_7996 游乐园、马戏团、嘉年华、占卜
MCC_7996 Mcc = "7996"
// MCC_7997 会员俱乐部(体育、娱乐、运动等)、乡村俱乐部以及私人高尔夫课程班
MCC_7997 Mcc = "7997"
// MCC_7998 水族馆、海洋馆和海豚馆
MCC_7998 Mcc = "7998"
// MCC_7999 未列入其他代码的娱乐服务
MCC_7999 Mcc = "7999"
// MCC_8062 公立医院
MCC_8062 Mcc = "8062"
// MCC_8211 中小学校(公立)
MCC_8211 Mcc = "8211"
// MCC_8220 普通高校(公立)
MCC_8220 Mcc = "8220"
// MCC_8398 慈善和社会公益服务组织
MCC_8398 Mcc = "8398"
// MCC_8651 政治组织(政府机构)
MCC_8651 Mcc = "8651"
// MCC_9211 法庭费用,包括赡养费和子女抚养费
MCC_9211 Mcc = "9211"
// MCC_9222 罚款
MCC_9222 Mcc = "9222"
// MCC_9223 保释金
MCC_9223 Mcc = "9223"
// MCC_9311 纳税
MCC_9311 Mcc = "9311"
// MCC_9399 未列入其他代码的政府服务(社会保障服务,国家强制)
MCC_9399 Mcc = "9399"
// MCC_9400 使领馆收费
MCC_9400 Mcc = "9400"
// MCC_9402 国家邮政服务
MCC_9402 Mcc = "9402"
// MCC_3998 中国人民共和国铁道部
MCC_3998 Mcc = "3998"
// MCC_BIG_7299 其他个人服务 包括干洗店,育发,植发,保洁、保安、婚庆、殡葬、家政、清洁、保养、门卫服务,出租衣物服务
MCC_BIG_7299 Mcc = "7299"
// MCC_BIG_7399 商业服务 无明细分类的其它服务
MCC_BIG_7399 Mcc = "7399"
// MCC_BIG_8999 其他专业服务 包括拍卖行、法律服务、会计审计财务服务、公关服务的企业,建筑设计、工程和测量服务等从事专业服务的企业
MCC_BIG_8999 Mcc = "8999"
)
// Pre 将Mcc枚举转换为字符串
func (m Mcc) Pre() string {
return string(m)
}
+347
View File
@@ -0,0 +1,347 @@
package consts
// AccIdType 证件类型枚举
type AccIdType string
const (
// ACC_ID_TYPE_ID_CARD 身份证
ACC_ID_TYPE_ID_CARD AccIdType = "01"
// ACC_ID_TYPE_PASSPORT 护照
ACC_ID_TYPE_PASSPORT AccIdType = "02"
// ACC_ID_TYPE_HK_MO_PASS 港澳通行证
ACC_ID_TYPE_HK_MO_PASS AccIdType = "03"
// ACC_ID_TYPE_TAIWAN_PASS 台胞证
ACC_ID_TYPE_TAIWAN_PASS AccIdType = "04"
// ACC_ID_TYPE_FOREIGN_PERMANENT_RESIDENCE 外国人永久居留身份证
ACC_ID_TYPE_FOREIGN_PERMANENT_RESIDENCE AccIdType = "10"
// ACC_ID_TYPE_HK_MO_RESIDENCE 港澳居民居住证
ACC_ID_TYPE_HK_MO_RESIDENCE AccIdType = "11"
// ACC_ID_TYPE_TAIWAN_RESIDENCE 台湾居民居住证
ACC_ID_TYPE_TAIWAN_RESIDENCE AccIdType = "12"
// ACC_ID_TYPE_EXECUTIVE_PARTNER 执行事务合伙人
ACC_ID_TYPE_EXECUTIVE_PARTNER AccIdType = "13"
// ACC_ID_TYPE_OTHER 其它证件
ACC_ID_TYPE_OTHER AccIdType = "99"
)
// Pre 将AccIdType枚举转换为字符串
func (ait AccIdType) Pre() string {
return string(ait)
}
// SettlePeriod 结算周期枚举
type SettlePeriod string
const (
// SETTLE_PERIOD_T_PLUS_1 T+1结算
SETTLE_PERIOD_T_PLUS_1 SettlePeriod = "T+1"
// SETTLE_PERIOD_T_PLUS_1_PLUS_N T+1普通结算批次
SETTLE_PERIOD_T_PLUS_1_PLUS_N SettlePeriod = "T+1+N"
// SETTLE_PERIOD_T_PLUS_3 收单T+3结算
SETTLE_PERIOD_T_PLUS_3 SettlePeriod = "T+3"
// SETTLE_PERIOD_D_PLUS_1_PLUS_N D+1普通结算批次
SETTLE_PERIOD_D_PLUS_1_PLUS_N SettlePeriod = "D+1+N"
// SETTLE_PERIOD_W_T_PLUS_9999 喔噻T+9999
SETTLE_PERIOD_W_T_PLUS_9999 SettlePeriod = "W_T+9999"
// SETTLE_PERIOD_D_PLUS_1 收单D+1结算批次
SETTLE_PERIOD_D_PLUS_1 SettlePeriod = "D+1"
// SETTLE_PERIOD_D1_PLUS_24 D1+24结算批次
SETTLE_PERIOD_D1_PLUS_24 SettlePeriod = "D1+24"
// SETTLE_PERIOD_D_PLUS_30 收单D+30结算
SETTLE_PERIOD_D_PLUS_30 SettlePeriod = "D+30"
// SETTLE_PERIOD_BT_D_PLUS_1 D+1四方补贴结算批次
SETTLE_PERIOD_BT_D_PLUS_1 SettlePeriod = "BT_D+1"
// SETTLE_PERIOD_QZT_FULL_D_PLUS_1 钱账通D+1全额结算批次
SETTLE_PERIOD_QZT_FULL_D_PLUS_1 SettlePeriod = "QZT_FULL_D+1"
// SETTLE_PERIOD_QZT_NET_D_PLUS_1 钱账通D+1净额结算批次
SETTLE_PERIOD_QZT_NET_D_PLUS_1 SettlePeriod = "QZT_NET_D+1"
// SETTLE_PERIOD_FS 灵活结算
SETTLE_PERIOD_FS SettlePeriod = "FS"
)
// Pre 将SettlePeriod枚举转换为字符串
func (sp SettlePeriod) Pre() string {
return string(sp)
}
// ClearDt 日切时间枚举
type ClearDt string
const (
// CLEAR_DT_ZERO 0点
CLEAR_DT_ZERO ClearDt = "ZERO"
// CLEAR_DT_ONE 1点
CLEAR_DT_ONE ClearDt = "ONE"
// CLEAR_DT_TWO 2点
CLEAR_DT_TWO ClearDt = "TWO"
// CLEAR_DT_THREE 3点
CLEAR_DT_THREE ClearDt = "THREE"
// CLEAR_DT_FOUR 4点
CLEAR_DT_FOUR ClearDt = "FOUR"
// CLEAR_DT_FIVE 5点
CLEAR_DT_FIVE ClearDt = "FIVE"
// CLEAR_DT_SIX 6点
CLEAR_DT_SIX ClearDt = "SIX"
// CLEAR_DT_SEVEN 7点
CLEAR_DT_SEVEN ClearDt = "SEVEN"
// CLEAR_DT_EIGHT 8点
CLEAR_DT_EIGHT ClearDt = "EIGHT"
// CLEAR_DT_NINE 9点
CLEAR_DT_NINE ClearDt = "NINE"
// CLEAR_DT_TEN 10点
CLEAR_DT_TEN ClearDt = "TEN"
// CLEAR_DT_ELEVEN 11点
CLEAR_DT_ELEVEN ClearDt = "ELEVEN"
// CLEAR_DT_TWELVE 12点
CLEAR_DT_TWELVE ClearDt = "TWELVE"
// CLEAR_DT_THIRTEEN 13点
CLEAR_DT_THIRTEEN ClearDt = "THIRTEEN"
// CLEAR_DT_FOURTEEN 14点
CLEAR_DT_FOURTEEN ClearDt = "FOURTEEN"
// CLEAR_DT_FIFTEEN 15点
CLEAR_DT_FIFTEEN ClearDt = "FIFTEEN"
// CLEAR_DT_SIXTEEN 16点
CLEAR_DT_SIXTEEN ClearDt = "SIXTEEN"
// CLEAR_DT_SEVENTEEN 17点
CLEAR_DT_SEVENTEEN ClearDt = "SEVENTEEN"
// CLEAR_DT_EIGHTEEN 18点
CLEAR_DT_EIGHTEEN ClearDt = "EIGHTEEN"
// CLEAR_DT_NINETEEN 19点
CLEAR_DT_NINETEEN ClearDt = "NINETEEN"
// CLEAR_DT_TWENTY 20点
CLEAR_DT_TWENTY ClearDt = "TWENTY"
// CLEAR_DT_TWENTY_ONE 21点
CLEAR_DT_TWENTY_ONE ClearDt = "TWENTY_ONE"
// CLEAR_DT_TWENTY_TWO 22点
CLEAR_DT_TWENTY_TWO ClearDt = "TWENTY_TWO"
// CLEAR_DT_TWENTY_THREE 23点
CLEAR_DT_TWENTY_THREE ClearDt = "TWENTY_THREE"
// CLEAR_DT_TWENTY_FOUR 24点
CLEAR_DT_TWENTY_FOUR ClearDt = "TWENTY_FOUR"
)
// Pre 将ClearDt枚举转换为字符串
func (cd ClearDt) Pre() string {
return string(cd)
}
// MerBusiContent 经营内容枚举
type MerBusiContent string
const (
// MER_BUSI_CONTENT_RESTAURANT_HOTEL 餐饮、宾馆、娱乐、珠宝金饰、工艺美术品
MER_BUSI_CONTENT_RESTAURANT_HOTEL MerBusiContent = "640"
// MER_BUSI_CONTENT_REAL_ESTATE_AUTO 房地产汽车类
MER_BUSI_CONTENT_REAL_ESTATE_AUTO MerBusiContent = "641"
// MER_BUSI_CONTENT_DEPARTMENT_AGENCY 百货、中介、培训、景区门票等
MER_BUSI_CONTENT_DEPARTMENT_AGENCY MerBusiContent = "642"
// MER_BUSI_CONTENT_WHOLESALE 批发类商户
MER_BUSI_CONTENT_WHOLESALE MerBusiContent = "643"
// MER_BUSI_CONTENT_GAS_STATION_SUPERMARKET 加油、超市类
MER_BUSI_CONTENT_GAS_STATION_SUPERMARKET MerBusiContent = "644"
// MER_BUSI_CONTENT_TRANSPORT_TICKET 交通运输售票
MER_BUSI_CONTENT_TRANSPORT_TICKET MerBusiContent = "645"
// MER_BUSI_CONTENT_UTILITY_PAYMENT 水电气缴费
MER_BUSI_CONTENT_UTILITY_PAYMENT MerBusiContent = "646"
// MER_BUSI_CONTENT_GOVERNMENT 政府类
MER_BUSI_CONTENT_GOVERNMENT MerBusiContent = "647"
// MER_BUSI_CONTENT_CONVENIENCE 便民类
MER_BUSI_CONTENT_CONVENIENCE MerBusiContent = "648"
// MER_BUSI_CONTENT_PUBLIC_INSTITUTION 公立医院、公立学校、慈善
MER_BUSI_CONTENT_PUBLIC_INSTITUTION MerBusiContent = "649"
// MER_BUSI_CONTENT_HOTEL_FOOD_ENTERTAINMENT 宾馆餐饮娱乐类
MER_BUSI_CONTENT_HOTEL_FOOD_ENTERTAINMENT MerBusiContent = "650"
// MER_BUSI_CONTENT_PROPERTY_AUTO 房产汽车类
MER_BUSI_CONTENT_PROPERTY_AUTO MerBusiContent = "651"
// MER_BUSI_CONTENT_WHOLESALE_TYPE 批发类
MER_BUSI_CONTENT_WHOLESALE_TYPE MerBusiContent = "652"
// MER_BUSI_CONTENT_SUPERMARKET_GAS 超市加油类
MER_BUSI_CONTENT_SUPERMARKET_GAS MerBusiContent = "653"
// MER_BUSI_CONTENT_GENERAL_MERCHANT 一般类商户
MER_BUSI_CONTENT_GENERAL_MERCHANT MerBusiContent = "654"
// MER_BUSI_CONTENT_AGRICULTURE 三农商户
MER_BUSI_CONTENT_AGRICULTURE MerBusiContent = "655"
)
// Pre 将MerBusiContent枚举转换为字符串
func (mbc MerBusiContent) Pre() string {
return string(mbc)
}
// PosType POS类型枚举
type PosType string
const (
// POS_TYPE_GENERAL_POS 传统POS
POS_TYPE_GENERAL_POS PosType = "GENERAL_POS"
// POS_TYPE_SUPER_POS 智能POS
POS_TYPE_SUPER_POS PosType = "SUPER_POS"
// POS_TYPE_BLUE_WIZARD 蓝精灵
POS_TYPE_BLUE_WIZARD PosType = "BLUE_WIZARD"
// POS_TYPE_WECHAT_PAY 专业化扫码
POS_TYPE_WECHAT_PAY PosType = "WECHAT_PAY"
// POS_TYPE_SQB_SCAN_CODE 收钱吧扫码
POS_TYPE_SQB_SCAN_CODE PosType = "SQB_SCAN_CODE"
// POS_TYPE_SQB_PAPER_CODE 收钱吧码牌
POS_TYPE_SQB_PAPER_CODE PosType = "SQB_PAPER_CODE"
// POS_TYPE_SQB_DESK_CODE 收钱吧桌码
POS_TYPE_SQB_DESK_CODE PosType = "SQB_DESK_CODE"
// POS_TYPE_SQB_POS 收钱吧POS
POS_TYPE_SQB_POS PosType = "SQB_POS"
// POS_TYPE_SQB_INSTALLMENT 收钱吧聚分期
POS_TYPE_SQB_INSTALLMENT PosType = "SQB_INSTALLMENT"
// POS_TYPE_CLOUD_STORE_NEW 新云小店
POS_TYPE_CLOUD_STORE_NEW PosType = "CLOUD_STORE_NEW"
// POS_TYPE_CLOUD_DISTRIBUTION 增商专用云分销
POS_TYPE_CLOUD_DISTRIBUTION PosType = "CLOUD_DISTRIBUTION"
// POS_TYPE_CLOUD_DISTRIBUTION_CB 云分销线上
POS_TYPE_CLOUD_DISTRIBUTION_CB PosType = "CLOUD_DISTRIBUTION_CB"
// POS_TYPE_CLOUD_STORE_CB 云小店线上
POS_TYPE_CLOUD_STORE_CB PosType = "CLOUD_STORE_CB"
// POS_TYPE_CLOUD_STORE_BC 云小店线下
POS_TYPE_CLOUD_STORE_BC PosType = "CLOUD_STORE_BC"
// POS_TYPE_CLOUD_STORE_BC_NOTLKL 云小店非收银机
POS_TYPE_CLOUD_STORE_BC_NOTLKL PosType = "CLOUD_STORE_BC_NOTLKL"
// POS_TYPE_HM 惠码
POS_TYPE_HM PosType = "HM"
// POS_TYPE_HM_CB 惠码线上
POS_TYPE_HM_CB PosType = "HM_CB"
// POS_TYPE_HM_BC 惠码线下
POS_TYPE_HM_BC PosType = "HM_BC"
// POS_TYPE_SCAN_CODE_ORDER 扫码点餐
POS_TYPE_SCAN_CODE_ORDER PosType = "SCAN_CODE_ORDER"
// POS_TYPE_B2B_CASHIER_DESK B2B收银台
POS_TYPE_B2B_CASHIER_DESK PosType = "B2B_CASHIER_DESK"
// POS_TYPE_B2B_QR_CODE B2B收款码
POS_TYPE_B2B_QR_CODE PosType = "B2B_QR_CODE"
// POS_TYPE_MOBILE_POS 手机POS
POS_TYPE_MOBILE_POS PosType = "MOBILE_POS"
// POS_TYPE_YF_YM 御风云码
POS_TYPE_YF_YM PosType = "YF_YM"
// POS_TYPE_YF_YM_CB 御风云码线上
POS_TYPE_YF_YM_CB PosType = "YF_YM_CB"
// POS_TYPE_TRANSFER_ACCOUNT 大额理财
POS_TYPE_TRANSFER_ACCOUNT PosType = "TRANSFER_ACCOUNT"
// POS_TYPE_SUPER_MPOS 超级收款宝
POS_TYPE_SUPER_MPOS PosType = "SUPER_MPOS"
// POS_TYPE_W_BOX 收钱宝盒
POS_TYPE_W_BOX PosType = "W_BOX"
// POS_TYPE_MOON_BOS 月光宝盒
POS_TYPE_MOON_BOS PosType = "MOON_BOS"
// POS_TYPE_SCANNING_GUN_PAY XQ码精灵
POS_TYPE_SCANNING_GUN_PAY PosType = "SCANNING_GUN_PAY"
// POS_TYPE_WIDE_SUPER_POS 智能POS PRO
POS_TYPE_WIDE_SUPER_POS PosType = "WIDE_SUPER_POS"
// POS_TYPE_YUNCHAO_TECH_CB 云超科技线上
POS_TYPE_YUNCHAO_TECH_CB PosType = "YUNCHAO_TECH_CB"
// POS_TYPE_YUNCHAO_TECH_BC 云超科技线下
POS_TYPE_YUNCHAO_TECH_BC PosType = "YUNCHAO_TECH_BC"
// POS_TYPE_HUMMING_BIRD 蜂鸟佳
POS_TYPE_HUMMING_BIRD PosType = "HUMMING_BIRD"
// POS_TYPE_SIMPLE_SPEED_SCRM 简速SCRM
POS_TYPE_SIMPLE_SPEED_SCRM PosType = "SIMPLE_SPEED_SCRM"
// POS_TYPE_SMART_NETWORK 智网
POS_TYPE_SMART_NETWORK PosType = "SMART_NETWORK"
// POS_TYPE_EASY_PAYMENT 缴费易
POS_TYPE_EASY_PAYMENT PosType = "EASY_PAYMENT"
// POS_TYPE_LIANTUO_ELF 联拓小精灵
POS_TYPE_LIANTUO_ELF PosType = "LIANTUO_ELF"
// POS_TYPE_KAOLA_CLOUD_PAY 考拉云付
POS_TYPE_KAOLA_CLOUD_PAY PosType = "KAOLA_CLOUD_PAY"
// POS_TYPE_BUSINESS_CLOUD_PRINT 拉生意云打印
POS_TYPE_BUSINESS_CLOUD_PRINT PosType = "BUSINESS_CLOUD_PRINT"
// POS_TYPE_B2B_CASHIER_DESK_CB B2B收银台线上外卡
POS_TYPE_B2B_CASHIER_DESK_CB PosType = "B2B_CASHIER_DESK_CB"
// POS_TYPE_MOBILE_POS_CB 手机POS线上外卡
POS_TYPE_MOBILE_POS_CB PosType = "MOBILE_POS_CB"
// POS_TYPE_LKL_SCRM 拉卡拉SCRM
POS_TYPE_LKL_SCRM PosType = "LKL_SCRM"
// POS_TYPE_MI_XUN 米讯
POS_TYPE_MI_XUN PosType = "MI_XUN"
// POS_TYPE_YOU_KE_LI_LI 油客里里
POS_TYPE_YOU_KE_LI_LI PosType = "YOU_KE_LI_LI"
// POS_TYPE_LE_YOU_KE 乐友客
POS_TYPE_LE_YOU_KE PosType = "LE_YOU_KE"
// POS_TYPE_EASY_TO_PAY 即易付
POS_TYPE_EASY_TO_PAY PosType = "EASY_TO_PAY"
// POS_TYPE_SMART_YOUKE 智慧油客
POS_TYPE_SMART_YOUKE PosType = "SMART_YOUKE"
// POS_TYPE_MICRO_SUPER_POS 微智能
POS_TYPE_MICRO_SUPER_POS PosType = "MICRO_SUPER_POS"
// POS_TYPE_JI_YI_SHOU 集易收
POS_TYPE_JI_YI_SHOU PosType = "JI_YI_SHOU"
// POS_TYPE_UNIONPAY_APPLET 云微小程序
POS_TYPE_UNIONPAY_APPLET PosType = "UNIONPAY_APPLET"
// POS_TYPE_UNION_INSTALMENT 银联聚分期
POS_TYPE_UNION_INSTALMENT PosType = "UNION_INSTALMENT"
// POS_TYPE_PULL_BUSINESS 拉生意
POS_TYPE_PULL_BUSINESS PosType = "PULL_BUSINESS"
// POS_TYPE_MOSS Moss收银台
POS_TYPE_MOSS PosType = "MOSS"
)
// Pre 将PosType枚举转换为字符串
func (pt PosType) Pre() string {
return string(pt)
}
// FeeRateTypeCode 费率类型枚举
type FeeRateTypeCode string
const (
// FEE_RATE_TYPE_CODE_UNIONPAY_DEBIT 银联借记卡
FEE_RATE_TYPE_CODE_UNIONPAY_DEBIT FeeRateTypeCode = "300"
// FEE_RATE_TYPE_CODE_UNIONPAY_CREDIT 银联贷记卡
FEE_RATE_TYPE_CODE_UNIONPAY_CREDIT FeeRateTypeCode = "301"
// FEE_RATE_TYPE_CODE_WECHAT 微信
FEE_RATE_TYPE_CODE_WECHAT FeeRateTypeCode = "302"
// FEE_RATE_TYPE_CODE_WECHAT_DEBIT 微信借记
FEE_RATE_TYPE_CODE_WECHAT_DEBIT FeeRateTypeCode = "338"
// FEE_RATE_TYPE_CODE_WECHAT_CREDIT 微信贷记
FEE_RATE_TYPE_CODE_WECHAT_CREDIT FeeRateTypeCode = "339"
// FEE_RATE_TYPE_CODE_ALIPAY 支付宝
FEE_RATE_TYPE_CODE_ALIPAY FeeRateTypeCode = "303"
// FEE_RATE_TYPE_CODE_YEEPAY 翼支付
FEE_RATE_TYPE_CODE_YEEPAY FeeRateTypeCode = "306"
// FEE_RATE_TYPE_CODE_UNIONPAY_QR_DEBIT 银联二维码借记卡
FEE_RATE_TYPE_CODE_UNIONPAY_QR_DEBIT FeeRateTypeCode = "314"
// FEE_RATE_TYPE_CODE_UNIONPAY_QR_CREDIT 银联二维码贷记卡
FEE_RATE_TYPE_CODE_UNIONPAY_QR_CREDIT FeeRateTypeCode = "315"
// FEE_RATE_TYPE_CODE_CARDLESS_CREDIT 无卡贷记
FEE_RATE_TYPE_CODE_CARDLESS_CREDIT FeeRateTypeCode = "321"
// FEE_RATE_TYPE_CODE_PAY_ACCOUNT 支付账户
FEE_RATE_TYPE_CODE_PAY_ACCOUNT FeeRateTypeCode = "319"
// FEE_RATE_TYPE_CODE_B2B_TRANSFER B2B转账
FEE_RATE_TYPE_CODE_B2B_TRANSFER FeeRateTypeCode = "322"
// FEE_RATE_TYPE_CODE_WECHAT_ONLINE 微信线上(千米专用)
FEE_RATE_TYPE_CODE_WECHAT_ONLINE FeeRateTypeCode = "400"
// FEE_RATE_TYPE_CODE_ALIPAY_ONLINE 支付宝线上(千米专用)
FEE_RATE_TYPE_CODE_ALIPAY_ONLINE FeeRateTypeCode = "401"
// FEE_RATE_TYPE_CODE_WECHAT_FACE 微信刷脸
FEE_RATE_TYPE_CODE_WECHAT_FACE FeeRateTypeCode = "307"
// FEE_RATE_TYPE_CODE_WECHAT_FACE_DEBIT 微信刷脸借记
FEE_RATE_TYPE_CODE_WECHAT_FACE_DEBIT FeeRateTypeCode = "342"
// FEE_RATE_TYPE_CODE_WECHAT_FACE_CREDIT 微信刷脸贷记
FEE_RATE_TYPE_CODE_WECHAT_FACE_CREDIT FeeRateTypeCode = "343"
// FEE_RATE_TYPE_CODE_ALIPAY_FACE 支付宝刷脸
FEE_RATE_TYPE_CODE_ALIPAY_FACE FeeRateTypeCode = "308"
// FEE_RATE_TYPE_CODE_UNIONPAY_DISCOUNT_DEBIT 云闪付借记-优惠
FEE_RATE_TYPE_CODE_UNIONPAY_DISCOUNT_DEBIT FeeRateTypeCode = "411"
// FEE_RATE_TYPE_CODE_UNIONPAY_DISCOUNT_CREDIT 云闪付贷记-优惠
FEE_RATE_TYPE_CODE_UNIONPAY_DISCOUNT_CREDIT FeeRateTypeCode = "412"
// FEE_RATE_TYPE_CODE_UNIONPAY_QR_DISCOUNT_DEBIT 银联二维码借记-优惠
FEE_RATE_TYPE_CODE_UNIONPAY_QR_DISCOUNT_DEBIT FeeRateTypeCode = "413"
// FEE_RATE_TYPE_CODE_UNIONPAY_QR_DISCOUNT_CREDIT 银联二维码贷记-优惠
FEE_RATE_TYPE_CODE_UNIONPAY_QR_DISCOUNT_CREDIT FeeRateTypeCode = "414"
// FEE_RATE_TYPE_CODE_ALIPAY_DISCOUNT 支付宝费率-优惠
FEE_RATE_TYPE_CODE_ALIPAY_DISCOUNT FeeRateTypeCode = "415"
// FEE_RATE_TYPE_CODE_DIGITAL_CURRENCY 数字货币
FEE_RATE_TYPE_CODE_DIGITAL_CURRENCY FeeRateTypeCode = "318"
// FEE_RATE_TYPE_CODE_JINGDONG 京东
FEE_RATE_TYPE_CODE_JINGDONG FeeRateTypeCode = "346"
)
// Pre 将FeeRateTypeCode枚举转换为字符串
func (frtc FeeRateTypeCode) Pre() string {
return string(frtc)
}
+38 -27
View File
@@ -1,34 +1,45 @@
package consts
const (
BASE_URL = "https://s2.lakala.com/api"
BASE_URL = "https://s2.lakala.com/api"
BASE_TEST_URL = "https://test.wsmsd.cn/sit/api"
)
// basePay/labs 基础支付聚合扫码API地址
const (
// LKL_UPLOAD_FILE_URL 拉卡拉附件上传地址
LKL_UPLOAD_FILE_URL = "/v2/mms/openApi/uploadFile"
// LKL_SPLIT_LEDGER_URL 拉卡拉商户分账业务开通申请
LKL_SPLIT_LEDGER_URL = "/v2/mms/openApi/ledger/applyLedgerMer"
// LKL_SPLIT_LEDGER_QUERY_URL 拉卡拉商户分账信息查询
LKL_SPLIT_LEDGER_QUERY_URL = "/v2/mms/openApi/ledger/queryLedgerMer"
// LKL_SPLIT_LEDGER_RECEIVE_URL 拉卡拉分账接收方创建申请
LKL_SPLIT_LEDGER_RECEIVE_URL = "/v2/mms/openApi/ledger/applyLedgerReceiver"
// LKL_SPLIT_LEDGER_RECEIVE_BIND_URL 拉卡拉分账关系绑定申请
LKL_SPLIT_LEDGER_RECEIVE_BIND_URL = "/v2/mms/openApi/ledger/applyBind"
// LKL_SPLIT_LEDGER_BALANCE_URL 拉卡拉可分账金额查询
LKL_SPLIT_LEDGER_BALANCE_URL = "/v3/sacs/queryAmt"
// LKL_ORDER_SPLIT_LEDGER_URL 拉卡拉订单分账
LKL_ORDER_SPLIT_LEDGER_URL = "/v3/sacs/separate"
// LKL_ACCOUNT_BALANCE_QUERY_URL 拉卡拉账户余额查询
LKL_ACCOUNT_BALANCE_QUERY_URL = "/v2/laep/industry/ewalletBalanceQuery"
// LKL_ACCOUNT_WITHDRAW_URL 拉卡拉账户提现
LKL_ACCOUNT_WITHDRAW_URL = "/v2/laep/industry/ewalletWithdrawD1"
// LKL_TRADE_QUERY_URL 拉卡拉交易查询
LKL_TRADE_QUERY_URL = "/v3/labs/query/tradequery"
// LKL_PRE_ORDER_URL 拉卡拉聚合预下单
LKL_PRE_ORDER_URL = "/v3/labs/trans/preorder"
// LKL_MERGE_ORDER_URL 拉卡拉主扫合单交易
LKL_MERGE_ORDER_URL = "/v3/labs/trans/merge/preorder"
// LKL_REFOUND_URL 拉卡拉退款
LKL_REFOUND_URL = "/v3/rfd/refund_front/refund"
// LKL_BASE_URL_TRANS_PREORDER_URL 拉卡拉聚合主扫
LKL_BASE_URL_TRANS_PREORDER_URL = "/v3/labs/trans/preorder"
// LKL_DCP_TRANS_PREORDER_URL 拉卡拉直连主扫
LKL_DCP_TRANS_PREORDER_URL = "/v3/dcp/trans/preorder"
// LKL_BASE_URL_TRANS_PREORDER_ENCRY_URL 拉卡拉聚合主扫交易(全报文加密)
LKL_BASE_URL_TRANS_PREORDER_ENCRY_URL = "/v3/labs/trans/preorder_encry"
// LKL_BASE_URL_TRANS_MICROPAY_URL 拉卡拉聚合被扫
LKL_BASE_URL_TRANS_MICROPAY_URL = "/v3/labs/trans/micropay"
// LKL_BASE_URL_TRANS_MICROPAY_ENCRY_URL 拉卡拉聚合被扫接口(全报文加密)
LKL_BASE_URL_TRANS_MICROPAY_ENCRY_URL = "/v3/labs/trans/micropay_encry"
// LKL_BASE_URL_TRANS_SHARE_CODE_URL 拉卡拉聚合扫码申请支付宝吱口令
LKL_BASE_URL_TRANS_SHARE_CODE_URL = "/v3/labs/trans/share_code"
// LKL_BASE_URL_TRANS_QUERY_URL 拉卡拉聚合扫码交易查询
LKL_BASE_URL_TRANS_QUERY_URL = "/v3/labs/query/tradequery"
// LKL_BASE_URL_RELATION_CLOSE_URL 拉卡拉聚合扫码关单
LKL_BASE_URL_RELATION_CLOSE_URL = "/v3/labs/relation/close"
// LKL_BASE_URL_RELATION_REVOKED_URL 拉卡拉聚合扫码撤销
LKL_BASE_URL_RELATION_REVOKED_URL = "/v3/labs/relation/revoked"
// LKL_BASE_URL_RELATION_REFUND_URL 拉卡拉聚合扫码退款
LKL_BASE_URL_RELATION_REFUND_URL = "/v3/labs/relation/refund"
)
// basePay/dcp 基础支付直接扫码API地址
const ()
// unifiedReturn 统一退货API地址
const (
// LKL_UNIFIED_RETURN_MERGE_REFUND_URL 拉卡拉合单退货
LKL_UNIFIED_RETURN_MERGE_REFUND_URL = "/v3/rfd/refund_front/merge_refund"
// LKL_UNIFIED_RETURN_REFUND_URL 拉卡拉退货
LKL_UNIFIED_RETURN_REFUND_URL = "/v3/rfd/refund_front/refund"
// LKL_UNIFIED_RETURN_REFUND_QUERY_URL 拉卡拉退货查询
LKL_UNIFIED_RETURN_REFUND_QUERY_URL = "/v3/rfd/refund_front/refund_query"
// LKL_UNIFIED_RETURN_REFUND_FEE_URL 拉卡拉退货手续费查询
LKL_UNIFIED_RETURN_REFUND_FEE_URL = "/v3/rfd/refund_front/refund_fee"
)
+1
View File
@@ -20,6 +20,7 @@ require (
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-sql-driver/mysql v1.9.2 // indirect
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.9.3 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gorilla/websocket v1.5.3 // indirect
github.com/grokify/html-strip-tags-go v0.1.0 // indirect
github.com/magiconair/properties v1.8.10 // indirect
-60
View File
@@ -1,60 +0,0 @@
package lklsdk
import (
"time"
"github.com/black1552/lkl_sdk/consts"
"github.com/black1552/lkl_sdk/model"
)
// AccountService 账户服务
type AccountService[T any] struct {
client *Client[T]
}
// NewAccountService 创建账户服务实例
func NewAccountService[T any](client *Client[T]) *AccountService[T] {
return &AccountService[T]{
client: client,
}
}
// BalanceQuery 账户余额查询
func (a *AccountService[T]) BalanceQuery(req *model.BalanceQueryReqData) (*T, error) {
// 构建请求参数
url := consts.BASE_URL + consts.LKL_ACCOUNT_BALANCE_QUERY_URL
// 构建BaseModel请求
baseReq := model.BalanceQueryRequest{
ReqTime: time.Now().Format("20060102150405"),
Version: "3.0",
ReqData: req,
}
// 发送请求
respBody, err := a.client.doRequest(url, baseReq)
if err != nil {
return nil, err
}
return respBody, nil
}
// Withdraw 账户提现
func (a *AccountService[T]) Withdraw(req *model.WithdrawReqData) (*T, error) {
// 构建请求参数
url := consts.BASE_URL + consts.LKL_ACCOUNT_WITHDRAW_URL
// 构建BaseModel请求
baseReq := model.WithdrawRequest{
ReqTime: time.Now().Format("20060102150405"),
Version: "3.0",
ReqData: req,
}
// 发送请求
respBody, err := a.client.doRequest(url, baseReq)
if err != nil {
return nil, err
}
return respBody, nil
}
+1
View File
@@ -0,0 +1 @@
package transmicropay
@@ -0,0 +1 @@
package transmicropay
@@ -0,0 +1 @@
package transmicropay
-38
View File
@@ -1,38 +0,0 @@
package lklsdk
import (
"github.com/black1552/lkl_sdk/consts"
"github.com/black1552/lkl_sdk/model"
"github.com/gogf/gf/v2/os/gtime"
)
type MergePreService[T any] struct {
client *Client[T]
}
// NewMergePreService 创建拉卡拉主扫合单交易
func NewMergePreService[T any](client *Client[T]) *MergePreService[T] {
return &MergePreService[T]{
client: client,
}
}
func (s *MergePreService[T]) PreOrder(req *model.MergePreorderReqData) (*T, error) {
// 构建请求参数
url := consts.BASE_URL + consts.LKL_MERGE_ORDER_URL
// 构建BaseModel请求
baseReq := model.MergePreorder{
ReqTime: gtime.Now().Format("YmdHis"),
Version: "2.0",
ReqData: req,
}
// 发送请求
respBody, err := s.client.doRequest(url, baseReq)
if err != nil {
return nil, err
}
return respBody, nil
}
-96
View File
@@ -1,96 +0,0 @@
package lklsdk
import (
"context"
"github.com/black1552/lkl_sdk/model"
)
// SDK 拉卡拉SDK主入口
type SDK[T any] struct {
Client *Client[T]
SplitLedger *SplitLedgerService[T]
Trade *TradeService[T]
Account *AccountService[T]
UploadFile *UploadFileService[T]
MergePre *MergePreService[T]
}
// NewSDK 创建拉卡拉SDK实例
func NewSDK[T any](ctx context.Context, cfgJson string) *SDK[T] {
client := NewClient[T](ctx, cfgJson)
return &SDK[T]{
Client: client,
SplitLedger: NewSplitLedgerService(client),
Trade: NewTradeService(client),
Account: NewAccountService(client),
UploadFile: NewUploadFileService(client),
MergePre: NewMergePreService(client),
}
}
// 以下为便捷方法,直接通过SDK调用各服务的主要功能
// MergePreOrder 主扫合单交易
func (s *SDK[T]) MergePreOrder(req *model.MergePreorderReqData) (*T, error) {
return s.MergePre.PreOrder(req)
}
// Refound 退款
func (s *SDK[T]) Refound(req *model.RefundReqData) (*T, error) {
return s.Trade.Refound(req)
}
// ApplyLedgerMer 商户分账业务开通申请
func (s *SDK[T]) ApplyLedgerMer(req *model.ApplyLedgerMerReqData) (*T, error) {
return s.SplitLedger.ApplyLedgerMer(req)
}
// QueryLedgerMer 商户分账信息查询
func (s *SDK[T]) QueryLedgerMer(req *model.QueryLedgerMerReqData) (*T, error) {
return s.SplitLedger.QueryLedgerMer(req)
}
// ApplyLedgerReceiver 分账接收方创建申请
func (s *SDK[T]) ApplyLedgerReceiver(req *model.ApplyLedgerReceiverReqData) (*T, error) {
return s.SplitLedger.ApplyLedgerReceiver(req)
}
// ApplyBind 分账关系绑定申请
func (s *SDK[T]) ApplyBind(req *model.ApplyBindReqData) (*T, error) {
return s.SplitLedger.ApplyBind(req)
}
// QuerySplitBalance 可分账金额查询
func (s *SDK[T]) QuerySplitBalance(req *model.SplitBalanceReqData) (*T, error) {
return s.SplitLedger.QuerySplitBalance(req)
}
// OrderSplitLedger 订单分账
func (s *SDK[T]) OrderSplitLedger(req *model.OrderSplitLedgerReqData) (*T, error) {
return s.SplitLedger.OrderSplitLedger(req)
}
// TradeQuery 交易查询
func (s *SDK[T]) TradeQuery(req *model.TradeQueryReqData) (*T, error) {
return s.Trade.TradeQuery(req)
}
// PreOrder 聚合预下单
func (s *SDK[T]) PreOrder(req *model.PreorderReqData) (*T, error) {
return s.Trade.PreOrder(req)
}
// BalanceQuery 账户余额查询
func (s *SDK[T]) BalanceQuery(req *model.BalanceQueryReqData) (*T, error) {
return s.Account.BalanceQuery(req)
}
func (s *SDK[T]) UploadFileQuery(req *model.UploadFileReqData) (*T, error) {
return s.UploadFile.UploadFileQuery(req)
}
// Withdraw 账户提现
func (s *SDK[T]) Withdraw(req *model.WithdrawReqData) (*T, error) {
return s.Account.Withdraw(req)
}
-97
View File
@@ -1,97 +0,0 @@
package lklsdk
import (
"fmt"
"time"
"github.com/black1552/lkl_sdk/consts"
"github.com/black1552/lkl_sdk/model"
"github.com/gogf/gf/v2/crypto/gmd5"
"github.com/gogf/gf/v2/os/gtime"
"github.com/gogf/gf/v2/util/gconv"
)
// SplitLedgerService 分账服务
type SplitLedgerService[T any] struct {
client *Client[T]
}
// NewSplitLedgerService 创建分账服务实例
func NewSplitLedgerService[T any](client *Client[T]) *SplitLedgerService[T] {
return &SplitLedgerService[T]{
client: client,
}
}
// ApplyLedgerMer 商户分账业务开通申请
func (s *SplitLedgerService[T]) ApplyLedgerMer(req *model.ApplyLedgerMerReqData) (*T, error) {
// 构建请求参数
url := consts.BASE_URL + consts.LKL_SPLIT_LEDGER_URL
md5, err := gmd5.Encrypt(gconv.String(time.Now().Unix()))
if err != nil {
return nil, fmt.Errorf("创建ReqId失败")
}
// 构建BaseModel请求
baseReq := model.ApplyLedgerMerRequest{
ReqTime: gtime.Now().Format("YmdHis"),
Version: "2.0",
ReqData: req,
ReqId: md5,
}
// 发送请求
respBody, err := s.client.doRequest(url, baseReq)
if err != nil {
return nil, err
}
return respBody, nil
}
// ApplyLedgerReceiver 分账接收方创建申请
func (s *SplitLedgerService[T]) ApplyLedgerReceiver(req *model.ApplyLedgerReceiverReqData) (*T, error) {
// 构建请求参数
url := consts.BASE_URL + consts.LKL_SPLIT_LEDGER_RECEIVE_URL
md5, err := gmd5.Encrypt(gconv.String(time.Now().Unix()))
if err != nil {
return nil, fmt.Errorf("创建ReqId失败")
}
// 构建BaseModel请求
baseReq := model.ApplyLedgerReceiverRequest{
ReqTime: gtime.Now().Format("YmdHis"),
Version: "2.0",
ReqId: md5,
ReqData: req,
}
// 发送请求
respBody, err := s.client.doRequest(url, baseReq)
if err != nil {
return nil, err
}
return respBody, nil
}
// QueryLedgerMer 商户分账信息查询
func (s *SplitLedgerService[T]) QueryLedgerMer(req *model.QueryLedgerMerReqData) (*T, error) {
// 构建请求参数
url := consts.BASE_URL + consts.LKL_SPLIT_LEDGER_QUERY_URL
// 构建BaseModel请求
baseReq := model.QueryLedgerMerRequest{
ReqTime: time.Now().Format("20060102150405"),
Version: "3.0",
ReqData: req,
}
// 发送请求
respBody, err := s.client.doRequest(url, baseReq)
if err != nil {
return nil, err
}
return respBody, nil
}
-77
View File
@@ -1,77 +0,0 @@
package lklsdk
import (
"fmt"
"time"
"github.com/black1552/lkl_sdk/consts"
"github.com/black1552/lkl_sdk/model"
"github.com/gogf/gf/v2/crypto/gmd5"
"github.com/gogf/gf/v2/os/gtime"
"github.com/gogf/gf/v2/util/gconv"
)
// ApplyBind 分账关系绑定申请
func (s *SplitLedgerService[T]) ApplyBind(req *model.ApplyBindReqData) (*T, error) {
// 构建请求参数
url := consts.BASE_URL + consts.LKL_SPLIT_LEDGER_RECEIVE_BIND_URL
md5, err := gmd5.Encrypt(gconv.String(time.Now().Unix()))
if err != nil {
return nil, fmt.Errorf("创建ReqId失败")
}
// 构建BaseModel请求
baseReq := model.ApplyBindRequest{
ReqTime: time.Now().Format("20060102150405"),
Version: "2.0",
ReqData: req,
ReqId: md5,
}
// 发送请求
respBody, err := s.client.doRequest(url, baseReq)
if err != nil {
return nil, err
}
return respBody, nil
}
// QuerySplitBalance 可分账金额查询
func (s *SplitLedgerService[T]) QuerySplitBalance(req *model.SplitBalanceReqData) (*T, error) {
// 构建请求参数
url := consts.BASE_URL + consts.LKL_SPLIT_LEDGER_BALANCE_URL
// 构建BaseModel请求
baseReq := model.SplitBalanceRequest{
ReqTime: gtime.Now().Format("YmdHis"),
Version: "3.0",
ReqData: req,
}
// 发送请求
respBody, err := s.client.doRequest(url, baseReq)
if err != nil {
return nil, err
}
return respBody, nil
}
// OrderSplitLedger 订单分账
func (s *SplitLedgerService[T]) OrderSplitLedger(req *model.OrderSplitLedgerReqData) (*T, error) {
// 构建请求参数
url := consts.BASE_URL + consts.LKL_ORDER_SPLIT_LEDGER_URL
// 构建BaseModel请求
baseReq := model.OrderSplitLedgerRequest{
ReqTime: time.Now().Format("20060102150405"),
Version: "3.0",
ReqData: req,
}
// 发送请求
respBody, err := s.client.doRequest(url, baseReq)
if err != nil {
return nil, err
}
return respBody, nil
}
-74
View File
@@ -1,74 +0,0 @@
package lklsdk
import (
"time"
"github.com/black1552/lkl_sdk/consts"
"github.com/black1552/lkl_sdk/model"
)
// TradeService 交易服务
type TradeService[T any] struct {
client *Client[T]
}
// NewTradeService 创建交易服务实例
func NewTradeService[T any](client *Client[T]) *TradeService[T] {
return &TradeService[T]{
client: client,
}
}
// TradeQuery 交易查询
func (t *TradeService[T]) TradeQuery(req *model.TradeQueryReqData) (*T, error) {
// 构建请求参数
url := consts.BASE_URL + consts.LKL_TRADE_QUERY_URL
// 构建BaseModel请求
baseReq := model.TradeQuery{
ReqTime: time.Now().Format("20060102150405"),
Version: "3.0",
OutOrgCode: t.client.config.AppId,
ReqData: req,
}
// 发送请求
respBody, err := t.client.doRequest(url, baseReq)
if err != nil {
return nil, err
}
return respBody, nil
}
// PreOrder 聚合预下单
func (t *TradeService[T]) PreOrder(req *model.PreorderReqData) (*T, error) {
// 构建请求参数
url := consts.BASE_URL + consts.LKL_PRE_ORDER_URL
// 构建BaseModel请求
baseReq := model.NewPreorder(req)
// 发送请求
respBody, err := t.client.doRequest(url, baseReq)
if err != nil {
return nil, err
}
return respBody, nil
}
// Refound 退款
func (t *TradeService[T]) Refound(req *model.RefundReqData) (*T, error) {
// 构建请求参数
url := consts.BASE_URL + consts.LKL_REFOUND_URL
// 构建BaseModel请求
baseReq := model.NewRefund(req)
// 发送请求
respBody, err := t.client.doRequest(url, baseReq)
if err != nil {
return nil, err
}
return respBody, nil
}
-47
View File
@@ -1,47 +0,0 @@
package lklsdk
import (
"fmt"
"time"
"github.com/black1552/lkl_sdk/consts"
"github.com/black1552/lkl_sdk/model"
"github.com/gogf/gf/v2/crypto/gmd5"
"github.com/gogf/gf/v2/util/gconv"
)
// UploadFileService 交易服务
type UploadFileService[T any] struct {
client *Client[T]
}
// NewUploadFileService 创建交易服务实例
func NewUploadFileService[T any](client *Client[T]) *UploadFileService[T] {
return &UploadFileService[T]{
client: client,
}
}
// UploadFileQuery 交易查询
func (t *UploadFileService[T]) UploadFileQuery(req *model.UploadFileReqData) (*T, error) {
// 构建请求参数
url := consts.BASE_URL + consts.LKL_UPLOAD_FILE_URL
md5, err := gmd5.Encrypt(gconv.String(time.Now().Unix()))
if err != nil {
return nil, fmt.Errorf("创建ReqId失败")
}
// 构建BaseModel请求
baseReq := model.UploadFileRequest{
Timestamp: gconv.String(time.Now().Unix()),
Ver: "1.0",
ReqId: md5,
ReqData: req,
}
// 发送请求
respBody, err := t.client.doRequest(url, baseReq)
if err != nil {
return nil, err
}
return respBody, nil
}
-52
View File
@@ -1,52 +0,0 @@
package model
// ApplyBindRequest 分账关系绑定请求结构体
// 用于发起分账接收方与商户的关系绑定申请
// 拉卡拉SDK接口文档:分账关系绑定接口
type ApplyBindRequest struct {
ReqData *ApplyBindReqData `json:"reqData"` // 请求业务数据
ReqId string `json:"reqId"` // 请求ID,唯一标识一笔请求
Version string `json:"version"` // 接口版本号
ReqTime string `json:"reqTime"` // 请求时间,格式为yyyyMMddHHmmss
}
// ApplyBindReqData 分账关系绑定请求业务数据结构体
// 包含分账关系绑定所需的详细业务参数
type ApplyBindReqData struct {
Version string `json:"version"` // 接口版本号,必传,长度8,取值说明:1.0
OrderNo string `json:"orderNo"` // 订单编号,必传,长度32,用于后续跟踪排查问题及核对报文,格式为14位年月日(24小时制)分秒+8位随机数(不重复)
OrgCode string `json:"orgCode"` // 分账接收方所属机构代码,必传,长度32
MerInnerNo string `json:"merInnerNo"` // 分账商户内部商户号,必传,长度32,与MerCupNo选传其一,不能都为空
MerCupNo string `json:"merCupNo"` // 分账商户银联商户号,必传,长度32,与MerInnerNo选传其一,不能都为空
ReceiverNo string `json:"receiverNo"` // 分账接收方编号,必传,长度32
EntrustFileName string `json:"entrustFileName"` // 合作协议附件名称,必传,长度32
EntrustFilePath string `json:"entrustFilePath"` // 合作协议附件路径,必传,长度32,通过调用附件上传接口获取
RetUrl string `json:"retUrl"` // 回调通知地址,必传,长度128,审核通过后通知地址
Attachments []*ApplyBindAttachment `json:"attachments,omitempty"` // 附加资料,可选,集合类型,其他附加资料文件信息
}
type ApplyBindAttachment struct {
AttachType string `json:"attachType"` // 附件类型编码,必传,长度32
AttachName string `json:"attachName"` // 附件名称,必传,长度32
AttachStorePath string `json:"attachStorePath"` // 附件路径,必传,长度128,通过调用附件上传接口获取
}
// ApplyBindResponse 分账关系绑定响应结构体
// 包含分账关系绑定申请的处理结果信息
type ApplyBindResponse struct {
RetCode string `json:"retCode"` // 响应码,000000表示成功
RetMsg string `json:"retMsg"` // 响应消息,描述响应结果
RespData struct {
Version string `json:"version"` // 接口版本号,例如:547110502170558464
OrderNo string `json:"orderNo"` // 订单编号,例如:2021020112000012345678
OrgCode string `json:"orgCode"` // 机构代码,例如:200669
ApplyId int64 `json:"applyId"` // 受理编号,例如:548099616395186176
} `json:"respData"` // 响应业务数据,当retCode为000000时返回
}
func (a *ApplyBindResponse) SuccessOrFail() bool {
return a.RetCode == "000000"
}
-46
View File
@@ -1,46 +0,0 @@
package model
// ApplyLedgerMerRequest 商户分账业务开通申请请求结构体
type ApplyLedgerMerRequest struct {
ReqData *ApplyLedgerMerReqData `json:"reqData"` // 请求业务数据
ReqId string `json:"reqId"` // 请求ID
Version string `json:"version"` // 接口版本号
ReqTime string `json:"reqTime"` // 请求时间
}
// ApplyLedgerMerReqData 商户分账业务开通申请请求业务数据结构体
type ApplyLedgerMerReqData struct {
Version string `json:"version"` // 版本号,必传,长度8,取值说明:1.0
OrderNo string `json:"orderNo"` // 订单编号,必传,长度32,用于后续处理查询及回调通知消息标识,2014年月日时分秒毫秒组成
OrgCode string `json:"orgCode"` // 机构代码,必传,长度12
MerInnerNo string `json:"merInnerNo"` // 拉卡拉内部商户号,可选,长度32,拉卡拉内部商户号和银联商户号必须传一个,默认以内部商户号为准
MerCupNo string `json:"merCupNo"` // 银联商户号,可选,长度32,拉卡拉内部商户号和银联商户号必须传一个,默认以内部商户号为准
ContactMobile string `json:"contactMobile"` // 联系手机号,必传,长度32
SplitLowestRatio float64 `json:"splitLowestRatio"` // 最低分账比例,必传,长度12,百分比,支持2位精度,取值范围:70-70.50
SplitEntrustFileName string `json:"splitEntrustFileName"` // 分账授权委托书文件名称,必传,长度64,文件格式:pdf
SplitEntrustFilePath string `json:"splitEntrustFilePath"` // 分账授权委托书文件路径,必传,长度64,调用附件上传接口获取
SplitRange string `json:"splitRange"` // 分账范围,必传,长度32,取值说明:ALL-全部交易分账(所有交易默认都分账),MARK-标记交易分账(只有带标记交易才分账,其余交易正常结算)
SplitFundSource string `json:"splitFundSource"` // 分账依据,非必传,长度32,取值说明:TRA-交易分账,BAR-金额分账
ElecContractId string `json:"elecContractId"` // 电子合同编号,非必传,长度32,收单已签约交易电子合同编号,供审核人员复核使用
SplitLaunchMode string `json:"splitLaunchMode"` // 分账发起方式,非必传,长度32,取值说明:AUTO-自动触发分账,POINTTRUE-指定规则分账,MANUAL-手动分账
SettleType string `json:"settleType"` // 结算类型,非必传,长度32,取值说明:01-主扫现结,02-复扫现结,03-交易自动结算
SplitRuleSource string `json:"splitRuleSource"` // 分账规则来源,条件必传,长度32,取值说明:MER-商户自定规则,PLATFORM-平台分润规则(分润规则必传)
RetUrl string `json:"retUrl"` // 回调通知地址,必传,长度128,分账申请结果以异步消息或同步返回的方式通知,如需无线路由处理,也可以通过第三方商户信息查询接口确定结算结果
Attachments []*ApplyBindAttachment `json:"attachments,omitempty"` // 附加资料,可选,集合,其他需附加的文件信息
}
// ApplyLedgerMerResponse 商户分账业务开通申请响应结构体
type ApplyLedgerMerResponse struct {
RetCode string `json:"retCode"` // 返回码,000000表示成功
RetMsg string `json:"retMsg"` // 返回消息
RespData struct {
Version string `json:"version"` // 接口版本号,例如:547110502170558464
OrderNo string `json:"orderNo"` // 订单编号,例如:2021020112000012345678
OrgCode string `json:"orgCode"` // 机构代码,例如:200669
ApplyId int64 `json:"applyId"` // 受理编号,例如:548099616395186176
} `json:"respData"` // 响应数据
}
func (a *ApplyLedgerMerResponse) SuccessOrFail() bool {
return a.RetCode == "000000"
}
-97
View File
@@ -1,97 +0,0 @@
package model
// ApplyLedgerReceiverRequest 分账接收方创建请求结构体
// 用于向拉卡拉接口发送分账接收方创建请求
// 包含请求头信息和业务数据
type ApplyLedgerReceiverRequest struct {
// 请求业务数据
ReqData *ApplyLedgerReceiverReqData `json:"reqData"`
// 请求ID,用于幂等性校验
ReqId string `json:"reqId"`
// 接口版本号
Version string `json:"version"`
// 请求时间,格式为yyyyMMddHHmmss
ReqTime string `json:"reqTime"`
}
// ApplyLedgerReceiverReqData 分账接收方创建请求业务数据结构体
// 包含分账接收方创建所需的具体业务参数
// 用于创建分账接收方信息
type ApplyLedgerReceiverReqData struct {
// 接口版本号,必传,长度8,取值说明:1.0
Version string `json:"version"`
// 订单编号(便于后续跟踪排查问题及核对报文),必传,长度32,取值说明:14位年月日(24小时制)分秒+8位的随机数(不重复)
OrderNo string `json:"orderNo"`
// 机构代码,必传,长度32
OrgCode string `json:"orgCode"`
// 分账接收方名称,必传,长度64
ReceiverName string `json:"receiverName"`
// 联系手机号,必传,长度16
ContactMobile string `json:"contactMobile"`
// 营业执照号码,可选,长度32,取值说明:收款账户类型为对公,必须上送
LicenseNo string `json:"licenseNo"`
// 营业执照名称,可选,长度128,取值说明:收款账户类型为对公,必须上送
LicenseName string `json:"licenseName"`
// 法人姓名,可选,长度32,取值说明:收款账户类型为对公,必须上送
LegalPersonName string `json:"legalPersonName"`
// 法人证件类型,可选,长度32,取值说明:17身份证,18护照,19港澳居民来往内地通行证,20台湾居民来往内地通行证,收款账户类型为对公,必须上送,身份证外类型先咨询后再使用
LegalPersonCertificateType string `json:"legalPersonCertificateType"`
// 法人证件号,可选,长度32,取值说明:收款账户类型为对公,必须上送
LegalPersonCertificateNo string `json:"legalPersonCertificateNo"`
// 收款账户卡号,必传,长度32
AcctNo string `json:"acctNo"`
// 收款账户名称,必传,长度32
AcctName string `json:"acctName"`
// 收款账户类型代码,必传,长度32,取值说明:57:对公,58:对私
AcctTypeCode string `json:"acctTypeCode"`
// 收款账户证件类型,必传,长度32,取值说明:17身份证,18护照,19港澳居民来往内地通行证,20台湾居民来往内地通行证,身份证外类型先咨询后再使用
AcctCertificateType string `json:"acctCertificateType"`
// 收款账户证件号,必传,长度32
AcctCertificateNo string `json:"acctCertificateNo"`
// 收款账户开户行号,必传,长度32,取值说明:参照FBI.N信息查询,仅支持对私结算账户
AcctOpenBankCode string `json:"acctOpenBankCode"`
// 收款账户开户行名称,必传,长度64,取值说明:参照FBI.N信息查询,仅支持对私结算账户
AcctOpenBankName string `json:"acctOpenBankName"`
// 收款账户清算行行号,必传,长度32,取值说明:参照FBI.N信息查询,仅支持对私结算账户
AcctClearBankCode string `json:"acctClearBankCode"`
// 接收方附件资料,可选,集合
AttachList []*ApplyBindAttachment `json:"attachList"`
// 提款类型,可选,长度32,取值说明:01:主动提款,03:交易自动结算,不填默认01
SettleType string `json:"settleType"`
}
// ApplyLedgerReceiverResponse 分账接收方创建响应结构体
// 拉卡拉接口返回的分账接收方创建响应数据
// 包含响应状态码、消息和业务数据
type ApplyLedgerReceiverResponse struct {
// 响应状态码,000000表示成功
RetCode string `json:"retCode"`
// 响应消息
RetMsg string `json:"retMsg"`
// 响应业务数据,当retCode为000000时返回
RespData *ApplyLedgerReceiverRespData `json:"respData"`
}
// ApplyLedgerReceiverRespData 分账接收方创建响应业务数据结构体
// 包含分账接收方创建返回的具体业务信息
type ApplyLedgerReceiverRespData struct {
// 接口版本号(回传)
Version string `json:"version"`
// 订单编号(回传)
OrderNo string `json:"orderNo"`
// 申请机构代码(回传)
OrgCode string `json:"orgCode"`
// 接收方所属机构
OrgId string `json:"orgId"`
// 接收方所属机构名称
OrgName string `json:"orgName"`
// 接收方编号
ReceiverNo string `json:"receiverNo"`
}
// SuccessOrFail 判断分账接收方创建请求是否成功
// 成功条件:响应码为000000
// 返回值:true表示成功,false表示失败
func (resp *ApplyLedgerReceiverResponse) SuccessOrFail() bool {
return resp.RetCode == "000000"
}
-67
View File
@@ -1,67 +0,0 @@
package model
// BalanceQueryRequest 余额查询请求结构体
// 用于向拉卡拉接口发送余额查询请求
// 包含请求头信息和业务数据
type BalanceQueryRequest struct {
// 请求业务数据
ReqData *BalanceQueryReqData `json:"req_data"`
// 接口版本号
Version string `json:"version"`
// 请求时间,格式为yyyyMMddHHmmss
ReqTime string `json:"req_time"`
}
// BalanceQueryReqData 余额查询请求业务数据结构体
// 包含余额查询所需的具体业务参数
// 用于查询账户的实时余额信息
type BalanceQueryReqData struct {
// 机构号,必传,最大长度32
OrgNo string `json:"org_no"`
// 商户号或receiveNo或商户用户编号,必传,最大长度32
MerchantNo string `json:"merchant_no"`
// 账号,若该参数上送,则payType将无效,非必传,最大长度32
PayNo string `json:"pay_no"`
// 账号类型(01:收款账户,02:付款账户,03:分账商户账户,04:分账接收方账户,05:充值代付账户,06:结算代付账户)-未上送则默认01,非必传,最大长度32
PayType string `json:"pay_type"`
// 账户标志(01:一般账户;03:虚户)-未上送则默认01,非必传,最大长度32
MgtFlag string `json:"mgt_flag"`
}
// BalanceQueryResponse 余额查询响应结构体
// 拉卡拉接口返回的余额查询响应数据
// 包含响应状态码、消息和业务数据
type BalanceQueryResponse struct {
// 响应状态码,000000
Code string `json:"code"`
// 响应消息
Msg string `json:"msg"`
// 响应业务数据,当code为SACS0000时返回
RespData *BalanceQueryRespData `json:"resp_data"`
}
// BalanceQueryRespData 余额查询响应业务数据结构体
// 包含余额查询返回的具体账户信息
type BalanceQueryRespData struct {
// 账号,必传
PayNo string `json:"pay_no"`
// 账户类型,必传
PayType string `json:"pay_type"`
// 账户状态,必传,取值说明:CLOSE销户,NORMAL正常,FREEZE冻结,STOPAY止付
AcctSt string `json:"acct_st"`
// 预付余额(单位元),必传
ForceBalance string `json:"force_balance"`
// 上日余额(单位元)-该字段已废弃使用,必传
HisBalance string `json:"his_balance"`
// 实时余额(单位元),必传
ReBalance string `json:"re_balance"`
// 当前可用余额(单位元),必传
CuBalance string `json:"cu_balance"`
}
// SuccessOrFail 判断余额查询请求是否成功
// 成功条件:响应码为SACS0000
// 返回值:true表示成功,false表示失败
func (resp *BalanceQueryResponse) SuccessOrFail() bool {
return resp.Code == "000000"
}
-7
View File
@@ -1,7 +0,0 @@
package model
type BaseModel[T any] struct {
ReqTime string `json:"req_time"`
Version string `json:"version"`
ReqData T `json:"req_data"`
}
-121
View File
@@ -1,121 +0,0 @@
package model
import "github.com/gogf/gf/v2/os/gtime"
// MergePreorder 主扫合单交易请求结构体
type MergePreorder struct {
ReqTime string `json:"req_time"` // 请求时间,格式:YYYYMMDDHHMMSS
Version string `json:"version"` // 接口版本号,固定值"3.0"
ReqData *MergePreorderReqData `json:"req_data"` // 请求业务数据
}
// MergePreorderReqData 主扫合单交易请求业务数据
type MergePreorderReqData struct {
MerchantNo string `json:"merchant_no"` // 商户号,拉卡拉分配的商户号,String(32),必填
TermNo string `json:"term_no"` // 终端号,拉卡拉分配的业务终端号,String(32),必填
OutTradeNo string `json:"out_trade_no"` // 商户交易流水号,商户系统唯一,String(32),必填
OutSplitInfo []*OutSplitInfo `json:"out_split_info"` // 拆单信息,List,必填
AccountType string `json:"account_type"` // 钱包类型,微信:WECHAT 支付宝:ALIPAY 银联:UQRCODEPAY 京东钱包:JD,String(32),必填
TransType string `json:"trans_type"` // 接入方式,41:NATIVE(扫码支付)(仅ALIPAY支持) 51:JSAPI(微信公众号支付,支付宝服务窗支付,银联JS支付,支付宝JS支付、拉卡拉钱包支付)71:微信小程序支付 81:支付宝H5支付(需特殊商户账户端支持),String(2),必填
TotalAmount string `json:"total_amount"` // 金额,单位分,整数型字符,String(12),必填
LocationInfo *LocationInfo `json:"location_info"` // 地址位置信息,Object,风控要求必送,必填
BusiMode string `json:"busi_mode"` // 业务模式,ACQ-收单 PAY-付款不填,默认为"ACQ-收单",String(8),选填
Subject string `json:"subject"` // 订单标题,用于简单描述订单或商品主题,传递给账户端(账户端控制,实际最多42个字节),String(42),选填
NotifyUrl string `json:"notify_url"` // 商户通知地址,如果上传,且 pay_order_no 不存在情况下,则按此地址通知商户,String(128),选填
Remark string `json:"remark"` // 备注,String(128),选填
IdentityInfo string `json:"identity_info"` // 实名支付信息,json字符串,如{"identityNo": "3200000000000000XX", "name": "张三"},然后国密sm2加密,String(1024),选填
AccBusiFields *AccBusiFields `json:"acc_busi_fields"` // 账户端业务信息域,Object,选填
CompleteNotifyUrl string `json:"complete_notify_url"` // 发货确认通知地址,发货类小程序确认收货后通知商户的地址,String(128),选填
}
// OutSplitInfo 拆单信息
type OutSplitInfo struct {
OutSubTradeNo string `json:"out_sub_trade_no"` // 外部子交易流水号,商户子交易流水号,商户号下唯一,String(32),必填
MerchantNo string `json:"merchant_no"` // 商户号,拉卡拉分配的商户号,String(32),必填
TermNo string `json:"term_no"` // 终端号,拉卡拉分配的业务终端号,String(32),必填
Amount string `json:"amount"` // 金额,单位分,整数型字符,String(12),必填
SettleType string `json:"settle_type"` // 结算类型(单台),"0"或者空,常规结算方式,String(4),选填
SubRemark string `json:"sub_remark"` // 子备注,子单备注信息,String(64),选填
}
// LocationInfo 地址位置信息
type LocationInfo struct {
RequestIp string `json:"request_ip"` // 请求方IP地址,请求方的IP地址,存在必填,格式如36.45.36.95,String(64),必填
BaseStation string `json:"base_station"` // 基站信息,客户端设备的基站信息(主扫时基站信息使用该字段),String(128),选填
Location string `json:"location"` // 维度,经度,商户终端的地理位置,存在必填格式:纬度,经度,+表示北纬、东经,-表示南纬、西经,精度最长支持小数点后9位。举例:+37.123456789,121.123456789,String(32),选填
}
// AccBusiFields 账户端业务信息域,微信主扫场景
type AccBusiFields struct {
TimeoutExpress string `json:"timeout_express"` // 预下单的订单的有效时间,以分钟为单位。如果在有效时间内没有完成付款,则在账户端该订单失效。如用户超时,则账户端完成失效处理,建议不超过15分钟。不传值则默认5分钟,String(2),选填
SubAppId string `json:"sub_appid"` // 子商户公众账号ID,sub_appid(即微信小程序支付-71、公众号支付-51、微信支付-61),此参数必传,只对微信支付生效;拉卡拉钱包情况下,该字段上送LAKALA的openid,String(32),选填
UserId string `json:"user_id"` // 用户标识,用户在子商户sub_appid下的唯一标识,sub_openid,(即微信小程序支付-71、公众号支付-51),此参数必传,只对微信支付有效,String(64),选填
Detail string `json:"detail"` // 商品详情,单品优惠功能字段,详见下文说明,String(1024),选填
GoodsTag string `json:"goods_tag"` // 订单优惠标记,微信平台配置的商品标记,用于优惠券或者满减使用,accountType为WECHAT时,可选填此字段,String(32),选填
Attach string `json:"attach"` // 附加域,附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据。商户定制字段,直接送到账户端,String(128),选填
GoodsDetail []*GoodsDetail `json:"goods_detail"` // 商品详情列表,微信商品详情字段说明
}
// GoodsDetail 微信商品详情字段说明
type GoodsDetail struct {
GoodsId string `json:"goods_id"` // 商品ID,由半角的大小写字母、数字、中划线、下划线中的一种或几种组成。如"商品编码",必填
WxpayGoodsId string `json:"wxpay_goods_id"` // 微信支付定义的统一商品编号,String(32),选填
GoodsName string `json:"goods_name"` // 商品的实际名称,String(256),选填
Quantity string `json:"quantity"` // 用户购买的数量,String(12),必填
Price string `json:"price"` // 单价,单位为:分。如果商户有优惠,需传输商户优惠后的单价,String(12),必填
}
// NewMergePreorder 创建主扫合单交易请求
func NewMergePreorder(param *MergePreorderReqData) *MergePreorder {
return &MergePreorder{
ReqTime: gtime.Now().Format("YmdHis"),
Version: "3.0",
ReqData: param,
}
}
// MergePreorderResponse 主扫合单交易响应结构体
type MergePreorderResponse struct {
Code string `json:"code"` // 响应码,BBS00000表示成功
Msg string `json:"msg"` // 响应信息,对响应码的文字描述
ReqData MergePreorderRespData `json:"resp_data"` // 响应业务数据
RespTime string `json:"resp_time"` // 响应时间
}
// MergePreorderRespData 主扫合单交易响应业务数据
type MergePreorderRespData struct {
MerchantNo string `json:"merchant_no"` // 商户号(待上线),拉卡拉分配的商户号(请求接口中商户号)
OutTradeNo string `json:"out_trade_no"` // 商户请求流水号,请求报文中的商户请求流水号
TradeNo string `json:"trade_no"` // 拉卡拉交易流水号
LogNo string `json:"log_no"` // 拉卡拉对账单流水号
SplitInfo []*SplitInfo `json:"split_info"` // 拆单信息
AccRespFields interface{} `json:"acc_resp_fields"` // 账户端返回信息域
}
// SplitInfo 拆单信息
type SplitInfo struct {
SubTradeNo string `json:"sub_trade_no"` // 子单交易流水号
SubLogNo string `json:"sub_log_no"` // 子单对账单流水号
OutSubTradeNo string `json:"out_sub_trade_no"` // 外部子交易流水号,商户子交易流水号,商户号下唯一
MerchantNo string `json:"merchant_no"` // 商户号,拉卡拉分配的商户号
MerchantName string `json:"merchant_name"` // 商户名称
TermNo string `json:"term_no"` // 终端号,拉卡拉分配的业务终端号
Amount string `json:"amount"` // 金额,单位为:分。整数型字符
}
// WxAccRespFields 微信(71-小程序/微信(51-JSAPI)场景下账户端返回信息域
type WxAccRespFields struct {
PrepayId string `json:"prepay_id"` // 预下单ID,预支付交易会话ID
PaySign string `json:"pay_sign"` // 支付签名信息
AppId string `json:"app_id"` // 小程序ID,商户注册具有支付权限的小程序成功后即可获得小程序ID
TimeStamp string `json:"time_stamp"` // 时间戳,当前的时间
NonceStr string `json:"nonce_str"` // 随机字符串
Package string `json:"package"` // 订单详情扩展字符串
SignType string `json:"sign_type"` // 签名方式,签名类型,支持RSA
SubMchId string `json:"sub_mch_id"` // 子商户号,账户端子商户号
}
// SuccessOrFail 判断主扫合单交易是否成功
func (m *MergePreorderResponse) SuccessOrFail() bool {
return m.Code == "BBS00000"
}
-55
View File
@@ -1,55 +0,0 @@
package model
// OrderSplitLedgerRequest 订单分账请求结构体
// 用于发起订单分账操作,支持向多个接收方进行分账
// 拉卡拉SDK接口文档:订单分账接口
type OrderSplitLedgerRequest struct {
ReqData *OrderSplitLedgerReqData `json:"req_data"` // 请求业务数据
Version string `json:"version"` // 接口版本号
ReqTime string `json:"req_time"` // 请求时间,格式为yyyyMMddHHmmss
}
// OrderSplitLedgerReqData 订单分账请求业务数据结构体
// 包含订单分账所需的详细业务参数
type OrderSplitLedgerReqData struct {
MerchantNo string `json:"merchant_no"` // 商户号,必传,长度32
LogNo string `json:"log_no"` // 拉卡拉对账单流水号,必传,长度14,posp流水号,用于查询结算
LogDate string `json:"log_date"` // 交易日期,必传,长度8,posp日期,格式为yyyyMMdd,用于查询结算
OutSeparateNo string `json:"out_separate_no"` // 商户分账指令流水号,必传,长度32,每个商户号下唯一,否则会校验失败
TotalAmt string `json:"total_amt"` // 分账总金额,必传,长度15,单位为分
LklOrgNo string `json:"lkl_org_no"` // 拉卡拉机构编号,条件必传,长度16
CalType string `json:"cal_type"` // 分账计算类型,条件必传,长度2,取值说明:0-按照指定金额,1-按照指定比例,默认0
NotifyUrl string `json:"notify_url"` // 回调地址,条件必传,长度128,分账、分账撤销或分账回退时,通过该地址通知商户最终处理结果,不传时不回调
RecvDatas []*OrderSplitLedgerRecvDatas `json:"recv_datas,omitempty"` // 分账接收数据对象,条件必传,列表类型,分账接收方编号必须已创建
}
type OrderSplitLedgerRecvDatas struct {
RecvMerchantNo string `json:"recv_merchant_no"` // 接收方商户号,条件必传,长度32,分账接收方商户号,分给自己时使用,需和merchantNo一样,否则检查报错;分账接收方商户号和分账接收方只能填写一个
RecvNo string `json:"recv_no"` // 分账接收方编号,条件必传,长度32,分账接收方编号,分给他人时使用;分账接收方商户号和分账接收方只能填写一个
SeparateValue string `json:"separate_value"` // 分账数值,必传,长度32,calType为0时按照固定金额分账(单位:分),calType为1时按照比例分账(单位:百分比的小数值,如0.55表示55%)
}
// OrderSplitLedgerResponse 订单分账响应结构体
// 包含订单分账操作的处理结果信息
type OrderSplitLedgerResponse struct {
Msg string `json:"msg"` // 响应消息,描述响应结果
RespTime string `json:"resp_time"` // 响应时间,格式为yyyyMMddHHmmss
Code string `json:"code"` // 响应码,SACS0000表示成功
RespData struct {
SeparateNo string `json:"separate_no"` // 分账指令流水号,必传,长度32,分账系统生成唯一流水
OutSeparateNo string `json:"out_separate_no"` // 商户订单号,必传,长度32,请求报文中的商户外部订单号
Status string `json:"status"` // 分账状态,条件必传,长度16,取值说明:处理中-PROCESSING,已受理-ACCEPTED,成功-SUCCESS,失败-FAIL
LogNo string `json:"log_no"` // 拉卡拉对账单流水号,条件必传,长度14,请求透返
LogDate string `json:"log_date"` // 拉卡拉订单日期,条件必传,长度8,posp日期,格式为yyyyMMdd,用于查询结算
TotalAmt string `json:"total_amt"` // 分账总金额,条件必传,长度15,单位为分
} `json:"resp_data"` // 响应业务数据,当code为SACS0000时返回
}
// SuccessOrFail 判断分账请求是否成功
// 返回true表示成功,false表示失败
func (s *OrderSplitLedgerResponse) SuccessOrFail() bool {
return s.Code == "SACS0000"
}
-75
View File
@@ -1,75 +0,0 @@
package model
import "github.com/gogf/gf/v2/os/gtime"
// Preorder 预下单请求结构体
type Preorder struct {
ReqTime string `json:"req_time"` // 请求时间,格式:YYYYMMDDHHMMSS
Version string `json:"version"` // 接口版本号,固定值"3.0"
ReqData *PreorderReqData `json:"req_data"` // 请求业务数据
}
// PreorderReqData 预下单请求业务数据
type PreorderReqData struct {
MerchantNo string `json:"merchant_no"` // 商户号,拉卡拉分配的商户号,String(32)
TermNo string `json:"term_no"` // 终端号,拉卡拉分配的业务终端号,String(32)
OutTradeNo string `json:"out_trade_no"` // 商户交易流水号,商户系统唯一,对应数据库表中外请求流水号,String(32)
AccountType string `json:"account_type"` // 钱包类型,微信:WECHAT 支付宝:ALIPAY 银联:UQRCODEPAY 翼支付:BESTPAY 苏宁易付宝:SUNING 拉卡拉支付账户:LKLACC 网联小钱包:NUCSPAY 京东钱包:JD,String(32)
TransType string `json:"trans_type"` // 接入方式,41:NATIVE(ALIPAY, 云闪付支持, 京东白条分期)51:JSAPI(微信公众号支付, 支付宝服务窗、JS支付, 翼支付JS支付, 拉卡拉钱包支付, 京东白条分期)71:微信小程序支付61:APP支付(微信APP支付),String(2)
TotalAmount string `json:"total_amount"` // 金额,单位分,整数型字符,String(12)
NotifyUrl string `json:"notify_url"` // 商户通知地址,商户通知地址,如果上传,且 pay_order_no 不存在情况下,则按此地址通知商户,String(128)
LocationInfo struct {
RequestIp string `json:"request_ip"` // 请求方IP地址,存在必填,格式如36.45.36.95,String(64)
Location string `json:"location"` // 纬度,经度,商户终端的地理位置,银联二维码交易必填,整体格式:纬度,经度,+表示北纬、东经,-表示南纬、西经。经度格式:1位正负号+3位整数+1位小数点+5位小数;纬度格式:1位正负号+2位整数+1位小数点+6位小数;举例:+31.221345,+121.12345,String(32)
} `json:"location_info"` // 地址位置信息,Object
Subject string `json:"subject"` // 订单标题,用于简单描述订单或商品主题,传输给账户端(账户端控制,实际最多42个字节),微信支付必送,String(42)
}
func NewPreorder(param *PreorderReqData) *Preorder {
return &Preorder{
ReqTime: gtime.Now().Format("YmdHis"),
Version: "3.0",
ReqData: param,
}
}
// PreorderResponse 预下单响应结构体
type PreorderResponse struct {
Code string `json:"code"` // 响应码,BBS00000表示成功
Msg string `json:"msg"` // 响应信息,对响应码的文字描述
ReqData *ReqData `json:"resp_data"` // 响应业务数据
RespTime string `json:"resp_time"` // 响应时间
}
// ReqData 响应业务数据
type ReqData struct {
MerchantNo string `json:"merchant_no"` // 商户号
OutTradeNo string `json:"out_trade_no"` // 外部订单号(商户订单号)
TradeNo string `json:"trade_no"` // 交易号,拉卡拉生成的订单号
LogNo string `json:"log_no"` // 拉卡拉对账单流水号
SettleMerchantNo string `json:"settle_merchant_no"` // 结算商户号
SettleTermNo string `json:"settle_term_no"` // 结算终端号
AccRespFields *WxPreorderResponse `json:"acc_resp_fields"` // 支付通道返回的具体信息
}
// WxPreorderResponse 支付通道返回的具体信息
type WxPreorderResponse struct {
Code string `json:"code"` // 返回码
CodeImage string `json:"code_image"` // 二维码图片Base64编码
PrepayId string `json:"prepay_id"` // 预支付ID
AppId string `json:"app_id"` // 应用ID
PaySign string `json:"pay_sign"` // 签名
TimeStamp string `json:"time_stamp"` // 时间戳
NonceStr string `json:"nonce_str"` // 随机字符串
Package string `json:"package"` // 订单详情扩展字符串
SignType string `json:"sign_type"` // 签名方式
FormData string `json:"form_data"` // 表单数据
RedirectUrl string `json:"redirect_url"` // 重定向URL
BestPayInfo string `json:"best_pay_info"` // 翼支付信息
PartnerId string `json:"partner_id"` // 合作伙伴ID
SubMchId string `json:"sub_mch_id"` // 子商户ID
}
func (p *PreorderResponse) SuccessOrFail() bool {
return p.Code == "BBS00000"
}
-90
View File
@@ -1,90 +0,0 @@
package model
// QueryLedgerMerRequest 分账商户查询请求结构体
// 用于向拉卡拉接口发送分账商户查询请求
// 包含请求头信息和业务数据
type QueryLedgerMerRequest struct {
// 请求业务数据
ReqData *QueryLedgerMerReqData `json:"req_data"`
// 接口版本号
Version string `json:"version"`
// 请求时间,格式为yyyyMMddHHmmss
ReqTime string `json:"req_time"`
}
// QueryLedgerMerReqData 分账商户查询请求业务数据结构体
// 包含分账商户查询所需的具体业务参数
// 用于查询商户的分账设置信息
type QueryLedgerMerReqData struct {
// 接口版本号,必传,长度8,取值说明:1.0
Version string `json:"version"`
// 订单编号(便于后续跟踪排查问题及核对报文),必传,长度32,取值说明:14位年月日(24小时制)分秒+8位的随机数(不重复)
OrderNo string `json:"order_no"`
// 机构代码,必传,长度32
OrgCode string `json:"org_code"`
// 拉卡拉内部商户号,可选,长度32,取值说明:拉卡拉内部商户号和银联商户号必须传一个,都送以内部商户号为准
MerInnerNo string `json:"mer_inner_no"`
// 银联商户号,可选,长度32,取值说明:拉卡拉内部商户号和银联商户号必须传一个,都送以内部商户号为准
MerCupNo string `json:"mer_cup_no"`
}
// QueryLedgerMerResponse 分账商户查询响应结构体
// 拉卡拉接口返回的分账商户查询响应数据
// 包含响应状态码、消息和业务数据
type QueryLedgerMerResponse struct {
// 响应状态码,000000表示成功
Code string `json:"code"`
// 响应消息
Msg string `json:"msg"`
// 响应业务数据,当code为000000时返回
RespData *QueryLedgerMerRespData `json:"resp_data"`
}
// QueryLedgerMerRespData 分账商户查询响应业务数据结构体
// 包含分账商户查询返回的具体业务信息
type QueryLedgerMerRespData struct {
// 分账商户机构号
OrgId string `json:"org_id"`
// 分账商户机构名称
OrgName string `json:"org_name"`
// 拉卡拉内部商户号
MerInnerNo string `json:"mer_inner_no"`
// 银联商户号
MerCupNo string `json:"mer_cup_no"`
// 最低分账比例(百分比,支持2位精度),取值说明:70或70.50
SplitLowestRatio string `json:"split_lowest_ratio"`
// 商户分账状态,取值说明:VALID启用,INVALID禁用
SplitStatus string `json:"split_status"`
// 分账范围,取值说明:ALL:全部交易分账(商户所有交易默认待分账),MARK:标记交易分账(只有带分账标识交易待分账,其余交易正常结算),默认:MARK
SplitRange string `json:"split_range"`
// 分账依据,取值说明:TR或空:交易分账,BA:余额分账,默认:TR交易分账
SepFundSource string `json:"sep_fund_source"`
// 平台ID,取值说明:如果商户和绑定平台分账,返回平台ID
PlatformId string `json:"platform_id"`
// 分账发起方式,取值说明:AUTO:自动规则分账,POINTRULE:指定规则分账,MANUAL:手动规则分账
SplitLaunchMode string `json:"split_launch_mode"`
// 分账规则来源,取值说明:MER:商户分账规则,PLATFORM:平台分账规则
SplitRuleSource string `json:"split_rule_source"`
// 已绑定接收方列表
BindRelations []*BindRelation `json:"bind_relations"`
}
// BindRelation 已绑定接收方信息结构体
// 用于表示分账商户已绑定的接收方信息
type BindRelation struct {
// 拉卡拉内部商户号
MerInnerNo string `json:"mer_inner_no"`
// 银联商户号
MerCupNo string `json:"mer_cup_no"`
// 接收方编号
ReceiverNo string `json:"receiver_no"`
// 接收方编号名称
ReceiverName string `json:"receiver_name"`
}
// SuccessOrFail 判断分账商户查询请求是否成功
// 成功条件:响应码为000000
// 返回值:true表示成功,false表示失败
func (resp *QueryLedgerMerResponse) SuccessOrFail() bool {
return resp.Code == "000000"
}
-70
View File
@@ -1,70 +0,0 @@
package model
import "github.com/gogf/gf/v2/os/gtime"
// Refund 退款请求结构体
type Refund struct {
ReqTime string `json:"req_time"` // 请求时间,格式:YYYYMMDDHHMMSS
Version string `json:"version"` // 接口版本号,固定值"3.0"
ReqData *RefundReqData `json:"req_data"` // 请求业务数据
}
// RefundReqData 退款请求业务数据
type RefundReqData struct {
MerchantNo string `json:"merchant_no"` // 商户号,拉卡拉分配的商户号,String(32),必填
TermNo string `json:"term_no"` // 终端号,拉卡拉分配的业务终端号,String(32),必填
OutTradeNo string `json:"out_trade_no"` // 商户请求流水号,商户系统唯一,String(32),必填
RefundAmount string `json:"refund_amount"` // 退款金额,单位分,整数型字符,String(12),必填
RefundAccMode string `json:"refund_acc_mode"` // 退款账户模式,String(2),必填,00-调用户余额 65-调商户余额 66-调终端余额 30-调账户
LocationInfo struct {
RequestIp string `json:"request_ip"` // 请求方IP地址,请求方的IP地址,存在必填,格式如36.45.36.95,String(64),必填
} `json:"location_info"` // 地址位置信息,Object,必填
NotifyUrl string `json:"notify_url"` // 后台通知地址,交易结果通知地址,String(128),选填
OriginLogNo string `json:"origin_log_no"` // 拉卡拉对账单流水号,正常退款的拉卡拉对账单流水号,String(14),选填
OriginOutTradeNo string `json:"origin_out_trade_no"` // 原始交易商户流水号,String(32),选填
OriginTradeNo string `json:"origin_trade_no"` // 原交易拉卡拉交易订单号,String(32),选填
RefundSplitMsg string `json:"refund_split_msg"` // 退款分账状态,String(2),选填,00-为默认,01-为分账;分账交易退款必须填写。需要退款上送该笔的分账状态,为分账时,是退分账前处理,还是退分账后处理
}
// NewRefund 创建退款请求
func NewRefund(param *RefundReqData) *Refund {
return &Refund{
ReqTime: gtime.Now().Format("YmdHis"),
Version: "3.0",
ReqData: param,
}
}
// RefundResponse 退款响应结构体
type RefundResponse struct {
Code string `json:"code"` // 响应码,"000000"表示成功
Msg string `json:"msg"` // 响应信息,对响应码的文字描述
RespData RefundRespData `json:"resp_data"` // 响应业务数据
RespTime string `json:"resp_time"` // 响应时间
}
// RefundRespData 退款响应业务数据
type RefundRespData struct {
TradeState string `json:"trade_state"` // 交易状态,String(15),必填,INIT-初始化(需商户确认结果);SUCCESS-交易成功;FAIL-交易失败;REFUND-交易退款中(需商户确认结果);PROCESSING-交易处理中(需商户确认结果);TIMEOUT-请求超时(需商户确认结果);EXCEPTION-异常(失败)
RefundType string `json:"refund_type"` // 退款模式,String(20),必填
MerchantNo string `json:"merchant_no"` // 商户号,拉卡拉分配的商户号,String(32),必填
OutTradeNo string `json:"out_trade_no"` // 商户请求流水号,请求报文中的商户请求流水号,String(32),必填
TradeNo string `json:"trade_no"` // 拉卡拉交易流水号,String(32),必填
LogNo string `json:"log_no"` // 拉卡拉对账单流水号,String(14),必填
AccType string `json:"acc_type"` // 账户类型,String(32),必填
TotalAmount string `json:"total_amount"` // 交易金额,单位分,整数型字符,String(12),必填
RefundAmount string `json:"refund_amount"` // 申请退款金额,单位分,整数型字符,String(12),必填
PayedAmount string `json:"payed_amount"` // 实际退款金额,单位分,整数型字符,String(12),必填
TradeTime string `json:"trade_time"` // 退款时间,实际退款时间,格式:yyyyMMddHHmmss,String(14),选填
OriginLogNo string `json:"origin_log_no"` // 原拉卡拉对账单流水号,原交易的拉卡拉对账单流水号,String(14),选填
OriginOutTradeNo string `json:"origin_out_trade_no"` // 原商户请求流水号,原交易中的商户请求流水号,String(32),选填
OriginTradeNo string `json:"origin_trade_no"` // 原交易拉卡拉交易订单号,String(32),选填
UpCouponInfo string `json:"up_coupon_info"` // 银联优惠券信息,目标字段,单位是银联侧返回的四部分内容:{"fundChannel": "BOC", "amount": "10"},String(500),选填
TanteInfo string `json:"tante_info"` // 淘方信息,目标字段,数据是淘方侧返回的四部分内容:{"fundChannel": "BOC", "amount": "10"},String(32),选填
ChannelRetDesc string `json:"channel_ret_desc"` // 渠道返回描述,String,必填,codeMsg: "R000000-成功", "R011122-渠道处理超时"
}
// SuccessOrFail 判断退款交易是否成功
func (r *RefundResponse) SuccessOrFail() bool {
return r.Code == "000000"
}
-43
View File
@@ -1,43 +0,0 @@
package model
type SeparateRequest struct {
ReqData *SeparateReqData `json:"req_data"` // 请求数据
Version string `json:"version"` // 版本号
ReqTime string `json:"req_time"` // 请求时间
}
type SeparateReqData struct {
MerchantNo string `json:"merchant_no"` // 商户号
LogDate string `json:"log_date"` // 交易日期 yyyyMMdd,查清结算用
LogNo string `json:"log_no"` // 拉卡拉对账单流水号
OutSeparateNo string `json:"out_separate_no"` // 商户分账指令流水号
TotalAmt string `json:"total_amt"` // 分账总金额 [单位:分]
LklOrgNo string `json:"lkl_org_no"` // 拉卡拉机构编号 非必填
CalType string `json:"cal_type"` // 分账计算类型 0- 按照指定金额,1- 按照指定比例。默认 0 非必填
SeparateType string `json:"separate_type"`
NotifyUrl string `json:"notify_url"` // 回调地址 分账,分账撤销或分账回退时,是异步接口。通过该地址通知商户最终处理结果。不传时,不回调
RecvDatas []*SeparateRecvDatas `json:"recv_datas"` // 分账接收数据对象 分账接收方编号必须已创建
}
type SeparateRecvDatas struct {
RecvMerchantNo string `json:"recv_merchant_no,omitempty"` // 接收方商户号 分账接收方商户号,分给自己时使用,需和merchantNo一样,否则检查报错;分账接收方商户号 和 分账接收方 只能填写一个。
SeparateValue string `json:"separate_value"` // 分账数值 calType为0时,按照固定金额分账,单位:分 calType为1时,按照比例分账,单位:百分比的小数值,比如0.55 (55%)
RecvNo string `json:"recv_no,omitempty"` // 分账接收方编号 分账接收方编号, 分给他人时使用;分账接收方商户号 和 分账接收方 只能填写一个。
}
type SeparateResponse struct {
Msg string `json:"msg"`
RespTime string `json:"resp_time"`
Code string `json:"code"`
RespData struct {
TotalAmt string `json:"total_amt"` // 分账总金额 单位:分
LogDate string `json:"log_date"` // 拉卡拉订单日期 posp日期,yyyyMMdd,查清结算用
SeparateNo string `json:"separate_no"` // 分账指令流水号 分账系统生成唯一流水
LogNo string `json:"log_no"` // 拉卡拉对账单流水号 请求透返
OutSeparateNo string `json:"out_separate_no"` // 商户订单号 请求报文中的商户外部订单号
Status string `json:"status"` // 分账状态 处理中:PROCESSING, 已受理:ACCEPTED, 成功:SUCCESS, 失败:FAIL
} `json:"resp_data"`
}
func (s *SeparateResponse) SuccessOrFail() bool {
return s.Code == "SACS0000"
}
-39
View File
@@ -1,39 +0,0 @@
package model
// SplitBalanceRequest 可分账金额查询请求结构体
// 用于查询指定交易的可分账金额信息
// 拉卡拉SDK接口文档:可分账金额查询接口
type SplitBalanceRequest struct {
ReqData *SplitBalanceReqData `json:"req_data"` // 请求业务数据
Version string `json:"version"` // 接口版本号
ReqTime string `json:"req_time"` // 请求时间,格式为yyyyMMddHHmmss
}
// SplitBalanceReqData 可分账金额查询请求业务数据结构体
// 包含可分账金额查询所需的查询参数
type SplitBalanceReqData struct {
MerchantNo string `json:"merchant_no"` // 商户号,必传,长度32
LogDate string `json:"log_date"` // 拉卡拉对账单交易日期,必传,长度8,格式为yyyyMMdd,用于查询结算
LogNo string `json:"log_no"` // 拉卡拉对账单流水号,必传,长度14,对应pos流水号,用于查询结算
}
// SplitBalanceResponse 可分账金额查询响应结构体
// 包含可分账金额查询的结果信息
type SplitBalanceResponse struct {
Msg string `json:"msg"` // 响应消息,描述响应结果
RespTime string `json:"resp_time"` // 响应时间,格式为yyyyMMddHHmmss
Code string `json:"code"` // 响应码,SACS0000表示成功
RespData struct {
MerchantNo string `json:"merchant_no"` // 商户号,请求返回
TotalSeparateAmt string `json:"total_separate_amt"` // 总分账金额,必传,长度15,单位为分
CanSeparateAmt string `json:"can_separate_amt"` // 可分账金额,必传,长度15,单位为分
LogDate string `json:"log_date"` // 拉卡拉对账单交易日期,必传,长度8,格式为yyyyMMdd
LogNo string `json:"log_no"` // 拉卡拉对账单流水号,必传,长度14,请求返回
} `json:"resp_data"` // 响应业务数据,当code为SACS0000时返回
}
func (s *SplitBalanceResponse) SuccessOrFail() bool {
return s.Code == "SACS0000"
}
-73
View File
@@ -1,73 +0,0 @@
package model
// TradeQuery 交易查询请求结构体
type TradeQuery struct {
ReqTime string `json:"req_time"` // 请求时间
Version string `json:"version"` // API版本号
OutOrgCode string `json:"out_org_code"` // 外部机构码
ReqData *TradeQueryReqData `json:"req_data"` // 请求数据
}
// TradeQueryReqData 交易查询请求数据结构体
type TradeQueryReqData struct {
MerchantNo string `json:"merchant_no"` // 商户号,必传
TermNo string `json:"term_no"` // 终端号,必传
OutTradeNo string `json:"out_trade_no"` // 商户交易流水号,条件必传,与trade_no必传其一
}
// TradeQueryResponse 交易查询响应结构体
type TradeQueryResponse struct {
Msg string `json:"msg"` // 响应消息
RespTime string `json:"resp_time"` // 响应时间
Code string `json:"code"` // 响应码,000000表示成功
RespData struct {
MerchantNo string `json:"merchant_no"` // 商户号,必传
OutTradeNo string `json:"out_trade_no"` // 商户请求流水号,必传
TradeNo string `json:"trade_no"` // 拉卡拉商户订单号,必传
LogNo string `json:"log_no"` // 拉卡拉对账流水号,必传
TradeMainType string `json:"trade_main_type"` // 交易大类,条件必传(PREORDER-主扫,MICROPAY-被扫,REFUND-退款,CANCEL-撤销)
SplitAttr string `json:"split_attr"` // 拆单属性,条件必传(M-主单,S-子单)
SplitInfo []struct {
SubTradeNo string `json:"sub_trade_no"` // 子单交易流水号,必传
SubLogNo string `json:"sub_log_no"` // 子单对账单单流水号,必传
OutSubTradeNo string `json:"out_sub_trade_no"` // 外部子交易流水号,必传
MerchantNo string `json:"merchant_no"` // 商户号,必传
MerchantName string `json:"merchant_name"` // 商户名称,必传
TermNo string `json:"term_no"` // 终端号,必传
Amount string `json:"amount"` // 金额,必传(单位分)
} `json:"split_info"` // 拆单信息,条件必传(如果查询订单是主单,则返回)
RefundSplitInfo []struct {
OutSubTradeNo string `json:"out_sub_trade_no"` // 外部子退款交易流水号,必传
MerchantNo string `json:"merchant_no"` // 商户号,必传
TermNo string `json:"term_no"` // 终端号,必传
RefundAmount string `json:"refund_amount"` // 申请退款金额,必传(单位分)
SubTradeNo string `json:"sub_trade_no"` // 拉卡分子交易流水号,条件必传
SubLogNo string `json:"sub_log_no"` // 对账单子流水号,条件必传
TradeState string `json:"trade_state"` // 子交易状态,条件必传(SUCCESS-交易成功 FAIL-交易失败)
ResultCode string `json:"result_code"` // 处理结果码,条件必传
ResultMsg string `json:"result_msg"` // 处理描述,条件必传
} `json:"refund_split_info"` // 合单退款拆单信息,条件必传(如果查询订单是退款主单,则返回)
AccTradeNo string `json:"acc_trade_no"` // 账户端交易订单号,必传
AccountType string `json:"account_type"` // 钱包类型,必传(微信: WECHAT 支付宝: ALIPAY 银联: UQRCODEPAY 翼支付: BESTPAY 苏宁支付: SUNING)
TradeState string `json:"trade_state"` // 交易状态,必传(INIT-初始化 CREATE-下单成功 SUCCESS-交易成功 FAIL-交易失败 DEAL-交易处理中 UNKNOWN-未知状态 CLOSE-订单关闭 PART_REFUND-部分退款 REFUND-全部退款)
TradeStateDesc string `json:"trade_state_desc"` // 交易状态描述,条件必传
TotalAmount string `json:"total_amount"` // 订单金额,必传(单位分)
PayerAmount string `json:"payer_amount"` // 付款人实付金额,条件必传(单位分)
AccSettleAmount string `json:"acc_settle_amount"` // 账户端结算金额,条件必传(单位分)
AccMdiscountAmount string `json:"acc_mdiscount_amount"` // 商户侧优惠金额,条件必传(单位分)
AccDiscountAmount string `json:"acc_discount_amount"` // 账户端优惠金额,条件必传(单位分)
AccOtherDiscountAmount string `json:"acc_other_discount_amount"` // 账户端其它优惠金额,条件必传(单位分)
TradeTime string `json:"trade_time"` // 交易完成时间,条件必传(yyyyMMddHHmmss)
UserId1 string `json:"user_id1"` // 用户标识1,条件必传(微信sub_open_id 支付宝buyer_login_id 买家支付账号)
UserId2 string `json:"user_id2"` // 用户标识2,条件必传(微信open_id 支付宝buyer_user_id 银user_id)
BankType string `json:"bank_type"` // 付款银行,条件必传
CardType string `json:"card_type"` // 银行卡类型,条件必传(00: 借记卡 01: 贷记卡 02: 微信零钱 03: 支付宝花呗 04: 支付宝其他 05: 数字货币 06: 拉卡拉支付账户 99: 未知)
AccActivityId string `json:"acc_activity_id"` // 活动ID,条件必传(在账户端商户后台配置的批次ID)
TradeReqDate string `json:"trade_req_date"` // 交易请求日期,必传(yyyyMMdd)
AccRespFields map[string]interface{} `json:"acc_resp_fields"` // 账户端返回信息域,条件必传
} `json:"resp_data"` // 响应数据
}
func (t *TradeQueryResponse) SuccessOrFail() bool {
return t.Code == "000000"
}
-36
View File
@@ -1,36 +0,0 @@
package model
type UploadFileRequest struct {
ReqData *UploadFileReqData `json:"reqData"`
Ver string `json:"ver"`
Timestamp string `json:"timestamp"`
ReqId string `json:"reqId"`
}
type UploadFileReqData struct {
Version string `json:"version"`
OrderNo string `json:"orderNo"`
AttType string `json:"attType"`
AttExtName string `json:"attExtName"`
AttContext string `json:"attContext"`
OrgCode string `json:"orgCode"`
}
type UploadFileResponse struct {
CmdRetCode string `json:"cmdRetCode"`
ReqId string `json:"reqId"`
RespData struct {
AttType string `json:"attType"`
OrderNo string `json:"orderNo"`
OrgCode string `json:"orgCode"`
AttFileId string `json:"attFileId"`
} `json:"respData"`
RetCode string `json:"retCode"`
RetMsg string `json:"retMsg"`
Timestamp int64 `json:"timestamp"`
Ver string `json:"ver"`
}
func (u *UploadFileResponse) SuccessOrFail() bool {
return u.RetCode == "000000"
}
-67
View File
@@ -1,67 +0,0 @@
package model
// WithdrawRequest 提现请求结构体
// 用于向拉卡拉接口发送提现请求
// 包含请求头信息和业务数据
type WithdrawRequest struct {
// 请求业务数据
ReqData *WithdrawReqData `json:"req_data"`
// 接口版本号
Version string `json:"version"`
// 请求时间,格式为yyyyMMddHHmmss
ReqTime string `json:"req_time"`
}
// WithdrawReqData 提现请求业务数据结构体
// 包含提现所需的具体业务参数
// 用于申请账户资金提现
type WithdrawReqData struct {
// bmcp机构号,必传,最大长度32
OrgNo string `json:"org_no"`
// 商户号,必传,最大长度32,822商户号,SR分账接收方编号
MerchantNo string `json:"merchant_no"`
// 提现金额(单位:元),必传,最大长度32
DrawAmt string `json:"draw_amt"`
// 通知地址,非必传,最大长度256
NotifyUrl string `json:"notify_url"`
// 商户订单号(商户系统唯一),非必传,最大长度256
MerOrderNo string `json:"mer_order_no"`
// 账号(若该参数上送,则payType将无效),非必传,最大长度32
PayNo string `json:"pay_no"`
// 账号类型(01:收款账户,04:分账接收方账户)未上送则默认01,必传,最大长度32,分账接收方提现时需填04
PayType string `json:"pay_type"`
// 备注信息,非必传,最大长度64
Remark string `json:"remark"`
// 摘要,非必传,最大长度64
Summary string `json:"summary"`
// 结算银行ID,非必传,最大长度32
BankId string `json:"bank_id"`
}
// WithdrawResponse 提现响应结构体
// 拉卡拉接口返回的提现响应数据
// 包含响应状态码、消息和业务数据
type WithdrawResponse struct {
// 响应状态码,000000表示成功
Code string `json:"code"`
// 响应消息
Msg string `json:"msg"`
// 响应业务数据,当code为000000时返回
RespData *WithdrawRespData `json:"resp_data"`
}
// WithdrawRespData 提现响应业务数据结构体
// 包含提现返回的具体业务信息
type WithdrawRespData struct {
// 提现流水号,必传
DrawJnl string `json:"draw_jnl"`
// 商户订单号,必传
MerOrderNo string `json:"mer_order_no"`
}
// SuccessOrFail 判断提现请求是否成功
// 成功条件:响应码为000000
// 返回值:true表示成功,false表示失败
func (resp *WithdrawResponse) SuccessOrFail() bool {
return resp.Code == "000000"
}
+20
View File
@@ -0,0 +1,20 @@
package lklSDK
import (
"context"
"github.com/black1552/lkl_sdk/basePay/labs"
"github.com/black1552/lkl_sdk/unifiedreturn"
)
type SDK struct {
labs *labs.Labs
unifiedReturn *unifiedreturn.Server
}
func NewSDK(ctx context.Context, cfgJson string) *SDK {
return &SDK{
labs: labs.NewLabs(ctx, cfgJson),
unifiedReturn: unifiedreturn.NewServer(ctx, cfgJson),
}
}
+35
View File
@@ -0,0 +1,35 @@
package mergerefund
import (
"github.com/black1552/lkl_sdk/common"
"github.com/black1552/lkl_sdk/consts"
"github.com/gogf/gf/v2/os/gtime"
)
type MergeRefund struct {
client *common.Client[ResponseMergeRefund]
}
func NewMergeRefund(client *common.Client[ResponseMergeRefund]) *MergeRefund {
return &MergeRefund{
client: client,
}
}
func (t *MergeRefund) MergeRefund(req *RequestDataMergeRefund) (*ResponseMergeRefund, error) {
// 构建BaseModel请求
baseReq := RequestMergeRefund{
ReqTime: gtime.Now().Format("YmdHis"),
Version: "3.0",
ReqData: req,
}
return t.client.DoRequest(consts.BASE_URL+consts.LKL_UNIFIED_RETURN_MERGE_REFUND_URL, baseReq)
}
func (t *MergeRefund) MergeRefundTest(req *RequestDataMergeRefund) (*ResponseMergeRefund, error) {
// 构建BaseModel请求
baseReq := RequestMergeRefund{
ReqTime: gtime.Now().Format("YmdHis"),
Version: "3.0",
ReqData: req,
}
return t.client.DoRequest(consts.BASE_TEST_URL+consts.LKL_UNIFIED_RETURN_MERGE_REFUND_URL, baseReq)
}
+42
View File
@@ -0,0 +1,42 @@
package mergerefund
// RequestMergeRefund 统一退货基础请求结构体
type RequestMergeRefund struct {
ReqTime string `json:"req_time" dc:"ReqTime 请求时间 必填,格式yyyyMMddHHmmss"`
Version string `json:"version" dc:"Version 版本号 必填,固定为\"3\""`
ReqData *RequestDataMergeRefund `json:"req_data" dc:"ReqData 请求参数 必填,具体字段见对应的数据结构体"`
}
// RequestDataMergeRefund 合单退货请求参数结构体
type RequestDataMergeRefund struct {
MerchantNo string `json:"merchant_no" dc:"MerchantNo 商户号 必填,拉卡拉分配的商户号"`
TermNo string `json:"term_no" dc:"TermNo 终端号 必填,拉卡拉分配的终端号"`
OutTradeNo string `json:"out_trade_no" dc:"OutTradeNo 商户请求流水号 必填,商户系统唯一"`
RefundAmount string `json:"refund_amount" dc:"RefundAmount 退款金额 必填,单位分,整数数字型字符"`
RefundReason string `json:"refund_reason,omitempty" dc:"RefundReason 退货原因 可选"`
OriginLogNo string `json:"origin_log_no,omitempty" dc:"OriginLogNo 拉卡拉对账单流水号 可选,正交易返回的拉卡拉对账单流水号"`
OriginOutTradeNo string `json:"origin_out_trade_no,omitempty" dc:"OriginOutTradeNo 原商户交易流水号 可选"`
OriginTradeNo string `json:"origin_trade_no,omitempty" dc:"OriginTradeNo 原交易拉卡拉交易订单号 可选"`
LocationInfo *LocationInfo `json:"location_info" dc:"LocationInfo 地址位置信息 必填"`
NotifyURL string `json:"notify_url,omitempty" dc:"NotifyURL 后台通知地址 可选,交易结果通知地址"`
RefundAccMode string `json:"refund_acc_mode,omitempty" dc:"RefundAccMode 退货账户模式 可选,00退货账户余额 05商户余额 06终端余额"`
RefundSplitInfo []*RelateOutSplitInfo `json:"refund_split_info,omitempty" dc:"RefundSplitInfo 请参合单域 可选"`
}
// LocationInfo 地址位置信息结构体
type LocationInfo struct {
RequestIP string `json:"request_ip" dc:"RequestIP 请求方IP地址 必填,格式如36.45.36.95"`
Location string `json:"location,omitempty" dc:"Location 维度,经度 可选,商户终端的地理位置,格式:纬度,经度,+表示北纬、东经,-表示南纬、西经,精度最长支持小数点后9位"`
BaseStation string `json:"base_station,omitempty" dc:"BaseStation 基站信息 可选,客户端设备的基站信息"`
}
// RelateOutSplitInfo 请求合单域结构体
type RelateOutSplitInfo struct {
OutSubTradeNo string `json:"out_sub_trade_no" dc:"OutSubTradeNo 外部子退款交易流水号 必填,商户子交易退款流水号,商户号下唯一"`
MerchantNo string `json:"merchant_no" dc:"MerchantNo 商户号 必填,拉卡拉分配的商户号"`
TermNo string `json:"term_no" dc:"TermNo 终端号 必填,拉卡拉分配的业务终端号"`
RefundAmount string `json:"refund_amount" dc:"RefundAmount 申请退款金额 必填,单位分,整数型字符"`
OriginOutSubTradeNo string `json:"origin_out_sub_trade_no,omitempty" dc:"OriginOutSubTradeNo 原商户交易流水号 可选,下单时的商户子单请求流水号"`
OriginSubTradeNo string `json:"origin_sub_trade_no,omitempty" dc:"OriginSubTradeNo 原拉卡拉子交易流水号 可选,下单成功时,返回的拉卡拉交易子流水"`
OriginSubLogNo string `json:"origin_sub_log_no,omitempty" dc:"OriginSubLogNo 原对账单子流水号 可选,原交易的tradeNo的后14位,必须是66开头的"`
}
+53
View File
@@ -0,0 +1,53 @@
package mergerefund
// ResponseMergeRefund 统一退货响应结构体
type ResponseMergeRefund struct {
Code string `json:"code" dc:"Code 响应码"`
Msg string `json:"msg" dc:"Msg 响应描述"`
RespTime string `json:"resp_time" dc:"RespTime 响应时间"`
RespData *ResponseDataMergeRefund `json:"resp_data" dc:"RespData 响应数据"`
}
func (r *ResponseMergeRefund) SuccessOrFail() bool {
return r.Code == "000000"
}
// ResponseDataMergeRefund 合单退货响应数据结构体
type ResponseDataMergeRefund struct {
TradeState string `json:"trade_state" dc:"TradeState 交易状态 必填,INIT-初始化;SUCCESS-交易成功;FAIL-交易失败;DEAL-交易处理中/未知;PROCESSING-交易已受理;TIMEOUT-超时未知;EXCEPTION-异常"`
RefundType string `json:"refund_type" dc:"RefundType 退货模式 必填"`
MerchantNo string `json:"merchant_no" dc:"MerchantNo 商户号 必填,拉卡拉分配的商户号"`
OutTradeNo string `json:"out_trade_no" dc:"OutTradeNo 商户请求流水号 必填,请求中的商户请求流水号"`
TradeNo string `json:"trade_no" dc:"TradeNo 拉卡拉交易流水号 必填"`
LogNo string `json:"log_no" dc:"LogNo 拉卡拉对账单流水号 必填,tradeNo的后14位"`
AccTradeNo string `json:"acc_trade_no,omitempty" dc:"AccTradeNo 账户端交易订单号 可选"`
AccountType string `json:"account_type,omitempty" dc:"AccountType 钱包类型 可选,微信:WECHAT;支付宝:ALIPAY;银联:UQRCODEPAY;翼支付:BESTPAY;苏宁易付宝:SUNING"`
TotalAmount string `json:"total_amount" dc:"TotalAmount 交易金额 必填,单位分,整数数字型字符串"`
RefundAmount string `json:"refund_amount" dc:"RefundAmount 申请退款金额 必填,单位分,整数数字型字符串"`
PayerAmount string `json:"payer_amount" dc:"PayerAmount 实际退款金额 必填,单位分,整数数字型字符串"`
TradeTime string `json:"trade_time,omitempty" dc:"TradeTime 退款时间 可选,实际退款时间。yyyyMMddHHmmss"`
OriginLogNo string `json:"origin_log_no,omitempty" dc:"OriginLogNo 原拉卡拉对账单流水号 可选,如果请求中携带,则返回"`
OriginTradeNo string `json:"origin_trade_no,omitempty" dc:"OriginTradeNo 原拉卡拉交易流水号 可选,如果请求中携带,则返回"`
OriginOutTradeNo string `json:"origin_out_trade_no,omitempty" dc:"OriginOutTradeNo 原商户请求流水号 可选,如果请求中携带,则返回"`
UpIssAddnData string `json:"up_iss_addn_data,omitempty" dc:"UpIssAddnData 单品营销附加数据 可选,扫码交易,参与单品营销优惠时返回"`
UpCouponInfo string `json:"up_coupon_info,omitempty" dc:"UpCouponInfo 银联优惠信息 可选,扫码交易,参与单品营销优惠时返回"`
TradeInfo string `json:"trade_info,omitempty" dc:"TradeInfo 出资方信息 可选,扫码交易"`
ChannelRetDesc string `json:"channel_ret_desc" dc:"ChannelRetDesc 返回描述信息 必填"`
RefundSplitInfo []*RelateOutSplitRspInfo `json:"refund_split_info" dc:"RefundSplitInfo 响应合单域 必填"`
}
// RelateOutSplitRspInfo 响应合单域结构体
type RelateOutSplitRspInfo struct {
OutSubTradeNo string `json:"out_sub_trade_no" dc:"OutSubTradeNo 外部子退款交易流水号 必填,请求中的商户子流水号"`
MerchantNo string `json:"merchant_no" dc:"MerchantNo 商户号 必填,拉卡拉分配的商户号"`
TermNo string `json:"term_no" dc:"TermNo 终端号 必填,拉卡拉分配的业务终端号"`
TradeState string `json:"trade_state" dc:"TradeState 交易状态 必填,INIT-初始化;SUCCESS-交易成功;FAIL-交易失败;DEAL-交易处理中/未知;PROCESSING-交易已受理;TIMEOUT-超时未知;EXCEPTION-异常"`
SubTradeNo string `json:"sub_trade_no" dc:"SubTradeNo 拉卡拉子交易流水号 必填"`
SubLogNo string `json:"sub_log_no" dc:"SubLogNo 拉卡拉子对账单流水号 必填"`
RefundAmount string `json:"refund_amount" dc:"RefundAmount 申请退款金额 必填,单位分,整数型字符"`
PayerAmount string `json:"payer_amount" dc:"PayerAmount 实际退款金额 必填,单位分,整数型字符"`
TotalAmount string `json:"total_amount" dc:"TotalAmount 交易金额 必填,单位分,整数型字符"`
OriginSubLogNo string `json:"origin_sub_log_no,omitempty" dc:"OriginSubLogNo 原拉卡拉子对账单流水号 可选,如果请求中携带,则返回"`
OriginSubTradeNo string `json:"origin_sub_trade_no,omitempty" dc:"OriginSubTradeNo 原拉卡拉子交易流水号 可选,如果请求中携带,则返回"`
OriginOutSubTradeNo string `json:"origin_out_sub_trade_no,omitempty" dc:"OriginOutSubTradeNo 原商户子交易流水号 可选,如果请求中携带,则返回"`
}
+40
View File
@@ -0,0 +1,40 @@
package refund
import (
"github.com/black1552/lkl_sdk/common"
"github.com/black1552/lkl_sdk/consts"
"github.com/gogf/gf/v2/os/gtime"
)
// Refund 统一退货API结构体
type Refund struct {
client *common.Client[ResponseRefund]
}
// NewRefund 创建统一退货API实例
func NewRefund(client *common.Client[ResponseRefund]) *Refund {
return &Refund{
client: client,
}
}
// Refund 发起统一退货请求
// request: 统一退货请求参数
// 返回统一退货响应结果和错误信息
func (api *Refund) Refund(req *RequestDataRefund) (*ResponseRefund, error) {
// 构建请求参数
url := consts.BASE_URL + consts.LKL_UNIFIED_RETURN_REFUND_URL
// 构建BaseModel请求
baseReq := RequestRefund{
ReqTime: gtime.Now().Format("YmdHis"),
Version: "3.0",
ReqData: req,
}
// 发送请求
respBody, err := api.client.DoRequest(url, baseReq)
if err != nil {
return nil, err
}
return respBody, nil
}
+37
View File
@@ -0,0 +1,37 @@
package refund
// ResponseRefund 统一退货响应结构体
// 参考文档:https://o.lakala.com/#/home/document/detail?id=892
type ResponseRefund struct {
Code string `json:"code" dc:"Code 返回业务代码 必填,通讯成功返回码:000000;交易未知:RFD11105/RFD11112;其他返回码可视为失败"`
Msg string `json:"msg" dc:"Msg 返回业务代码描述 必填,如\"成功\""`
RespTime string `json:"resp_time" dc:"RespTime 响应时间 必填,格式yyyyMMddHHmmss"`
RespData *ResponseDataRefund `json:"resp_data" dc:"RespData 响应数据 必填,具体字段根据接口返回"`
}
func (r *ResponseRefund) SuccessOrFail() bool {
return r.Code == "000000"
}
// ResponseDataRefund 统一退货响应数据结构体
type ResponseDataRefund struct {
TradeState string `json:"trade_state" dc:"TradeState 交易状态 必填,INIT-初始化;SUCCESS-交易成功;FAIL-交易失败;DEAL-交易处理中/未知;PROCESSING-交易已受理;TIMEOUT-超时未知;EXCEPTION-异常"`
RefundType string `json:"refund_type" dc:"RefundType 退货模式 必填"`
MerchantNo string `json:"merchant_no" dc:"MerchantNo 商户号 必填,拉卡拉分配的商户号"`
OutTradeNo string `json:"out_trade_no" dc:"OutTradeNo 商户请求流水号 必填,请求中的商户请求流水号"`
TradeNo string `json:"trade_no" dc:"TradeNo 拉卡拉交易流水号 必填"`
LogNo string `json:"log_no" dc:"LogNo 拉卡拉对账单流水号 必填,tradeNo的后14位"`
AccTradeNo string `json:"acc_trade_no,omitempty" dc:"AccTradeNo 账户端交易订单号 可选"`
AccountType string `json:"account_type,omitempty" dc:"AccountType 钱包类型 可选,微信:WECHAT;支付宝:ALIPAY;银联:UQRCODEPAY;翼支付:BESTPAY;苏宁易付宝:SUNING"`
TotalAmount string `json:"total_amount" dc:"TotalAmount 交易金额 必填,单位分,整数数字型字符串"`
RefundAmount string `json:"refund_amount" dc:"RefundAmount 申请退款金额 必填,单位分,整数数字型字符串"`
PayerAmount string `json:"payer_amount" dc:"PayerAmount 实际退款金额 必填,单位分,整数数字型字符串"`
TradeTime string `json:"trade_time,omitempty" dc:"TradeTime 退款时间 可选,实际退款时间。yyyyMMddHHmmss"`
OriginLogNo string `json:"origin_log_no,omitempty" dc:"OriginLogNo 原拉卡拉对账单流水号 可选,如果请求中携带,则返回"`
OriginTradeNo string `json:"origin_trade_no,omitempty" dc:"OriginTradeNo 原拉卡拉交易流水号 可选,如果请求中携带,则返回"`
OriginOutTradeNo string `json:"origin_out_trade_no,omitempty" dc:"OriginOutTradeNo 原商户请求流水号 可选,如果请求中携带,则返回"`
UpIssAddData string `json:"up_iss_add_data,omitempty" dc:"UpIssAddData 单品营销附加数据 可选,扫码交易,参与单品营销优惠时返回"`
UpCouponInfo string `json:"up_coupon_info,omitempty" dc:"UpCouponInfo 银联优惠信息 可选,扫码交易,参与单品营销优惠时返回"`
TradeInfo string `json:"trade_info,omitempty" dc:"TradeInfo 出资方信息 可选,扫码交易"`
ChannelRetDesc string `json:"channel_ret_desc" dc:"ChannelRetDesc 返回描述信息 必填"`
}
+34
View File
@@ -0,0 +1,34 @@
package refund
// RequestRefund 统一退货基础请求结构体
// 参考文档:https://o.lakala.com/#/home/document/detail?id=894
type RequestRefund struct {
ReqTime string `json:"req_time"`
Version string `json:"version"`
ReqData *RequestDataRefund `json:"req_data"`
}
// RequestDataRefund 统一退货请求数据结构体
// 注意:origin_out_trade_no、origin_log_no、origin_trade_no至少一个必填(调用收银台下单接口拉起交易后发起退款时至少要传两个)
// 优先级顺序:origin_trade_no > origin_log_no > origin_out_trade_no
type RequestDataRefund struct {
MerchantNo string `json:"merchant_no"` // merchant_no: 商户号 (必填,拉卡拉分配的商户号,String(15))
TermNo string `json:"term_no"` // term_no: 终端号 (必填,拉卡拉分配的终端号,String(8))
OutTradeNo string `json:"out_trade_no"` // out_trade_no: 商户请求流水号 (必填,商户系统唯一,String(32))
RefundAmount string `json:"refund_amount"` // refund_amount: 退款金额 (必填,单位分,整数数字型字符,String(12))
RefundReason string `json:"refund_reason,omitempty"` // refund_reason: 退货原因 (可选,String(32))
OriginLogNo string `json:"origin_log_no,omitempty"` // origin_log_no: 拉卡拉对账单流水号 (可选,正交易返回的拉卡拉对账单流水号,String(14))
OriginOutTradeNo string `json:"origin_out_trade_no,omitempty"` // origin_out_trade_no: 原商户交易流水号 (可选,String(32))
OriginTradeNo string `json:"origin_trade_no,omitempty"` // origin_trade_no: 原交易拉卡拉交易订单号 (可选,String(32))
LocationInfo *LocationInfo `json:"location_info"` // location_info: 地址位置信息 (必填)
RefundAccMode string `json:"refund_acc_mode,omitempty"` // refund_acc_mode: 退货账户模式 (可选,00退货账户余额 05商户余额 06终端余额 30终点账户,String(2))
NotifyURL string `json:"notify_url,omitempty"` // notify_url: 后台通知地址 (可选,交易结果通知地址,String(128))
RefundAmtSts string `json:"refund_amt_sts,omitempty"` // refund_amt_sts: 退货资金状态 (可选,00 分账前,01 分账后;分账交易部分退货的情况,需要前端上送交易的分账状态,String(2))
}
// LocationInfo 地址位置信息结构体
type LocationInfo struct {
RequestIP string `json:"request_ip"` // request_ip: 请求IP (必填)
Location string `json:"location"` // location: 位置信息 (必填,如经纬度等)
BaseStation string `json:"base_station,omitempty"` // base_station: 基站信息 (可选)
}
+1
View File
@@ -0,0 +1 @@
package refundfee
+1
View File
@@ -0,0 +1 @@
package refundfee
+1
View File
@@ -0,0 +1 @@
package refundfee
+30
View File
@@ -0,0 +1,30 @@
package refundquery
import (
"github.com/black1552/lkl_sdk/common"
"github.com/black1552/lkl_sdk/consts"
"github.com/gogf/gf/v2/os/gtime"
)
type RefundQuery struct {
client *common.Client[ResponseRefundQuery]
}
// NewRefundQuery 创建统一退货查询API实例
func NewRefundQuery(client *common.Client[ResponseRefundQuery]) *RefundQuery {
return &RefundQuery{
client: client,
}
}
// RefundQuery 发起统一退货查询请求
func (api *RefundQuery) RefundQuery(req *RequestDataRefundQuery) (*ResponseRefundQuery, error) {
// 构建BaseModel请求
baseReq := RequestRefundQuery{
ReqTime: gtime.Now().Format("YmdHis"),
Version: "3.0",
ReqData: req,
}
return api.client.DoRequest(consts.BASE_URL+consts.LKL_UNIFIED_RETURN_REFUND_QUERY_URL, baseReq)
}
+18
View File
@@ -0,0 +1,18 @@
package refundquery
// RequestRefundQuery 统一退货查询请求结构体
// API文档: https://o.lakala.com/#/home/document/detail?id=893
type RequestRefundQuery struct {
ReqTime string `json:"req_time" dc:"ReqTime 请求时间 格式yyyyMMddHHmmss"`
Version string `json:"version" dc:"Version 版本号 固定值3.0"`
ReqData *RequestDataRefundQuery `json:"req_data" dc:"ReqData 请求数据"`
}
// RequestDataRefundQuery 统一退货查询请求数据结构体
// API文档: https://o.lakala.com/#/home/document/detail?id=893
type RequestDataRefundQuery struct {
MerchantNo string `json:"merchant_no" dc:"MerchantNo 商户号 必填,拉卡拉分配的商户号,String(15)"`
TermNo string `json:"term_no" dc:"TermNo 终端号 必填,拉卡拉分配的业务终端号,String(8)"`
OutTradeNo string `json:"out_trade_no,omitempty" dc:"OutTradeNo 商户交易流水号 选填,下单时的商户请求流水号,String(32) 与拉卡拉交易流水号二选一"`
TradeNo string `json:"trade_no,omitempty" dc:"TradeNo 拉卡拉交易流水号 选填,拉卡拉交易流水号,String(32) 与商户交易流水号二选一"`
}
+56
View File
@@ -0,0 +1,56 @@
package refundquery
// ResponseRefundQuery 统一退货查询响应结构体
// API文档: https://o.lakala.com/#/home/document/detail?id=893
type ResponseRefundQuery struct {
Code string `json:"code" dc:"Code 响应码 RFD00000#成功、RFD11112#网络请求超时"`
Msg string `json:"msg" dc:"Msg 响应描述"`
Data *ResponseDataRefundQuery `json:"data,omitempty" dc:"Data 响应数据"`
Sign string `json:"sign" dc:"Sign 签名"`
}
// ResponseDataRefundQuery 统一退货查询响应数据结构体
// API文档: https://o.lakala.com/#/home/document/detail?id=893
type ResponseDataRefundQuery struct {
OutTradeNo string `json:"out_trade_no" dc:"OutTradeNo 商户请求流水号 必填,原退款交易商户请求流水号(扫码交易返回)"`
TradeTime string `json:"trade_time" dc:"TradeTime 交易时间 必填,交易时间yyyyMMddHHmmss"`
TradeState string `json:"trade_state" dc:"TradeState 交易状态 必填,INIT-初始化;SUCCESS-交易成功;FAIL-交易失败;DEAL-交易处理中/未知;TIMEOUT-超时未知;EXCEPTION-异常"`
TradeNo string `json:"trade_no" dc:"TradeNo 拉卡拉商户订单号 必填,拉卡拉生成的交易流水"`
LogNo string `json:"log_no" dc:"LogNo 拉卡拉对账单流水号 必填,拉卡拉生成的对账单流水号(新增)"`
AccTradeNo string `json:"acc_trade_no,omitempty" dc:"AccTradeNo 账户端交易订单号 选填,账户端交易流水号,String(32)"`
RefundAmount string `json:"refund_amount" dc:"RefundAmount 交易金额 必填"`
PayMode string `json:"pay_mode,omitempty" dc:"PayMode 支付方式 选填,00 借记卡 01 贷记卡 02 准贷记卡 银行卡交易返回"`
CrdNo string `json:"crd_no,omitempty" dc:"CrdNo 卡号 选填,脱敏卡号,前六后四,中间用*替换"`
AccountType string `json:"account_type,omitempty" dc:"AccountType 钱包类型 选填,微信:WECHAT 支付宝:ALIPAY 银联:UNION 翼支付: BESTPAY 苏宁易付宝: SUNING 扫码交易返回"`
PayerAmount string `json:"payer_amount,omitempty" dc:"PayerAmount 付款人实付金额 选填,实际退款金额,单位分 扫码交易返回"`
AccSettleAmount string `json:"acc_settle_amount,omitempty" dc:"AccSettleAmount 账户端结算金额 选填,账户端应结订单金额,单位分 扫码交易返回"`
AccMdiscountAmount string `json:"acc_mdiscount_amount,omitempty" dc:"AccMdiscountAmount 商户侧优惠金额(账户端) 选填,商户优惠金额,单位分 扫码交易返回"`
AccDiscountAmount string `json:"acc_discount_amount,omitempty" dc:"AccDiscountAmount 账户端优惠金额 选填,拉卡拉优惠金额, 扫码交易返回"`
ChannelRetDesc string `json:"channel_ret_desc" dc:"ChannelRetDesc 返回描述信息 必填,code#msg:RFD00000#成功、RFD11112#网络请求超时"`
RefundSplitInfo []*RelateOutSplitRspInfo `json:"refund_split_info,omitempty" dc:"RefundSplitInfo 退款拆单信息 选填,合单交易退款查询时返回"`
OriginLogNo string `json:"origin_log_no" dc:"OriginLogNo 拉卡拉对账单流水号 必填,原交易拉卡拉对账单流水号"`
OriginOutTradeNo string `json:"origin_out_trade_no" dc:"OriginOutTradeNo 原商户交易流水号 必填"`
OriginTradeNo string `json:"origin_trade_no" dc:"OriginTradeNo 原交易拉卡拉交易订单号 必填"`
OriginTotalAmount string `json:"origin_total_amount" dc:"OriginTotalAmount 原交易金额 必填,原正交易订单金额"`
RefundType string `json:"refund_type,omitempty" dc:"RefundType 退货模式 选填"`
}
// RelateOutSplitRspInfo 退款拆单信息结构体
// API文档: https://o.lakala.com/#/home/document/detail?id=893
type RelateOutSplitRspInfo struct {
OutSubTradeNo string `json:"out_sub_trade_no" dc:"OutSubTradeNo 外部子退款交易流水号 必填,商户子交易流水号,商户号下唯一"`
MerchantNo string `json:"merchant_no" dc:"MerchantNo 商户号 必填,拉卡拉分配的商户号"`
TermNo string `json:"term_no" dc:"TermNo 终端号 必填,拉卡拉分配的业务终端号"`
RefundAmount string `json:"refund_amount" dc:"RefundAmount 申请退款金额 必填,单位分,整数型字符"`
SubTradeNo string `json:"sub_trade_no,omitempty" dc:"SubTradeNo 拉卡拉子交易流水号 选填"`
SubLogNo string `json:"sub_log_no,omitempty" dc:"SubLogNo 对账单子流水号 选填,sub_trade_no后14位"`
TradeState string `json:"trade_state,omitempty" dc:"TradeState 子交易状态 选填,SUCCESS-交易成功 FAIL-交易失败"`
ResultCode string `json:"result_code,omitempty" dc:"ResultCode 处理结果码 选填"`
ResultMsg string `json:"result_msg,omitempty" dc:"ResultMsg 处理描述 选填"`
}
// SuccessOrFail 判断交易是否成功
// 返回true表示交易成功,false表示交易失败或处理中
func (r *ResponseRefundQuery) SuccessOrFail() bool {
return r.Code == "000000"
}
+25
View File
@@ -0,0 +1,25 @@
package unifiedreturn
import (
"context"
"github.com/black1552/lkl_sdk/common"
mergeRefund "github.com/black1552/lkl_sdk/unifiedReturn/mergeRefund"
"github.com/black1552/lkl_sdk/unifiedReturn/refund"
"github.com/black1552/lkl_sdk/unifiedReturn/refundquery"
)
type Server struct {
MergeRefound *mergeRefund.MergeRefund
Refound *refund.Refund
RefoundQuery *refundquery.RefundQuery
}
// NewServer 创建拉卡拉统一退货服务实例
func NewServer(ctx context.Context, cfgJson string) *Server {
return &Server{
MergeRefound: mergeRefund.NewMergeRefund(common.NewClient[mergeRefund.ResponseMergeRefund](ctx, cfgJson)),
Refound: refund.NewRefund(common.NewClient[refund.ResponseRefund](ctx, cfgJson)),
RefoundQuery: refundquery.NewRefundQuery(common.NewClient[refundquery.ResponseRefundQuery](ctx, cfgJson)),
}
}