Compare commits

..

9 Commits

30 changed files with 308 additions and 335 deletions

View File

@ -82,11 +82,10 @@ func closeOrder() {
// 发起关闭订单请求 // 发起关闭订单请求
response := paymentService.OrderClose(ctx, req) response := paymentService.OrderClose(ctx, req)
// 成功 // 成功
if response.Code == payCommon.PAY_SUCCESS_CODE { if response.Code != payCommon.PAY_SUCCESS_CODE {
orderIds = append(orderIds, orderInfo.Id) utils.Log(nil, "关闭订单,上游失败", response, orderInfo.Id)
} else {
utils.Log(nil, "关闭订单,上游失败", response)
} }
orderIds = append(orderIds, orderInfo.Id)
} }
// 修改订单状态为关闭 // 修改订单状态为关闭
cond = builder.NewCond() cond = builder.NewCond()

View File

@ -45,6 +45,10 @@ const (
THIRD_ORDER_TYPE_REFUND_QUERY = 4 // 退款查询 THIRD_ORDER_TYPE_REFUND_QUERY = 4 // 退款查询
THIRD_ORDER_TYPE_CLOSE = 5 // 关闭订单 THIRD_ORDER_TYPE_CLOSE = 5 // 关闭订单
THIRD_ORDER_TYPE_CALL_BACK = 6 // 支付回调 THIRD_ORDER_TYPE_CALL_BACK = 6 // 支付回调
THIRD_ORDER_LOG_STATUS_COMMON = 0 // 第三方日志状态 未知
THIRD_ORDER_LOG_STATUS_FAIL = 1 // 第三方日志状态 失败
THIRD_ORDER_LOG_STATUS_SUCCESS = 2 // 第三方日志状态 成功
) )
var PayChannelList = map[int]string{ var PayChannelList = map[int]string{

View File

@ -48,6 +48,7 @@ const (
AppSM4EncryptKeyNotFound = 1232 AppSM4EncryptKeyNotFound = 1232
AppSM4EncryptFail = 1233 AppSM4EncryptFail = 1233
AppAesEncryptFail = 1234 AppAesEncryptFail = 1234
AppDeEncryptFail = 1250
// 加密方式不存在 // 加密方式不存在
EncryptTypeNotFound = 1241 EncryptTypeNotFound = 1241
@ -73,8 +74,9 @@ const (
//回调 //回调
NotifySendFail = 1600 NotifySendFail = 1600
//预支付 //订单结果
PrePayFail = 1701 PrePayFail = 1701
PreRefundFail = 1702
) )
var MsgEN = map[int]string{ var MsgEN = map[int]string{
@ -120,6 +122,8 @@ var MsgZH = map[int]string{
EncryptTypeNotFound: "加密方式不存在", EncryptTypeNotFound: "加密方式不存在",
AppDeEncryptFail: "未知原因导致解密失败请检查加密数据是和app加密配置",
PayChannelNotFound: "支付方式不存在", PayChannelNotFound: "支付方式不存在",
PayChannelNotBuild: "支付方式尚未开通", PayChannelNotBuild: "支付方式尚未开通",
PayChannelExtJsonError: "支付方式扩展参数错误", PayChannelExtJsonError: "支付方式扩展参数错误",

View File

@ -21,7 +21,7 @@ func PayUrl(c *gin.Context) {
controllers.ApiRes(c, nil, check.CheckCode) controllers.ApiRes(c, nil, check.CheckCode)
return return
} }
check.CheckOrder() check.CheckOrderPay()
if check.CheckCode != errorcode.Success { if check.CheckCode != errorcode.Success {
controllers.ApiRes(c, nil, check.CheckCode) controllers.ApiRes(c, nil, check.CheckCode)
return return
@ -44,6 +44,24 @@ func PayUrl(c *gin.Context) {
return return
} }
func Refund(c *gin.Context) {
req := controllers.GetRequest(c).(*front.RefundReqs)
appCheckInfo := controllers.GetAppCheckInfo(c).(*services.AppCheck)
refund := thirdpay.ThirdPayRefund(c.Request.Context(), req, appCheckInfo, c.ClientIP())
if refund.PayCode != errorcode.Success {
controllers.ApiRes(c, nil, refund.PayCode)
}
data := thirdpay.NewOrdersResp(refund.Order)
encryptData, errCode := api.EnCrypt(appCheckInfo.App, data)
if errCode != errorcode.Success {
controllers.ApiRes(c, nil, refund.PayCode)
return
}
controllers.ApiRes(c, encryptData, refund.PayCode)
return
}
// 查询订单 // 查询订单
func QueryOrder(c *gin.Context) { func QueryOrder(c *gin.Context) {
req := controllers.GetRequest(c).(*front.QueryReqs) req := controllers.GetRequest(c).(*front.QueryReqs)

View File

@ -12,15 +12,25 @@ type RequestBody struct {
Key string `json:"key" validate:"max=32"` Key string `json:"key" validate:"max=32"`
} }
type PayReqs struct { type PayCommonReqBody struct {
ApiCommonBody ApiCommonBody
PayChannelId int64 `json:"pay_channel_id" validate:"required" label:"支付渠道"` PayChannelId int64 `json:"pay_channel_id" validate:"required" label:"支付渠道"`
OutTradeNo string `json:"out_trade_no" validate:"required" label:"外侧商户订单号"`
Amount int `json:"amount" validate:"required" label:"支付金额,单位分"` Amount int `json:"amount" validate:"required" label:"支付金额,单位分"`
ExtJson string `json:"ext_json" label:"扩展参数"` ExtJson string `json:"ext_json" label:"扩展参数"`
Desc string `json:"desc" validate:"max=100" label:"商品描述"` Desc string `json:"desc" validate:"max=100" label:"商品描述"`
} }
type PayReqs struct {
PayCommonReqBody
OutTradeNo string `json:"out_trade_no" validate:"required" label:"外侧商户订单号"`
}
type RefundReqs struct {
PayCommonReqBody
OutTradeNo string `json:"out_trade_no" label:"外侧商户订单号"`
OrderId string `json:"order_id" label:"平台订单号"`
}
type PayUrlResp struct { type PayUrlResp struct {
Order string `json:"order"` Order string `json:"order"`
Url string `json:"url"` Url string `json:"url"`

View File

@ -147,7 +147,6 @@ func ValidatePayRequest() gin.HandlerFunc {
//获取app信息 //获取app信息
appCheck := services.GetAppCheck(requestDataStruct.AppId, c.ClientIP()) appCheck := services.GetAppCheck(requestDataStruct.AppId, c.ClientIP())
//存入请求记录 //存入请求记录
if appCheck.Code != errorcode.Success { if appCheck.Code != errorcode.Success {
controllers.ApiRes(c, nil, appCheck.Code) controllers.ApiRes(c, nil, appCheck.Code)
return return

View File

@ -6,7 +6,8 @@ import (
) )
var FrontRequestMap = map[string]func() interface{}{ var FrontRequestMap = map[string]func() interface{}{
common.FRONT_V1 + "/pay/url": func() interface{} { return new(front.PayReqs) }, common.FRONT_V1 + "/pay/url": func() interface{} { return new(front.PayReqs) },
common.FRONT_V1 + "/pay/refund": func() interface{} { return new(front.RefundReqs) },
} }
var FrontRequestMapBeforeDecrypt = map[string]func() interface{}{ var FrontRequestMapBeforeDecrypt = map[string]func() interface{}{

View File

@ -60,6 +60,7 @@ func RegisterRoute(router *gin.Engine) {
{ {
pay.POST("/url", front.PayUrl) pay.POST("/url", front.PayUrl)
pay.POST("/query", front.QueryOrder) //查询订单 pay.POST("/query", front.QueryOrder) //查询订单
pay.POST("/refund", front.Refund)
} }
} }

View File

@ -42,10 +42,7 @@ func (a *AppCheck) Check() *AppCheck {
a.Code = errorcode.AppDisabled a.Code = errorcode.AppDisabled
return a return a
} }
if !a.App.DeleteTime.IsZero() {
a.Code = errorcode.AppNotFound
return a
}
return a return a
} }

View File

@ -18,7 +18,7 @@ func (r *SM2) Encrypt(data []byte) (encryptData []byte, errCode int) {
return nil, errorcode.AppSM2EncryptKeyNotFound return nil, errorcode.AppSM2EncryptKeyNotFound
} }
encryptDataString, err := sm2.SM2Encrypt(string(data), r.App.PrivateKey) encryptDataString, err := sm2.SM2Encrypt(string(data), r.App.MerchantPublicKey)
if err != nil { if err != nil {
return nil, errorcode.AppSM2EncryptFail return nil, errorcode.AppSM2EncryptFail
} }

View File

@ -87,8 +87,5 @@ func GetAndCheckMerchant(merchant *merchantmodel.Merchant, conn builder.Cond, co
return nil, code return nil, code
} }
if !merchantInfo.DeleteTime.IsZero() {
return nil, errorcode.MerchantNotFound
}
return return
} }

View File

@ -100,7 +100,7 @@ func PayChannelFindOne(channel *paychannelmodel.PayChannel, conn builder.Cond, c
channelInfo, err := repo.PayChannelFindOne(channel, conn, col...) channelInfo, err := repo.PayChannelFindOne(channel, conn, col...)
if err != nil { if err != nil {
if err == sql.ErrNoRows { if err == sql.ErrNoRows {
return nil, errorcode.MerchantNotFound return nil, errorcode.PayChannelNotFound
} }
return nil, errorcode.SystemError return nil, errorcode.SystemError
} }
@ -112,8 +112,6 @@ func GetAndCheckPayChannel(channel *paychannelmodel.PayChannel, conn builder.Con
if code != errorcode.Success { if code != errorcode.Success {
return nil, code return nil, code
} }
if !channelInfo.DeleteTime.IsZero() {
return nil, errorcode.PayChannelNotFound
}
return return
} }

View File

@ -43,6 +43,9 @@ func DeCrypt(app *appmodel.App, data string, aesKey string) ([]byte, int) {
if errCode != apicrypt.CryptNotError { if errCode != apicrypt.CryptNotError {
return nil, errCode return nil, errCode
} }
if len(dataByte) == 0 {
return nil, errorcode.AppDeEncryptFail
}
//aesData, err := aes.Decrypt(dataByte, []byte(aesKey)) //aesData, err := aes.Decrypt(dataByte, []byte(aesKey))
//if err != nil { //if err != nil {
// return nil, errorcode.AppAesEncryptFail // return nil, errorcode.AppAesEncryptFail

View File

@ -3,6 +3,7 @@ package do
import ( import (
"PaymentCenter/app/constants/common" "PaymentCenter/app/constants/common"
"PaymentCenter/app/constants/errorcode" "PaymentCenter/app/constants/errorcode"
"PaymentCenter/app/models/merchantmodel"
"PaymentCenter/app/models/paychannelmodel" "PaymentCenter/app/models/paychannelmodel"
"PaymentCenter/app/services" "PaymentCenter/app/services"
"PaymentCenter/app/third/paymentService/payCommon" "PaymentCenter/app/third/paymentService/payCommon"
@ -12,6 +13,9 @@ import (
) )
type Pay struct { type Pay struct {
Merchant *merchantmodel.Merchant
Channel *paychannelmodel.PayChannel
paycheck *PayCheck paycheck *PayCheck
Order *ordersmodel.Orders Order *ordersmodel.Orders
PayCode int PayCode int
@ -33,12 +37,12 @@ func (w *Pay) CreateOrder(order_type int) {
w.Order, w.PayCode = services.OrderCreate(&ordersmodel.Orders{ w.Order, w.PayCode = services.OrderCreate(&ordersmodel.Orders{
MerchantId: w.paycheck.Merchant.Id, MerchantId: w.paycheck.Merchant.Id,
PayChannelId: w.paycheck.Channel.Id, PayChannelId: w.paycheck.Channel.Id,
AppId: w.paycheck.Channel.Id, AppId: w.paycheck.Reqs.AppId,
OutTreadNo: w.paycheck.WebPayReqs.OutTradeNo, OutTreadNo: w.paycheck.Reqs.OutTradeNo,
OrderType: order_type, OrderType: order_type,
Amount: w.paycheck.WebPayReqs.Amount, Amount: w.paycheck.Reqs.Amount,
ExtJson: w.paycheck.WebPayReqs.ExtJson, ExtJson: w.paycheck.Reqs.ExtJson,
Desc: w.paycheck.WebPayReqs.Desc, Desc: w.paycheck.Reqs.Desc,
Status: common.ORDER_STATUS_WAITPAY, Status: common.ORDER_STATUS_WAITPAY,
}, },
) )
@ -50,7 +54,7 @@ func (w *Pay) PayUrl() (url string) {
ok bool ok bool
) )
thirdPay := &paymentService.PayOrderRequest{ thirdPay := &paymentService.PayOrderRequest{
PayChannelId: w.paycheck.WebPayReqs.PayChannelId, PayChannelId: w.paycheck.Reqs.PayChannelId,
OrderId: w.Order.Id, OrderId: w.Order.Id,
ChannelType: w.paycheck.Channel.ChannelType, ChannelType: w.paycheck.Channel.ChannelType,
Description: w.Order.Desc, Description: w.Order.Desc,
@ -81,3 +85,37 @@ func (w *Pay) PayUrl() (url string) {
return return
} }
func (w *Pay) Refund() {
var (
refundFunc func(commonRefundInfo *paymentService.OrderRefundRequest, channel *paychannelmodel.PayChannel) error
ok bool
)
thirdPayRefund := &paymentService.OrderRefundRequest{
OrderId: w.Order.Id,
RefundOrderId: w.paycheck.OldOrder.Id,
RefundReason: w.paycheck.Reqs.Desc,
RefundAmount: int64(w.paycheck.Reqs.Amount),
PayChannel: w.paycheck.Channel.ChannelType,
}
if refundFunc, ok = RefundWayList[w.paycheck.Channel.ChannelType]; !ok {
w.PayCode = errorcode.PayChannelNotBuild
return
}
err := refundFunc(thirdPayRefund, w.paycheck.Channel)
if err != nil {
w.PayCode = errorcode.PayChannelExtJsonError
return
}
res := paymentService.OrderRefund(*w.paycheck.ctx, *thirdPayRefund)
if res.Code == payCommon.PAY_SUCCESS_CODE {
w.Order.Status = common.ORDER_STATUS_PAYING
code := services.OrderUpdate(w.Order, "status")
if code != errorcode.Success {
w.PayCode = code
}
} else {
w.PayCode = errorcode.PreRefundFail
}
return
}

View File

@ -4,9 +4,9 @@ import (
"PaymentCenter/app/constants/common" "PaymentCenter/app/constants/common"
"PaymentCenter/app/constants/errorcode" "PaymentCenter/app/constants/errorcode"
"PaymentCenter/app/services" "PaymentCenter/app/services"
"PaymentCenter/app/services/thirdpay/types"
"xorm.io/builder" "xorm.io/builder"
"PaymentCenter/app/http/entities/front"
"PaymentCenter/app/models/merchantmodel" "PaymentCenter/app/models/merchantmodel"
"PaymentCenter/app/models/orderrequestlogmodel" "PaymentCenter/app/models/orderrequestlogmodel"
"PaymentCenter/app/models/ordersmodel" "PaymentCenter/app/models/ordersmodel"
@ -16,7 +16,7 @@ import (
type PayCheck struct { type PayCheck struct {
ctx *context.Context ctx *context.Context
WebPayReqs *front.PayReqs Reqs *types.Reqs
AppCheck *services.AppCheck AppCheck *services.AppCheck
RequestLog *orderrequestlogmodel.OrderRequestLog RequestLog *orderrequestlogmodel.OrderRequestLog
Channel *paychannelmodel.PayChannel Channel *paychannelmodel.PayChannel
@ -25,29 +25,32 @@ type PayCheck struct {
CheckCode int CheckCode int
} }
func NewPayCheck(ctx *context.Context, reqs *front.PayReqs, appCheck *services.AppCheck, ip string) *PayCheck { func NewPayCheck(ctx *context.Context, reqs *types.Reqs, appCheck *services.AppCheck, ip string) *PayCheck {
if appCheck == nil { if appCheck == nil {
appCheck = services.GetAppCheck(reqs.AppId, ip) appCheck = services.GetAppCheck(reqs.AppId, ip)
} }
return &PayCheck{ return &PayCheck{
ctx: ctx, ctx: ctx,
WebPayReqs: reqs, Reqs: reqs,
AppCheck: appCheck, AppCheck: appCheck,
CheckCode: appCheck.Code, CheckCode: appCheck.Code,
} }
} }
func (w *PayCheck) CheckForm() { func (w *PayCheck) CheckPayInfo() {
//if _, ok := common.OrderTypeList[w.WebPayReqs.OrderType]; !ok { //判断是否是支持的支付渠道 w.CheckMerchant()
// w.CheckCode = errorcode.PayChannelNotFound if w.CheckCode != errorcode.Success {
// return return
//} }
w.CheckPayChannel()
if w.CheckCode != errorcode.Success {
return
}
} }
func (w *PayCheck) CheckPayChannel() { func (w *PayCheck) CheckPayChannel() {
conn := builder.NewCond() conn := builder.NewCond()
conn = conn.And(builder.Eq{"id": w.WebPayReqs.PayChannelId}) conn = conn.And(builder.Eq{"id": w.Reqs.PayChannelId})
w.Channel, w.CheckCode = services.GetAndCheckPayChannel(&paychannelmodel.PayChannel{}, conn) w.Channel, w.CheckCode = services.GetAndCheckPayChannel(&paychannelmodel.PayChannel{}, conn)
} }
@ -57,9 +60,45 @@ func (w *PayCheck) CheckMerchant() {
w.Merchant, w.CheckCode = services.GetAndCheckMerchant(&merchantmodel.Merchant{}, conn) w.Merchant, w.CheckCode = services.GetAndCheckMerchant(&merchantmodel.Merchant{}, conn)
} }
func (w *PayCheck) CheckOrder() { func (w *PayCheck) CheckOrderPay() {
w.GetOrder()
if w.OldOrder != nil {
switch w.OldOrder.Status {
case common.ORDER_STATUS_CLOSE:
w.CheckCode = errorcode.OrderClosed
case common.ORDER_STATUS_FAILED:
w.CheckCode = errorcode.OrderFailed
case common.ORDER_STATUS_PAYED:
w.CheckCode = errorcode.OrderPayed
default:
}
}
return
}
func (w *PayCheck) CheckOrderRefund() {
w.GetOrder()
if w.OldOrder == nil {
w.CheckCode = errorcode.OrdersNotFound
}
switch w.OldOrder.Status {
case common.ORDER_STATUS_CLOSE:
w.CheckCode = errorcode.OrderClosed
case common.ORDER_STATUS_FAILED:
w.CheckCode = errorcode.OrderFailed
case common.ORDER_STATUS_WAITPAY:
w.CheckCode = errorcode.OrderStatusErr
case common.ORDER_STATUS_PAYING:
w.CheckCode = errorcode.OrderStatusErr
default:
}
return
}
func (w *PayCheck) GetOrder() {
cond := builder.NewCond() cond := builder.NewCond()
cond = cond.And(builder.Eq{"out_tread_no": w.WebPayReqs.OutTradeNo}, builder.Eq{"app_id": w.AppCheck.AppId}) cond = cond.And(builder.Eq{"out_tread_no": w.Reqs.OutTradeNo}, builder.Eq{"app_id": w.AppCheck.AppId})
order, code := services.OrderFindOne(&ordersmodel.Orders{}, cond) order, code := services.OrderFindOne(&ordersmodel.Orders{}, cond)
if code == errorcode.SystemError { if code == errorcode.SystemError {
w.CheckCode = code w.CheckCode = code
@ -67,15 +106,6 @@ func (w *PayCheck) CheckOrder() {
} }
if code == errorcode.OrdersExist { if code == errorcode.OrdersExist {
w.OldOrder = order w.OldOrder = order
switch order.Status {
case common.ORDER_STATUS_CLOSE:
w.CheckCode = errorcode.OrderClosed
case common.ORDER_STATUS_FAILED:
w.CheckCode = errorcode.OrderFailed
case common.ORDER_STATUS_PAYED:
w.CheckCode = errorcode.OrderPayed
}
} }
return
} }

View File

@ -0,0 +1,31 @@
package do
import (
"PaymentCenter/app/constants/common"
"PaymentCenter/app/models/paychannelmodel"
"PaymentCenter/app/third/paymentService"
"github.com/bytedance/sonic"
)
var RefundWayList = map[int]func(commonRefundInfo *paymentService.OrderRefundRequest, channel *paychannelmodel.PayChannel) error{
common.PAY_CHANNEL_WECHAT_H5: WechatH5Refund,
common.PAY_CHANNEL_ALIPAY_WEB: AlipayWebRefund,
}
func WechatH5Refund(commonRefundInfo *paymentService.OrderRefundRequest, channel *paychannelmodel.PayChannel) error {
err := sonic.Unmarshal([]byte(channel.ExtJson), &commonRefundInfo.Wx)
if err != nil {
return err
}
commonRefundInfo.Wx.AppId = channel.AppId
return nil
}
func AlipayWebRefund(commonRefundInfo *paymentService.OrderRefundRequest, channel *paychannelmodel.PayChannel) error {
err := sonic.Unmarshal([]byte(channel.ExtJson), &commonRefundInfo.Ali)
if err != nil {
return err
}
commonRefundInfo.Ali.AppId = channel.AppId
return nil
}

View File

@ -8,7 +8,9 @@ import (
"PaymentCenter/app/services" "PaymentCenter/app/services"
"PaymentCenter/app/services/thirdpay/api" "PaymentCenter/app/services/thirdpay/api"
thirdpay "PaymentCenter/app/services/thirdpay/do" thirdpay "PaymentCenter/app/services/thirdpay/do"
"PaymentCenter/app/services/thirdpay/types"
"context" "context"
"github.com/jinzhu/copier"
) )
func ThirdPayUrl(check *thirdpay.PayCheck) *thirdpay.Pay { func ThirdPayUrl(check *thirdpay.PayCheck) *thirdpay.Pay {
@ -30,41 +32,35 @@ func NewOrdersResp(db *ordersmodel.Orders) *api.OrdersResp {
} }
} }
func ThirdPayRefund(check *thirdpay.PayCheck) *thirdpay.Pay { func ThirdPayInfoCheck(ctx context.Context, payReq *front.PayReqs, appCheck *services.AppCheck, ip string) (check *thirdpay.PayCheck) {
pay := thirdpay.NewPay(check) var req types.Reqs
// 创建订单 copier.Copy(&req, payReq)
if &check.OldOrder != nil { check = thirdpay.NewPayCheck(&ctx, &req, appCheck, ip)
pay.CreateOrder(common.ORDER_TYPE_PAY) // 校验表单
if pay.PayCode != errorcode.Success { check.CheckPayInfo()
return pay if check.CheckCode != errorcode.Success {
} return
} else {
pay.Order = check.OldOrder
} }
// 支付
pay.PayUrl() return
return pay
} }
func ThirdPayInfoCheck(ctx context.Context, req *front.PayReqs, appCheck *services.AppCheck, ip string) (check *thirdpay.PayCheck) { func ThirdPayRefund(ctx context.Context, refundReq *front.RefundReqs, appCheck *services.AppCheck, ip string) (refund *thirdpay.Pay) {
check = thirdpay.NewPayCheck(&ctx, req, appCheck, ip) var req types.Reqs
copier.Copy(req, refundReq)
check := thirdpay.NewPayCheck(&ctx, &req, appCheck, ip)
// 校验表单 // 校验表单
check.CheckForm() check.CheckPayInfo()
if check.CheckCode != errorcode.Success { if check.CheckCode != errorcode.Success {
return return
} }
check.CheckOrderRefund()
// 校验商户
check.CheckMerchant()
if check.CheckCode != errorcode.Success { if check.CheckCode != errorcode.Success {
return return
} }
// 校验支付通道 refund = thirdpay.NewPay(check)
check.CheckPayChannel() refund.CreateOrder(common.ORDER_TYPE_REFUND)
if check.CheckCode != errorcode.Success { refund.Refund()
return
}
return return
} }

View File

@ -133,10 +133,7 @@ func (o *OrderNotify) checkApp() {
if o.Code != errorcode.Success { if o.Code != errorcode.Success {
return return
} }
if o.app.DeleteTime.IsZero() {
o.Code = errorcode.AppDisabled
return
}
if o.app.NotifyUrl == "" { if o.app.NotifyUrl == "" {
o.Code = errorcode.AppNotifyUrlNotFound o.Code = errorcode.AppNotifyUrlNotFound
return return
@ -148,15 +145,11 @@ func (o *OrderNotify) checkApp() {
func (o *OrderNotify) checkOrder() { func (o *OrderNotify) checkOrder() {
cond := builder.NewCond() cond := builder.NewCond()
cond = cond.And(builder.Eq{"id": o.OrderId}) cond = cond.And(builder.Eq{"id": o.OrderId})
o.order, o.Code = services.OrderFindOne(&ordersmodel.Orders{}, cond) o.order, o.Code = services.OrderFindOne(&ordersmodel.Orders{}, cond)
if o.Code != errorcode.Success { if o.Code != errorcode.OrdersExist {
return
}
if o.order.DeleteTime.IsZero() {
o.Code = errorcode.OrderIsDelete
return return
} }
if o.order.Status != common.ORDER_STATUS_PAYING { if o.order.Status != common.ORDER_STATUS_PAYING {
o.Code = errorcode.OrderStatusErr o.Code = errorcode.OrderStatusErr
return return

View File

@ -1,10 +0,0 @@
package types
type PayResp struct {
OrderNo int64 `json:"order_no"`
OrderType int `json:"out_trade_no"`
Amount int `json:"order_type"`
Desc string `json:"amount"`
IsNewCreate bool `json:"is_new_create"`
Status int `json:"status"`
}

View File

@ -0,0 +1,8 @@
package types
import "PaymentCenter/app/http/entities/front"
type Reqs struct {
front.PayCommonReqBody
OutTradeNo string `json:"out_trade_no"`
}

View File

@ -1,164 +0,0 @@
package openapiService
import (
"PaymentCenter/app/models/orderdetailsmodel"
"PaymentCenter/app/models/ordersmodel"
"PaymentCenter/app/models/usercouponmodel"
"PaymentCenter/app/utils"
"PaymentCenter/config"
"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"
"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
}

View File

@ -132,7 +132,8 @@ func ALiCallBack(notifyReq gopay.BodyMap, aliConfig AliPay) error {
go func() { go func() {
payCallback, _ := json.Marshal(notifyReq) payCallback, _ := json.Marshal(notifyReq)
payParam := "{}" payParam := "{}"
SaveLog(int64(orderId), common.THIRD_ORDER_TYPE_CALL_BACK, string(payCallback), payParam, string(merchantCallback)) status := common.THIRD_ORDER_LOG_STATUS_SUCCESS
SaveLog(int64(orderId), common.THIRD_ORDER_TYPE_CALL_BACK, string(payCallback), payParam, "{}", status)
}() }()
if res.ErrCode != errorcode.Success { if res.ErrCode != errorcode.Success {

View File

@ -40,14 +40,6 @@ type AliPay struct {
AlipayPublicCert string `json:"alipay_public_cert"` // 支付宝公钥 AlipayPublicCert string `json:"alipay_public_cert"` // 支付宝公钥
} }
type AliPayA struct {
AppId string `json:"app_id"` // 应用ID
PrivateKey string `json:"private_key"` // 应用私钥
AppPublicCert string `json:"app_public_cert"` // 应用公钥
AlipayRootCert string `json:"alipay_root_cert"` // 支付宝根证书
AlipayPublicCert string `json:"alipay_public_cert"` // 支付宝公钥
}
type PayOrderResponse struct { type PayOrderResponse struct {
Code int `json:"code"` Code int `json:"code"`
ErrorMsg string `json:"error_msg"` ErrorMsg string `json:"error_msg"`
@ -59,6 +51,7 @@ func PaymentService(c context.Context, payOrderRequest PayOrderRequest) PayOrder
logger.Info(c, "PaymentService 收到支付请求", payOrderRequest) logger.Info(c, "PaymentService 收到支付请求", payOrderRequest)
var err error var err error
var info string var info string
var payOrderResponse PayOrderResponse
switch payOrderRequest.ChannelType { switch payOrderRequest.ChannelType {
case payCommon.PAY_CHANNEL_WECHAT_H5: case payCommon.PAY_CHANNEL_WECHAT_H5:
// 微信H5支付 // 微信H5支付
@ -67,29 +60,35 @@ func PaymentService(c context.Context, payOrderRequest PayOrderRequest) PayOrder
// 支付宝H5支付 // 支付宝H5支付
info, err = ALiH5PayInfo(c, payOrderRequest) info, err = ALiH5PayInfo(c, payOrderRequest)
default: default:
return PayOrderResponse{ payOrderResponse = PayOrderResponse{
Code: payCommon.PAY_NOT_FOUND_CODE, Code: payCommon.PAY_NOT_FOUND_CODE,
ErrorMsg: "暂不支持该支付渠道,请后续再使用", ErrorMsg: "暂不支持该支付渠道,请后续再使用",
} }
} }
logStatus := common.THIRD_ORDER_LOG_STATUS_FAIL
if err != nil { if err != nil {
return PayOrderResponse{ payOrderResponse = PayOrderResponse{
Code: payCommon.PAY_ERROR_CODE, Code: payCommon.PAY_ERROR_CODE,
ErrorMsg: err.Error(), ErrorMsg: err.Error(),
} }
logStatus = common.THIRD_ORDER_LOG_STATUS_FAIL
} else {
payOrderResponse = PayOrderResponse{
Code: payCommon.PAY_SUCCESS_CODE,
ErrorMsg: "",
Result: info,
}
logStatus = common.THIRD_ORDER_LOG_STATUS_SUCCESS
} }
payOrderResponse := PayOrderResponse{
Code: payCommon.PAY_SUCCESS_CODE,
ErrorMsg: "",
Result: info,
}
// 记录日志 // 记录日志
go func() { go func() {
orderId := payOrderRequest.OrderId orderId := payOrderRequest.OrderId
payCallback := fmt.Sprintf("{%s}", info) payCallback := fmt.Sprintf("{%s}", info)
payParam, _ := json.Marshal(payOrderRequest) payParam, _ := json.Marshal(payOrderRequest)
merchantCallback, _ := json.Marshal(payOrderResponse) merchantCallback, _ := json.Marshal(payOrderResponse)
SaveLog(orderId, common.THIRD_ORDER_TYPE_PAY, payCallback, string(payParam), string(merchantCallback)) SaveLog(orderId, common.THIRD_ORDER_TYPE_PAY, payCallback, string(payParam), string(merchantCallback), logStatus)
}() }()
return payOrderResponse return payOrderResponse
} }
@ -122,6 +121,7 @@ type PayOrderQueryInfo struct {
func PayOrderQuery(c context.Context, payOrderQueryRequest PayOrderQueryRequest) PayOrderQueryResponse { func PayOrderQuery(c context.Context, payOrderQueryRequest PayOrderQueryRequest) PayOrderQueryResponse {
var err error var err error
var info PayOrderQueryInfo var info PayOrderQueryInfo
var payOrderQueryResponse PayOrderQueryResponse
switch payOrderQueryRequest.PayChannel { switch payOrderQueryRequest.PayChannel {
case payCommon.PAY_CHANNLE_TYPE_WECHAT: case payCommon.PAY_CHANNLE_TYPE_WECHAT:
// 微信H5支付 // 微信H5支付
@ -129,21 +129,25 @@ func PayOrderQuery(c context.Context, payOrderQueryRequest PayOrderQueryRequest)
case payCommon.PAY_CHANNLE_TYPE_ZFB: case payCommon.PAY_CHANNLE_TYPE_ZFB:
info, err = ALiOrderQuery(c, payOrderQueryRequest.Ali, strconv.FormatInt(payOrderQueryRequest.OrderId, 10)) info, err = ALiOrderQuery(c, payOrderQueryRequest.Ali, strconv.FormatInt(payOrderQueryRequest.OrderId, 10))
default: default:
return PayOrderQueryResponse{ payOrderQueryResponse = PayOrderQueryResponse{
Code: payCommon.PAY_ERROR_CODE, Code: payCommon.PAY_ERROR_CODE,
ErrorMsg: "暂不支持该支付渠道,请后续再使用", ErrorMsg: "暂不支持该支付渠道,请后续再使用",
} }
} }
logStatus := common.THIRD_ORDER_LOG_STATUS_FAIL
if err != nil { if err != nil {
return PayOrderQueryResponse{ payOrderQueryResponse = PayOrderQueryResponse{
Code: payCommon.PAY_ERROR_CODE, Code: payCommon.PAY_ERROR_CODE,
ErrorMsg: err.Error(), ErrorMsg: err.Error(),
} }
} logStatus = common.THIRD_ORDER_LOG_STATUS_FAIL
} else {
payOrderQueryResponse := PayOrderQueryResponse{ payOrderQueryResponse = PayOrderQueryResponse{
Code: payCommon.PAY_SUCCESS_CODE, Code: payCommon.PAY_SUCCESS_CODE,
Result: info, Result: info,
}
logStatus = common.THIRD_ORDER_LOG_STATUS_SUCCESS
} }
// 记录日志 // 记录日志
@ -152,7 +156,7 @@ func PayOrderQuery(c context.Context, payOrderQueryRequest PayOrderQueryRequest)
payCallback, _ := json.Marshal(info) payCallback, _ := json.Marshal(info)
payParam, _ := json.Marshal(payOrderQueryRequest) payParam, _ := json.Marshal(payOrderQueryRequest)
merchantCallback, _ := json.Marshal(payOrderQueryResponse) merchantCallback, _ := json.Marshal(payOrderQueryResponse)
SaveLog(orderId, common.THIRD_ORDER_TYPE_ORDER_QUERY, string(payCallback), string(payParam), string(merchantCallback)) SaveLog(orderId, common.THIRD_ORDER_TYPE_ORDER_QUERY, string(payCallback), string(payParam), string(merchantCallback), logStatus)
}() }()
return payOrderQueryResponse return payOrderQueryResponse
} }
@ -187,6 +191,7 @@ func OrderRefund(c context.Context, orderRefundRequest OrderRefundRequest) Order
logger.Info(c, "PaymentService 收到退款请求", orderRefundRequest) logger.Info(c, "PaymentService 收到退款请求", orderRefundRequest)
var err error var err error
var info OrderRefundInfo var info OrderRefundInfo
var orderRefundResponse OrderRefundResponse
switch orderRefundRequest.PayChannel { switch orderRefundRequest.PayChannel {
case payCommon.PAY_CHANNLE_TYPE_WECHAT: case payCommon.PAY_CHANNLE_TYPE_WECHAT:
// 微信H5支付 // 微信H5支付
@ -194,31 +199,35 @@ func OrderRefund(c context.Context, orderRefundRequest OrderRefundRequest) Order
case payCommon.PAY_CHANNLE_TYPE_ZFB: case payCommon.PAY_CHANNLE_TYPE_ZFB:
info, err = AliRefundOrder(c, orderRefundRequest) info, err = AliRefundOrder(c, orderRefundRequest)
default: default:
return OrderRefundResponse{ orderRefundResponse = OrderRefundResponse{
Code: payCommon.PAY_ERROR_CODE, Code: payCommon.PAY_ERROR_CODE,
ErrorMsg: "暂不支持该支付渠道,请后续再使用", ErrorMsg: "暂不支持该支付渠道,请后续再使用",
} }
} }
logStatus := common.THIRD_ORDER_LOG_STATUS_FAIL
if err != nil { if err != nil {
return OrderRefundResponse{ orderRefundResponse = OrderRefundResponse{
Code: payCommon.PAY_ERROR_CODE, Code: payCommon.PAY_ERROR_CODE,
ErrorMsg: err.Error(), ErrorMsg: err.Error(),
} }
logStatus = common.THIRD_ORDER_LOG_STATUS_FAIL
} else {
orderRefundResponse = OrderRefundResponse{
Code: payCommon.PAY_SUCCESS_CODE,
Result: info,
}
logStatus = common.THIRD_ORDER_LOG_STATUS_SUCCESS
} }
orderRefundResponse := OrderRefundResponse{
Code: payCommon.PAY_SUCCESS_CODE,
Result: info,
}
// 记录日志 // 记录日志
go func() { go func() {
orderId := orderRefundRequest.OrderId orderId := orderRefundRequest.OrderId
payCallback, _ := json.Marshal(info) payCallback, _ := json.Marshal(info)
payParam, _ := json.Marshal(orderRefundRequest) payParam, _ := json.Marshal(orderRefundRequest)
merchantCallback, _ := json.Marshal(orderRefundResponse) merchantCallback, _ := json.Marshal(orderRefundResponse)
SaveLog(orderId, common.THIRD_ORDER_TYPE_REFUND, string(payCallback), string(payParam), string(merchantCallback)) SaveLog(orderId, common.THIRD_ORDER_TYPE_REFUND, string(payCallback), string(payParam), string(merchantCallback), logStatus)
}() }()
return orderRefundResponse return orderRefundResponse
} }
@ -239,6 +248,7 @@ type OrderRefundQueryResponse struct {
func OrderRefundQuery(c context.Context, orderRefundQueryRequest OrderRefundQueryRequest) OrderRefundQueryResponse { func OrderRefundQuery(c context.Context, orderRefundQueryRequest OrderRefundQueryRequest) OrderRefundQueryResponse {
var err error var err error
var info OrderRefundInfo var info OrderRefundInfo
var orderRefundQueryResponse OrderRefundQueryResponse
switch orderRefundQueryRequest.PayChannel { switch orderRefundQueryRequest.PayChannel {
case payCommon.PAY_CHANNLE_TYPE_WECHAT: case payCommon.PAY_CHANNLE_TYPE_WECHAT:
// 微信H5支付 // 微信H5支付
@ -246,20 +256,25 @@ func OrderRefundQuery(c context.Context, orderRefundQueryRequest OrderRefundQuer
case payCommon.PAY_CHANNLE_TYPE_ZFB: case payCommon.PAY_CHANNLE_TYPE_ZFB:
info, err = AliRefundOrderQuery(c, orderRefundQueryRequest) info, err = AliRefundOrderQuery(c, orderRefundQueryRequest)
default: default:
return OrderRefundQueryResponse{ orderRefundQueryResponse = OrderRefundQueryResponse{
Code: payCommon.PAY_ERROR_CODE, Code: payCommon.PAY_ERROR_CODE,
ErrorMsg: "暂不支持该支付渠道,请后续再使用", ErrorMsg: "暂不支持该支付渠道,请后续再使用",
} }
} }
logStatus := common.THIRD_ORDER_LOG_STATUS_FAIL
if err != nil { if err != nil {
return OrderRefundQueryResponse{ orderRefundQueryResponse = OrderRefundQueryResponse{
Code: payCommon.PAY_ERROR_CODE, Code: payCommon.PAY_ERROR_CODE,
ErrorMsg: err.Error(), ErrorMsg: err.Error(),
} }
} logStatus = common.THIRD_ORDER_LOG_STATUS_FAIL
orderRefundQueryResponse := OrderRefundQueryResponse{ } else {
Code: payCommon.PAY_SUCCESS_CODE, orderRefundQueryResponse = OrderRefundQueryResponse{
Result: info, Code: payCommon.PAY_SUCCESS_CODE,
Result: info,
}
logStatus = common.THIRD_ORDER_LOG_STATUS_SUCCESS
} }
// 记录日志 // 记录日志
@ -268,9 +283,8 @@ func OrderRefundQuery(c context.Context, orderRefundQueryRequest OrderRefundQuer
payCallback, _ := json.Marshal(info) payCallback, _ := json.Marshal(info)
payParam, _ := json.Marshal(orderRefundQueryRequest) payParam, _ := json.Marshal(orderRefundQueryRequest)
merchantCallback, _ := json.Marshal(orderRefundQueryResponse) merchantCallback, _ := json.Marshal(orderRefundQueryResponse)
SaveLog(orderId, common.THIRD_ORDER_TYPE_REFUND_QUERY, string(payCallback), string(payParam), string(merchantCallback)) SaveLog(orderId, common.THIRD_ORDER_TYPE_REFUND_QUERY, string(payCallback), string(payParam), string(merchantCallback), logStatus)
}() }()
return orderRefundQueryResponse return orderRefundQueryResponse
} }
@ -296,6 +310,7 @@ func OrderClose(c context.Context, orderCloseRequest OrderCloseRequest) OrderClo
logger.Info(c, "PaymentService 收到关闭订单请求", orderCloseRequest) logger.Info(c, "PaymentService 收到关闭订单请求", orderCloseRequest)
var err error var err error
var info OrderCloseInfo var info OrderCloseInfo
var orderCloseResponse OrderCloseResponse
switch orderCloseRequest.PayChannel { switch orderCloseRequest.PayChannel {
case payCommon.PAY_CHANNLE_TYPE_WECHAT: case payCommon.PAY_CHANNLE_TYPE_WECHAT:
// 微信H5支付 // 微信H5支付
@ -303,40 +318,45 @@ func OrderClose(c context.Context, orderCloseRequest OrderCloseRequest) OrderClo
case payCommon.PAY_CHANNLE_TYPE_ZFB: case payCommon.PAY_CHANNLE_TYPE_ZFB:
info, err = AliCloseOrder(c, orderCloseRequest) info, err = AliCloseOrder(c, orderCloseRequest)
default: default:
return OrderCloseResponse{ orderCloseResponse = OrderCloseResponse{
Code: payCommon.PAY_ERROR_CODE, Code: payCommon.PAY_ERROR_CODE,
ErrorMsg: "暂不支持该支付渠道,请后续再使用", ErrorMsg: "暂不支持该支付渠道,请后续再使用",
} }
} }
logStatus := common.THIRD_ORDER_LOG_STATUS_FAIL
if err != nil { if err != nil {
return OrderCloseResponse{ orderCloseResponse = OrderCloseResponse{
Code: payCommon.PAY_ERROR_CODE, Code: payCommon.PAY_ERROR_CODE,
ErrorMsg: err.Error(), ErrorMsg: err.Error(),
} }
logStatus = common.THIRD_ORDER_LOG_STATUS_FAIL
} else {
orderCloseResponse = OrderCloseResponse{
Code: payCommon.PAY_SUCCESS_CODE,
Result: info,
}
logStatus = common.THIRD_ORDER_LOG_STATUS_SUCCESS
} }
orderCloseResponse := OrderCloseResponse{
Code: payCommon.PAY_SUCCESS_CODE,
Result: info,
}
// 记录日志 // 记录日志
go func() { go func() {
orderId := orderCloseRequest.OrderId orderId := orderCloseRequest.OrderId
payCallback, _ := json.Marshal(info) payCallback, _ := json.Marshal(info)
payParam, _ := json.Marshal(orderCloseRequest) payParam, _ := json.Marshal(orderCloseRequest)
merchantCallback, _ := json.Marshal(orderCloseResponse) merchantCallback, _ := json.Marshal(orderCloseResponse)
SaveLog(orderId, common.THIRD_ORDER_TYPE_CLOSE, string(payCallback), string(payParam), string(merchantCallback)) SaveLog(orderId, common.THIRD_ORDER_TYPE_CLOSE, string(payCallback), string(payParam), string(merchantCallback), logStatus)
}() }()
return orderCloseResponse return orderCloseResponse
} }
// SaveLog 记录操作日志 // SaveLog 记录操作日志
func SaveLog(orderId int64, OType int, payCallback string, PayParam string, MerchantCallback string) { func SaveLog(orderId int64, OType int, payCallback string, PayParam string, MerchantCallback string, status int) {
thirdRepo := data.NewOrderThirdPayLogRepo(paychannelmodel.GetInstance().GetDb()) thirdRepo := data.NewOrderThirdPayLogRepo(paychannelmodel.GetInstance().GetDb())
log := orderthirdpaylogmodel.OrderThirdPayLog{ log := orderthirdpaylogmodel.OrderThirdPayLog{
OrderId: orderId, OrderId: orderId,
PayCallback: payCallback, PayCallback: payCallback,
Status: 0, Status: status,
PayParam: PayParam, PayParam: PayParam,
MerchantCallback: MerchantCallback, MerchantCallback: MerchantCallback,
Type: OType, Type: OType,

View File

@ -166,7 +166,8 @@ func WxPayCallBack(notifyReq *wechat.V3NotifyReq, wxConfig WxPay) error {
go func() { go func() {
payCallback, _ := json.Marshal(CallBackInfo) payCallback, _ := json.Marshal(CallBackInfo)
payParam := "{}" payParam := "{}"
SaveLog(int64(orderId), common.THIRD_ORDER_TYPE_CALL_BACK, string(payCallback), payParam, string(merchantCallback)) status := common.THIRD_ORDER_LOG_STATUS_SUCCESS
SaveLog(int64(orderId), common.THIRD_ORDER_TYPE_CALL_BACK, string(payCallback), payParam, "{}", status)
}() }()
if res.ErrCode != errorcode.Success { if res.ErrCode != errorcode.Success {

View File

@ -8,6 +8,7 @@ import (
"encoding/base64" "encoding/base64"
"encoding/pem" "encoding/pem"
"fmt" "fmt"
"strings"
) )
// parseRSAPublicKeyFromPEM 解析PEM编码的RSA公钥 // parseRSAPublicKeyFromPEM 解析PEM编码的RSA公钥
@ -136,5 +137,9 @@ func GenerateKey() (string, string, error) {
Bytes: derPkix, Bytes: derPkix,
} }
pubPem := pem.EncodeToMemory(pubBlock) pubPem := pem.EncodeToMemory(pubBlock)
return string(pubPem), string(privPem), nil pri := strings.Replace(string(privPem), "-----BEGIN RSA PRIVATE KEY-----\n", "", -1)
pri = strings.Replace(pri, "\n-----END RSA PRIVATE KEY-----\n", "", -1)
pub := strings.Replace(string(pubPem), "-----BEGIN PUBLIC KEY-----\n", "", -1)
pub = strings.Replace(pub, "\n-----END PUBLIC KEY-----\n", "", -1)
return pub, pri, nil
} }

View File

@ -41,20 +41,6 @@ func encrypt() string {
return base64.StdEncoding.EncodeToString(en) return base64.StdEncoding.EncodeToString(en)
} }
func TestRsaEncryptWithAes(t *testing.T) {
fmt.Printf("%s\n", encryptWithAes())
}
func TestRsaDecryptWithAes(t *testing.T) {
data := "cGuoR6Bmmm9fZr/OAnM54eM6Z7M4ysnRr7TV64rIK6mAkGDzJROwSOY443e7UJmLpwIEn8G5jNk6j8K1scxvIMMdSJZ0QOJREjgzbZfNfuXV0LO1lVNu3uhwVQXN/zMZxBHGIcYQnPWSaOHhNy6yMRPLFNRuIb5FuTx7E6VI5UVZpHk9VLv63QX+6+hQMOiqoif/YyXkAqi2xG+unq4MVq9w5aYMOVzHX1eyMiTeRFRB4iKhf6bCJmVvLMmvjHYKQl3/225R4uXaI8nv7y4IHnK8KVYAnuJE6SvEPeJAjpINrY2CRoNqTYkt7DRS2uz5l7aE+KX8GShV2XlDoM8KZA=="
privateKeyPEM := `-----BEGIN RSA PRIVATE KEY-----
` + PRI + `
-----END RSA PRIVATE KEY-----`
res, err := Decrypt(privateKeyPEM, data)
fmt.Println(string(res), err)
}
func encryptWithAes() string { func encryptWithAes() string {
data := "{\"pay_channel_id\":8935141660703064070,\"out_trade_no\":\"asdadasdas\",\"order_type\":1,\"amount\":1,\"desc\":\"abc\",\"ext_json\":\"\",\"app_id\":5476377146882523138,\"timestamp\":53612533412643}" data := "{\"pay_channel_id\":8935141660703064070,\"out_trade_no\":\"asdadasdas\",\"order_type\":1,\"amount\":1,\"desc\":\"abc\",\"ext_json\":\"\",\"app_id\":5476377146882523138,\"timestamp\":53612533412643}"
aes.Encrypt([]byte(data), []byte(aes.TestKey)) aes.Encrypt([]byte(data), []byte(aes.TestKey))

View File

@ -6,9 +6,9 @@ import (
) )
const ( const (
SELF_PRI = "EA7CB6F907A96264D6763F8C46AB96B476538D2ABC880A459E10BE5A1C30013D" SELF_PRI = "BD13D44C74422F80ADDF54AD2DE2888C4092AF6F61E41FABADA6C47F17574A41"
SELF_PUB = "04363DF574D4FE34EE58FB8A3F7CB08E6CA5EBB3B7335CBAE10A2900551F6450AB3AD25DBC0A76EFA9E6D44D2C51E3027483F7BFD09996457888BAFD1AF673817F" SELF_PUB = "04F26C6CDA5E58153999FDF3023259F16EDE0A556C39FCF4BC97C04A10A8A6CF1D52297B53DB4DD72FEEF8221394C8478E6424F4E84E4A6E2784C1A4A1C99F2DC2"
) )
func TestGenerateSM2KeyPair(t *testing.T) { func TestGenerateSM2KeyPair(t *testing.T) {
@ -47,7 +47,7 @@ func TestSM2Decrypt(t *testing.T) {
} }
func encrypt() string { func encrypt() string {
data := "{\"name\":\"张三\",\"sex\":1,\"is_human\":true}" data := "{\"order_no\":5476377146882523228,\"order_type\":1,\"out_tread_no\":\"asdadasdas\",\"amount\":1,\"desc\":\"abc\",\"status\":2,\"create_time\":\"2024-08-08 14:47:35\"}"
en, err := SM2Encrypt(data, SELF_PUB) en, err := SM2Encrypt(data, SELF_PUB)
if err != nil { if err != nil {
panic(err) panic(err)

View File

@ -2,6 +2,7 @@ package sm4
import ( import (
"fmt" "fmt"
"strconv"
"testing" "testing"
) )
@ -25,7 +26,10 @@ func TestSM4Encrypt(t *testing.T) {
} }
func TestSM4Decrypt(t *testing.T) { func TestSM4Decrypt(t *testing.T) {
uid, en := encrypt() uid, en := encrypt()
//uid := "1729382256910270475"
//en := "{\"accessToken\":\"77F59F157466F309E703F43CFDCFFECF\",\"encryptKey\":\"04237241E4A465C18645985B3C1DAE987B5DDF1C077AA27D677C843C52E833A24711C63F2512D1A4C37E85A5C9CEAC94156C97460CB5E8966CAD2A0C2596A64ED69CF3306D031C4AADAA73D165FB7EEC34E5AAF532A301169847560329F7F1E40E9FD09EB191976BB49ABFE611E05158EF\",\"request\":\"mkuquQ1RB2AtZYzBtWtLPJ3MMULWj7I5RmK3dKENYVW8OgB//I/+MAD/XnjxYYJlRWM8uL/rWL9o\\r\\n0L7W9fSBvOXWwz8reiwcAF/JZ5dnacZtVe0NPujDfeVIJp+9ua7hxQcegcEsIRS9CQqtF/rJN7M9\\r\\nxxCLSzEiJY8bIdRLBsfmB0uVIE2144s2tH7Q8R2fSOVbiSTH1PW3Ye0kkyCcBw==\",\"signature\":\"ed99a2ce827a4d443e2639ccfb78865e913854e2d61d1746dafb640e19cbb4f8#3793b1cac082d9e1cdfc2b7b8387a8c29e44b2f3fb35b352d02f1b2c9321e0a7\"}"
decrypt, err := Sm4Decrypt(uid, SELF_PRI, PARTY_PUB, en, true) decrypt, err := Sm4Decrypt(uid, SELF_PRI, PARTY_PUB, en, true)
if err != nil { if err != nil {
panic(err) panic(err)
@ -34,8 +38,8 @@ func TestSM4Decrypt(t *testing.T) {
} }
func encrypt() (string, string) { func encrypt() (string, string) {
uid := "1234567890" uid := strconv.FormatInt(int64(5476377146882523149), 10)
data := "{\"name\":\"张三\",\"sex\":1,\"is_human\":true}" data := "{\"pay_channel_id\":1729382256910270476,\"out_trade_no\":\"asdadasdas\",\"order_type\":1,\"amount\":1,\"desc\":\"abc\",\"ext_json\":\"\",\"app_id\":5476377146882523149,\"timestamp\":1723096731}"
en, err := Sm4Encrypt(uid, PARTY_PRI, SELF_PUB, data, "", true) en, err := Sm4Encrypt(uid, PARTY_PRI, SELF_PUB, data, "", true)
if err != nil { if err != nil {
panic(err) panic(err)

1
go.mod
View File

@ -82,6 +82,7 @@ require (
github.com/hetiansu5/accesslog v1.0.0 // indirect github.com/hetiansu5/accesslog v1.0.0 // indirect
github.com/hetiansu5/cores v1.0.0 // indirect github.com/hetiansu5/cores v1.0.0 // indirect
github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect
github.com/jinzhu/copier v0.4.0 // indirect
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af // indirect github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af // indirect
github.com/josharian/intern v1.0.0 // indirect github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect github.com/json-iterator/go v1.1.12 // indirect

2
go.sum
View File

@ -443,6 +443,8 @@ github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0f
github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8=
github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg=
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM=
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=