diff --git a/plugins/alipay_cpn/internal/alipay_cpn.go b/plugins/alipay_cpn/internal/alipay_cpn.go index 663c773..1412a7a 100644 --- a/plugins/alipay_cpn/internal/alipay_cpn.go +++ b/plugins/alipay_cpn/internal/alipay_cpn.go @@ -7,7 +7,7 @@ import ( "gitea.cdlsxd.cn/sdk/plugin/proto" "github.com/carlmjohnson/requests" "plugins/alipay_cpn/internal/po" - "plugins/utils" + "plugins/utils/helper" ) // 插件通信信息,若不对应则会报错panic @@ -49,7 +49,7 @@ func (s *AlipayCpnService) Order(ctx context.Context, request *proto.OrderReques err = requests.URL(baseUri).Post().BodyForm(uv).ToString(&sp).Fetch(ctx) var response *po.OrderResp - sp = utils.ToChinese(sp) + sp = helper.ToChinese(sp) if err = json.Unmarshal([]byte(sp), &response); err != nil { return nil, fmt.Errorf("请求异常,msg:" + err.Error()) } @@ -82,7 +82,7 @@ func (s *AlipayCpnService) Query(ctx context.Context, request *proto.QueryReques } var response po.QueryResp - sp = utils.ToChinese(sp) + sp = helper.ToChinese(sp) if err = json.Unmarshal([]byte(sp), &response); err != nil { return nil, fmt.Errorf("请求异常,msg:" + err.Error()) } diff --git a/plugins/alipay_redpack/internal/alipay_redpack.go b/plugins/alipay_redpack/internal/alipay_redpack.go index 5ea06a0..1edec3c 100644 --- a/plugins/alipay_redpack/internal/alipay_redpack.go +++ b/plugins/alipay_redpack/internal/alipay_redpack.go @@ -7,8 +7,8 @@ import ( "gitea.cdlsxd.cn/sdk/plugin/proto" "github.com/carlmjohnson/requests" "plugins/alipay_redpack/internal/po" - "plugins/utils" "plugins/utils/alipay" + "plugins/utils/helper" ) // 插件通信信息,若不对应则会报错panic @@ -51,7 +51,7 @@ func (s *AlipayRedPackService) Order(ctx context.Context, request *proto.OrderRe err = requests.URL(baseUri).Post().BodyForm(uv).ToString(&sp).Fetch(ctx) var response *po.OrderResp - sp = utils.ToChinese(sp) + sp = helper.ToChinese(sp) if err = json.Unmarshal([]byte(sp), &response); err != nil { return nil, fmt.Errorf("请求异常,msg:" + err.Error()) } @@ -84,7 +84,7 @@ func (s *AlipayRedPackService) Query(ctx context.Context, request *proto.QueryRe } var response po.QueryResp - sp = utils.ToChinese(sp) + sp = helper.ToChinese(sp) if err = json.Unmarshal([]byte(sp), &response); err != nil { return nil, fmt.Errorf("请求异常,msg:" + err.Error()) } diff --git a/plugins/union_pay_cpn/internal/vo/sub_code.go b/plugins/union_pay_cpn/internal/vo/sub_code.go index c2f40f7..a207d7b 100644 --- a/plugins/union_pay_cpn/internal/vo/sub_code.go +++ b/plugins/union_pay_cpn/internal/vo/sub_code.go @@ -1,8 +1,25 @@ package vo +// SubCode @link https://docs.qq.com/doc/DTU5mdGJ2b0xndXNJ +// @link https://open.unionpay.com/tjweb/api/interface?apiSvcId=3161&id=19701 type SubCode string const ( + SubCodeUP07006 SubCode = "UP07006" + SubCodeUP07007 SubCode = "UP07007" + SubCodeUP07008 SubCode = "UP07008" + SubCodeUP07009 SubCode = "UP07009" + SubCodeUP07011 SubCode = "UP07011" + SubCodeUP07016 SubCode = "UP07016" + SubCodeUP07017 SubCode = "UP07017" + SubCodeUP07018 SubCode = "UP07018" + SubCodeUP07019 SubCode = "UP07019" + SubCodeUP07021 SubCode = "UP07021" + SubCodeUP07097 SubCode = "UP07097" + SubCodeUP07098 SubCode = "UP07098" + SubCodeUP07099 SubCode = "UP07099" + SubCodeUP07400 SubCode = "UP07400" + SubCodeUp02094 SubCode = "UP02094" SubCodeUp02099 SubCode = "UP02099" SubCodeUp06003 SubCode = "UP06003" @@ -49,9 +66,38 @@ const ( SubCodeUp00080 SubCode = "UP00080" SubCodeUp02025 SubCode = "UP02025" SubCodeUp02071 SubCode = "UP02071" + + SubCodeUP07600 SubCode = "UP07600" + SubCodeUP07601 SubCode = "UP07601" + SubCodeUP07602 SubCode = "UP07602" + SubCodeUP07603 SubCode = "UP07603" + SubCodeUP07604 SubCode = "UP07604" + SubCodeUP07605 SubCode = "UP07605" + SubCodeUP07606 SubCode = "UP07606" + SubCodeUP07607 SubCode = "UP07607" + SubCodeUP07608 SubCode = "UP07608" + SubCodeUP07609 SubCode = "UP07609" + SubCodeUP07610 SubCode = "UP07610" + SubCodeUP07611 SubCode = "UP07611" + SubCodeUP07612 SubCode = "UP07612" ) var codeMsg = map[SubCode]string{ + SubCodeUP07006: "积分撤销业务异常", + SubCodeUP07007: "积分退货业务异常", + SubCodeUP07008: "积分调账业务异常", + SubCodeUP07009: "积分归并业务异常", + SubCodeUP07011: "调用外部系统服务异常", + SubCodeUP07016: "积分赠送调用封顶规则失败", + SubCodeUP07017: "调用热点账户动账失败", + SubCodeUP07018: "幂等校验异常", + SubCodeUP07019: "账户校验异常", + SubCodeUP07021: "积分消费撤销业务异常", + SubCodeUP07097: "积分业务系统熔断", + SubCodeUP07098: "积分业务系统限流", + SubCodeUP07099: "系统异常", + SubCodeUP07400: "积分查询为空", + SubCodeUp02094: "交易重复", SubCodeUp02099: "交易单品信息无效", SubCodeUp06003: "线上折扣活动不存在", @@ -98,6 +144,20 @@ var codeMsg = map[SubCode]string{ SubCodeUp00080: "线上折扣系统内部错误", SubCodeUp02025: "原交易不存在", SubCodeUp02071: "交易无效", + + SubCodeUP07600: "调用规则查询积分信息异常/积分ID不存在", + SubCodeUP07601: "调用账户系统查询异常", + SubCodeUP07602: "调用账户系统动账异常", + SubCodeUP07603: "调用账户系统冲账异常", + SubCodeUP07604: "调用热点账户系统异常", + SubCodeUP07605: "调用统一用户系统异常", + SubCodeUP07606: "调用热点账户系统异常", + SubCodeUP07607: "触发用户规则", + SubCodeUP07608: "原交易不存在", + SubCodeUP07609: "接入方余额不足", + SubCodeUP07610: "接入方关联积分Id不匹配", + SubCodeUP07611: "用统一用户-用户红包开关权限未开启", + SubCodeUP07612: "用统一用户-调用商户权限异常", } func (code SubCode) GetMsg() string { diff --git a/plugins/union_pay_redpack/internal/union_pay_redpack.go b/plugins/union_pay_redpack/internal/union_pay_redpack.go index 29a08a6..8fa3ab3 100644 --- a/plugins/union_pay_redpack/internal/union_pay_redpack.go +++ b/plugins/union_pay_redpack/internal/union_pay_redpack.go @@ -45,8 +45,7 @@ func (p *UnionPayCpnService) Order(ctx context.Context, request *proto.OrderRequ return nil, err } var response po.OrderResp - url := fmt.Sprintf("%s%s", baseUri, orderMethod) - err = requests.URL(url).Headers(headers(c, uv, orderBizMethod)).BodyJSON(uv).ToJSON(&response).Fetch(ctx) + err = requests.URL(baseUri + orderMethod).Headers(headers(c, uv, orderBizMethod)).Post().BodyJSON(uv).ToJSON(&response).Fetch(ctx) if err != nil { return nil, fmt.Errorf("请求异常,msg:" + err.Error()) } @@ -67,11 +66,10 @@ func (p *UnionPayCpnService) Query(ctx context.Context, request *proto.QueryRequ return nil, err } var response po.QueryResp - url := fmt.Sprintf("%s%s", baseUri, queryMethod) h := new(http.Client) h.Timeout = 20 * time.Second - err = requests.URL(url).Client(h).Headers(headers(c, uv, queryBizMethod)).BodyJSON(uv).ToJSON(&response).Fetch(ctx) + err = requests.URL(baseUri + queryMethod).Client(h).Headers(headers(c, uv, queryBizMethod)).BodyJSON(uv).ToJSON(&response).Fetch(ctx) if err != nil { return nil, fmt.Errorf("请求异常,msg:" + err.Error()) } diff --git a/plugins/union_pay_redpack/internal/union_pay_redpack_test.go b/plugins/union_pay_redpack/internal/union_pay_redpack_test.go index 449ef4c..2768478 100644 --- a/plugins/union_pay_redpack/internal/union_pay_redpack_test.go +++ b/plugins/union_pay_redpack/internal/union_pay_redpack_test.go @@ -39,11 +39,11 @@ func TestOrder(t *testing.T) { request := &proto.OrderRequest{ Config: config(), Order: &proto.OrderRequest_Order{ - OrderNo: "240403164049635931", - Account: "18666173766", + OrderNo: "202409141047181834200102", + Account: "18512869479", Quantity: 1, Amount: 1, - Extra: []byte(`{"transDtTm":"20230710165534","validEndDtTm":"20230710165535","transDigest":"测试红包"}`), + Extra: []byte(`{"transDtTm":"20240914151102","validEndDtTm":"20241031235959","transDigest":"测试红包"}`), }, Product: &proto.OrderRequest_Product{ ProductNo: "", diff --git a/plugins/union_pay_redpack/internal/vo/sub_code.go b/plugins/union_pay_redpack/internal/vo/sub_code.go index c2f40f7..a207d7b 100644 --- a/plugins/union_pay_redpack/internal/vo/sub_code.go +++ b/plugins/union_pay_redpack/internal/vo/sub_code.go @@ -1,8 +1,25 @@ package vo +// SubCode @link https://docs.qq.com/doc/DTU5mdGJ2b0xndXNJ +// @link https://open.unionpay.com/tjweb/api/interface?apiSvcId=3161&id=19701 type SubCode string const ( + SubCodeUP07006 SubCode = "UP07006" + SubCodeUP07007 SubCode = "UP07007" + SubCodeUP07008 SubCode = "UP07008" + SubCodeUP07009 SubCode = "UP07009" + SubCodeUP07011 SubCode = "UP07011" + SubCodeUP07016 SubCode = "UP07016" + SubCodeUP07017 SubCode = "UP07017" + SubCodeUP07018 SubCode = "UP07018" + SubCodeUP07019 SubCode = "UP07019" + SubCodeUP07021 SubCode = "UP07021" + SubCodeUP07097 SubCode = "UP07097" + SubCodeUP07098 SubCode = "UP07098" + SubCodeUP07099 SubCode = "UP07099" + SubCodeUP07400 SubCode = "UP07400" + SubCodeUp02094 SubCode = "UP02094" SubCodeUp02099 SubCode = "UP02099" SubCodeUp06003 SubCode = "UP06003" @@ -49,9 +66,38 @@ const ( SubCodeUp00080 SubCode = "UP00080" SubCodeUp02025 SubCode = "UP02025" SubCodeUp02071 SubCode = "UP02071" + + SubCodeUP07600 SubCode = "UP07600" + SubCodeUP07601 SubCode = "UP07601" + SubCodeUP07602 SubCode = "UP07602" + SubCodeUP07603 SubCode = "UP07603" + SubCodeUP07604 SubCode = "UP07604" + SubCodeUP07605 SubCode = "UP07605" + SubCodeUP07606 SubCode = "UP07606" + SubCodeUP07607 SubCode = "UP07607" + SubCodeUP07608 SubCode = "UP07608" + SubCodeUP07609 SubCode = "UP07609" + SubCodeUP07610 SubCode = "UP07610" + SubCodeUP07611 SubCode = "UP07611" + SubCodeUP07612 SubCode = "UP07612" ) var codeMsg = map[SubCode]string{ + SubCodeUP07006: "积分撤销业务异常", + SubCodeUP07007: "积分退货业务异常", + SubCodeUP07008: "积分调账业务异常", + SubCodeUP07009: "积分归并业务异常", + SubCodeUP07011: "调用外部系统服务异常", + SubCodeUP07016: "积分赠送调用封顶规则失败", + SubCodeUP07017: "调用热点账户动账失败", + SubCodeUP07018: "幂等校验异常", + SubCodeUP07019: "账户校验异常", + SubCodeUP07021: "积分消费撤销业务异常", + SubCodeUP07097: "积分业务系统熔断", + SubCodeUP07098: "积分业务系统限流", + SubCodeUP07099: "系统异常", + SubCodeUP07400: "积分查询为空", + SubCodeUp02094: "交易重复", SubCodeUp02099: "交易单品信息无效", SubCodeUp06003: "线上折扣活动不存在", @@ -98,6 +144,20 @@ var codeMsg = map[SubCode]string{ SubCodeUp00080: "线上折扣系统内部错误", SubCodeUp02025: "原交易不存在", SubCodeUp02071: "交易无效", + + SubCodeUP07600: "调用规则查询积分信息异常/积分ID不存在", + SubCodeUP07601: "调用账户系统查询异常", + SubCodeUP07602: "调用账户系统动账异常", + SubCodeUP07603: "调用账户系统冲账异常", + SubCodeUP07604: "调用热点账户系统异常", + SubCodeUP07605: "调用统一用户系统异常", + SubCodeUP07606: "调用热点账户系统异常", + SubCodeUP07607: "触发用户规则", + SubCodeUP07608: "原交易不存在", + SubCodeUP07609: "接入方余额不足", + SubCodeUP07610: "接入方关联积分Id不匹配", + SubCodeUP07611: "用统一用户-用户红包开关权限未开启", + SubCodeUP07612: "用统一用户-调用商户权限异常", } func (code SubCode) GetMsg() string { diff --git a/utils/alipay/cert.go b/utils/alipay/cert.go index 47540ca..02864f7 100644 --- a/utils/alipay/cert.go +++ b/utils/alipay/cert.go @@ -3,7 +3,7 @@ package alipay import ( "fmt" "os" - "plugins/utils" + "plugins/utils/helper" "sync" ) @@ -49,7 +49,7 @@ func GetCert(appId string) (*CertConfig, error) { return nil, fmt.Errorf("get current dir error: %v", err) } filePath := fmt.Sprintf("%s/%s/%s/%s", dir, "cert", "alipay", appId) - if !utils.FileExists(filePath) { + if !helper.FileExists(filePath) { return nil, fmt.Errorf("appId[%s]支付宝密钥文件信息不存在,请联系技术人员处理", appId) } mchCertPath := fmt.Sprintf("%s/%s_%s.crt", filePath, "appCertPublicKey", appId) diff --git a/utils/common.go b/utils/helper/common.go similarity index 96% rename from utils/common.go rename to utils/helper/common.go index b2fdadc..017850e 100644 --- a/utils/common.go +++ b/utils/helper/common.go @@ -1,4 +1,4 @@ -package utils +package helper import ( "golang.org/x/text/encoding/simplifiedchinese" diff --git a/utils/common_test.go b/utils/helper/common_test.go similarity index 87% rename from utils/common_test.go rename to utils/helper/common_test.go index 56cdfaa..5c416c1 100644 --- a/utils/common_test.go +++ b/utils/helper/common_test.go @@ -1,4 +1,4 @@ -package utils +package helper import "testing" diff --git a/utils/helper/env.go b/utils/helper/env.go new file mode 100644 index 0000000..17e4c10 --- /dev/null +++ b/utils/helper/env.go @@ -0,0 +1,23 @@ +package helper + +import "os" + +const ( + DefaultTimeZone = "Asia/Shanghai" // 时区 +) + +func GetEnv(name string) string { + return os.Getenv(name) +} + +func GetEnvWithDefault(name string, defaultValue string) string { + value := GetEnv(name) + if value == "" { + return defaultValue + } + return value +} + +func GetTimeZone() string { + return GetEnvWithDefault("TZ", DefaultTimeZone) +} diff --git a/utils/helper/time.go b/utils/helper/time.go new file mode 100644 index 0000000..21a8e4b --- /dev/null +++ b/utils/helper/time.go @@ -0,0 +1,68 @@ +package helper + +import ( + "fmt" + "time" +) + +const ( + DefaultParseFormatLayout = "2006-1-02 15:04:05" // 默认解析时间格式 + DefaultFormatLayout = "2006-01-02 15:04:05" // 默认时间格式 +) + +func Parse(localTimeStr string) (time.Time, error) { + if localTimeStr == "" { + return time.Time{}, fmt.Errorf("时间参数未传递") + } + layouts := []string{ + DefaultParseFormatLayout, + DefaultFormatLayout, + "2006-01-02 15:04", + "2006-1-02 15:04", + "2006-01-02", + "2006-1-02", + time.RFC3339Nano, + } + var ( + localTime time.Time + err error + ) + loc, _ := time.LoadLocation(GetTimeZone()) + for _, layout := range layouts { + localTime, err = time.ParseInLocation(layout, localTimeStr, loc) + if err == nil { + break + } + } + if err != nil { + return time.Time{}, fmt.Errorf("时间转换错误:%v", err) + } + + return localTime, nil +} + +// Duration [微信]方24小时内未完成验证,自动关闭批次单,24小时后,不再触发查询了 +// [我方]不管什么渠道,首次间隔5s查询,第二次后间隔5s,第三次间隔10s,大于2分钟后间隔1分钟,大于5分钟后间隔5分钟,总共只查询30分钟,后续不在查询 +func Duration(t *time.Time) (int, error) { + if t == nil { + return 5, nil + } + rt := *t + if rt.IsZero() { + return 5, nil + } + duration := time.Since(rt).Abs().Minutes() + seconds := time.Since(rt).Abs().Seconds() + switch { + case duration > 30: + return 0, fmt.Errorf("已超过30分钟") + case duration > 5: + return 5 * 60, nil + case duration > 2: + return 2 * 60, nil + case seconds > 5 && seconds <= 10: + return 5, nil + default: + return 10, nil + } +} diff --git a/utils/helper/time_test.go b/utils/helper/time_test.go new file mode 100644 index 0000000..3f67670 --- /dev/null +++ b/utils/helper/time_test.go @@ -0,0 +1,30 @@ +package helper + +import ( + "testing" + "time" +) + +func TestDuration(t *testing.T) { + str := "2024-09-13 16:46:00" + timeObj, err := Parse(str) + if err != nil { + t.Fatal(err) + } + t.Log(timeObj) + got, err := Duration(&timeObj) + if err != nil { + t.Fatal(err) + } + t.Log(got) +} + +func TestParse(t *testing.T) { + got, err := Parse("2024-10-31 23:59:59") + if err != nil { + t.Fatal(err) + } + t.Log(got) + t.Log(time.Now().Format("20060102150405")) + t.Log(got.Format("20060102150405")) +} diff --git a/utils/wechat/client.go b/utils/wechat/client.go index 5e82503..60880e4 100644 --- a/utils/wechat/client.go +++ b/utils/wechat/client.go @@ -8,7 +8,7 @@ import ( "github.com/wechatpay-apiv3/wechatpay-go/core/option" "github.com/wechatpay-apiv3/wechatpay-go/utils" "os" - putils "plugins/utils" + putils "plugins/utils/helper" ) type Server struct {