@@ -0,0 +1,21 @@ | |||||
package model | |||||
import ( | |||||
"time" | |||||
) | |||||
type FbPaySet struct { | |||||
Id int `json:"id" xorm:"not null pk autoincr INT(11)"` | |||||
IsUse int `json:"is_use" xorm:"not null default 0 comment('1开启') TINYINT(1)"` | |||||
VendorSn string `json:"vendor_sn" xorm:"not null comment('服务商开放平台id(服务商后台生成') VARCHAR(255)"` | |||||
StoreId string `json:"store_id" xorm:"not null comment('商户门店号') VARCHAR(255)"` | |||||
AppSecret string `json:"app_secret" xorm:"not null default '' comment('appSecret') VARCHAR(255)"` | |||||
MerchantId string `json:"merchant_id" xorm:"not null comment('呗商户号,以服务商级接入时必传,以商户级接入时不传') VARCHAR(255)"` | |||||
PayImg string `json:"pay_img" xorm:"not null comment('支付图标') VARCHAR(255)"` | |||||
UpdateTime time.Time `json:"update_time" xorm:"not null default 'CURRENT_TIMESTAMP' comment('更新时间') DATETIME"` | |||||
AliPayUse int `json:"ali_pay_use" xorm:"not null default 1 comment('1开启') TINYINT(1)"` | |||||
WechatPayUse int `json:"wechat_pay_use" xorm:"not null default 1 comment('1开启') TINYINT(1)"` | |||||
FastPayUse int `json:"fast_pay_use" xorm:"default 0 comment('1开启') TINYINT(1)"` | |||||
AppId string `json:"app_id" xorm:"not null comment('付呗应用id') VARCHAR(255)"` | |||||
OriginalId string `json:"original_id" xorm:"comment('original_id') VARCHAR(255)"` | |||||
} |
@@ -0,0 +1,83 @@ | |||||
package model | |||||
import ( | |||||
"applet/app/utils/cache" | |||||
"fmt" | |||||
jsoniter "github.com/json-iterator/go" | |||||
"xorm.io/xorm" | |||||
) | |||||
var Json = jsoniter.ConfigCompatibleWithStandardLibrary | |||||
func (set *FbPaySet) init(engine *xorm.Engine) error { | |||||
_, err := engine.Insert(set) | |||||
return err | |||||
} | |||||
func (set *FbPaySet) Get(engine *xorm.Engine) error { | |||||
exist, err := engine.IsTableExist(set) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
if !exist { | |||||
if err := engine.CreateTables(set); err != nil { | |||||
return err | |||||
} | |||||
} | |||||
if err != nil { | |||||
return err | |||||
} | |||||
get, err := engine.Get(set) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
if !get { | |||||
err := set.init(engine) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
} | |||||
return nil | |||||
} | |||||
func (set *FbPaySet) Update(engine *xorm.Engine, cols []string) error { | |||||
if len(cols) == 0 { | |||||
_, err := engine.ID(set.Id).AllCols().Update(set) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
return nil | |||||
} else { | |||||
_, err := engine.ID(set.Id).Cols(cols...).Update(set) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
return nil | |||||
} | |||||
} | |||||
func (set *FbPaySet) ToRedis(mid string) error { | |||||
marshalToString, err := Json.MarshalToString(set) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
key := fmt.Sprintf("%s:fb_pay_setting", mid) | |||||
_, err = cache.SetEx(key, marshalToString, 39528000) // 半年 | |||||
if err != nil { | |||||
return err | |||||
} | |||||
return nil | |||||
} | |||||
func (set *FbPaySet) GetByRedis(mid string) bool { | |||||
key := fmt.Sprintf("%s:fb_pay_setting", mid) | |||||
marshalString, _ := cache.GetString(key) | |||||
if marshalString == "" || len(marshalString) < 10 { | |||||
return false | |||||
} | |||||
err := Json.UnmarshalFromString(marshalString, set) | |||||
if err != nil { | |||||
return false | |||||
} | |||||
return true | |||||
} |
@@ -0,0 +1,42 @@ | |||||
package model | |||||
import ( | |||||
"time" | |||||
) | |||||
type MerchantIncomeInfo struct { | |||||
Id int `json:"id" xorm:"not null pk autoincr INT(11)"` | |||||
ZyosMerchantId int `json:"zyos_merchant_id" xorm:"not null comment('智莺商家id') INT(11)"` | |||||
FbMerchantCode string `json:"fb_merchant_code" xorm:"not null comment('付呗商户账号') VARCHAR(255)"` | |||||
SalesMan int `json:"sales_man" xorm:"comment('授理商编号') INT(11)"` | |||||
BaseInfo string `json:"base_info" xorm:"not null comment('付呗商户基本信息') TEXT"` | |||||
LegalPerson string `json:"legal_person" xorm:"not null comment('付呗法人信息,个人类型填联系人信息') TEXT"` | |||||
AddressInfo string `json:"address_info" xorm:"not null comment('付呗店铺地址信息') TEXT"` | |||||
LicenseInfo string `json:"license_info" xorm:"comment('付呗(营业资质信息)注:小微进件不要传此对象') TEXT"` | |||||
AccountInfo string `json:"account_info" xorm:"comment('付呗结算信息') TEXT"` | |||||
ShopInfo string `json:"shop_info" xorm:"comment('付呗门店信息') TEXT"` | |||||
RateInfo string `json:"rate_info" xorm:"comment('付呗费率') TEXT"` | |||||
OtherInfo string `json:"other_info" xorm:"comment('付呗其它信息') TEXT"` | |||||
CreateTime time.Time `json:"create_time" xorm:"created not null default 'CURRENT_TIMESTAMP' comment('创建时间') DATETIME"` | |||||
UpdateTime time.Time `json:"update_time" xorm:"updated not null default 'CURRENT_TIMESTAMP' comment('更新时间') DATETIME"` | |||||
DeletedTime time.Time `json:"deleted_time" xorm:"deleted comment('删除时间') DATETIME"` | |||||
FbMerchantId int `json:"fb_merchant_id" xorm:"comment('付呗商户号') INT(11)"` | |||||
FbStoreId int `json:"fb_store_id" xorm:"comment('付呗门店ID') INT(11)"` | |||||
IncomeSuccessInfo string `json:"income_success_info" xorm:"comment('付呗入驻成功后返回的信息') TEXT"` | |||||
LegalIdCardFrontPhoto string `json:"legal_id_card_front_photo" xorm:"comment('法人身份证正面二进制数据源') TEXT"` | |||||
LegalIdCardBackPhoto string `json:"legal_id_card_back_photo" xorm:"comment('法人身份证反面二进制数据源') TEXT"` | |||||
HandHoldIdCardPhoto string `json:"hand_hold_id_card_photo" xorm:"comment('手持身份证照二进制数据源') TEXT"` | |||||
LicensePhoto string `json:"license_photo" xorm:"comment('营业执照照片二进制数据源') TEXT"` | |||||
StoreEnvPhoto string `json:"store_env_photo" xorm:"comment('经营场所内设照片二进制数据源') TEXT"` | |||||
StoreFrontPhoto string `json:"store_front_photo" xorm:"comment('门头照二进制数据源') TEXT"` | |||||
StoreCashPhoto string `json:"store_cash_photo" xorm:"comment('收银台照片二进制数据源') TEXT"` | |||||
OperatingLicensePhoto string `json:"operating_license_photo" xorm:"comment('经营许可证图片二进制数据源') TEXT"` | |||||
BankCardPhoto string `json:"bank_card_photo" xorm:"comment('银行卡正面二进制数据源') TEXT"` | |||||
IdCardFrontPhoto string `json:"id_card_front_photo" xorm:"comment('结算人身份证正面二进制数据源') TEXT"` | |||||
IdCardBackPhoto string `json:"id_card_back_photo" xorm:"comment('结算人身份证反面二进制数据源') TEXT"` | |||||
GroupCreateState int `json:"group_create_state" xorm:"comment('创建分账组是否成功') INT(11)"` | |||||
GroupCreateResp string `json:"group_create_resp" xorm:"comment('创建分账组返回结果') TEXT"` | |||||
GroupId string `json:"group_id" xorm:"not null comment('分账组id') VARCHAR(255)"` | |||||
AgreementImg string `json:"agreement_img" xorm:"not null comment('') VARCHAR(600)"` | |||||
AppSupplementInfo string `json:"app_supplement_info" xorm:"comment('app补充信息') TEXT"` | |||||
} |
@@ -0,0 +1,23 @@ | |||||
package model | |||||
type StationLedgerInfo struct { | |||||
Id int `json:"id" xorm:"not null pk autoincr INT(11)"` | |||||
MerchantOrderSn string `json:"merchant_order_sn" xorm:"comment('系统订单号') VARCHAR(255)"` | |||||
Info string `json:"info" xorm:"comment('申请信息') TEXT"` | |||||
AccountId string `json:"account_id" xorm:"comment('分账id') VARCHAR(100)"` | |||||
Type string `json:"type" xorm:"comment('第三方类型 付呗--fubei') VARCHAR(50)"` | |||||
State int `json:"state" xorm:"default 0 comment('1审核中 2审核成功 3审核失败') INT(1)"` | |||||
ReturnData string `json:"return_data" xorm:"comment('第三方返回信息') TEXT"` | |||||
FailMessage string `json:"fail_message" xorm:"comment('失败原因') VARCHAR(255)"` | |||||
MerchantId string `json:"merchant_id" xorm:"comment('商户id') VARCHAR(100)"` | |||||
LegalPersonIdCardFrontPhoto string `json:"legal_person_id_card_front_photo" xorm:"comment('法人证件正面照片') TEXT"` | |||||
LegalPersonIdCardBackPhoto string `json:"legal_person_id_card_back_photo" xorm:"comment('法人证件反面照片') TEXT"` | |||||
SettlementPersonIdCardFrontPhoto string `json:"settlement_person_id_card_front_photo" xorm:"comment('结算人证件正面照片') TEXT"` | |||||
SettlementPersonIdCardBackPhoto string `json:"settlement_person_id_card_back_photo" xorm:"comment('结算人证件反面照片') TEXT"` | |||||
BankCardPhoto string `json:"bank_card_photo" xorm:"comment('结算银行卡照片') TEXT"` | |||||
LicensePhoto string `json:"license_photo" xorm:"comment('营业执照照片地址') TEXT"` | |||||
AuthorizationPic string `json:"authorization_pic" xorm:"comment('非法人结算授权函 ') TEXT"` | |||||
StoreEnvPhoto string `json:"store_env_photo" xorm:"comment('店内环境照') TEXT"` | |||||
StoreFrontImgUrl string `json:"store_front_img_url" xorm:"comment('门头照') TEXT"` | |||||
StoreCashPhoto string `json:"store_cash_photo" xorm:"comment('收银台照片') TEXT"` | |||||
} |
@@ -16,4 +16,5 @@ type YibaoShareMoney struct { | |||||
EndStatus string `json:"end_status" xorm:"VARCHAR(255)"` | EndStatus string `json:"end_status" xorm:"VARCHAR(255)"` | ||||
Param string `json:"param" xorm:"TEXT"` | Param string `json:"param" xorm:"TEXT"` | ||||
EndParam string `json:"end_param" xorm:"TEXT"` | EndParam string `json:"end_param" xorm:"TEXT"` | ||||
Type string `json:"type" xorm:"VARCHAR(255)"` | |||||
} | } |
@@ -1,18 +1,22 @@ | |||||
package consume | package consume | ||||
import ( | import ( | ||||
"applet/app/cfg" | |||||
"applet/app/db" | "applet/app/db" | ||||
"applet/app/db/model" | "applet/app/db/model" | ||||
"applet/app/utils" | "applet/app/utils" | ||||
"applet/app/utils/logx" | "applet/app/utils/logx" | ||||
"applet/consume/md" | "applet/consume/md" | ||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit" | "code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit" | ||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git/lib/fb_pay" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/db/offical" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/yibao_pay" | "code.fnuoos.com/go_rely_warehouse/zyos_go_third_party_api.git/yibao_pay" | ||||
"encoding/json" | "encoding/json" | ||||
"errors" | "errors" | ||||
"fmt" | "fmt" | ||||
"github.com/streadway/amqp" | "github.com/streadway/amqp" | ||||
"github.com/tidwall/gjson" | "github.com/tidwall/gjson" | ||||
"time" | |||||
"xorm.io/xorm" | "xorm.io/xorm" | ||||
) | ) | ||||
@@ -91,10 +95,124 @@ func handleZhiosYibao0rderShareMoneyMallExchange(msg []byte) error { | |||||
total += utils.StrToFloat64(v.CostPrice) | total += utils.StrToFloat64(v.CostPrice) | ||||
} | } | ||||
total += fee | total += fee | ||||
commShare(eg, payMethod, total, payOid, uniqueOrderNo, MerchantNo, uid) | |||||
if utils.InArr(utils.IntToStr(payMethod), []string{"21", "22"}) { | |||||
yibaoShare(eg, payMethod, total, payOid, uniqueOrderNo, MerchantNo, uid) | |||||
} else if utils.InArr(utils.IntToStr(payMethod), []string{"19"}) { | |||||
fbShare(eg, canalMsg.Mid, payMethod, total, payOid, uniqueOrderNo, MerchantNo, uid) | |||||
} | |||||
return nil | return nil | ||||
} | } | ||||
func commShare(eg *xorm.Engine, payMethod int, total float64, payOid, uniqueOrderNo, MerchantNo string, uid int) { | |||||
func fbShare(eg *xorm.Engine, dbName string, payMethod int, total float64, payOid, uniqueOrderNo, MerchantNo string, uid int) { | |||||
key := yibao_pay.CommKey(db.Db, true) | |||||
zhiyingOnlineBili := utils.StrToFloat64(key["zhiyingOnlineBili"]) - 0.63 | |||||
zhiyingUnlineBili := utils.StrToFloat64(key["zhiyingUnlineBili"]) - 0.63 | |||||
allBili := utils.StrToFloat64(key["zhiyingUnlineBili"]) / 100 | |||||
bili := zhiyingUnlineBili / 100 | |||||
if payMethod == 19 { | |||||
allBili = utils.StrToFloat64(key["zhiyingOnlineBili"]) / 100 | |||||
bili = zhiyingOnlineBili / 100 | |||||
} | |||||
fee := total * bili | |||||
if fee < 0.01 { | |||||
fee = 0 | |||||
} | |||||
req3 := map[string]string{} | |||||
req3["key"] = utils.SerializeStr(key) | |||||
req3["bili"] = utils.Float64ToStr(bili) | |||||
var tmp = model.YibaoShareMoney{ | |||||
Oid: utils.OrderUUID(uid), | |||||
PayOid: payOid, | |||||
StoreMoney: utils.Float64ToStr(total - total*allBili), | |||||
ZhiyingMoney: utils.Float64ToStr(total * bili), | |||||
Platform: "mall", | |||||
PayMethod: utils.IntToStr(payMethod), | |||||
Param: utils.SerializeStr(req3), | |||||
Type: "fb", | |||||
} | |||||
eg.Insert(&tmp) | |||||
//4、调用分账接口 | |||||
fbPaySet, err := GetFbMdSetting(eg, dbName) | |||||
if err != nil { | |||||
utils.FilePutContents("GetFbMdSettingErr", "err:"+err.Error()) | |||||
logx.Warn(err) | |||||
return | |||||
} | |||||
if fbPaySet.VendorSn == "" { | |||||
err = errors.New("没有设置相关付呗支付信息") | |||||
utils.FilePutContents("GetFbMdSettingErr", "err:"+err.Error()) | |||||
logx.Warn(err) | |||||
return | |||||
} | |||||
var ( | |||||
merchantIncomeInfo model.MerchantIncomeInfo | |||||
) | |||||
if merchantIncomeInfo.FbStoreId == 0 || merchantIncomeInfo.FbMerchantId == 0 { | |||||
err = errors.New("付呗支付暂未开通") | |||||
utils.FilePutContents("GetMerchantIncomeInfoErr", "err:"+err.Error()) | |||||
logx.Warn(err) | |||||
return | |||||
} | |||||
parameters := fb_pay.GetRequestParametersByVendorSn(fbPaySet.VendorSn) | |||||
parameters.Method = "openapi.agent.account.order.share" | |||||
param := make(map[string]interface{}) | |||||
param["merchant_id"] = merchantIncomeInfo.FbMerchantId | |||||
param["pay_order_sn"] = payOid | |||||
param["merchant_order_sn"] = tmp.Oid | |||||
param["notify_level"] = "agent" | |||||
host := "http://csapi.fnuo123.com.cn" | |||||
if cfg.Prd { | |||||
host = "http://yadht.zehaochi.com.cn" | |||||
} | |||||
param["notify_url"] = fmt.Sprintf("%s/api/v1/o2oc/customer/pay/fb/order/share/callback", host) | |||||
shareDetail := []map[string]interface{}{ | |||||
{ | |||||
"account_id": "", | |||||
"account_type": "2", | |||||
"share_amount": total - fee, | |||||
"remark": "商户分账", | |||||
}, | |||||
} | |||||
if fee > 0 { //TODO | |||||
var tmp1 = map[string]interface{}{ | |||||
"account_id": offical.SysCfgByKey(db.Db, "zhiying_fb_account"), | |||||
"account_type": "1", | |||||
"share_amount": fee, | |||||
"remark": "服务费", | |||||
} | |||||
shareDetail = append(shareDetail, tmp1) | |||||
} | |||||
param["share_detail"] = shareDetail | |||||
utils.FilePutContents("split_account_param:::", utils.SerializeStr(param)) | |||||
fmt.Println(param) | |||||
parameters.Nonce = utils.AnyToString(time.Now().Unix()) | |||||
parameters.SetBizContent(param) | |||||
parameters.SetSign(fbPaySet.AppSecret) | |||||
send, err := parameters.Send(cfg.Prd) | |||||
if err != nil { | |||||
utils.FilePutContents("openapiagentaccountordershare", "err:"+err.Error()) | |||||
logx.Warn(err) | |||||
return | |||||
} | |||||
resp := struct { | |||||
MerchantId int64 `json:"merchant_id"` | |||||
PayOrderSn interface{} `json:"pay_order_sn"` | |||||
MerchantPayOrderSn interface{} `json:"merchant_pay_order_sn"` | |||||
MerchantOrderSn string `json:"merchant_order_sn"` | |||||
OrderNo interface{} `json:"order_no"` | |||||
ShareDetail interface{} `json:"share_detail"` | |||||
}{} | |||||
utils.Unserialize([]byte(send), &resp) | |||||
tmp.Msg = send | |||||
if orderNoStr, ok := resp.OrderNo.(string); ok { | |||||
tmp.Oid = orderNoStr | |||||
} else if orderNoStrArry, ok := resp.OrderNo.([]string); ok && len(orderNoStrArry) > 0 { | |||||
tmp.Oid = orderNoStrArry[0] | |||||
} | |||||
tmp.Status = "SUCCESS" | |||||
eg.Where("id=?", tmp.Id).Cols("msg,status").Update(&tmp) | |||||
return | |||||
} | |||||
func yibaoShare(eg *xorm.Engine, payMethod int, total float64, payOid, uniqueOrderNo, MerchantNo string, uid int) { | |||||
key := yibao_pay.CommKey(db.Db, true) | key := yibao_pay.CommKey(db.Db, true) | ||||
zhiyingOnlineBili := utils.StrToFloat64(key["zhiyingOnlineBili"]) - utils.StrToFloat64(key["yibaoOnlineBili"]) | zhiyingOnlineBili := utils.StrToFloat64(key["zhiyingOnlineBili"]) - utils.StrToFloat64(key["yibaoOnlineBili"]) | ||||
zhiyingUnlineBili := utils.StrToFloat64(key["zhiyingUnlineBili"]) - utils.StrToFloat64(key["yibaoUnlineBili"]) | zhiyingUnlineBili := utils.StrToFloat64(key["zhiyingUnlineBili"]) - utils.StrToFloat64(key["yibaoUnlineBili"]) | ||||
@@ -131,6 +249,7 @@ func commShare(eg *xorm.Engine, payMethod int, total float64, payOid, uniqueOrde | |||||
Platform: "mall", | Platform: "mall", | ||||
PayMethod: utils.IntToStr(payMethod), | PayMethod: utils.IntToStr(payMethod), | ||||
Param: utils.SerializeStr(req3), | Param: utils.SerializeStr(req3), | ||||
Type: "yibao", | |||||
} | } | ||||
eg.Insert(&tmp) | eg.Insert(&tmp) | ||||
if fee > 0 { | if fee > 0 { | ||||
@@ -195,3 +314,18 @@ func commShare(eg *xorm.Engine, payMethod int, total float64, payOid, uniqueOrde | |||||
eg.Where("id=?", tmp.Id).Cols("end_msg,end_status").Update(&tmp) | eg.Where("id=?", tmp.Id).Cols("end_msg,end_status").Update(&tmp) | ||||
return | return | ||||
} | } | ||||
func GetFbMdSetting(engine *xorm.Engine, mid string) (*model.FbPaySet, error) { | |||||
var ( | |||||
setting model.FbPaySet | |||||
) | |||||
get := setting.GetByRedis(mid) | |||||
if get { | |||||
return &setting, nil | |||||
} else { | |||||
err := setting.Get(engine) | |||||
if err != nil { | |||||
return nil, err | |||||
} | |||||
return &setting, nil | |||||
} | |||||
} |