这是一个通用go语言的拉卡拉SDK,提供了分账、交易、账户等功能的API接口封装,方便开发者快速集成拉卡拉支付服务。
Go to file
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
.idea first commit 2025-10-09 15:56:47 +08:00
consts 引入账户相关常量和类型定义 2025-10-10 14:47:25 +08:00
lklsdk fix(trade):修复查询请求中的应用ID字段 2025-10-09 17:06:52 +08:00
model 引入账户相关常量和类型定义 2025-10-10 14:47:25 +08:00
README.md first commitrefactor(lklsdk):重构SDK配置和初始化方式 2025-10-09 16:48:08 +08:00
go.mod first commit 2025-10-09 15:56:47 +08:00
go.sum first commit 2025-10-09 15:56:47 +08:00

README.md

拉卡拉SDK

这是一个通用的拉卡拉SDK提供了分账、交易、账户等功能的API接口封装方便开发者快速集成拉卡拉支付服务。

目录结构

lklsdk/
├── client.go     # 核心客户端
├── split_ledger.go     # 分账基本功能
├── split_ledger_more.go # 分账扩展功能
├── trade.go      # 交易相关功能
├── account.go    # 账户相关功能
├── merge_pre.go  # 主扫合单交易功能
└── sdk.go        # SDK主入口

安装

# 将SDK引入到您的项目中
go get -u github.com/black1552/lkl_sdk

快速开始

初始化SDK

import (
	"github.com/black1552/lkl_sdk/lklsdk"
	"github.com/black1552/lkl_sdk/model"
	"github.com/gogf/gf/v2/os/gctx"
)

// 创建配置JSON字符串
cfgJson := `{
	"public_key": "your_public_key",        // 公钥字符串
	"private_key": "your_private_key",      // 私钥字符串
	"app_id": "your_app_id",                // lakala应用ID
	"serial_no": "your_serial_no",          // 序列号
	"sub_app_id": "your_sub_app_id",        // 子应用ID 微信AppId
	"version": "3.0",                       // lakala版本号
	"account_type": "WECHAT",               // 账户类型
	"trans_type": "71",                     // 交易类型
	"notify_url": "your_notify_url"         // 回调地址
}`

// 初始化SDK使用泛型指定响应类型
sdk := lklsdk.NewSDK[model.ResponseType](gctx.New(), cfgJson)

功能模块

1. 主扫合单交易

// 初始化特定响应类型的SDK
sdk := lklsdk.NewSDK[model.MergePreorderResponse](gctx.New(), cfgJson)

// 准备拆单信息
outSplitInfo := []*model.OutSplitInfo{
	{
		OutSubTradeNo: "子交易流水号1",
		MerchantNo:    config.MerchantNo,
		TermNo:        config.TermNo,
		Amount:        "100", // 1元
	},
	{
		OutSubTradeNo: "子交易流水号2",
		MerchantNo:    config.MerchantNo,
		TermNo:        config.TermNo,
		Amount:        "200", // 2元
	},
}

// 构建位置信息
locationInfo := &model.LocationInfo{
	RequestIp: "127.0.0.1",
}

// 构建请求参数
mergePreorderReq := &model.MergePreorderReqData{
	MerchantNo:   config.MerchantNo,
	TermNo:       config.TermNo,
	OutTradeNo:   "商户交易流水号",
	OutSplitInfo: outSplitInfo,
	AccountType:  "WECHAT",
	TransType:    "71",
	TotalAmount:  "300", // 3元
	LocationInfo: locationInfo,
	Subject:      "测试订单",
	NotifyUrl:    "https://your-notify-url.com",
}

// 调用接口
mergePreorderResp, err := sdk.MergePreOrder(mergePreorderReq)
if err != nil {
	log.Printf("主扫合单交易失败: %v\n", err)
}

// 使用SuccessOrFail方法判断请求是否成功
if !mergePreorderResp.SuccessOrFail() {
	log.Printf("主扫合单交易失败: %s\n", mergePreorderResp.Msg)
}

2. 商户分账业务开通申请

// 初始化特定响应类型的SDK
sdk := lklsdk.NewSDK[model.ApplyLedgerMerResponse](gctx.New(), cfgJson)

// 构建请求参数
applyLedgerReq := &model.ApplyLedgerMerReqData{
	Version:              "1.0",
	OrderNo:              "12345678901234567890123456789012", // 32位订单号
	OrgCode:              "123456789012",                      // 机构代码
	MerInnerNo:           "1234567821",                        // 拉卡拉内部商户号
	MerCupNo:             "",                                  // 银联商户号(与内部商户号二选一)
	ContactMobile:        "13311111111",                       // 联系手机号
	SplitLowestRatio:     3.51,                                 // 最低分账比例
	SplitEntrustFileName: "授权委托书.pdf",                     // 授权委托书文件名
	SplitEntrustFilePath: "path",                              // 授权委托书文件路径
	SplitRange:           "ALL",                               // 分账范围ALL全部交易分账MARK标记交易分账
	RetUrl:               "notifyUrl.com",                     // 回调URL
}

