You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

131 lines
4.3 KiB

package pay
import (
"yunyan/comm"
"yunyan/pb"
"yunyan/sys/pay/alipay"
"yunyan/sys/pay/appleiap"
"yunyan/sys/pay/googleiap"
"yunyan/sys/pay/paypal"
"yunyan/sys/pay/wechat"
"encoding/json"
"time"
)
// @Summary 创建支付订单
// @Description 创建支付订单并返回支付信息
// @Tags Pay
// @Accept json
// @Produce json
// @Security BearerAuth
// @Param order body pb.PayCreatePayOrderReq true "订单信息"
// @Success 200 {object} comm.HttpResult{data=pb.PayCreatePayOrderResp} "支付订单信息"
// @Router /api/home/pay_createorder [post]
func (this *apiComp) CreateOrder(session comm.IUserSession, req *pb.PayCreatePayOrderReq) (resp *pb.PayCreatePayOrderResp, errdata *pb.ErrorData) {
var (
osrderNo string
appPayParams *wechat.AppPayParams
alipayPayParams string
paypalPayParams string
err error
)
resp = &pb.PayCreatePayOrderResp{
Orderid: osrderNo,
ProductId: req.ProductId,
ProductName: req.ProductName,
}
if req.PaymentMethod == pb.PaymentMethod_WxAPP {
osrderNo = wechat.GenerateOrderNo("WxAPP")
if appPayParams, err = wechat.CreateAppOrder(session, osrderNo, req.Amount, req.ProductName, req.NotifyUrl); err != nil {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_PayCreateOrderFail,
Message: "创建微信支付订单失败:" + err.Error(),
}
return
}
resp.PayParams = &pb.AppPayParams{
Appid: appPayParams.AppID,
Partnerid: appPayParams.PartnerID,
Prepayid: appPayParams.PrepayID,
Package: appPayParams.Package,
Noncestr: appPayParams.NonceStr,
Timestamp: appPayParams.TimeStamp,
Sign: appPayParams.Sign,
}
} else if req.PaymentMethod == pb.PaymentMethod_Alipay {
osrderNo = alipay.GenerateOrderNo("Alipay")
if alipayPayParams, err = alipay.CreateAppOrder(session, osrderNo, req.Amount, req.ProductName, req.NotifyUrl); err != nil {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_PayCreateOrderFail,
Message: "创建微信支付订单失败:" + err.Error(),
}
return
}
resp.AlipayPayParams = alipayPayParams
} else if req.PaymentMethod == pb.PaymentMethod_PayPal {
osrderNo = paypal.GenerateOrderNo("PayPal")
if paypalPayParams, err = paypal.CreateAppOrder(session, osrderNo, req.Amount, req.ProductName, req.ReturnUrl, req.CancelUrl); err != nil {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_PayCreateOrderFail,
Message: "创建PayPal支付订单失败:" + err.Error(),
}
return
}
// CreateAppOrder 返回 JSON 字符串,包含 order_id 和 links
resp.PaypalPayParams = paypalPayParams
} else if req.PaymentMethod == pb.PaymentMethod_AppleIAP {
osrderNo = appleiap.GenerateOrderNo("AppleIAP")
} else if req.PaymentMethod == pb.PaymentMethod_GoogleIAP {
osrderNo = googleiap.GenerateOrderNo("GoogleIAP")
} else {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_PayCreateOrderFail,
Message: "不支持的支付方式",
}
return
}
// this.module.Debugf("CreateOrder appPayParams:%v", appPayParams)
// 如果是 PayPal,解析并保存第三方订单号(用于后续 capture)
var paypalOrderID string
if req.PaymentMethod == pb.PaymentMethod_PayPal && paypalPayParams != "" {
var m map[string]any
if json.Unmarshal([]byte(paypalPayParams), &m) == nil {
if v, ok := m["order_id"].(string); ok {
paypalOrderID = v
}
}
}
if err = this.module.model.createPayOrder(&pb.DBPayOrder{
OrderId: osrderNo,
Uid: session.GetUserId(),
ProductId: req.ProductId,
ProductName: req.ProductName,
Amount: req.Amount,
PaymentMethod: req.PaymentMethod,
Status: pb.PayOrderStatus_PAY_ORDER_PENDING,
TransactionId: paypalOrderID,
CreateTime: time.Now().Unix(),
}); err != nil {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_PayCreateOrderFail,
Message: "创建支付订单失败:" + err.Error(),
}
return
}
// 订单创建埋点(按用户最后绑定的产品归属统计)
if this.module.analyze != nil {
var lastbindpid uint32
if u, uerr := this.module.model.getUser(session.GetUserId()); uerr == nil && u != nil {
lastbindpid = u.Lastbindproductid
}
this.module.analyze.Report(&comm.StatEvent{
Type: comm.StatEventOrderCreate,
ProductId: lastbindpid,
Uid: session.GetUserId(),
Amount: req.Amount,
})
}
resp.Orderid = osrderNo
return
}