135 lines
3.6 KiB
Go
135 lines
3.6 KiB
Go
package wechatrepoimpl
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"github.com/go-kratos/kratos/v2/log"
|
|
"github.com/wechatpay-apiv3/wechatpay-go/core"
|
|
"net/http"
|
|
err2 "voucher/api/err"
|
|
"voucher/internal/biz/bo"
|
|
"voucher/internal/biz/businesserr"
|
|
"voucher/internal/biz/wechatrepo"
|
|
"voucher/internal/conf"
|
|
"voucher/internal/data"
|
|
"voucher/internal/pkg/wechat/srv/marketing"
|
|
"voucher/internal/pkg/wechat/utils"
|
|
)
|
|
|
|
type BankMultiActivityImpl struct {
|
|
bc *conf.Bootstrap
|
|
wx *data.Wx
|
|
}
|
|
|
|
func NewBankMultiActivityImpl(bc *conf.Bootstrap, wx *data.Wx) wechatrepo.BankMultiActivityRepo {
|
|
return &BankMultiActivityImpl{bc: bc, wx: wx}
|
|
}
|
|
|
|
func (w *BankMultiActivityImpl) Order(order *bo.OrderBo) (couponId string, err error) {
|
|
|
|
req := &marketing.SendReq{
|
|
OutRequestNo: core.String(order.OrderNo),
|
|
Appid: core.String(order.AppID),
|
|
StockId: core.String(order.BatchNo),
|
|
StockCreatorMchId: core.String(order.MerchantNo),
|
|
ActivityId: core.String(order.ActivityId),
|
|
}
|
|
|
|
t, err := w.wx.Get(w.bc.Wechat.MchID)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
resp, err := t.Send(order.Account, req)
|
|
|
|
if err != nil {
|
|
|
|
var e *utils.ApiException
|
|
if errors.As(err, &e) {
|
|
// 格式:{"code":"INVALID_REQUEST","message":"对应单号已超出重试期;请查单确认后决定是否换单请求"}
|
|
var beer *businesserr.BusinessErr
|
|
if err = json.Unmarshal(e.Body(), &beer); err != nil {
|
|
log.Errorf("微信错误返回body解析报错,body:%s,err:%s", string(e.Body()), err.Error())
|
|
return "", err2.ErrorWechatFAIL(fmt.Sprintf("微信错误返回内容解析错误:%s", err.Error()))
|
|
}
|
|
|
|
//apiErr, err3 := marketing.BuildErr(e.Body())
|
|
//if err3 != nil {
|
|
// return "", fmt.Errorf("ApiException analysis err: %+v", err3)
|
|
//}
|
|
//return "", err2.ErrorWechatFAIL("%s-%s", apiErr.Code, apiErr.Message)
|
|
|
|
return "", beer
|
|
}
|
|
|
|
return "", err
|
|
}
|
|
|
|
return *resp.CouponId, nil
|
|
}
|
|
|
|
func (w *BankMultiActivityImpl) Notify(ctx context.Context, mchId string, headers *http.Header, respBody []byte) (*bo.WechatVoucherNotifyBo, error) {
|
|
|
|
t, err := w.wx.Get(mchId)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
body, decodeBodyStr, err := t.Notify(ctx, headers, respBody)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var plainText bo.PlainText
|
|
if err = json.Unmarshal([]byte(decodeBodyStr), &plainText); err != nil {
|
|
return nil, fmt.Errorf("plainText json.Unmarshal error: %v", err)
|
|
}
|
|
|
|
return &bo.WechatVoucherNotifyBo{
|
|
ID: body.Id,
|
|
CreateTime: body.CreateTime,
|
|
ResourceType: body.ResourceType,
|
|
EventType: body.EventType,
|
|
Summary: body.Summary,
|
|
OriginalType: body.Resource.OriginalType,
|
|
AssociatedData: body.Resource.AssociatedData,
|
|
PlainText: plainText,
|
|
}, nil
|
|
}
|
|
|
|
func (w *BankMultiActivityImpl) DecodeBody(ctx context.Context, mchId string, respBody []byte) (*bo.WechatVoucherNotifyBo, error) {
|
|
|
|
t, err := w.wx.Get(mchId)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var body utils.WxNotifyBody
|
|
if err = json.Unmarshal(respBody, &body); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
decryptedText, err := t.DecodeBody(&body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var plainText bo.PlainText
|
|
if err = json.Unmarshal([]byte(decryptedText), &plainText); err != nil {
|
|
return nil, fmt.Errorf("plainText json.Unmarshal error: %v", err)
|
|
}
|
|
|
|
return &bo.WechatVoucherNotifyBo{
|
|
ID: body.Id,
|
|
CreateTime: body.CreateTime,
|
|
ResourceType: body.ResourceType,
|
|
EventType: body.EventType,
|
|
Summary: body.Summary,
|
|
OriginalType: body.Resource.OriginalType,
|
|
AssociatedData: body.Resource.AssociatedData,
|
|
PlainText: plainText,
|
|
}, nil
|
|
}
|