162 lines
5.6 KiB
Go
162 lines
5.6 KiB
Go
package orderLogic
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"github.com/hibiken/asynq"
|
|
order2 "github.com/perfect-panel/ppanel-server/internal/logic/public/order"
|
|
"github.com/perfect-panel/ppanel-server/internal/model/payment"
|
|
"github.com/perfect-panel/ppanel-server/internal/svc"
|
|
"github.com/perfect-panel/ppanel-server/pkg/logger"
|
|
"github.com/perfect-panel/ppanel-server/pkg/payment/alipay"
|
|
"github.com/perfect-panel/ppanel-server/pkg/payment/payssion"
|
|
"github.com/perfect-panel/ppanel-server/pkg/payment/stripe"
|
|
"github.com/perfect-panel/ppanel-server/queue/types"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
type CheckOrderLogic struct {
|
|
svc *svc.ServiceContext
|
|
}
|
|
|
|
func NewCheckOrderLogic(svc *svc.ServiceContext) *CheckOrderLogic {
|
|
return &CheckOrderLogic{
|
|
svc: svc,
|
|
}
|
|
}
|
|
|
|
func (l *CheckOrderLogic) ProcessTask(ctx context.Context, task *asynq.Task) error {
|
|
|
|
orderList, err := l.svc.OrderModel.QueryPendingOrders(ctx)
|
|
if err != nil {
|
|
logger.Errorf("query pending orders error: %v", zap.Error(err))
|
|
return err
|
|
}
|
|
logger.Infof("查到订单数据: %v", orderList)
|
|
for _, order := range orderList {
|
|
paymentConfig, err := l.svc.PaymentModel.FindOne(ctx, order.PaymentId)
|
|
if err != nil {
|
|
logger.Errorw("[CheckOrder] Find payment config failed", logger.Field("error", err.Error()), logger.Field("paymentMark", order.Method))
|
|
continue
|
|
}
|
|
logger.Infof("查到配置数据[%s]: %v", order.Method, orderList)
|
|
var flag bool
|
|
switch order.Method {
|
|
case order2.AlipayF2f:
|
|
if l.queryAlipay(paymentConfig, order.TradeNo) {
|
|
flag = true
|
|
}
|
|
break
|
|
case order2.Payssion:
|
|
logger.Infof("匹配配置类型: %v", order2.Payssion)
|
|
if l.queryPayssion(paymentConfig, order.OrderNo) {
|
|
flag = true
|
|
}
|
|
break
|
|
case order2.StripeWeChatPay:
|
|
if l.queryStripe(paymentConfig, order.TradeNo) {
|
|
flag = true
|
|
}
|
|
break
|
|
default:
|
|
logger.Infow("[CheckOrder] Unsupported payment method", logger.Field("paymentMethod", order.Method))
|
|
continue
|
|
}
|
|
logger.Infof("[CheckOrder] Unsupported payment method[%v]", flag)
|
|
if flag {
|
|
err := l.svc.OrderModel.UpdateOrderStatus(ctx, order.OrderNo, 2)
|
|
if err != nil {
|
|
logger.Errorf("[CheckOrder] query order status error: %v", zap.Error(err))
|
|
}
|
|
logger.Info("[CheckOrder] Notify status success", logger.Field("orderNo", order.TradeNo))
|
|
payload := types.ForthwithActivateOrderPayload{
|
|
OrderNo: order.OrderNo,
|
|
}
|
|
bytes, err := json.Marshal(&payload)
|
|
if err != nil {
|
|
logger.Error("[CheckOrder] Marshal payload failed", logger.Field("error", err.Error()))
|
|
return err
|
|
}
|
|
task := asynq.NewTask(types.ForthwithActivateOrder, bytes)
|
|
taskInfo, err := l.svc.Queue.EnqueueContext(ctx, task)
|
|
if err != nil {
|
|
logger.Error("[CheckOrder] Enqueue task failed", logger.Field("error", err.Error()))
|
|
return err
|
|
}
|
|
logger.Info("[CheckOrder] Enqueue task success", logger.Field("taskInfo", taskInfo))
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// queryAlipay Query Alipay payment status
|
|
//
|
|
//nolint:unused
|
|
func (l *CheckOrderLogic) queryAlipay(paymentConfig *payment.Payment, TradeNo string) bool {
|
|
config := payment.AlipayF2FConfig{}
|
|
if err := json.Unmarshal([]byte(paymentConfig.Config), &config); err != nil {
|
|
zap.S().Errorw("[CheckOrder] Unmarshal payment config failed", logger.Field("error", err.Error()), logger.Field("config", paymentConfig.Config))
|
|
return false
|
|
}
|
|
client := alipay.NewClient(alipay.Config{
|
|
AppId: config.AppId,
|
|
PrivateKey: config.PrivateKey,
|
|
PublicKey: config.PublicKey,
|
|
InvoiceName: config.InvoiceName,
|
|
})
|
|
status, err := client.QueryTrade(context.Background(), TradeNo)
|
|
if err != nil {
|
|
zap.S().Errorw("[CheckOrder] Query trade failed", logger.Field("error", err.Error()), logger.Field("TradeNo", TradeNo))
|
|
return false
|
|
}
|
|
if status == alipay.Success || status == alipay.Finished {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
// queryStripe Query Stripe payment status
|
|
//
|
|
//nolint:unused
|
|
func (l *CheckOrderLogic) queryStripe(paymentConfig *payment.Payment, TradeNo string) bool {
|
|
config := payment.StripeConfig{}
|
|
if err := json.Unmarshal([]byte(paymentConfig.Config), &config); err != nil {
|
|
zap.S().Errorw("[CheckOrder] Unmarshal payment config failed", logger.Field("error", err.Error()), logger.Field("config", paymentConfig.Config))
|
|
return false
|
|
}
|
|
client := stripe.NewClient(stripe.Config{
|
|
PublicKey: config.PublicKey,
|
|
SecretKey: config.SecretKey,
|
|
WebhookSecret: config.WebhookSecret,
|
|
})
|
|
status, err := client.QueryOrderStatus(TradeNo)
|
|
if err != nil {
|
|
zap.S().Errorw("[CheckOrder] Query order status failed", logger.Field("error", err.Error()), logger.Field("TradeNo", TradeNo))
|
|
return false
|
|
}
|
|
return status
|
|
}
|
|
|
|
// queryPayssion Query Stripe payment status
|
|
//
|
|
//nolint:unused
|
|
func (l *CheckOrderLogic) queryPayssion(paymentConfig *payment.Payment, TradeNo string) bool {
|
|
zap.S().Infof("[CheckOrder]1 Query Payssion called")
|
|
payssionConfig := payment.PayssionConfig{}
|
|
if err := json.Unmarshal([]byte(paymentConfig.Config), &payssionConfig); err != nil {
|
|
zap.S().Errorw("[CheckOrder] Unmarshal error", logger.Field("error", err.Error()))
|
|
return false
|
|
}
|
|
zap.S().Infof("[CheckOrder]2 Query Payssion called")
|
|
client := payssion.NewClient(payssionConfig.ApiKey, payssionConfig.SecretKey, payssionConfig.PmId, payssionConfig.Currency, payssionConfig.QueryUrl, payssionConfig.CreateUrl)
|
|
// create payment
|
|
result, err := client.QueryOrder(TradeNo)
|
|
if err != nil {
|
|
zap.S().Errorw("[CheckOrder] Query order status failed", logger.Field("error", err.Error()), logger.Field("TradeNo", TradeNo))
|
|
return false
|
|
}
|
|
zap.S().Infof("[CheckOrder]3 Query Payssion called")
|
|
return result.Transaction.State == "completed"
|
|
}
|