// 调用接口
expectResp, err := sdk.ApplyLedgerMer(applyLedgerReq)
if err != nil {
	log.Printf("商户分账业务开通申请失败: %v\n", err)
}

// 使用SuccessOrFail方法判断请求是否成功
if !expectResp.SuccessOrFail() {
	log.Printf("商户分账业务开通申请失败: %s\n", expectResp.RetMsg)
}

3. 交易查询

// 初始化特定响应类型的SDK
sdk := lklsdk.NewSDK[model.TradeQueryResponse](gctx.New(), cfgJson)

// 构建请求参数
tradeQueryReq := &model.TradeQueryReqData{
	MerchantNo: config.MerchantNo,
	TermNo:     config.TermNo,
	OutTradeNo: "商户订单号", // 替换为实际的商户订单号
}

// 调用接口
tradeQueryResp, err := sdk.TradeQuery(tradeQueryReq)
if err != nil {
	log.Printf("交易查询失败: %v\n", err)
}

// 使用SuccessOrFail方法判断请求是否成功
if !tradeQueryResp.SuccessOrFail() {
	log.Printf("交易查询失败: %s\n", tradeQueryResp.Msg)
}

4. 订单分账

// 初始化特定响应类型的SDK
sdk := lklsdk.NewSDK[model.OrderSplitLedgerResponse](gctx.New(), cfgJson)

// 准备分账接收方数据
var recvDatas []*model.OrderSplitLedgerRecvDatas
// 可以向recvDatas数组中添加分账接收方信息

// 构建请求参数
splitLedgerReq := &model.OrderSplitLedgerReqData{
	MerchantNo:    config.MerchantNo,
	LogDate:       "",              // 交易日期格式为yyyyMMdd
	LogNo:         "",              // 拉卡拉对账单流水号
	OutSeparateNo: "",              // 商户分账指令流水号
	TotalAmt:      "",              // 分账总金额,单位为分
	LklOrgNo:      "",              // 拉卡拉机构编号
	CalType:       "",              // 分账计算类型0-按金额1-按比例)
	NotifyUrl:     "",              // 回调地址
	RecvDatas:     recvDatas,        // 分账接收方数据
}

// 调用接口
splitLedgerResp, err := sdk.OrderSplitLedger(splitLedgerReq)
if err != nil {
	log.Printf("订单分账失败: %v\n", err)
}

// 使用SuccessOrFail方法判断请求是否成功
if !splitLedgerResp.SuccessOrFail() {
	log.Printf("订单分账失败: %s\n", splitLedgerResp.Msg)
}

5. 退款

// 初始化特定响应类型的SDK
sdk := lklsdk.NewSDK[model.RefundResponse](gctx.New(), cfgJson)

// 构建请求参数
refundReq := &model.RefundReqData{
	MerchantNo: "your_merchant_no",  // 商户号
	TermNo:     "your_term_no",      // 终端号
	OutTradeNo: "original_out_trade_no", // 原商户交易流水号
	OutRefundNo: "your_refund_out_trade_no", // 退款商户流水号
	RefundAmount: "100",  // 退款金额,单位为分
	TotalAmount: "100",   // 原交易总金额,单位为分
	RefundReason: "退款原因", // 退款原因
	NotifyUrl: "https://your-notify-url.com", // 回调地址
}

// 调用接口
refundResp, err := sdk.Refound(refundReq)
if err != nil {
	log.Printf("退款失败: %v\n", err)
}

// 使用SuccessOrFail方法判断请求是否成功
if !refundResp.SuccessOrFail() {
	log.Printf("退款失败: %s\n", refundResp.Msg)
}

// 处理成功响应
// 可以从refundResp.RespData中获取退款结果数据

6. 账户余额查询

// 初始化特定响应类型的SDK
sdk := lklsdk.NewSDK[model.BalanceQueryResponse](gctx.New(), cfgJson)

// 构建请求参数
balanceQueryReq := &model.BalanceQueryReqData{
	MerchantNo: config.MerchantNo,
	OrgNo:      "",    // 机构号
	PayNo:      "",    // 支付单号
	PayType:    "",    // 支付类型
	MgtFlag:    "",    // 管理标志
}

// 调用接口
balanceQueryResp, err := sdk.BalanceQuery(balanceQueryReq)
if err != nil {
	log.Printf("账户余额查询失败: %v\n", err)
}

// 使用SuccessOrFail方法判断请求是否成功
if !balanceQueryResp.SuccessOrFail() {
	log.Printf("账户余额查询失败: %s\n", balanceQueryResp.Msg)
}

错误处理

SDK使用两层错误处理机制请确保同时检查网络错误和业务响应状态

// 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、商户号、密钥等敏感信息
  2. 确保网络环境稳定,避免请求超时
  3. 建议添加请求重试机制,处理网络波动
  4. 请遵循拉卡拉的接口规范,不要频繁调用接口
  5. 如遇到问题,请参考拉卡拉官方文档或联系技术支持