This commit is contained in:
李子铭 2024-09-14 15:30:21 +08:00
parent 164bf9fe3d
commit 38d27f53bb
13 changed files with 257 additions and 18 deletions

View File

@ -7,7 +7,7 @@ import (
"gitea.cdlsxd.cn/sdk/plugin/proto" "gitea.cdlsxd.cn/sdk/plugin/proto"
"github.com/carlmjohnson/requests" "github.com/carlmjohnson/requests"
"plugins/alipay_cpn/internal/po" "plugins/alipay_cpn/internal/po"
"plugins/utils" "plugins/utils/helper"
) )
// 插件通信信息,若不对应则会报错panic // 插件通信信息,若不对应则会报错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) err = requests.URL(baseUri).Post().BodyForm(uv).ToString(&sp).Fetch(ctx)
var response *po.OrderResp var response *po.OrderResp
sp = utils.ToChinese(sp) sp = helper.ToChinese(sp)
if err = json.Unmarshal([]byte(sp), &response); err != nil { if err = json.Unmarshal([]byte(sp), &response); err != nil {
return nil, fmt.Errorf("请求异常msg:" + err.Error()) 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 var response po.QueryResp
sp = utils.ToChinese(sp) sp = helper.ToChinese(sp)
if err = json.Unmarshal([]byte(sp), &response); err != nil { if err = json.Unmarshal([]byte(sp), &response); err != nil {
return nil, fmt.Errorf("请求异常msg:" + err.Error()) return nil, fmt.Errorf("请求异常msg:" + err.Error())
} }

View File

@ -7,8 +7,8 @@ import (
"gitea.cdlsxd.cn/sdk/plugin/proto" "gitea.cdlsxd.cn/sdk/plugin/proto"
"github.com/carlmjohnson/requests" "github.com/carlmjohnson/requests"
"plugins/alipay_redpack/internal/po" "plugins/alipay_redpack/internal/po"
"plugins/utils"
"plugins/utils/alipay" "plugins/utils/alipay"
"plugins/utils/helper"
) )
// 插件通信信息,若不对应则会报错panic // 插件通信信息,若不对应则会报错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) err = requests.URL(baseUri).Post().BodyForm(uv).ToString(&sp).Fetch(ctx)
var response *po.OrderResp var response *po.OrderResp
sp = utils.ToChinese(sp) sp = helper.ToChinese(sp)
if err = json.Unmarshal([]byte(sp), &response); err != nil { if err = json.Unmarshal([]byte(sp), &response); err != nil {
return nil, fmt.Errorf("请求异常msg:" + err.Error()) 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 var response po.QueryResp
sp = utils.ToChinese(sp) sp = helper.ToChinese(sp)
if err = json.Unmarshal([]byte(sp), &response); err != nil { if err = json.Unmarshal([]byte(sp), &response); err != nil {
return nil, fmt.Errorf("请求异常msg:" + err.Error()) return nil, fmt.Errorf("请求异常msg:" + err.Error())
} }

View File

@ -1,8 +1,25 @@
package vo 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 type SubCode string
const ( 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" SubCodeUp02094 SubCode = "UP02094"
SubCodeUp02099 SubCode = "UP02099" SubCodeUp02099 SubCode = "UP02099"
SubCodeUp06003 SubCode = "UP06003" SubCodeUp06003 SubCode = "UP06003"
@ -49,9 +66,38 @@ const (
SubCodeUp00080 SubCode = "UP00080" SubCodeUp00080 SubCode = "UP00080"
SubCodeUp02025 SubCode = "UP02025" SubCodeUp02025 SubCode = "UP02025"
SubCodeUp02071 SubCode = "UP02071" 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{ var codeMsg = map[SubCode]string{
SubCodeUP07006: "积分撤销业务异常",
SubCodeUP07007: "积分退货业务异常",
SubCodeUP07008: "积分调账业务异常",
SubCodeUP07009: "积分归并业务异常",
SubCodeUP07011: "调用外部系统服务异常",
SubCodeUP07016: "积分赠送调用封顶规则失败",
SubCodeUP07017: "调用热点账户动账失败",
SubCodeUP07018: "幂等校验异常",
SubCodeUP07019: "账户校验异常",
SubCodeUP07021: "积分消费撤销业务异常",
SubCodeUP07097: "积分业务系统熔断",
SubCodeUP07098: "积分业务系统限流",
SubCodeUP07099: "系统异常",
SubCodeUP07400: "积分查询为空",
SubCodeUp02094: "交易重复", SubCodeUp02094: "交易重复",
SubCodeUp02099: "交易单品信息无效", SubCodeUp02099: "交易单品信息无效",
SubCodeUp06003: "线上折扣活动不存在", SubCodeUp06003: "线上折扣活动不存在",
@ -98,6 +144,20 @@ var codeMsg = map[SubCode]string{
SubCodeUp00080: "线上折扣系统内部错误", SubCodeUp00080: "线上折扣系统内部错误",
SubCodeUp02025: "原交易不存在", SubCodeUp02025: "原交易不存在",
SubCodeUp02071: "交易无效", SubCodeUp02071: "交易无效",
SubCodeUP07600: "调用规则查询积分信息异常/积分ID不存在",
SubCodeUP07601: "调用账户系统查询异常",
SubCodeUP07602: "调用账户系统动账异常",
SubCodeUP07603: "调用账户系统冲账异常",
SubCodeUP07604: "调用热点账户系统异常",
SubCodeUP07605: "调用统一用户系统异常",
SubCodeUP07606: "调用热点账户系统异常",
SubCodeUP07607: "触发用户规则",
SubCodeUP07608: "原交易不存在",
SubCodeUP07609: "接入方余额不足",
SubCodeUP07610: "接入方关联积分Id不匹配",
SubCodeUP07611: "用统一用户-用户红包开关权限未开启",
SubCodeUP07612: "用统一用户-调用商户权限异常",
} }
func (code SubCode) GetMsg() string { func (code SubCode) GetMsg() string {

View File

@ -45,8 +45,7 @@ func (p *UnionPayCpnService) Order(ctx context.Context, request *proto.OrderRequ
return nil, err return nil, err
} }
var response po.OrderResp var response po.OrderResp
url := fmt.Sprintf("%s%s", baseUri, orderMethod) err = requests.URL(baseUri + orderMethod).Headers(headers(c, uv, orderBizMethod)).Post().BodyJSON(uv).ToJSON(&response).Fetch(ctx)
err = requests.URL(url).Headers(headers(c, uv, orderBizMethod)).BodyJSON(uv).ToJSON(&response).Fetch(ctx)
if err != nil { if err != nil {
return nil, fmt.Errorf("请求异常msg:" + err.Error()) return nil, fmt.Errorf("请求异常msg:" + err.Error())
} }
@ -67,11 +66,10 @@ func (p *UnionPayCpnService) Query(ctx context.Context, request *proto.QueryRequ
return nil, err return nil, err
} }
var response po.QueryResp var response po.QueryResp
url := fmt.Sprintf("%s%s", baseUri, queryMethod)
h := new(http.Client) h := new(http.Client)
h.Timeout = 20 * time.Second 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 { if err != nil {
return nil, fmt.Errorf("请求异常msg:" + err.Error()) return nil, fmt.Errorf("请求异常msg:" + err.Error())
} }

View File

@ -39,11 +39,11 @@ func TestOrder(t *testing.T) {
request := &proto.OrderRequest{ request := &proto.OrderRequest{
Config: config(), Config: config(),
Order: &proto.OrderRequest_Order{ Order: &proto.OrderRequest_Order{
OrderNo: "240403164049635931", OrderNo: "202409141047181834200102",
Account: "18666173766", Account: "18512869479",
Quantity: 1, Quantity: 1,
Amount: 1, Amount: 1,
Extra: []byte(`{"transDtTm":"20230710165534","validEndDtTm":"20230710165535","transDigest":"测试红包"}`), Extra: []byte(`{"transDtTm":"20240914151102","validEndDtTm":"20241031235959","transDigest":"测试红包"}`),
}, },
Product: &proto.OrderRequest_Product{ Product: &proto.OrderRequest_Product{
ProductNo: "", ProductNo: "",

View File

@ -1,8 +1,25 @@
package vo 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 type SubCode string
const ( 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" SubCodeUp02094 SubCode = "UP02094"
SubCodeUp02099 SubCode = "UP02099" SubCodeUp02099 SubCode = "UP02099"
SubCodeUp06003 SubCode = "UP06003" SubCodeUp06003 SubCode = "UP06003"
@ -49,9 +66,38 @@ const (
SubCodeUp00080 SubCode = "UP00080" SubCodeUp00080 SubCode = "UP00080"
SubCodeUp02025 SubCode = "UP02025" SubCodeUp02025 SubCode = "UP02025"
SubCodeUp02071 SubCode = "UP02071" 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{ var codeMsg = map[SubCode]string{
SubCodeUP07006: "积分撤销业务异常",
SubCodeUP07007: "积分退货业务异常",
SubCodeUP07008: "积分调账业务异常",
SubCodeUP07009: "积分归并业务异常",
SubCodeUP07011: "调用外部系统服务异常",
SubCodeUP07016: "积分赠送调用封顶规则失败",
SubCodeUP07017: "调用热点账户动账失败",
SubCodeUP07018: "幂等校验异常",
SubCodeUP07019: "账户校验异常",
SubCodeUP07021: "积分消费撤销业务异常",
SubCodeUP07097: "积分业务系统熔断",
SubCodeUP07098: "积分业务系统限流",
SubCodeUP07099: "系统异常",
SubCodeUP07400: "积分查询为空",
SubCodeUp02094: "交易重复", SubCodeUp02094: "交易重复",
SubCodeUp02099: "交易单品信息无效", SubCodeUp02099: "交易单品信息无效",
SubCodeUp06003: "线上折扣活动不存在", SubCodeUp06003: "线上折扣活动不存在",
@ -98,6 +144,20 @@ var codeMsg = map[SubCode]string{
SubCodeUp00080: "线上折扣系统内部错误", SubCodeUp00080: "线上折扣系统内部错误",
SubCodeUp02025: "原交易不存在", SubCodeUp02025: "原交易不存在",
SubCodeUp02071: "交易无效", SubCodeUp02071: "交易无效",
SubCodeUP07600: "调用规则查询积分信息异常/积分ID不存在",
SubCodeUP07601: "调用账户系统查询异常",
SubCodeUP07602: "调用账户系统动账异常",
SubCodeUP07603: "调用账户系统冲账异常",
SubCodeUP07604: "调用热点账户系统异常",
SubCodeUP07605: "调用统一用户系统异常",
SubCodeUP07606: "调用热点账户系统异常",
SubCodeUP07607: "触发用户规则",
SubCodeUP07608: "原交易不存在",
SubCodeUP07609: "接入方余额不足",
SubCodeUP07610: "接入方关联积分Id不匹配",
SubCodeUP07611: "用统一用户-用户红包开关权限未开启",
SubCodeUP07612: "用统一用户-调用商户权限异常",
} }
func (code SubCode) GetMsg() string { func (code SubCode) GetMsg() string {

View File

@ -3,7 +3,7 @@ package alipay
import ( import (
"fmt" "fmt"
"os" "os"
"plugins/utils" "plugins/utils/helper"
"sync" "sync"
) )
@ -49,7 +49,7 @@ func GetCert(appId string) (*CertConfig, error) {
return nil, fmt.Errorf("get current dir error: %v", err) return nil, fmt.Errorf("get current dir error: %v", err)
} }
filePath := fmt.Sprintf("%s/%s/%s/%s", dir, "cert", "alipay", appId) 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) return nil, fmt.Errorf("appId[%s]支付宝密钥文件信息不存在,请联系技术人员处理", appId)
} }
mchCertPath := fmt.Sprintf("%s/%s_%s.crt", filePath, "appCertPublicKey", appId) mchCertPath := fmt.Sprintf("%s/%s_%s.crt", filePath, "appCertPublicKey", appId)

View File

@ -1,4 +1,4 @@
package utils package helper
import ( import (
"golang.org/x/text/encoding/simplifiedchinese" "golang.org/x/text/encoding/simplifiedchinese"

View File

@ -1,4 +1,4 @@
package utils package helper
import "testing" import "testing"

23
utils/helper/env.go Normal file
View File

@ -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)
}

68
utils/helper/time.go Normal file
View File

@ -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
}
}

30
utils/helper/time_test.go Normal file
View File

@ -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"))
}

View File

@ -8,7 +8,7 @@ import (
"github.com/wechatpay-apiv3/wechatpay-go/core/option" "github.com/wechatpay-apiv3/wechatpay-go/core/option"
"github.com/wechatpay-apiv3/wechatpay-go/utils" "github.com/wechatpay-apiv3/wechatpay-go/utils"
"os" "os"
putils "plugins/utils" putils "plugins/utils/helper"
) )
type Server struct { type Server struct {