From 7974b4d570b8e5f8f5a4f8b802d90fe3049028a5 Mon Sep 17 00:00:00 2001 From: maguodong Date: Sat, 11 Oct 2025 10:25:41 +0800 Subject: [PATCH] =?UTF-8?q?feat(account):=20=E6=96=B0=E5=A2=9E=E8=B4=A6?= =?UTF-8?q?=E6=88=B7=E7=AE=A1=E7=90=86=E6=A0=87=E5=BF=97=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 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 文件 - 在示例代码中增加对支付类型、管理标志等字段的具体常量引用 --- README.md | 310 ++++++++++++++++++++++++++++++++++++++++-- consts/account.go | 7 + go.mod | 1 + model/balanceQuery.go | 2 +- 4 files changed, 310 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index c85de07..bad7c02 100644 --- a/README.md +++ b/README.md @@ -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、商户号、密钥等敏感信息 diff --git a/consts/account.go b/consts/account.go index b6eb116..5c8154a 100644 --- a/consts/account.go +++ b/consts/account.go @@ -27,6 +27,13 @@ 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 ( diff --git a/go.mod b/go.mod index f5fe5c9..18da409 100644 --- a/go.mod +++ b/go.mod @@ -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 diff --git a/model/balanceQuery.go b/model/balanceQuery.go index 3b320d3..26876b8 100644 --- a/model/balanceQuery.go +++ b/model/balanceQuery.go @@ -27,7 +27,7 @@ type BalanceQueryReqData struct { // 账号类型(01:收款账户,02:付款账户,03:分账商户账户,04:分账接收方账户,05:充值代付账户,06:结算代付账户)-未上送则默认01,非必传,最大长度32 PayType consts.PayType `json:"pay_type"` // 账户标志(01:一般账户;03:虚户)-未上送则默认01,非必传,最大长度32 - MgtFlag string `json:"mgt_flag"` + MgtFlag consts.MgtFlag `json:"mgt_flag"` } // BalanceQueryResponse 余额查询响应结构体