parent
6c1ce4a097
commit
cfdce2798b
4 changed files with 202 additions and 0 deletions
@ -0,0 +1,126 @@ |
||||
package payplus |
||||
|
||||
import ( |
||||
"errors" |
||||
"fmt" |
||||
"net/http" |
||||
"server/common" |
||||
"server/modules/pay/base" |
||||
"server/modules/pay/values" |
||||
"server/pb" |
||||
|
||||
"github.com/gogo/protobuf/proto" |
||||
"github.com/liangdas/mqant/log" |
||||
) |
||||
|
||||
func NewSub(b *base.Base) { |
||||
sub := &Sub{ |
||||
Base: b, |
||||
} |
||||
b.SignKey = key |
||||
b.HttpType = base.HttpTypeForm |
||||
b.ShouldSignUpper = true |
||||
b.Channel = values.PayPlus |
||||
if b.Opt == 1 { |
||||
b.Resp = new(PayReq) |
||||
b.ReqURL = payApi |
||||
} else if b.Opt == 2 { |
||||
b.Resp = new(WithdrawReq) |
||||
b.ReqURL = withdrawApi |
||||
} else if b.Opt == 3 { |
||||
b.SignPassStr = []string{"sign"} |
||||
b.CallbackResp.Msg = "SUCCESS" |
||||
b.CallbackReq = new(PayCallbackReq) |
||||
} else if b.Opt == 4 { |
||||
b.SignPassStr = []string{"sign", "msg"} |
||||
b.CallbackResp.Msg = "SUCCESS" |
||||
b.CallbackReq = new(WithdrawCallbackReq) |
||||
} |
||||
b.Sub = sub |
||||
} |
||||
|
||||
type Sub struct { |
||||
Base *base.Base |
||||
} |
||||
|
||||
func (s *Sub) PackHeader(header http.Header) { |
||||
// header.Set("Merchant-Id", config.GetConfig().Pay.IGeek.MID)
|
||||
} |
||||
|
||||
func (s *Sub) PackReq() interface{} { |
||||
if s.Base.Opt == 1 { |
||||
return s.PackPayReq() |
||||
} |
||||
return s.PackWithdrawReq() |
||||
} |
||||
|
||||
func (s *Sub) GetResp() (proto.Message, error) { |
||||
if s.Base.Opt == 1 { |
||||
resp := s.Base.Resp.(*PaymentResponse) |
||||
if resp.RetCode != StatusSuccess || resp.PayUrl == "" { |
||||
return nil, errors.New("pay fail") |
||||
} |
||||
return &pb.InnerRechargeResp{APIOrderID: fmt.Sprintf("%v", resp.OrderNo), URL: resp.PayUrl, Channel: uint32(values.PayPlus)}, nil |
||||
} |
||||
resp := s.Base.Resp.(*PayoutResponse) |
||||
if s.Base.Status == 0 && resp.RetCode != StatusSuccess { |
||||
return nil, errors.New("withdraw fail") |
||||
} |
||||
return &pb.InnerWithdrawResp{APIOrderID: fmt.Sprintf("%v", resp.MchTransNo), Channel: uint32(values.PayPlus)}, nil |
||||
} |
||||
|
||||
func (s *Sub) PackPayReq() interface{} { |
||||
r := s.Base.PayReq |
||||
send := &PayReq{ |
||||
Amount: r.Amount, |
||||
MchId: "", |
||||
OrderNo: r.OrderID, |
||||
NotifyUrl: values.GetPayCallback(values.PayPlus), |
||||
} |
||||
send.Sign = s.Base.SignMD5(send) |
||||
return send |
||||
} |
||||
|
||||
func (s *Sub) PackWithdrawReq() interface{} { |
||||
r := s.Base.WithdrawReq |
||||
if r.PayType != int64(common.PayTypeBank) { |
||||
return nil |
||||
} |
||||
send := &WithdrawReq{ |
||||
Amount: r.Amount, |
||||
MchId: "", |
||||
OrderNo: r.OrderID, |
||||
BankCode: r.PayCode, |
||||
AccountName: r.Name, |
||||
AccountNo: r.CardNo, |
||||
NotifyUrl: values.GetWithdrawCallback(values.PayPlus), |
||||
} |
||||
|
||||
send.Sign = s.Base.SignMD5(send) |
||||
return send |
||||
} |
||||
|
||||
func (s *Sub) CheckSign(str string) bool { |
||||
// str += "&key=" + key
|
||||
checkSign := "" |
||||
s.Base.CallbackResp.Msg = "SUCCESS" |
||||
mySign := "" |
||||
if s.Base.Opt == 3 { |
||||
req := s.Base.CallbackReq.(*PayCallbackReq) |
||||
log.Debug("checkSign pay:%+v", *req) |
||||
checkSign = req.Sign |
||||
s.Base.CallbackResp.OrderID = req.OrderNo |
||||
s.Base.CallbackResp.Success = req.Status == StatusSuccess |
||||
mySign = s.Base.SignMD5(req) |
||||
} else if s.Base.Opt == 4 { |
||||
req := s.Base.CallbackReq.(*WithdrawCallbackReq) |
||||
log.Debug("checkSign withdraw:%+v", *req) |
||||
checkSign = req.Sign |
||||
s.Base.CallbackResp.OrderID = req.OrderNo |
||||
s.Base.CallbackResp.Success = req.Status == StatusSuccess |
||||
s.Base.CallbackResp.APIOrderID = req.TradeNo |
||||
s.Base.CallbackResp.FailMessage = "" |
||||
mySign = s.Base.SignMD5(req) |
||||
} |
||||
return mySign == checkSign |
||||
} |
||||
@ -0,0 +1,72 @@ |
||||
package payplus |
||||
|
||||
// 常量定义
|
||||
const ( |
||||
key = "your_secret_key" |
||||
StatusSuccess = "SUCCESS" |
||||
StatusFail = "FAIL" |
||||
payApi = "http://api.letspayfast.com/apipay" |
||||
withdrawApi = "http://api.letspayfast.com/apitrans" |
||||
) |
||||
|
||||
// PayReq 支付请求结构体
|
||||
type PayReq struct { |
||||
MchId string `json:"mchId" binding:"required"` // 商户号
|
||||
OrderNo string `json:"orderNo" binding:"required"` // 订单号
|
||||
Amount int64 `json:"amount" binding:"required"` // 支付金额
|
||||
NotifyUrl string `json:"notifyUrl" binding:"required"` // 支付结果通知的回调URL
|
||||
Sign string `json:"sign,omitempty"` // 签名,生成后填充
|
||||
} |
||||
|
||||
// PaymentResponse 支付响应结构体
|
||||
type PaymentResponse struct { |
||||
RetCode string `json:"retCode"` |
||||
PayUrl string `json:"payUrl"` |
||||
OrderNo string `json:"orderNo"` |
||||
PlatOrder string `json:"platOrder"` |
||||
Code string `json:"code"` |
||||
RetMsg string `json:"retMsg"` |
||||
} |
||||
|
||||
// PayCallbackReq 支付通知结构体
|
||||
type PayCallbackReq struct { |
||||
MchId string `json:"mchId" binding:"required"` // 商户号
|
||||
OrderNo string `json:"orderNo" binding:"required"` // 订单号
|
||||
Amount string `json:"amount" binding:"required"` // 支付金额
|
||||
TradeNo string `json:"tradeNo" binding:"required"` // 支付平台生成的交易号
|
||||
Status string `json:"status" binding:"required"` // 支付状态(如成功、失败)
|
||||
Sign string `json:"sign" binding:"required"` // 签名,用于验证通知的真实性
|
||||
} |
||||
|
||||
// WithdrawReq 代付请求结构体
|
||||
type WithdrawReq struct { |
||||
MchId string `json:"mchId" binding:"required"` // 商户号
|
||||
OrderNo string `json:"orderNo" binding:"required"` // 订单号
|
||||
Amount int64 `json:"amount" binding:"required"` // 代付金额
|
||||
BankCode string `json:"bankCode" binding:"required"` // 收款银行代码
|
||||
AccountName string `json:"accountName" binding:"required"` // 收款人姓名
|
||||
AccountNo string `json:"accountNo" binding:"required"` // 收款账号
|
||||
NotifyUrl string `json:"notifyUrl" binding:"required"` // 代付结果通知的回调URL
|
||||
Sign string `json:"sign,omitempty"` // 签名,生成后填充
|
||||
} |
||||
|
||||
// PayoutResponse 代付响应结构体
|
||||
type PayoutResponse struct { |
||||
RetCode string `json:"retCode"` |
||||
RetMsg string `json:"retMsg"` |
||||
MchTransNo string `json:"mchTransNo"` |
||||
PlatOrder string `json:"platOrder"` |
||||
Status string `json:"status"` |
||||
} |
||||
|
||||
// WithdrawCallbackReq 代付通知结构体
|
||||
type WithdrawCallbackReq struct { |
||||
MchId string `json:"mchId" binding:"required"` // 商户号
|
||||
OrderNo string `json:"orderNo" binding:"required"` // 订单号
|
||||
Amount string `json:"amount" binding:"required"` // 代付金额
|
||||
TradeNo string `json:"tradeNo" binding:"required"` // 代付平台生成的交易号
|
||||
Status string `json:"status" binding:"required"` // 代付状态(如成功、失败)
|
||||
AccountName string `json:"accountName" binding:"required"` // 收款人姓名
|
||||
AccountNo string `json:"accountNo" binding:"required"` // 收款账号
|
||||
Sign string `json:"sign" binding:"required"` // 签名,用于验证通知的真实性
|
||||
} |
||||
Loading…
Reference in new issue