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