165 lines
4.2 KiB
Go
165 lines
4.2 KiB
Go
|
package openapiService
|
|||
|
|
|||
|
import (
|
|||
|
"context"
|
|||
|
"crypto/aes"
|
|||
|
"encoding/base64"
|
|||
|
"gitee.com/chengdu_blue_brothers/openapi-go-sdk/api"
|
|||
|
"gitee.com/chengdu_blue_brothers/openapi-go-sdk/notify"
|
|||
|
"net/http"
|
|||
|
"qteam/app/models/orderdetailsmodel"
|
|||
|
"qteam/app/models/ordersmodel"
|
|||
|
"qteam/app/models/usercouponmodel"
|
|||
|
"qteam/app/utils"
|
|||
|
"qteam/config"
|
|||
|
"time"
|
|||
|
)
|
|||
|
|
|||
|
func CreatClient() (client *api.Client, err error) {
|
|||
|
merchantId := config.GetConf().OpenApi.MerchantId
|
|||
|
secretKey := config.GetConf().OpenApi.SecretKey
|
|||
|
isProd := config.GetConf().OpenApi.IsProd
|
|||
|
timeout := 10 * time.Second // 请求超时时间
|
|||
|
|
|||
|
client, err = api.NewClient(merchantId, secretKey, isProd, timeout)
|
|||
|
if err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
return client, nil
|
|||
|
}
|
|||
|
|
|||
|
type RechargeOrderReq struct {
|
|||
|
OutTradeNo string
|
|||
|
ProductId int
|
|||
|
RechargeAccount string
|
|||
|
AccountType int
|
|||
|
Number int
|
|||
|
}
|
|||
|
|
|||
|
func RechargeOrder(rechargeOrderReq RechargeOrderReq) (result *api.RechargeOrderResp, err error) {
|
|||
|
req := &api.RechargeOrderReq{
|
|||
|
OutTradeNo: rechargeOrderReq.OutTradeNo,
|
|||
|
ProductId: rechargeOrderReq.ProductId,
|
|||
|
RechargeAccount: rechargeOrderReq.RechargeAccount,
|
|||
|
AccountType: 0,
|
|||
|
Number: 1,
|
|||
|
NotifyUrl: config.GetConf().OpenApi.NotifyUrl,
|
|||
|
}
|
|||
|
client, err := CreatClient()
|
|||
|
if err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
result, err = client.RechargeOrder(context.Background(), req)
|
|||
|
if err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
if result.Code != api.CodeCreateOrderSuccess {
|
|||
|
return
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
func ReCardOrder(CardOrderReq api.CardOrderReq) (result *api.CardOrderResp, err error) {
|
|||
|
req := &api.CardOrderReq{
|
|||
|
OutTradeNo: CardOrderReq.OutTradeNo,
|
|||
|
ProductId: CardOrderReq.ProductId,
|
|||
|
AccountType: 0,
|
|||
|
Number: 1,
|
|||
|
NotifyUrl: config.GetConf().OpenApi.NotifyUrl,
|
|||
|
}
|
|||
|
client, err := CreatClient()
|
|||
|
if err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
result, err = client.CardOrder(context.Background(), req)
|
|||
|
if err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
if result.Code != api.CodeCreateOrderSuccess {
|
|||
|
return
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
func DecryptCard(encCode string) (decode string, err error) {
|
|||
|
defer func() error {
|
|||
|
if r := recover(); r != nil {
|
|||
|
utils.Log(nil, "解密错误", err)
|
|||
|
|
|||
|
}
|
|||
|
return err
|
|||
|
}()
|
|||
|
client, err := CreatClient()
|
|||
|
if err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
decryptedCode, err := decryptAES(encCode, client.GetSecretKey())
|
|||
|
if err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
return decryptedCode, nil
|
|||
|
}
|
|||
|
|
|||
|
// AES 解密
|
|||
|
func decryptAES(encryptedData string, secretKey string) (string, error) {
|
|||
|
// 第一步:对加密的卡密做base64 decode
|
|||
|
encryptedBytes, err := base64.StdEncoding.DecodeString(encryptedData)
|
|||
|
if err != nil {
|
|||
|
return "", err
|
|||
|
}
|
|||
|
|
|||
|
// 第二步:使用aes-256-ecb解密
|
|||
|
cipher, _ := aes.NewCipher([]byte(secretKey))
|
|||
|
decrypted := make([]byte, len(encryptedBytes))
|
|||
|
size := 16
|
|||
|
for bs, be := 0, size; bs < len(encryptedBytes); bs, be = bs+size, be+size {
|
|||
|
cipher.Decrypt(decrypted[bs:be], encryptedBytes[bs:be])
|
|||
|
}
|
|||
|
paddingSize := int(decrypted[len(decrypted)-1])
|
|||
|
return string(decrypted[0 : len(decrypted)-paddingSize]), nil
|
|||
|
}
|
|||
|
|
|||
|
func ParseAndVerify(request *http.Request) (req *notify.OrderReq, err error) {
|
|||
|
// 第一步:初使化client实例
|
|||
|
merchantId := config.GetConf().OpenApi.MerchantId
|
|||
|
secretKey := config.GetConf().OpenApi.SecretKey
|
|||
|
client := notify.NewNotify(merchantId, secretKey)
|
|||
|
|
|||
|
// 第二步:验签并解析结果
|
|||
|
req, err = client.ParseAndVerify(request)
|
|||
|
if err != nil {
|
|||
|
return nil, err
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// NotifyOperation /**
|
|||
|
func NotifyOperation(order ordersmodel.Orders, req *notify.OrderReq) (err error) {
|
|||
|
var session = ordersmodel.GetInstance().GetDb().NewSession()
|
|||
|
session.Begin()
|
|||
|
updateOrder := ordersmodel.Orders{Status: 3}
|
|||
|
_, err = session.Where("Id = ?", order.Id).Update(&updateOrder)
|
|||
|
if err != nil {
|
|||
|
session.Rollback()
|
|||
|
return
|
|||
|
}
|
|||
|
//卡密
|
|||
|
if req.CardCode != "" {
|
|||
|
//订单详情
|
|||
|
updateOrderDetail := orderdetailsmodel.OrderDetails{Url: req.CardCode.Value()}
|
|||
|
_, err = session.Where("OrderId = ?", order.Id).Update(&updateOrderDetail)
|
|||
|
if err != nil {
|
|||
|
session.Rollback()
|
|||
|
return
|
|||
|
}
|
|||
|
userCouponDetail := usercouponmodel.UserCoupon{OrderInfo: req.CardCode.Value()}
|
|||
|
_, err = session.Where("OrderId = ?", order.Id).Update(&userCouponDetail)
|
|||
|
if err != nil {
|
|||
|
session.Rollback()
|
|||
|
return
|
|||
|
}
|
|||
|
}
|
|||
|
session.Commit()
|
|||
|
return
|
|||
|
}
|