1
This commit is contained in:
186
services/print_server/app_server/tonglian_pay_utils.go
Normal file
186
services/print_server/app_server/tonglian_pay_utils.go
Normal file
@@ -0,0 +1,186 @@
|
||||
package app_server
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"git.rosy.net.cn/baseapi/platformapi/tonglianpayapi"
|
||||
"git.rosy.net.cn/baseapi/platformapi/wxpayapi"
|
||||
"git.rosy.net.cn/baseapi/utils"
|
||||
"git.rosy.net.cn/jx-print/dao"
|
||||
"git.rosy.net.cn/jx-print/globals"
|
||||
userModel "git.rosy.net.cn/jx-print/model"
|
||||
printModel "git.rosy.net.cn/jx-print/model/app_model"
|
||||
"git.rosy.net.cn/jx-print/services/api"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/jmoiron/sqlx"
|
||||
"math/rand"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
// pay4OrderByWX 直接微信支付
|
||||
func pay4OrderByWX(user *userModel.User, totalFell int, ip, vendorPayType string) (orderPay *printModel.OrderPay, err error) {
|
||||
payCreatedAt := time.Now()
|
||||
param := &wxpayapi.CreateOrderParam{
|
||||
OutTradeNo: utils.Int64ToStr(time.Now().Unix()) + fmt.Sprintf("%d", rand.Intn(100000)),
|
||||
Body: printModel.PayBody,
|
||||
NotifyURL: globals.TongLianPayCallBack,
|
||||
SpbillCreateIP: ip,
|
||||
TradeType: vendorPayType,
|
||||
TotalFee: totalFell,
|
||||
|
||||
TimeStart: wxpayapi.Time2PayTime(payCreatedAt),
|
||||
ProfitSharing: wxpayapi.OptYes,
|
||||
}
|
||||
if user.OpenId != "" {
|
||||
param.OpenID = user.OpenId
|
||||
}
|
||||
|
||||
result, err := api.WxpayAPI.CreateUnifiedOrder(param)
|
||||
if err == nil {
|
||||
orderPay = &printModel.OrderPay{
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
PayOrderID: param.OutTradeNo,
|
||||
PayType: printModel.PayTypeWX,
|
||||
VendorPayType: vendorPayType,
|
||||
Status: 0,
|
||||
PayCreatedAt: payCreatedAt,
|
||||
PrepayID: result.PrepayID,
|
||||
CodeURL: result.CodeURL,
|
||||
TotalFee: int(totalFell),
|
||||
}
|
||||
}
|
||||
return orderPay, err
|
||||
}
|
||||
|
||||
// pay4OrderByTL 通联支付
|
||||
func pay4OrderByTL(user *userModel.User, totalFell int, payType int, vendorPayType string) (orderPay *printModel.OrderPay, err error) {
|
||||
payCreatedAt := time.Now()
|
||||
param := &tonglianpayapi.CreateUnitorderOrderParam{
|
||||
Trxamt: totalFell,
|
||||
NotifyUrl: globals.TongLianPayCallBack,
|
||||
Reqsn: utils.Int64ToStr(time.Now().Unix()) + fmt.Sprintf("%d", rand.Intn(100000)),
|
||||
PayType: vendorPayType,
|
||||
}
|
||||
//暂时做兼容处理
|
||||
if vendorPayType == "JSAPI" {
|
||||
param.PayType = tonglianpayapi.PayTypeWxXcx
|
||||
}
|
||||
if vendorPayType == tonglianpayapi.PayTypeWxXcx {
|
||||
param.Acct = user.OpenId
|
||||
}
|
||||
|
||||
if vendorPayType == tonglianpayapi.PayTypeZfbJS || vendorPayType == tonglianpayapi.PayTypeZfbApp {
|
||||
param.Acct = user.OpenId
|
||||
if param.Acct == "" {
|
||||
return nil, fmt.Errorf("未找到用户的认证ID!")
|
||||
}
|
||||
}
|
||||
if vendorPayType == tonglianpayapi.PayTypeH5 {
|
||||
param2 := &tonglianpayapi.CreateH5UnitorderOrderParam{
|
||||
Trxamt: totalFell,
|
||||
NotifyUrl: globals.TongLianPayCallBack,
|
||||
Body: printModel.PayBody,
|
||||
Charset: "UTF-8",
|
||||
}
|
||||
err = api.TLpayAPI.CreateH5UnitorderOrder(param2)
|
||||
} else {
|
||||
result, err := api.TLpayAPI.CreateUnitorderOrder(param)
|
||||
if err == nil {
|
||||
var result2 tonglianpayapi.PayInfo
|
||||
json.Unmarshal([]byte(result.PayInfo), &result2)
|
||||
prePayID := result2.Package[strings.LastIndex(result2.Package, "=")+1 : len(result2.Package)]
|
||||
orderPay = &printModel.OrderPay{
|
||||
PayOrderID: param.Reqsn,
|
||||
PayType: payType,
|
||||
VendorPayType: vendorPayType,
|
||||
TransactionID: result.TrxID,
|
||||
VendorOrderID: param.Reqsn,
|
||||
VendorID: printModel.OrderPayVendorId,
|
||||
Status: 0,
|
||||
PayCreatedAt: payCreatedAt,
|
||||
PrepayID: prePayID,
|
||||
CodeURL: utils.LimitUTF8StringLen(result.PayInfo, 3200),
|
||||
TotalFee: param.Trxamt,
|
||||
}
|
||||
}
|
||||
}
|
||||
return orderPay, err
|
||||
}
|
||||
|
||||
// onTLPayFinished 通联微信支付回调
|
||||
func onTLPayFinished(call *tonglianpayapi.CallBackResult) (err error) {
|
||||
orderPay, err := dao.QueryPrinterPayRecord(call.CusorderID)
|
||||
if err != nil {
|
||||
globals.SugarLogger.Debugf("onTLpayFinished msg:%s, err:%v", utils.Format4Output(call, true), err)
|
||||
return err
|
||||
}
|
||||
if orderPay.Status != 0 {
|
||||
return err
|
||||
}
|
||||
loc, _ := time.LoadLocation("Local")
|
||||
t1, _ := time.ParseInLocation("20060102150405", call.PayTime, loc)
|
||||
orderPay.PayFinishedAt = t1
|
||||
orderPay.OriginalData = utils.Format4Output(call, true)
|
||||
if call.TrxStatus == tonglianpayapi.TrxStatusSuccess {
|
||||
orderPay.Status = printModel.PayStatusYes
|
||||
} else {
|
||||
orderPay.Status = printModel.PayStatusFailed
|
||||
}
|
||||
|
||||
txDb := globals.GetTxDb()
|
||||
if err := dao.UpdatePrinterPayRecord(txDb, orderPay, "status", "pay_finished_at", "original_data"); err != nil {
|
||||
globals.SugarLogger.Debugf("UpdatePrinterPayRecord msg:%s, err:%v", utils.Format4Output(call, true), err)
|
||||
txDb.Rollback()
|
||||
return err
|
||||
}
|
||||
|
||||
if call.TrxStatus == tonglianpayapi.TrxStatusSuccess {
|
||||
err = onPayFinished(txDb, orderPay)
|
||||
}
|
||||
|
||||
txDb.Commit()
|
||||
return err
|
||||
}
|
||||
|
||||
// onPayFinished 通联支付完成时,修改打印机账户余额
|
||||
func onPayFinished(db *sqlx.Tx, param *printModel.OrderPay) error {
|
||||
// 修改打印机余额
|
||||
if err := dao.AddMoney(db, param.PrintNo, int64(param.TotalFee)); err != nil {
|
||||
globals.SugarLogger.Debugf("onPayFinished update bancall err = %v", err)
|
||||
db.Rollback()
|
||||
return err
|
||||
}
|
||||
// 添加充值记录
|
||||
record := &printModel.PrintBillRecord{
|
||||
CreatedAt: time.Now(),
|
||||
UpdatedAt: time.Now(),
|
||||
PrintNo: param.PrintNo,
|
||||
PayType: 1,
|
||||
PayMoney: param.TotalFee,
|
||||
OrderId: param.PayOrderID,
|
||||
UserId: "",
|
||||
}
|
||||
if err := dao.AddIncomeRecord(db, record); err != nil {
|
||||
globals.SugarLogger.Debugf("onPayFinished AddIncomeRecord bancall err = %v", err)
|
||||
db.Rollback()
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetRealRemoteIP 获取ip
|
||||
func (p *PrintPay) GetRealRemoteIP(ctx *gin.Context) (ip string) {
|
||||
ip = ctx.ClientIP()
|
||||
if ip == "" {
|
||||
ip = ctx.Request.Header.Get("X-real-ip")
|
||||
}
|
||||
if ip == "" {
|
||||
ip = strings.Split(ctx.Request.RemoteAddr, ":")[0]
|
||||
} else {
|
||||
ip = strings.Split(ip, ",")[0]
|
||||
}
|
||||
return ip
|
||||
}
|
||||
Reference in New Issue
Block a user