dongfeng-pay/gateway/controllers/gateway/payfor_gateway.go

257 lines
9.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/***************************************************
** @Desc : This file for ...
** @Time : 2019/12/5 14:05
** @Author : yuebin
** @File : payfor_gateway
** @Last Modified by : yuebin
** @Last Modified time: 2019/12/5 14:05
** @Software: GoLand
****************************************************/
package gateway
import (
"encoding/json"
"fmt"
"gateway/common"
"gateway/models"
"gateway/utils"
"github.com/beego/beego/v2/core/logs"
beego "github.com/beego/beego/v2/server/web"
"github.com/rs/xid"
"strconv"
"strings"
)
type PayForGateway struct {
beego.Controller
}
type PayForResponse struct {
ResultCode string `json:"resultCode,omitempty"`
ResultMsg string `json:"resultMsg,omitempty"`
MerchantOrderId string `json:"merchantOrderId,omitempty"`
SettAmount string `json:"settAmount,omitempty"`
SettFee string `json:"settFee,omitempty"`
Sign string `json:"sign,omitempty"`
}
type PayForQueryResponse struct {
ResultMsg string `json:"resultMsg,omitempty"`
MerchantOrderId string `json:"merchantOrderId,omitempty"`
SettAmount string `json:"settAmount,omitempty"`
SettFee string `json:"settFee,omitempty"`
SettStatus string `json:"settStatus,omitempty"`
Sign string `json:"sign,omitempty"`
}
type BalanceResponse struct {
resultCode string `json:"resultCode,omitempty"`
balance string `json:"balance,omitempty"`
availableAmount string `json:"availableAmount,omitempty"`
freezeAmount string `json:"freezeAmount,omitempty"`
waitAmount string `json:"waitAmount,omitempty"`
loanAmount string `json:"loanAmount,omitempty"`
payforAmount string `json:"payforAmount,omitempty"`
resultMsg string `json:"resultMsg,omitempty"`
sign string `json:"sign,omitempty"`
}
/*
* 接受下游商户的代付请求
*/
func (c *PayForGateway) PayFor() {
params := make(map[string]string)
params["merchantKey"] = strings.TrimSpace(c.GetString("merchantKey"))
params["realname"] = strings.TrimSpace(c.GetString("realname"))
params["cardNo"] = strings.TrimSpace(c.GetString("cardNo"))
params["bankCode"] = strings.TrimSpace(c.GetString("bankCode"))
params["accType"] = strings.TrimSpace(c.GetString("accType"))
params["province"] = strings.TrimSpace(c.GetString("province"))
params["city"] = strings.TrimSpace(c.GetString("city"))
params["bankAccountAddress"] = strings.TrimSpace(c.GetString("bankAccountAddress"))
params["amount"] = strings.TrimSpace(c.GetString("amount"))
params["moblieNo"] = strings.TrimSpace(c.GetString("moblieNo"))
params["merchantOrderId"] = strings.TrimSpace(c.GetString("merchantOrderId"))
params["sign"] = strings.TrimSpace(c.GetString("sign"))
payForResponse := new(PayForResponse)
res, msg := c.checkParams(params)
if !res {
payForResponse.ResultCode = "01"
payForResponse.ResultMsg = msg
c.Data["json"] = payForResponse
c.ServeJSON()
return
}
merchantInfo := models.GetMerchantByPaykey(params["merchantKey"])
if !utils.Md5Verify(params, merchantInfo.MerchantSecret) {
logs.Error(fmt.Sprintf("下游商户代付请求,签名失败,商户信息: %+v", merchantInfo))
payForResponse.ResultCode = "01"
payForResponse.ResultMsg = "下游商户代付请求,签名失败。"
} else {
res, msg = c.checkSettAmount(params["amount"])
if !res {
payForResponse.ResultCode = "01"
payForResponse.ResultMsg = msg
c.Data["json"] = payForResponse
c.ServeJSON()
return
}
exist := models.IsExistPayForByMerchantOrderId(params["merchantOrderId"])
if exist {
logs.Error(fmt.Sprintf("代付订单号重复merchantOrderId = %s", params["merchantOrderId"]))
payForResponse.ResultMsg = "商户订单号重复"
payForResponse.ResultCode = "01"
c.Data["json"] = payForResponse
c.ServeJSON()
return
}
settAmount, _ := strconv.ParseFloat(params["amount"], 64)
payFor := models.PayforInfo{PayforUid: "pppp" + xid.New().String(), MerchantUid: merchantInfo.MerchantUid, MerchantName: merchantInfo.MerchantName,
MerchantOrderId: params["merchantOrderId"], BankOrderId: "4444" + xid.New().String(), PayforAmount: settAmount, Status: common.PAYFOR_COMFRIM,
BankCode: params["bankCode"], BankName: params["bankAccountAddress"], BankAccountName: params["realname"], BankAccountNo: params["cardNo"],
BankAccountType: params["accType"], City: params["city"], Ares: params["province"] + params["city"], PhoneNo: params["mobileNo"], Type: common.SELF_API,
UpdateTime: utils.GetBasicDateTime(), CreateTime: utils.GetBasicDateTime(),
}
if !models.InsertPayfor(payFor) {
payForResponse.ResultCode = "01"
payForResponse.ResultMsg = "代付记录插入失败"
} else {
payForResponse.ResultMsg = "代付订单已生成"
payForResponse.ResultCode = "00"
payForResponse.SettAmount = params["amount"]
payForResponse.MerchantOrderId = params["MerchantOrderId"]
tmp := make(map[string]string)
tmp["resultCode"] = payForResponse.ResultCode
tmp["resultMsg"] = payForResponse.ResultMsg
tmp["merchantOrderId"] = payForResponse.MerchantOrderId
tmp["settAmount"] = payForResponse.SettAmount
keys := utils.SortMap(tmp)
sign := utils.GetMD5Sign(params, keys, merchantInfo.MerchantSecret)
tmp["sign"] = sign
c.Data["json"] = payForResponse
c.ServeJSON()
}
}
}
func (c *PayForGateway) checkSettAmount(settAmount string) (bool, string) {
_, err := strconv.ParseFloat(settAmount, 64)
if err != nil {
logs.Error(fmt.Sprintf("代付金额有误settAmount = %s", settAmount))
return false, "代付金额有误"
}
return true, ""
}
func (c *PayForGateway) checkParams(params map[string]string) (bool, string) {
for k, v := range params {
if v == "" || len(v) == 0 {
return false, fmt.Sprintf("字段: %s 为必填!", k)
}
}
return true, ""
}
/*
* 代付结果查询,
*/
func (c *PayForGateway) PayForQuery() {
params := make(map[string]string)
params["merchantKey"] = strings.TrimSpace(c.GetString("merchantKey"))
params["timestamp"] = strings.TrimSpace(c.GetString("timestamp"))
params["merchantOrderId"] = strings.TrimSpace(c.GetString("merchantOrderId"))
params["sign"] = strings.TrimSpace(c.GetString("sign"))
query := make(map[string]string)
query["merchantOrderId"] = params["merchantOrderId"]
merchantInfo := models.GetMerchantByPaykey(params["merchantKey"])
if !utils.Md5Verify(params, merchantInfo.MerchantSecret) {
query["resultMsg"] = "签名错误"
query["settStatus"] = "03"
query["sign"] = utils.GetMD5Sign(params, utils.SortMap(params), merchantInfo.MerchantSecret)
} else {
payForInfo := models.GetPayForByMerchantOrderId(params["merchantOrderId"])
if payForInfo.BankOrderId == "" {
query["resultMsg"] = "不存在这样的代付订单"
query["settStatus"] = "03"
query["sign"] = utils.GetMD5Sign(params, utils.SortMap(params), merchantInfo.MerchantSecret)
} else {
switch payForInfo.Status {
case common.PAYFOR_BANKING:
query["resultMsg"] = "打款中"
query["settStatus"] = "02"
case common.PAYFOR_SOLVING:
query["resultMsg"] = "打款中"
query["settStatus"] = "02"
case common.PAYFOR_COMFRIM:
query["resultMsg"] = "打款中"
query["settStatus"] = "02"
case common.PAYFOR_SUCCESS:
query["resultMsg"] = "打款成功"
query["settStatus"] = "00"
query["settAmount"] = strconv.FormatFloat(payForInfo.PayforAmount, 'f', 2, 64)
query["settFee"] = strconv.FormatFloat(payForInfo.PayforFee, 'f', 2, 64)
case common.PAYFOR_FAIL:
query["resultMsg"] = "打款失败"
query["settStatus"] = "01"
}
query["sign"] = utils.GetMD5Sign(query, utils.SortMap(query), merchantInfo.MerchantSecret)
}
}
mJson, err := json.Marshal(query)
if err != nil {
logs.Error("PayForQuery json marshal fail", err)
}
c.Data["json"] = string(mJson)
c.ServeJSON()
}
/*
* 商户查找余额
*/
func (c *PayForGateway) Balance() {
params := make(map[string]string)
params["merchantKey"] = strings.TrimSpace(c.GetString("merchantKey"))
params["timestamp"] = strings.TrimSpace(c.GetString("timestamp"))
params["sign"] = strings.TrimSpace(c.GetString("sign"))
balanceResponse := new(BalanceResponse)
res, msg := c.checkParams(params)
if !res {
balanceResponse.resultCode = "-1"
balanceResponse.resultMsg = msg
c.Data["json"] = balanceResponse
} else {
merchantInfo := models.GetMerchantByPaykey(params["merchantKey"])
if !utils.Md5Verify(params, merchantInfo.MerchantSecret) {
balanceResponse.resultCode = "-1"
balanceResponse.resultMsg = "签名错误"
c.Data["json"] = balanceResponse
} else {
accountInfo := models.GetAccountByUid(merchantInfo.MerchantUid)
tmp := make(map[string]string)
tmp["resultCode"] = "00"
tmp["balance"] = strconv.FormatFloat(accountInfo.Balance, 'f', 2, 64)
tmp["availableAmount"] = strconv.FormatFloat(accountInfo.SettleAmount, 'f', 2, 64)
tmp["freezeAmount"] = strconv.FormatFloat(accountInfo.FreezeAmount, 'f', 2, 64)
tmp["waitAmount"] = strconv.FormatFloat(accountInfo.WaitAmount, 'f', 2, 64)
tmp["loanAmount"] = strconv.FormatFloat(accountInfo.LoanAmount, 'f', 2, 64)
tmp["payforAmount"] = strconv.FormatFloat(accountInfo.PayforAmount, 'f', 2, 64)
tmp["resultMsg"] = "查询成功"
tmp["sign"] = utils.GetMD5Sign(tmp, utils.SortMap(tmp), merchantInfo.MerchantSecret)
mJson, _ := json.Marshal(tmp)
c.Data["json"] = string(mJson)
}
}
c.ServeJSON()
}