@@ -193,8 +193,8 @@ func UserFindByID(Db *xorm.Engine, id interface{}) (*model.User, error) { | |||||
} | } | ||||
return &m, nil | return &m, nil | ||||
} | } | ||||
func UserFindByIDWithSession(sess *xorm.Session, id interface{}) (*model.User, error) { | |||||
var m model.User | |||||
func UserFindByIDWithSession(sess *xorm.Session, id interface{}) (*model.UserProfile, error) { | |||||
var m model.UserProfile | |||||
if has, err := sess.Where("uid = ?", id). | if has, err := sess.Where("uid = ?", id). | ||||
Get(&m); err != nil || has == false { | Get(&m); err != nil || has == false { | ||||
return nil, logx.Warn(err) | return nil, logx.Warn(err) | ||||
@@ -290,7 +290,7 @@ func UserUpdate(Db *xorm.Engine, uid interface{}, user *model.User, forceColums | |||||
return affected, nil | return affected, nil | ||||
} | } | ||||
func UserUpdateWithSession(Db *xorm.Session, uid interface{}, user *model.User, forceColums ...string) (int64, error) { | |||||
func UserUpdateWithSession(Db *xorm.Session, uid interface{}, user *model.UserProfile, forceColums ...string) (int64, error) { | |||||
var ( | var ( | ||||
affected int64 | affected int64 | ||||
err error | err error | ||||
@@ -63,7 +63,7 @@ func UserWithDrawApplyByUIDByTime(Db *xorm.Engine, uid interface{}, stime, etime | |||||
return m, nil | return m, nil | ||||
} | } | ||||
func UserWithDrawApplyByUIDById(Db *xorm.Engine, id int64) (*model.FinWithdrawApply, error) { | |||||
func UserWithDrawApplyByUIDById(Db *xorm.Engine, id string) (*model.FinWithdrawApply, error) { | |||||
var m model.FinWithdrawApply | var m model.FinWithdrawApply | ||||
has, err := Db.Where("id = ?", id).Get(&m) | has, err := Db.Where("id = ?", id).Get(&m) | ||||
if err != nil { | if err != nil { | ||||
@@ -110,7 +110,7 @@ func GetAllDatabaseDev() *[]model.DbMapping { | |||||
fmt.Println("cfg.Local is: ", cfg.Local) | fmt.Println("cfg.Local is: ", cfg.Local) | ||||
if cfg.Local { // 本地调试 加快速度 | if cfg.Local { // 本地调试 加快速度 | ||||
fmt.Println("notice:LOCAL TEST, only masterId:** 99813608 ** available!") | fmt.Println("notice:LOCAL TEST, only masterId:** 99813608 ** available!") | ||||
err = Db.Where("deleted_at != ? AND db_master_id=?", 1, 31585332).Find(&m) | |||||
err = Db.Where("deleted_at != ? AND db_master_id=?", 1, 89608884).Find(&m) | |||||
} else { | } else { | ||||
err = Db.Where("deleted_at != ? AND is_dev = '1' ", 1).Find(&m) | err = Db.Where("deleted_at != ? AND is_dev = '1' ", 1).Find(&m) | ||||
} | } | ||||
@@ -8,6 +8,7 @@ type FinWithdrawApply struct { | |||||
Id int64 `json:"id" xorm:"pk autoincr BIGINT(20)"` | Id int64 `json:"id" xorm:"pk autoincr BIGINT(20)"` | ||||
Uid int `json:"uid" xorm:"not null default 0 comment('用户ID') index INT(10)"` | Uid int `json:"uid" xorm:"not null default 0 comment('用户ID') index INT(10)"` | ||||
AdmId int `json:"adm_id" xorm:"not null default 0 comment('审核人ID,0为系统自动') INT(10)"` | AdmId int `json:"adm_id" xorm:"not null default 0 comment('审核人ID,0为系统自动') INT(10)"` | ||||
FeeType int `json:"fee_type" xorm:"not null default 0 comment('审核人ID,0为系统自动') INT(10)"` | |||||
Amount string `json:"amount" xorm:"not null default 0.00 comment('提现金额') DECIMAL(10,2)"` | Amount string `json:"amount" xorm:"not null default 0.00 comment('提现金额') DECIMAL(10,2)"` | ||||
Memo string `json:"memo" xorm:"not null default '' comment('备注,失败请备注原因') VARCHAR(500)"` | Memo string `json:"memo" xorm:"not null default '' comment('备注,失败请备注原因') VARCHAR(500)"` | ||||
Type int `json:"type" xorm:"not null default 1 comment('提现类型;1:手动;2:自动') TINYINT(1)"` | Type int `json:"type" xorm:"not null default 1 comment('提现类型;1:手动;2:自动') TINYINT(1)"` | ||||
@@ -0,0 +1,40 @@ | |||||
package db | |||||
import ( | |||||
"applet/app/db" | |||||
"applet/app/flexible_employment/db/model" | |||||
"applet/app/utils/logx" | |||||
"xorm.io/xorm" | |||||
) | |||||
type FlexibleEmploymentBasicDb struct { | |||||
Db *xorm.Engine `json:"model"` | |||||
} | |||||
func (flexibleEmploymentBasicDb *FlexibleEmploymentBasicDb) Set() { // set方法 | |||||
flexibleEmploymentBasicDb.Db = db.Db | |||||
} | |||||
func (flexibleEmploymentBasicDb *FlexibleEmploymentBasicDb) Get(masterId string) (m *model.FlexibleEmploymentBasic, err error) { | |||||
m = new(model.FlexibleEmploymentBasic) | |||||
has, err := flexibleEmploymentBasicDb.Db.Where("master_id = ?", masterId).Get(m) | |||||
if err != nil { | |||||
return nil, logx.Error(err) | |||||
} | |||||
if has == false { | |||||
return nil, nil | |||||
} | |||||
return m, nil | |||||
} | |||||
func (flexibleEmploymentBasicDb *FlexibleEmploymentBasicDb) GetBasicByAppKey(appKey string) (m *model.FlexibleEmploymentBasic, err error) { | |||||
m = new(model.FlexibleEmploymentBasic) | |||||
has, err := flexibleEmploymentBasicDb.Db.Where("app_key = ?", appKey).Get(m) | |||||
if err != nil { | |||||
return nil, logx.Error(err) | |||||
} | |||||
if has == false { | |||||
return nil, nil | |||||
} | |||||
return m, nil | |||||
} |
@@ -0,0 +1,44 @@ | |||||
package db | |||||
import ( | |||||
"applet/app/db" | |||||
"applet/app/flexible_employment/db/model" | |||||
"applet/app/utils/logx" | |||||
"xorm.io/xorm" | |||||
) | |||||
type FlexibleEmploymentOrdDb struct { | |||||
Db *xorm.Engine `json:"model"` | |||||
} | |||||
func (flexibleEmploymentOrdDb *FlexibleEmploymentOrdDb) Set(masterId string) { // set方法 | |||||
flexibleEmploymentOrdDb.Db = db.DBs[masterId] | |||||
} | |||||
func (flexibleEmploymentOrdDb *FlexibleEmploymentOrdDb) Get(requestId string) (m *model.FlexibleEmploymentOrd, err error) { | |||||
m = new(model.FlexibleEmploymentOrd) | |||||
has, err := flexibleEmploymentOrdDb.Db.Where("request_id = ?", requestId).Get(m) | |||||
if err != nil { | |||||
return nil, logx.Error(err) | |||||
} | |||||
if has == false { | |||||
return nil, nil | |||||
} | |||||
return m, nil | |||||
} | |||||
func (flexibleEmploymentOrdDb *FlexibleEmploymentOrdDb) Update(id interface{}, m *model.FlexibleEmploymentOrd, forceColums ...string) (int64, error) { | |||||
var ( | |||||
affected int64 | |||||
err error | |||||
) | |||||
if forceColums != nil { | |||||
affected, err = flexibleEmploymentOrdDb.Db.Where("id=?", id).Cols(forceColums...).Update(m) | |||||
} else { | |||||
affected, err = flexibleEmploymentOrdDb.Db.Where("id=?", id).Update(m) | |||||
} | |||||
if err != nil { | |||||
return 0, err | |||||
} | |||||
return affected, nil | |||||
} |
@@ -0,0 +1,40 @@ | |||||
package db | |||||
import ( | |||||
"applet/app/db" | |||||
"applet/app/flexible_employment/db/model" | |||||
"applet/app/utils/logx" | |||||
"xorm.io/xorm" | |||||
) | |||||
type FlexibleEmploymentPuiaoBasicDb struct { | |||||
Db *xorm.Engine `json:"model"` | |||||
} | |||||
func (flexibleEmploymentPupiaoBasicDb *FlexibleEmploymentPuiaoBasicDb) Set() { // set方法 | |||||
flexibleEmploymentPupiaoBasicDb.Db = db.Db | |||||
} | |||||
func (flexibleEmploymentPupiaoBasicDb *FlexibleEmploymentPuiaoBasicDb) GetBasic(masterId string) (m *model.FlexibleEmploymentPupiaoBasic, err error) { | |||||
m = new(model.FlexibleEmploymentPupiaoBasic) | |||||
has, err := flexibleEmploymentPupiaoBasicDb.Db.Where("master_id = ?", masterId).Get(m) | |||||
if err != nil { | |||||
return nil, logx.Error(err) | |||||
} | |||||
if has == false { | |||||
return nil, nil | |||||
} | |||||
return m, nil | |||||
} | |||||
func (flexibleEmploymentPupiaoBasicDb *FlexibleEmploymentPuiaoBasicDb) GetBasicByAppId(appId string) (m *model.FlexibleEmploymentPupiaoBasic, err error) { | |||||
m = new(model.FlexibleEmploymentPupiaoBasic) | |||||
has, err := flexibleEmploymentPupiaoBasicDb.Db.Where("app_id = ?", appId).Get(m) | |||||
if err != nil { | |||||
return nil, logx.Error(err) | |||||
} | |||||
if has == false { | |||||
return nil, nil | |||||
} | |||||
return m, nil | |||||
} |
@@ -0,0 +1,44 @@ | |||||
package db | |||||
import ( | |||||
"applet/app/db" | |||||
"applet/app/flexible_employment/db/model" | |||||
"applet/app/utils/logx" | |||||
"xorm.io/xorm" | |||||
) | |||||
type FlexibleEmploymentPupiaoOrdDb struct { | |||||
Db *xorm.Engine `json:"model"` | |||||
} | |||||
func (flexibleEmploymentPupiaoOrdDb *FlexibleEmploymentPupiaoOrdDb) Set(masterId string) { // set方法 | |||||
flexibleEmploymentPupiaoOrdDb.Db = db.DBs[masterId] | |||||
} | |||||
func (flexibleEmploymentPupiaoOrdDb *FlexibleEmploymentPupiaoOrdDb) Get(outBatchNo string) (m *model.FlexibleEmploymentPupiaoOrd, err error) { | |||||
m = new(model.FlexibleEmploymentPupiaoOrd) | |||||
has, err := flexibleEmploymentPupiaoOrdDb.Db.Where("out_batch_no = ?", outBatchNo).Get(m) | |||||
if err != nil { | |||||
return nil, logx.Error(err) | |||||
} | |||||
if has == false { | |||||
return nil, nil | |||||
} | |||||
return m, nil | |||||
} | |||||
func (flexibleEmploymentPupiaoOrdDb *FlexibleEmploymentPupiaoOrdDb) Update(id interface{}, m *model.FlexibleEmploymentPupiaoOrd, forceColums ...string) (int64, error) { | |||||
var ( | |||||
affected int64 | |||||
err error | |||||
) | |||||
if forceColums != nil { | |||||
affected, err = flexibleEmploymentPupiaoOrdDb.Db.Where("id=?", id).Cols(forceColums...).Update(m) | |||||
} else { | |||||
affected, err = flexibleEmploymentPupiaoOrdDb.Db.Where("id=?", id).Update(m) | |||||
} | |||||
if err != nil { | |||||
return 0, err | |||||
} | |||||
return affected, nil | |||||
} |
@@ -0,0 +1,13 @@ | |||||
package model | |||||
type FlexibleEmploymentBasic struct { | |||||
Id int `json:"id" xorm:"pk autoincr INT(11)"` | |||||
AppKey string `json:"app_key" xorm:"app_key"` | |||||
AppSecret string `json:"app_secret" xorm:"app_secret"` | |||||
SecretId string `json:"secret_id" xorm:"secret_id"` | |||||
CallbackUrl string `json:"callback_url" xorm:"callback_url"` | |||||
AgreementContent string `json:"agreement_content" xorm:"agreement_content"` | |||||
CompanyName string `json:"company_name" xorm:"company_name"` | |||||
CreateAt string `json:"create_at" xorm:"not null default 'CURRENT_TIMESTAMP' comment('创建时间') DATETIME"` | |||||
UpdateAt string `json:"update_at" xorm:"not null default 'CURRENT_TIMESTAMP' comment('更新时间') DATETIME"` | |||||
} |
@@ -0,0 +1,18 @@ | |||||
package model | |||||
type FlexibleEmploymentOrd struct { | |||||
Id int `json:"id" xorm:"not null pk autoincr INT(11)"` | |||||
Uid int `json:"uid" xorm:"not null default 0 comment('用户id') INT(11)"` | |||||
ServiceId string `json:"service_id" xorm:"not null default '' comment('服务主体id') VARCHAR(255)"` | |||||
RequestId string `json:"request_id" xorm:"not null default '' comment('提现记录ID') VARCHAR(255)"` | |||||
Mobile string `json:"mobile" xorm:"not null default '' comment('手机号') VARCHAR(255)"` | |||||
Name string `json:"name" xorm:"not null default '' comment('姓名') VARCHAR(255)"` | |||||
Amount string `json:"amount" xorm:"not null default 0.00 comment('提现金额') DECIMAL(8,2)"` | |||||
Identity string `json:"identity" xorm:"not null default 0.00 comment('证件号码') DECIMAL(8,2)"` | |||||
BankAccount string `json:"bank_account" xorm:"not null default 0 comment('入款账号 银行卡提现此字段传入员工绑定的银行卡,支付宝提现此字段请传入员工绑定的支付宝账号') TINYINT(1)"` | |||||
SettleType string `json:"settle_type" xorm:"not null default '' comment('商户提现账户类型 银行通道:BANK, 微信通道:WECHAT, 支付宝通道:ALIPAY 例如:传BANK会从商户银行账户扣款') CHAR(50)"` | |||||
CallbackDataForTradeResult string `json:"callback_data_for_trade_result" xorm:"not null comment('交易结果通知') TEXT"` | |||||
State int `json:"state" xorm:"not null default 0 comment('状态(0:待提交易 1:已提交交易 2:交易成功 3:交易失败)') TINYINT(1)"` | |||||
CreateAt string `json:"create_at" xorm:"not null default 'CURRENT_TIMESTAMP' comment('创建时间') DATETIME"` | |||||
UpdateAt string `json:"update_at" xorm:"not null default 'CURRENT_TIMESTAMP' comment('更新时间') DATETIME"` | |||||
} |
@@ -0,0 +1,14 @@ | |||||
package model | |||||
type FlexibleEmploymentPupiaoBasic struct { | |||||
Id int `json:"id" xorm:"not null pk autoincr INT(11)"` | |||||
MasterId int `json:"master_id" xorm:"not null default 0 comment('站长ID') INT(11)"` | |||||
AppId string `json:"app_id" xorm:"not null default '' comment('appId') VARCHAR(255)"` | |||||
AppSecret string `json:"app_secret" xorm:"not null default '' comment('appSecret') VARCHAR(255)"` | |||||
HrCompanyId string `json:"hr_company_id" xorm:"not null default '' comment('hrcompanyId') VARCHAR(255)"` | |||||
SettleAccountId string `json:"settle_account_id" xorm:"not null default '' comment('settleAccountId') VARCHAR(255)"` | |||||
CallbackUrl string `json:"callback_url" xorm:"not null default '' comment('回调地址') VARCHAR(255)"` | |||||
WithdrawalType int `json:"withdrawal_type" xorm:"not null default 1 comment('提现方式(1:支付宝 2:银行卡)') TINYINT(1)"` | |||||
CreateAt string `json:"create_at" xorm:"not null default 'CURRENT_TIMESTAMP' comment('创建时间') DATETIME"` | |||||
UpdateAt string `json:"update_at" xorm:"not null default 'CURRENT_TIMESTAMP' comment('更新时间') DATETIME"` | |||||
} |
@@ -0,0 +1,21 @@ | |||||
package model | |||||
type FlexibleEmploymentPupiaoOrd struct { | |||||
Id int `json:"id" xorm:"not null pk autoincr INT(11)"` | |||||
Uid int `json:"uid" xorm:"not null default 0 comment('用户id') INT(11)"` | |||||
WithdrawApplyId int64 `json:"withdraw_apply_id" xorm:"not null default 0 comment('提现记录ID') BIGINT(20)"` | |||||
OutBatchNo string `json:"out_batch_no" xorm:"not null default '' comment('外部商户批次订单号') VARCHAR(255)"` | |||||
PlatformBatchNo string `json:"platform_batch_no" xorm:"not null default '' comment('平台批次订单号') VARCHAR(255)"` | |||||
TotalAmount string `json:"total_amount" xorm:"not null default 0.00 comment('总金额') DECIMAL(8,2)"` | |||||
ValidTotalFeeAmount string `json:"valid_total_fee_amount" xorm:"not null default 0.00 comment('平台总服务费金额') DECIMAL(8,2)"` | |||||
BatchStatus int `json:"batch_status" xorm:"not null default 0 comment('批次状态(0:待创建 1:制单失败 2:待确认支付 3:支付成功 4:支付失败)') TINYINT(1)"` | |||||
SettleType string `json:"settle_type" xorm:"not null default '' comment('结算方式(CARD:银行卡,ALIPAY:支付宝,WECHAT:微信)') CHAR(50)"` | |||||
PayeeNo string `json:"payee_no" xorm:"not null default '' comment('收款人账户') CHAR(50)"` | |||||
PayeePhone string `json:"payee_phone" xorm:"not null default '' comment('收款人手机号') CHAR(50)"` | |||||
PayeeName string `json:"payee_name" xorm:"not null default '' comment('收款人姓名') CHAR(50)"` | |||||
PayeeIdCard string `json:"payee_id_card" xorm:"not null default '' comment('收款人身份证号') CHAR(50)"` | |||||
CallbackDataForReceiveOrder string `json:"callback_data_for_receive_order" xorm:"not null comment('制单回调通知') TEXT"` | |||||
CallbackDataForTradeResult string `json:"callback_data_for_trade_result" xorm:"not null comment('交易结果通知') TEXT"` | |||||
CreateAt string `json:"create_at" xorm:"not null default 'CURRENT_TIMESTAMP' comment('创建时间') DATETIME"` | |||||
UpdateAt string `json:"update_at" xorm:"not null default 'CURRENT_TIMESTAMP' comment('更新时间') DATETIME"` | |||||
} |
@@ -0,0 +1,13 @@ | |||||
package model | |||||
type FlexibleEmploymentPupiaoUserInfo struct { | |||||
Id int `json:"id" xorm:"not null pk autoincr INT(11)"` | |||||
Uid int `json:"uid" xorm:"not null default 0 INT(11)"` | |||||
Name string `json:"name" xorm:"not null default '' comment('姓名') VARCHAR(255)"` | |||||
Mobile string `json:"mobile" xorm:"not null default '' comment('手机号') VARCHAR(255)"` | |||||
Identity string `json:"identity" xorm:"not null default '' comment('证件号码') VARCHAR(255)"` | |||||
BankAccountNo string `json:"bank_account_no" xorm:"not null default '' comment('默认银行账号') VARCHAR(255)"` | |||||
AlipayAccountNo string `json:"alipay_account_no" xorm:"not null default '' comment('默认支付宝账号') VARCHAR(255)"` | |||||
CreateAt string `json:"create_at" xorm:"not null default 'CURRENT_TIMESTAMP' comment('创建时间') DATETIME"` | |||||
UpdateAt string `json:"update_at" xorm:"not null default 'CURRENT_TIMESTAMP' comment('更新时间') DATETIME"` | |||||
} |
@@ -0,0 +1,17 @@ | |||||
package model | |||||
type FlexibleEmploymentUserInfo struct { | |||||
Id int `json:"id" xorm:"not null pk autoincr INT(11)"` | |||||
Uid int `json:"uid" xorm:"not null default 0 INT(11)"` | |||||
Name string `json:"name" xorm:"not null default '' comment('姓名') VARCHAR(255)"` | |||||
Mobile string `json:"mobile" xorm:"not null default '' comment('手机号') VARCHAR(255)"` | |||||
Identity string `json:"identity" xorm:"not null default '' comment('证件号码') VARCHAR(255)"` | |||||
BankAccountNo string `json:"bank_account_no" xorm:"not null default '' comment('默认银行账号') VARCHAR(255)"` | |||||
AlipayAccountNo string `json:"alipay_account_no" xorm:"not null default '' comment('默认支付宝账号') VARCHAR(255)"` | |||||
IdentityFrontBase64 string `json:"identity_front_base64" xorm:"not null comment('证件头像面图片base64(图片大小不能超过3M)') TEXT"` | |||||
IdentityBackgroundBase64 string `json:"identity_background_base64" xorm:"not null comment('证件国徽面图片base64(图片大小不能超过3M)') TEXT"` | |||||
ContractId string `json:"contract_id" xorm:"not null comment('合同id') CHAR(50)"` | |||||
State int `json:"state" xorm:"not null default 0 comment('状态(0:未签约(员工未同步) 1:待签约(员工已同步,但未确认签约)2:签约文件生成中(用户已确认签署,合同文件正在生成,此状态可发起提现) 3:签约完成 (用户已签约,签约合同生成完成))') TINYINT(1)"` | |||||
CreateAt string `json:"create_at" xorm:"not null default 'CURRENT_TIMESTAMP' comment('创建时间') DATETIME"` | |||||
UpdateAt string `json:"update_at" xorm:"not null default 'CURRENT_TIMESTAMP' comment('更新时间') DATETIME"` | |||||
} |
@@ -0,0 +1,35 @@ | |||||
package enum | |||||
type GongMaoMethodName string | |||||
const ( | |||||
MerchantContractGetList = "/api/merchant/contract/getList" | |||||
MerchantEmployeeSyncInfo = "/api/merchant/employee/syncInfo" | |||||
MerchantEmployeeSignContract = "/api/merchant/employee/signContract" | |||||
MerchantQueryBalance = "/api/merchant/queryBalance" | |||||
MerchantDoSinglePayment = "/api/merchant/doSinglePayment" | |||||
MerchantEmployeeGetContractStatusByContractId = "/api/merchant/employee/getContractStatusByContractId" | |||||
MerchantEmployeeDeleteContract = "/api/merchant/employee/deleteContract" | |||||
MerchantEmployeeUpdateEmployee = "/api/merchant/employee/updateEmployee" | |||||
) | |||||
func (gt GongMaoMethodName) String() string { | |||||
switch gt { | |||||
case MerchantContractGetList: | |||||
return "查询电签时需要的合同模板列表" | |||||
case MerchantEmployeeSyncInfo: | |||||
return "发起签署" | |||||
case MerchantEmployeeSignContract: | |||||
return "确认签署" | |||||
case MerchantEmployeeGetContractStatusByContractId: | |||||
return "通过合同id查询电签结果" | |||||
case MerchantEmployeeDeleteContract: | |||||
return "员工解除签署" | |||||
case MerchantDoSinglePayment: | |||||
return "提现" | |||||
case MerchantEmployeeUpdateEmployee: | |||||
return "更新员工默认手机号或者账号" | |||||
default: | |||||
return "未知" | |||||
} | |||||
} |
@@ -0,0 +1,22 @@ | |||||
package enum | |||||
type PuPiaoMethodName string | |||||
const ( | |||||
OpenApiContractSignApply = "/open/api/contract/signApply" | |||||
OpenApiPaymentReceiveOrder = "/open/api/payment/receiveOrder" | |||||
OpenApiPaymentConfirmPay = "/open/api/payment/confirmPay" | |||||
) | |||||
func (gt PuPiaoMethodName) String() string { | |||||
switch gt { | |||||
case OpenApiContractSignApply: | |||||
return "申请签约接口" | |||||
case OpenApiPaymentReceiveOrder: | |||||
return "发起制单" | |||||
case OpenApiPaymentConfirmPay: | |||||
return "确认支付" | |||||
default: | |||||
return "未知" | |||||
} | |||||
} |
@@ -0,0 +1,9 @@ | |||||
package md | |||||
type CurlPuPiaoConfirmPayResponse struct { | |||||
IsSuccess string `json:"isSuccess"` | |||||
Data interface{} `json:"data"` | |||||
Charset string `json:"charset"` | |||||
ErrorMsg string `json:"errorMsg"` | |||||
ErrorCode string `json:"errorCode"` | |||||
} |
@@ -0,0 +1,58 @@ | |||||
package md | |||||
type CallbackRequestForPuPiao struct { | |||||
AppId string `json:"appId"` //appId | |||||
PlatformOrderNo string `json:"platformOrderNo"` //平台订单号 | |||||
NotifyType string `json:"notifyType"` //通知业务类型 | |||||
NotifyContent string `json:"notifyContent"` //业务参数加密密文 (根据不同通知类型解密后参数不同,具体请参考通知类型参数说明) | |||||
Sign string `json:"sign"` //签名字符串 | |||||
} | |||||
type CallbackRequestForPuPiaoByRECEIVEORDER struct { | |||||
PlatformBatchNo string `json:"platformBatchNo"` //平台批次订单号 | |||||
OutBatchNo string `json:"outBatchNo"` //外部商户批次订单号 | |||||
TotalCount string `json:"totalCount"` //总笔数 | |||||
TotalAmount string `json:"totalAmount"` //总金额 | |||||
ValidTotalCount string `json:"validTotalCount"` //有效订单(平台收单成功)-总笔数 | |||||
ValidTotalAmount string `json:"validTotalAmount"` //有效订单(平台收单成功)-总金额 | |||||
ValidTotalFeeAmount string `json:"validTotalFeeAmount"` //有效订单(平台收单成功)-平台总服务费金额 | |||||
BatchStatus string `json:"batchStatus"` //批次状态 RECEIVE_FAIL:收单失败(整批次下全部失败) WAIT_CONFIRM:待确认支付(有效订单笔数大于0时,为此批次状态) | |||||
ItemList []struct { | |||||
PlatformOrderNo string `json:"platformOrderNo"` //单笔平台订单号 | |||||
OutTradeNo string `json:"outTradeNo"` //单笔外部商户订单号(批次下唯一不可重复) | |||||
SettleType string `json:"settleType"` //结算方式(CARD:银行卡,ALIPAY:支付宝,WECHAT:微信) | |||||
PayeeName string `json:"payeeName"` //收款人姓名 | |||||
PayeeIdCard string `json:"payeeIdCard"` //收款人身份证号 | |||||
PayeePhone string `json:"payeePhone"` //收款人手机号 | |||||
PayeeNo string `json:"payeeNo"` //收款人账户 | |||||
OrderAmount string `json:"orderAmount"` //订单金额(最多保留两位小数) | |||||
OrderStatus string `json:"orderStatus"` //单笔订单状态,见以下取值范围 RECEIVE_FAIL:收单失败 WAIT_CONFIRM:待确认支付 | |||||
PayeeBankName string `json:"payeeBankName"` //收款人银行名称 | |||||
PayeeBranchNo string `json:"payeeBranchNo"` //收款人分行联行号 | |||||
OrderMemo string `json:"orderMemo"` //付款备注摘要 | |||||
FeeAmount string `json:"feeAmount"` //单笔平台服务费金额 | |||||
ErrorCode string `json:"errorCode"` //单笔异常code | |||||
ErrorMsg string `json:"errorMsg"` //单笔异常msg | |||||
} `json:"itemList"` //批次明细list | |||||
} | |||||
type CallbackRequestForPuPiaoByTRADERESULT struct { | |||||
PlatformBatchNo string `json:"platformBatchNo"` //平台批次订单号 | |||||
OutBatchNo string `json:"outBatchNo"` //外部商户批次订单号 | |||||
PlatformOrderNo string `json:"platformOrderNo"` //单笔平台订单号 | |||||
OutTradeNo string `json:"outTradeNo"` //单笔外部商户订单号(批次下唯一不可重复) | |||||
SettleType string `json:"settleType"` //结算方式(CARD:银行卡,ALIPAY:支付宝,WECHAT:微信) | |||||
PayeeName string `json:"payeeName"` //收款人姓名 | |||||
PayeeIdCard string `json:"payeeIdCard"` //收款人身份证号 | |||||
PayeePhone string `json:"payeePhone"` //收款人手机号 | |||||
PayeeNo string `json:"payeeNo"` //收款人账户 | |||||
OrderAmount string `json:"orderAmount"` //订单金额(最多保留两位小数) | |||||
OrderStatus string `json:"orderStatus"` //单笔订单状态,见以下取值范围 RECEIVE_FAIL:收单失败 WAIT_CONFIRM:待确认支付 | |||||
TradeTime string `json:"tradeTime"` //交易时间(格式 yyyy-MM-dd HH:mm:ss) | |||||
PayeeBankName string `json:"payeeBankName"` //收款人银行名称 | |||||
PayeeBranchNo string `json:"payeeBranchNo"` //收款人分行联行号 | |||||
OrderMemo string `json:"orderMemo"` //付款备注摘要 | |||||
FeeAmount string `json:"feeAmount"` //单笔平台服务费金额 | |||||
ErrorCode string `json:"errorCode"` //单笔异常code | |||||
ErrorMsg string `json:"errorMsg"` //单笔异常msg | |||||
} |
@@ -0,0 +1,77 @@ | |||||
package md | |||||
const RobotQrcodeMacLoginQueue = "cloud_issuance_async_mlogin" | |||||
const CloudIssuanceMsgCallBackQueue = "cloud_issuance_msg_call_back" //云发单消息回调 | |||||
type CloudIssuanceAsyncMLogin struct { | |||||
UserId string `json:"user_id"` //用户id | |||||
MasterId string `json:"master_id"` //站长id | |||||
WId string `json:"wId"` //实例id | |||||
RobotId int `json:"robot_id"` //机器人id | |||||
QrCodeUrl string `json:"qrCodeUrl"` | |||||
} | |||||
const UserWithdrawApplyExchange = "zhios.app.user.withdraw.apply.exchange" | |||||
const ZhiosCapitalPoolOrderTotalExchange = "zhios.capital_pool.order_total.exchange" | |||||
const CloudIssuanceMsgCallBackExchange = "zhios.cloud.issuance.msg.callback.exchange" | |||||
const DouShenUserRegisterExchange = "zhios.doushen.user.register.exchange" | |||||
const FastReturnOrder = "zhios.order.fast.return.exchange" | |||||
const ( | |||||
DouShenUserRegisterRoutKeyForOfficial = "official" // 官方 | |||||
DouShenUserRegisterRoutKeyForOperationCenter = "operation_center" // 运营中心 | |||||
DouShenUserRegisterRoutKeyForMyRecommender = "my_recommender" // 我的推荐人 | |||||
DouShenUserRegisterRoutKeyForMyFans = "my_fans" // 我的粉丝 | |||||
DouShenUserRegisterRoutKeyForUserRegisterCommUpLv = "user_register_comm_up_lv" // 用户注册自动升级(给推荐人) | |||||
FastReturnOrderRoutKeyForOrderPay = "order_pay" | |||||
FastReturnOrderRoutKeyForOrderRefund = "order_refund" | |||||
FastReturnOrderRoutKeyForOrderSuccess = "order_success" | |||||
ZhiosCapitalPoolOrderTotalStr = "order_total" | |||||
) | |||||
type DouShenUserRegisterMessageStructForOfficial struct { | |||||
MasterId string `json:"master_id"` | |||||
Phone int64 `json:"phone"` | |||||
Uid int64 `json:"uid"` | |||||
} | |||||
type DouShenUserRegisterMessageStructForMyFans struct { | |||||
MasterId string `json:"master_id"` | |||||
Phone int64 `json:"phone"` | |||||
Uid int64 `json:"uid"` | |||||
} | |||||
type DouShenUserRegisterMessageStructForMyRecommender struct { | |||||
MasterId string `json:"master_id"` | |||||
Phone int64 `json:"phone"` | |||||
Uid int64 `json:"uid"` | |||||
RecommenderUid int64 `json:"recommender_uid"` | |||||
RecommenderPhone string `json:"recommender_phone"` | |||||
} | |||||
type DouShenUserRegisterMessageStructForOperationCenter struct { | |||||
MasterId string `json:"master_id"` | |||||
Phone int64 `json:"phone"` | |||||
Uid int64 `json:"uid"` | |||||
OperationCenterUid int64 `json:"operation_center_uid"` | |||||
OperationCenterPhone string `json:"operation_center_phone"` | |||||
} | |||||
type DouShenUserRegisterMessageStructForCommUpLv struct { | |||||
MasterId string `json:"master_id"` | |||||
Uid int64 `json:"uid"` | |||||
} | |||||
type ZhiosFatReturnOrderPay struct { | |||||
Uid string `json:"uid"` | |||||
Mid string `json:"mid"` | |||||
Oid string `json:"oid"` | |||||
Name string `json:"name"` | |||||
Prd string `json:"prd"` | |||||
} | |||||
type ZhiosCapitalPoolOrderTotal struct { | |||||
Uid []string `json:"uid"` | |||||
Mid string `json:"mid"` | |||||
Runtime int64 `json:"runtime"` | |||||
TotalTime int64 `json:"totalTime"` | |||||
BonusLevelType int `json:"bonusLevelType"` | |||||
Level string `json:"level"` | |||||
} |
@@ -0,0 +1,105 @@ | |||||
package svc | |||||
import ( | |||||
"applet/app/db" | |||||
"applet/app/db/model" | |||||
model2 "applet/app/flexible_employment/db/model" | |||||
"applet/app/svc" | |||||
"applet/app/utils" | |||||
"errors" | |||||
"time" | |||||
"xorm.io/xorm" | |||||
) | |||||
func DealFailResult(sess *xorm.Session, apply *model.FinWithdrawApply, masterId, errMsg string) (err error) { | |||||
userProfile, err := db.UserFindByIDWithSession(sess, apply.Uid) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
//1、修改提现单为失败 | |||||
apply.State = 3 | |||||
apply.Memo = errMsg | |||||
updateAck, err := sess.Where("id=?", apply.Id).Cols("state", "memo").Update(apply) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
if updateAck <= 0 { | |||||
return errors.New("更新提现单失败") | |||||
} | |||||
updateAck, err = sess.Where("request_id=?", apply.Id).Cols("state", "callback_data_for_trade_result").Update(model2.FlexibleEmploymentOrd{ | |||||
State: 3, | |||||
CallbackDataForTradeResult: errMsg, | |||||
}) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
if updateAck <= 0 { | |||||
return errors.New("更新工猫记录失败") | |||||
} | |||||
//2、判断类型 加回手续费 | |||||
var finUserFlow model.FinUserFlow | |||||
has, err := sess.Where("other_id = ?", apply.Id).Get(&finUserFlow) | |||||
if err != nil { | |||||
return | |||||
} | |||||
var sysFee = 0.00 | |||||
if has && apply.FeeType == 1 { | |||||
apply.Amount = utils.Float64ToStr(utils.StrToFloat64(apply.Amount) + utils.StrToFloat64(finUserFlow.SysFee)) | |||||
sysFee = utils.StrToFloat64(finUserFlow.SysFee) | |||||
} | |||||
//3、退回余额 | |||||
cb, err := svc.HandleBalanceDistributedLock(masterId, utils.IntToStr(apply.Uid), "withdraw_consume") | |||||
if err != nil { | |||||
return | |||||
} | |||||
if cb != nil { | |||||
defer cb() | |||||
} | |||||
var beforeAmount = userProfile.FinValid | |||||
userProfile.FinValid = utils.Float64ToStrPrec4(utils.StrToFloat64(beforeAmount) + utils.StrToFloat64(apply.Amount)) | |||||
_, err = db.UserUpdateWithSession(sess, userProfile.Uid, userProfile, "fin_valid") | |||||
if err != nil { | |||||
return err | |||||
} | |||||
//4、插入流水表 | |||||
newFinUserFlow := model.FinUserFlow{ | |||||
Type: 0, | |||||
Uid: userProfile.Uid, | |||||
Amount: apply.Amount, | |||||
BeforeAmount: beforeAmount, | |||||
AfterAmount: userProfile.FinValid, | |||||
OrdType: "withdraw", | |||||
OrdAction: 22, | |||||
PaymentType: 1, | |||||
SysFee: utils.Float64ToStrPrec4(sysFee), | |||||
OrdDetail: "", | |||||
OtherId: apply.Id, | |||||
OrdTitle: "提现退回", | |||||
State: 2, | |||||
OrdTime: int(apply.CreateAt.Unix()), | |||||
CreateAt: time.Now(), | |||||
UpdateAt: time.Now(), | |||||
} | |||||
_, err = db.InsertCommWithSession(sess, &newFinUserFlow) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
return nil | |||||
} | |||||
func DealSuccessResult(sess *xorm.Session, apply *model.FinWithdrawApply) (err error) { | |||||
//1、修改提现单为成功 | |||||
apply.State = 2 | |||||
updateAck, err := sess.Where("id=?", apply.Id).Cols("state").Update(apply) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
if updateAck <= 0 { | |||||
return errors.New("更新提现单失败") | |||||
} | |||||
return nil | |||||
} |
@@ -0,0 +1,99 @@ | |||||
package aes | |||||
import ( | |||||
"bytes" | |||||
"crypto/aes" | |||||
"encoding/base64" | |||||
"fmt" | |||||
"net/url" | |||||
) | |||||
// 加密 | |||||
func AesEncryptByECB(key []byte, plaintext string) (string, error) { | |||||
block, err := aes.NewCipher(key) | |||||
if err != nil { | |||||
return "", err | |||||
} | |||||
plainBytes := []byte(plaintext) | |||||
// PKCS5Padding | |||||
pad := block.BlockSize() - len(plainBytes)%block.BlockSize() | |||||
plainBytes = append(plainBytes, bytes.Repeat([]byte{byte(pad)}, pad)...) | |||||
// ECB模式 | |||||
encrypted := make([]byte, len(plainBytes)) | |||||
for bs, be := 0, block.BlockSize(); bs <= len(plainBytes)-block.BlockSize(); bs, be = bs+block.BlockSize(), be+block.BlockSize() { | |||||
block.Encrypt(encrypted[bs:be], plainBytes[bs:be]) | |||||
} | |||||
return url.QueryEscape(base64.StdEncoding.EncodeToString(encrypted)), nil | |||||
} | |||||
// AesDecryptByECB 解密AES ECB加密的字符串 | |||||
func AesDecryptByECB(key []byte, ciphertext string) (string, error) { | |||||
// 先进行URL解码 | |||||
decodedCiphertext, err := url.QueryUnescape(ciphertext) | |||||
if err != nil { | |||||
return "", err | |||||
} | |||||
// Base64解码 | |||||
encrypted, err := base64.StdEncoding.DecodeString(decodedCiphertext) | |||||
if err != nil { | |||||
return "", err | |||||
} | |||||
block, err := aes.NewCipher(key) | |||||
if err != nil { | |||||
return "", err | |||||
} | |||||
// ECB模式 | |||||
decrypted := make([]byte, len(encrypted)) | |||||
for bs, be := 0, block.BlockSize(); bs < len(encrypted); bs, be = bs+block.BlockSize(), be+block.BlockSize() { | |||||
block.Decrypt(decrypted[bs:be], encrypted[bs:be]) | |||||
} | |||||
// 去除PKCS5Padding | |||||
decrypted = PKCS5UnPadding(decrypted) | |||||
if decrypted == nil { | |||||
return "", fmt.Errorf("invalid PKCS5 padding") | |||||
} | |||||
return string(decrypted), nil | |||||
} | |||||
// PKCS5UnPadding 去除PKCS5Padding | |||||
func PKCS5UnPadding(data []byte) []byte { | |||||
length := len(data) | |||||
unpadding := int(data[length-1]) | |||||
if unpadding > length { | |||||
return nil | |||||
} | |||||
return data[:(length - unpadding)] | |||||
} |
@@ -0,0 +1,26 @@ | |||||
package utils | |||||
import ( | |||||
"math/rand" | |||||
"time" | |||||
) | |||||
//RED_PACKET_MIN_MONEY 红包最小金额(单位:分) | |||||
const RED_PACKET_MIN_MONEY = 1 | |||||
//DoubleAverage 二倍均值算法 | |||||
func DoubleAverage(count, amount int64) int64 { | |||||
if count == 1 { | |||||
return amount | |||||
} | |||||
//计算出最大可用金额 | |||||
max := amount - RED_PACKET_MIN_MONEY*count | |||||
//计算出最大可用平均值 | |||||
avg := max / count | |||||
//二倍均值基础上再加上最小金额 防止出现金额为0 | |||||
avg2 := 2*avg + RED_PACKET_MIN_MONEY | |||||
//随机红包金额序列元素,把二倍均值作为随机的最大数 | |||||
rand.Seed(time.Now().UnixNano()) | |||||
x := rand.Int63n(avg2) + RED_PACKET_MIN_MONEY | |||||
return x | |||||
} |
@@ -0,0 +1,60 @@ | |||||
package utils | |||||
import ( | |||||
"applet/pkg/pb" | |||||
"context" | |||||
"fmt" | |||||
"google.golang.org/grpc" | |||||
"google.golang.org/grpc/metadata" | |||||
"strconv" | |||||
"time" | |||||
) | |||||
func GetBusinessIntClient(url, port string) pb.BusinessIntClient { | |||||
target := fmt.Sprintf("%s:%s", url, port) | |||||
conn, err := grpc.Dial(target, grpc.WithInsecure()) | |||||
if err != nil { | |||||
fmt.Println(err) | |||||
return nil | |||||
} | |||||
return pb.NewBusinessIntClient(conn) | |||||
} | |||||
func GetBusinessExtClient(url, port string) pb.BusinessExtClient { | |||||
target := fmt.Sprintf("%s:%s", url, port) | |||||
conn, err := grpc.Dial(target, grpc.WithInsecure()) | |||||
//defer conn.Close() | |||||
if err != nil { | |||||
fmt.Println(err) | |||||
return nil | |||||
} | |||||
return pb.NewBusinessExtClient(conn) | |||||
} | |||||
func GetLogicExtClient(url, port string) pb.LogicExtClient { | |||||
target := fmt.Sprintf("%s:%s", url, port) | |||||
conn, err := grpc.Dial(target, grpc.WithInsecure()) | |||||
if err != nil { | |||||
fmt.Println(err) | |||||
return nil | |||||
} | |||||
return pb.NewLogicExtClient(conn) | |||||
} | |||||
func GetCtx(token, userId, deviceId, masterId string) context.Context { | |||||
if userId == "" { | |||||
userId = "1" | |||||
} | |||||
if deviceId == "" { | |||||
deviceId = "1" | |||||
} | |||||
if token == "" { | |||||
token = "0" | |||||
} | |||||
return metadata.NewOutgoingContext(context.TODO(), metadata.Pairs( | |||||
"user_id", userId, | |||||
"device_id", deviceId, | |||||
"token", token, | |||||
"master_id", masterId, | |||||
"request_id", strconv.FormatInt(time.Now().UnixNano(), 10))) | |||||
} |
@@ -0,0 +1,10 @@ | |||||
package utils | |||||
func ContainerStr(slice []string, element string) bool { | |||||
for _, e := range slice { | |||||
if e == element { | |||||
return true | |||||
} | |||||
} | |||||
return false | |||||
} |
@@ -0,0 +1,155 @@ | |||||
package flexible_employment | |||||
import ( | |||||
"applet/app/cfg" | |||||
"applet/app/utils" | |||||
"bytes" | |||||
"crypto/md5" | |||||
"crypto/tls" | |||||
"encoding/hex" | |||||
"encoding/json" | |||||
"fmt" | |||||
"io/ioutil" | |||||
"math/rand" | |||||
"net/http" | |||||
"net/url" | |||||
"sort" | |||||
"strconv" | |||||
"strings" | |||||
"time" | |||||
) | |||||
type GongMao struct { | |||||
AppKey string | |||||
AppSecret string | |||||
Nonce string | |||||
Timestamp string | |||||
ServiceId string | |||||
Sign string | |||||
} | |||||
const postUrlForPrd = "https://openapi.gongmall.com" | |||||
const postUrlForDev = "https://openapi-qa.gongmall.com" | |||||
func New(appKey, appSecret, serviceId string) *GongMao { | |||||
return &GongMao{ | |||||
AppKey: appKey, | |||||
AppSecret: appSecret, | |||||
Nonce: randomString(32), | |||||
Timestamp: "", // 生成timestamp(当前毫秒时间戳) | |||||
ServiceId: serviceId, | |||||
Sign: "", | |||||
} | |||||
} | |||||
// generateSign 生成签名 | |||||
func (gm *GongMao) generateSign(params map[string]interface{}, appSecret string) string { | |||||
var keys []string | |||||
for k := range params { | |||||
keys = append(keys, k) | |||||
} | |||||
sort.Strings(keys) | |||||
var stringA bytes.Buffer | |||||
for _, k := range keys { | |||||
if stringA.Len() > 0 { | |||||
stringA.WriteString("&") | |||||
} | |||||
stringA.WriteString(url.QueryEscape(k)) | |||||
stringA.WriteString("=") | |||||
stringA.WriteString(utils.AnyToString(params[k])) | |||||
} | |||||
stringSignTemp := stringA.String() + "&appSecret=" + appSecret | |||||
h := md5.New() | |||||
h.Write([]byte(stringSignTemp)) | |||||
sign := hex.EncodeToString(h.Sum(nil)) | |||||
return strings.ToUpper(sign) | |||||
} | |||||
func (gm *GongMao) Curl(uri string, params map[string]interface{}) (result map[string]interface{}, err error) { | |||||
// 准备请求参数 | |||||
gm.Timestamp = strconv.FormatInt(time.Now().UnixNano()/int64(time.Millisecond), 10) | |||||
paramData := make(map[string]interface{}) | |||||
paramData = gm.mergeMaps(map[string]interface{}{ | |||||
"appKey": gm.AppKey, | |||||
"nonce": gm.Nonce, | |||||
"serviceId": gm.ServiceId, | |||||
"timestamp": gm.Timestamp, | |||||
}, params) | |||||
// 生成签名 | |||||
paramData["sign"] = gm.generateSign(paramData, gm.AppSecret) | |||||
// 编码请求参数为URL编码的字符串 | |||||
form := url.Values{} | |||||
for key, value := range paramData { | |||||
form.Set(key, utils.AnyToString(value)) | |||||
} | |||||
requestBody := form.Encode() | |||||
// 构造请求 | |||||
var url string | |||||
fmt.Println("prd::::::::::", cfg.Prd) | |||||
if cfg.Prd { | |||||
url = postUrlForPrd + uri | |||||
} else { | |||||
url = postUrlForDev + uri | |||||
} | |||||
fmt.Println("url::::::::::", url) | |||||
req, err := http.NewRequest("POST", url, bytes.NewBufferString(requestBody)) | |||||
if err != nil { | |||||
return | |||||
} | |||||
// 设置请求头 | |||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded") | |||||
// 发送请求 | |||||
client := &http.Client{ | |||||
Transport: &http.Transport{ | |||||
TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, | |||||
}, | |||||
} | |||||
resp, err := client.Do(req) | |||||
if err != nil { | |||||
return | |||||
} | |||||
defer resp.Body.Close() | |||||
// 读取响应体 | |||||
body, err := ioutil.ReadAll(resp.Body) | |||||
if err != nil { | |||||
return | |||||
} | |||||
// 打印响应内容 | |||||
fmt.Printf("Response: %s\n", body) | |||||
// 解析JSON响应 | |||||
err = json.Unmarshal(body, &result) | |||||
if err != nil { | |||||
return | |||||
} | |||||
return | |||||
} | |||||
// 合并map | |||||
func (gm *GongMao) mergeMaps(map1, map2 map[string]interface{}) map[string]interface{} { | |||||
for key, value := range map2 { | |||||
map1[key] = value | |||||
} | |||||
return map1 | |||||
} | |||||
// 随机生成指定位数的大写字母和数字的组合 | |||||
func randomString(ln int) string { | |||||
letters := []rune("1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") | |||||
b := make([]rune, ln) | |||||
r := rand.New(rand.NewSource(time.Now().UnixNano())) | |||||
for i := range b { | |||||
b[i] = letters[r.Intn(len(letters))] | |||||
} | |||||
return string(b) | |||||
} |
@@ -0,0 +1,117 @@ | |||||
package flexible_employment | |||||
import ( | |||||
"applet/app/cfg" | |||||
"bytes" | |||||
"crypto/md5" | |||||
"encoding/hex" | |||||
"encoding/json" | |||||
"fmt" | |||||
"io/ioutil" | |||||
"net/http" | |||||
"sort" | |||||
"strconv" | |||||
"time" | |||||
) | |||||
type PuPiao struct { | |||||
AppId string | |||||
Charset string | |||||
Version string | |||||
Sign string | |||||
RequestId string | |||||
AppSecret string | |||||
} | |||||
const urlForPrd = "https://openapi.gongmall.com" | |||||
const urlForDev = "http://api.testlg.cn" | |||||
func NewPuPiao(appId, appSecret string) *PuPiao { | |||||
return &PuPiao{ | |||||
AppId: appId, | |||||
Charset: "UTF-8", | |||||
Version: "1.0", | |||||
Sign: "", | |||||
RequestId: "", | |||||
AppSecret: appSecret, | |||||
} | |||||
} | |||||
// generateSign 生成签名 | |||||
func (gm *PuPiao) generateSign(params map[string]interface{}, appSecret string) string { | |||||
var keys []string | |||||
for k := range params { | |||||
keys = append(keys, k) | |||||
} | |||||
sort.Strings(keys) | |||||
var stringA = map[string]interface{}{} | |||||
for _, k := range keys { | |||||
stringA[k] = params[k] | |||||
} | |||||
str, _ := json.Marshal(stringA) | |||||
paramJson := string(str) | |||||
stringSignTemp := paramJson + appSecret | |||||
h := md5.New() | |||||
h.Write([]byte(stringSignTemp)) | |||||
sign := hex.EncodeToString(h.Sum(nil)) | |||||
return sign | |||||
} | |||||
func (gm *PuPiao) Curl(uri string, params map[string]interface{}) (result map[string]interface{}, err error) { | |||||
// 准备请求参数 | |||||
gm.RequestId = strconv.FormatInt(time.Now().UnixNano()/int64(time.Microsecond), 10) //请求Id,每次请求唯一 | |||||
paramData := make(map[string]interface{}) | |||||
paramData = gm.mergeMaps(map[string]interface{}{ | |||||
"appId": gm.AppId, | |||||
"charset": gm.Charset, | |||||
"requestId": gm.RequestId, | |||||
"version": gm.Version, | |||||
}, params) | |||||
// 生成签名 | |||||
paramData["sign"] = gm.generateSign(paramData, gm.AppSecret) | |||||
b, err := json.Marshal(paramData) | |||||
if err != nil { | |||||
return | |||||
} | |||||
// 构造请求 | |||||
var url string | |||||
if cfg.Prd { | |||||
url = urlForPrd + uri | |||||
} else { | |||||
url = urlForDev + uri | |||||
} | |||||
fmt.Println("url::::::::::", url) | |||||
postBody, err := gm.httpPostBody(url, b) | |||||
if err != nil { | |||||
return | |||||
} | |||||
// 打印响应内容 | |||||
fmt.Printf("Response: %s\n", postBody) | |||||
// 解析JSON响应 | |||||
err = json.Unmarshal(postBody, &result) | |||||
if err != nil { | |||||
return | |||||
} | |||||
return | |||||
} | |||||
// 合并map | |||||
func (gm *PuPiao) mergeMaps(map1, map2 map[string]interface{}) map[string]interface{} { | |||||
for key, value := range map2 { | |||||
map1[key] = value | |||||
} | |||||
return map1 | |||||
} | |||||
func (gm *PuPiao) httpPostBody(url string, msg []byte) ([]byte, error) { | |||||
resp, err := http.Post(url, "application/json;charset=utf-8", bytes.NewBuffer(msg)) | |||||
if err != nil { | |||||
return []byte(""), err | |||||
} | |||||
defer resp.Body.Close() | |||||
body, err := ioutil.ReadAll(resp.Body) | |||||
return body, err | |||||
} |
@@ -278,6 +278,9 @@ func Float64ToStr(f float64) string { | |||||
func Float64ToStrPrec1(f float64) string { | func Float64ToStrPrec1(f float64) string { | ||||
return strconv.FormatFloat(f, 'f', 1, 64) | return strconv.FormatFloat(f, 'f', 1, 64) | ||||
} | } | ||||
func Float64ToStrPrec4(f float64) string { | |||||
return strconv.FormatFloat(f, 'f', 4, 64) | |||||
} | |||||
func Float32ToStr(f float32) string { | func Float32ToStr(f float32) string { | ||||
return Float64ToStr(float64(f)) | return Float64ToStr(float64(f)) | ||||
@@ -84,10 +84,12 @@ func initConsumes() { | |||||
//jobs[consumeMd.OneCirclesSignInCopyGreenEnergyFunName] = OneCirclesSignInCopyGreenEnergyConsume | //jobs[consumeMd.OneCirclesSignInCopyGreenEnergyFunName] = OneCirclesSignInCopyGreenEnergyConsume | ||||
//////////////////////////////////////// withdraw ///////////////////////////////////////////////////// | //////////////////////////////////////// withdraw ///////////////////////////////////////////////////// | ||||
//jobs[consumeMd.WithdrawConsumeFunName] = WithdrawConsume | |||||
jobs[consumeMd.WithdrawConsumeFunName] = WithdrawConsume | |||||
jobs[consumeMd.FlexibleEmploymentWithdrawForGongMaoConsumeFunName] = FlexibleEmploymentWithdrawForGongMaoConsume | |||||
//jobs[consumeMd.FlexibleEmploymentWithdrawForPupiaoConsumeFunName] = FlexibleEmploymentWithdrawForPupiaoConsume | |||||
jobs[consumeMd.ZhiosMallGreenCoinConsumeFunName] = ZhiosMallGreenCoinConsume //绿色双链积分 | |||||
jobs[consumeMd.ZhiosOneCirclesCoinConsumeFunName] = ZhiosOneCirclesCoinConsume //一个圈圈虚拟币变化 | |||||
//jobs[consumeMd.ZhiosMallGreenCoinConsumeFunName] = ZhiosMallGreenCoinConsume //绿色双链积分 | |||||
//jobs[consumeMd.ZhiosOneCirclesCoinConsumeFunName] = ZhiosOneCirclesCoinConsume //一个圈圈虚拟币变化 | |||||
} | } | ||||
func Run() { | func Run() { | ||||
@@ -443,6 +443,24 @@ var RabbitMqQueueKeyList = []*MqQueue{ | |||||
BindKey: "", | BindKey: "", | ||||
ConsumeFunName: "WithdrawConsume", | ConsumeFunName: "WithdrawConsume", | ||||
}, | }, | ||||
{ | |||||
ExchangeName: "zhios.app.user.withdraw.apply.flexible.employment.exchange", | |||||
Name: "zhios_app_user_withdraw_apply_gongmao_queue", | |||||
Type: DirectQueueType, | |||||
IsPersistent: false, | |||||
RoutKey: "gongmao", | |||||
BindKey: "", | |||||
ConsumeFunName: "FlexibleEmploymentWithdrawForGongMaoConsume", | |||||
}, | |||||
{ | |||||
ExchangeName: "zhios.app.user.withdraw.apply.flexible.employment.exchange", | |||||
Name: "zhios_app_user_withdraw_apply_pupiao_queue", | |||||
Type: DirectQueueType, | |||||
IsPersistent: false, | |||||
RoutKey: "pupiao", | |||||
BindKey: "", | |||||
ConsumeFunName: "FlexibleEmploymentWithdrawForPupiaoConsume", | |||||
}, | |||||
} | } | ||||
const ( | const ( | ||||
@@ -495,4 +513,6 @@ const ( | |||||
OneCirclesStartLevelDividendFunName = "OneCirclesStartLevelDividendConsume" | OneCirclesStartLevelDividendFunName = "OneCirclesStartLevelDividendConsume" | ||||
OneCirclesSignInCopyGreenEnergyFunName = "OneCirclesSignInCopyGreenEnergyConsume" | OneCirclesSignInCopyGreenEnergyFunName = "OneCirclesSignInCopyGreenEnergyConsume" | ||||
WithdrawConsumeFunName = "WithdrawConsume" | WithdrawConsumeFunName = "WithdrawConsume" | ||||
FlexibleEmploymentWithdrawForGongMaoConsumeFunName = "FlexibleEmploymentWithdrawForGongMaoConsume" | |||||
FlexibleEmploymentWithdrawForPupiaoConsumeFunName = "FlexibleEmploymentWithdrawForPupiaoConsume" | |||||
) | ) |
@@ -0,0 +1,165 @@ | |||||
package consume | |||||
import ( | |||||
"applet/app/cfg" | |||||
"applet/app/db" | |||||
db2 "applet/app/flexible_employment/db" | |||||
"applet/app/flexible_employment/enum" | |||||
"applet/app/flexible_employment/svc" | |||||
"applet/app/lib/flexible_employment" | |||||
"applet/app/utils" | |||||
"applet/app/utils/logx" | |||||
"applet/consume/md" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule/one_circles" | |||||
"encoding/json" | |||||
"errors" | |||||
"fmt" | |||||
"github.com/streadway/amqp" | |||||
"time" | |||||
) | |||||
func FlexibleEmploymentWithdrawForGongMaoConsume(queue md.MqQueue) { | |||||
fmt.Println(">>>>>>>>>>>>FlexibleEmploymentWithdrawForGongMaoConsume>>>>>>>>>>>>") | |||||
ch, err := rabbit.Cfg.Pool.GetChannel() | |||||
if err != nil { | |||||
logx.Error(err) | |||||
return | |||||
} | |||||
defer ch.Release() | |||||
//1、将自己绑定到交换机上 | |||||
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey) | |||||
//2、取出数据进行消费 | |||||
ch.Qos(1) | |||||
delivery := ch.Consume(queue.Name, false) | |||||
one_circles.Init(cfg.RedisAddr) | |||||
var res amqp.Delivery | |||||
var ok bool | |||||
for { | |||||
res, ok = <-delivery | |||||
if ok == true { | |||||
err = handleFlexibleEmploymentWithdrawForGongMaoConsume(res.Body) | |||||
fmt.Println("err ::: ", err) | |||||
if err != nil { | |||||
fmt.Println("FlexibleEmploymentWithdrawForGongMaoConsume_ERR:::::", err.Error()) | |||||
_ = res.Reject(true) | |||||
//_ = res.Reject(false) | |||||
var msg interface{} | |||||
json.Unmarshal(res.Body, &msg) | |||||
if err.Error() == "Connection timed out" { | |||||
//TODO::重新推回队列末尾,避免造成队列堵塞 | |||||
ch.Publish(queue.ExchangeName, msg, queue.RoutKey) | |||||
} else { | |||||
//TODO::推入新的队列中备份 | |||||
utils.FilePutContents("FlexibleEmploymentWithdrawForGongMaoConsume_ERR", utils.SerializeStr(err.Error())) | |||||
ch.Publish("zhios.app.user.withdraw.apply.exception.exchange", msg, "gongmao") | |||||
} | |||||
} else { | |||||
err = res.Ack(true) | |||||
} | |||||
} else { | |||||
panic(errors.New("error getting message")) | |||||
} | |||||
} | |||||
fmt.Println("get msg done") | |||||
} | |||||
func handleFlexibleEmploymentWithdrawForGongMaoConsume(msgData []byte) error { | |||||
var ms string | |||||
err := json.Unmarshal(msgData, &ms) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
time.Sleep(time.Microsecond * 200) // 等待200毫秒 | |||||
//1、解析mq中queue的数据结构体 | |||||
var msg struct { | |||||
Uid string `json:"uid"` | |||||
Nickname string `json:"nickname"` | |||||
MasterId string `json:"master_id"` | |||||
AppName string `json:"app_name"` | |||||
ApplyOrder string `json:"apply_order"` | |||||
ActualAmount string `json:"actual_amount"` | |||||
MobCfg interface{} `json:"mob_cfg"` | |||||
} | |||||
err = json.Unmarshal([]byte(ms), &msg) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
fmt.Println("gongmao_message:::::::::::>>>>>>>>>") | |||||
fmt.Println(msg) | |||||
if db.DBs[msg.MasterId] == nil { | |||||
return nil | |||||
} | |||||
engine := db.DBs[msg.MasterId] | |||||
//1、查找对应记录 | |||||
flexibleEmploymentOrdDb := db2.FlexibleEmploymentOrdDb{} | |||||
flexibleEmploymentOrdDb.Set(msg.MasterId) | |||||
flexibleEmploymentOrd, err := flexibleEmploymentOrdDb.Get(msg.ApplyOrder) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
if flexibleEmploymentOrd == nil { | |||||
return errors.New("未查询到对应订单记录") | |||||
} | |||||
flexibleEmploymentBasicDb := db2.FlexibleEmploymentBasicDb{} | |||||
flexibleEmploymentBasicDb.Set() | |||||
basic, err := flexibleEmploymentBasicDb.Get(msg.MasterId) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
gongMao := flexible_employment.New(basic.AppKey, basic.AppSecret, basic.SecretId) | |||||
result, err := gongMao.Curl(enum.MerchantDoSinglePayment, map[string]interface{}{ | |||||
"requestId": flexibleEmploymentOrd.RequestId, | |||||
"mobile": flexibleEmploymentOrd.Mobile, | |||||
"name": flexibleEmploymentOrd.Name, | |||||
"amount": flexibleEmploymentOrd.Amount, | |||||
"identity": flexibleEmploymentOrd.Identity, | |||||
"bankAccount": flexibleEmploymentOrd.BankAccount, | |||||
"dateTime": time.Now().Format("20060102150405"), | |||||
"salaryType": flexibleEmploymentOrd.SettleType, | |||||
}) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
var response struct { | |||||
Success bool `json:"success"` | |||||
ErrorCode string `json:"errorCode"` | |||||
ErrorMsg string `json:"errorMsg"` | |||||
Data struct { | |||||
RequestId string `json:"requestId"` | |||||
AppmentTime string `json:"appmentTime"` | |||||
} `json:"data"` | |||||
} | |||||
if err = json.Unmarshal(utils.Serialize(result), &response); err != nil { | |||||
return err | |||||
} | |||||
if !response.Success { | |||||
//TODO::发起提现失败,将处理提现失败状态 | |||||
finWithdrawApply, err := db.UserWithDrawApplyByUIDById(engine, flexibleEmploymentOrd.RequestId) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
session := engine.NewSession() | |||||
defer session.Close() | |||||
session.Begin() | |||||
err = svc.DealFailResult(session, finWithdrawApply, msg.MasterId, response.ErrorMsg) | |||||
if err != nil { | |||||
_ = session.Rollback() | |||||
return err | |||||
} | |||||
return session.Commit() | |||||
} | |||||
flexibleEmploymentOrd.State = 1 | |||||
updateAck, err := flexibleEmploymentOrdDb.Update(flexibleEmploymentOrd.Id, flexibleEmploymentOrd, "state") | |||||
if err != nil { | |||||
return err | |||||
} | |||||
if updateAck <= 0 { | |||||
return errors.New("更新 flexible_employment_ord 状态失败") | |||||
} | |||||
return nil | |||||
} |
@@ -0,0 +1,176 @@ | |||||
package consume | |||||
import ( | |||||
"applet/app/cfg" | |||||
"applet/app/db" | |||||
db2 "applet/app/flexible_employment/db" | |||||
"applet/app/flexible_employment/enum" | |||||
"applet/app/flexible_employment/svc" | |||||
"applet/app/flexible_employment/utils/aes" | |||||
"applet/app/lib/flexible_employment" | |||||
"applet/app/utils" | |||||
"applet/app/utils/logx" | |||||
"applet/consume/md" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit" | |||||
"code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule/one_circles" | |||||
"encoding/json" | |||||
"errors" | |||||
"fmt" | |||||
"github.com/streadway/amqp" | |||||
"time" | |||||
) | |||||
func FlexibleEmploymentWithdrawForPupiaoConsume(queue md.MqQueue) { | |||||
fmt.Println(">>>>>>>>>>>>FlexibleEmploymentWithdrawForPupiaoConsume>>>>>>>>>>>>") | |||||
ch, err := rabbit.Cfg.Pool.GetChannel() | |||||
if err != nil { | |||||
logx.Error(err) | |||||
return | |||||
} | |||||
defer ch.Release() | |||||
//1、将自己绑定到交换机上 | |||||
ch.Bind(queue.Name, queue.ExchangeName, queue.RoutKey) | |||||
//2、取出数据进行消费 | |||||
ch.Qos(1) | |||||
delivery := ch.Consume(queue.Name, false) | |||||
one_circles.Init(cfg.RedisAddr) | |||||
var res amqp.Delivery | |||||
var ok bool | |||||
for { | |||||
res, ok = <-delivery | |||||
if ok == true { | |||||
err = handleFlexibleEmploymentWithdrawForPupiaoConsume(res.Body) | |||||
fmt.Println("err ::: ", err) | |||||
if err != nil { | |||||
fmt.Println("FlexibleEmploymentWithdrawForPupiaoConsume_ERR:::::", err.Error()) | |||||
//_ = res.Reject(true) | |||||
_ = res.Reject(false) | |||||
var msg interface{} | |||||
json.Unmarshal(res.Body, &msg) | |||||
if err.Error() == "Connection timed out" { | |||||
//TODO::重新推回队列末尾,避免造成队列堵塞 | |||||
ch.Publish(queue.ExchangeName, msg, queue.RoutKey) | |||||
} else { | |||||
//TODO::推入新的队列中备份 | |||||
utils.FilePutContents("FlexibleEmploymentWithdrawForPupiaoConsume_ERR", utils.SerializeStr(err.Error())) | |||||
ch.Publish("zhios.app.user.withdraw.apply.exception.exchange", msg, "pupiao") | |||||
} | |||||
} else { | |||||
err = res.Ack(true) | |||||
} | |||||
} else { | |||||
panic(errors.New("error getting message")) | |||||
} | |||||
} | |||||
fmt.Println("get msg done") | |||||
} | |||||
func handleFlexibleEmploymentWithdrawForPupiaoConsume(msgData []byte) error { | |||||
time.Sleep(time.Microsecond * 200) // 等待200毫秒 | |||||
//1、解析mq中queue的数据结构体 | |||||
var msg struct { | |||||
Uid string `json:"uid"` | |||||
Nickname string `json:"nickname"` | |||||
MasterId string `json:"master_id"` | |||||
AppName string `json:"app_name"` | |||||
ApplyOrder string `json:"apply_order"` | |||||
ActualAmount string `json:"actual_amount"` | |||||
Oid string `json:"oid"` | |||||
MobCfg string `json:"mob_cfg"` | |||||
} | |||||
err := json.Unmarshal(msgData, &msg) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
fmt.Println("pupiao_message:::::::::::>>>>>>>>>") | |||||
fmt.Println(msg) | |||||
if db.DBs[msg.MasterId] == nil { | |||||
return nil | |||||
} | |||||
engine := db.DBs[msg.MasterId] | |||||
//1、查找对应记录 | |||||
flexibleEmploymentPupiaoOrdDb := db2.FlexibleEmploymentPupiaoOrdDb{} | |||||
flexibleEmploymentPupiaoOrdDb.Set(msg.MasterId) | |||||
flexibleEmploymentPupiaoOrd, err := flexibleEmploymentPupiaoOrdDb.Get(msg.Oid) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
if flexibleEmploymentPupiaoOrd == nil { | |||||
return errors.New("未查询到对应订单记录") | |||||
} | |||||
flexibleEmploymentPuiaoBasicDb := db2.FlexibleEmploymentPuiaoBasicDb{} | |||||
flexibleEmploymentPuiaoBasicDb.Set() | |||||
basic, err := flexibleEmploymentPuiaoBasicDb.GetBasic(msg.MasterId) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
//2、发起制单 | |||||
puPiao := flexible_employment.NewPuPiao(basic.AppId, basic.AppSecret) | |||||
var userAESData = []map[string]string{ | |||||
{ | |||||
"outTradeNo": "o_" + utils.Int64ToStr(flexibleEmploymentPupiaoOrd.WithdrawApplyId), | |||||
"settleType": flexibleEmploymentPupiaoOrd.SettleType, | |||||
"payeeName": flexibleEmploymentPupiaoOrd.PayeeName, | |||||
"payeeIdCard": flexibleEmploymentPupiaoOrd.PayeeIdCard, | |||||
"payeePhone": flexibleEmploymentPupiaoOrd.PayeePhone, | |||||
"payeeNo": flexibleEmploymentPupiaoOrd.PayeeNo, | |||||
"orderAmount": flexibleEmploymentPupiaoOrd.TotalAmount, | |||||
}, | |||||
} | |||||
str, _ := json.Marshal(userAESData) | |||||
itemAESContent, _ := aes.AesEncryptByECB([]byte(basic.AppSecret), string(str)) | |||||
result, err := puPiao.Curl(enum.OpenApiPaymentReceiveOrder, map[string]interface{}{ | |||||
"outBatchNo": flexibleEmploymentPupiaoOrd.OutBatchNo, | |||||
"hrcompanyId": basic.HrCompanyId, | |||||
"settleAccountId": basic.SettleAccountId, | |||||
"totalCount": "1", | |||||
"totalAmount": flexibleEmploymentPupiaoOrd.TotalAmount, | |||||
"itemAESContent": itemAESContent, | |||||
}) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
var response struct { | |||||
IsSuccess string `json:"isSuccess"` | |||||
Charset string `json:"charset"` | |||||
ErrorCode string `json:"errorCode"` | |||||
ErrorMsg string `json:"errorMsg"` | |||||
Data struct { | |||||
PlatformBatchNo string `json:"platformBatchNo"` | |||||
OutBatchNo string `json:"outBatchNo"` | |||||
} `json:"data"` | |||||
} | |||||
if err = json.Unmarshal(utils.Serialize(result), &response); err != nil { | |||||
return err | |||||
} | |||||
if response.IsSuccess == "F" { | |||||
flexibleEmploymentPupiaoOrd.BatchStatus = 1 | |||||
updateAck, err := flexibleEmploymentPupiaoOrdDb.Update(flexibleEmploymentPupiaoOrd.Id, flexibleEmploymentPupiaoOrd, "batch_status") | |||||
if err != nil { | |||||
return err | |||||
} | |||||
if updateAck <= 0 { | |||||
return errors.New("更新 flexible_employment_pupiao_ord 状态失败") | |||||
} | |||||
//TODO::制单失败,将处理提现失败状态 | |||||
finWithdrawApply, err := db.UserWithDrawApplyByUIDById(engine, utils.Int64ToStr(flexibleEmploymentPupiaoOrd.WithdrawApplyId)) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
session := engine.NewSession() | |||||
defer session.Close() | |||||
session.Begin() | |||||
err = svc.DealFailResult(session, finWithdrawApply, msg.MasterId, response.ErrorMsg) | |||||
if err != nil { | |||||
_ = session.Rollback() | |||||
return err | |||||
} | |||||
return session.Commit() | |||||
} | |||||
return nil | |||||
} |
@@ -16,14 +16,12 @@ require ( | |||||
github.com/cc14514/go-geoip2-db v0.0.0-20190106063142-7b6408a9812a | github.com/cc14514/go-geoip2-db v0.0.0-20190106063142-7b6408a9812a | ||||
github.com/dchest/uniuri v0.0.0-20200228104902-7aecb25e1fe5 | github.com/dchest/uniuri v0.0.0-20200228104902-7aecb25e1fe5 | ||||
github.com/forgoer/openssl v1.2.1 | github.com/forgoer/openssl v1.2.1 | ||||
github.com/gin-contrib/sessions v0.0.3 | |||||
github.com/gin-gonic/gin v1.8.0 | github.com/gin-gonic/gin v1.8.0 | ||||
github.com/go-playground/locales v0.14.0 | github.com/go-playground/locales v0.14.0 | ||||
github.com/go-playground/universal-translator v0.18.0 | github.com/go-playground/universal-translator v0.18.0 | ||||
github.com/go-playground/validator/v10 v10.10.0 | github.com/go-playground/validator/v10 v10.10.0 | ||||
github.com/go-redis/redis v6.15.9+incompatible | github.com/go-redis/redis v6.15.9+incompatible | ||||
github.com/go-sql-driver/mysql v1.6.0 | github.com/go-sql-driver/mysql v1.6.0 | ||||
github.com/gomodule/redigo v2.0.0+incompatible | |||||
github.com/iGoogle-ink/gopay v1.5.36 | github.com/iGoogle-ink/gopay v1.5.36 | ||||
github.com/jinzhu/copier v0.3.5 | github.com/jinzhu/copier v0.3.5 | ||||
github.com/json-iterator/go v1.1.12 | github.com/json-iterator/go v1.1.12 | ||||
@@ -57,6 +55,7 @@ require ( | |||||
github.com/goccy/go-json v0.9.7 // indirect | github.com/goccy/go-json v0.9.7 // indirect | ||||
github.com/golang/protobuf v1.5.3 // indirect | github.com/golang/protobuf v1.5.3 // indirect | ||||
github.com/golang/snappy v0.0.4 // indirect | github.com/golang/snappy v0.0.4 // indirect | ||||
github.com/gomodule/redigo v1.9.2 // indirect | |||||
github.com/gorilla/context v1.1.1 // indirect | github.com/gorilla/context v1.1.1 // indirect | ||||
github.com/gorilla/securecookie v1.1.1 // indirect | github.com/gorilla/securecookie v1.1.1 // indirect | ||||
github.com/gorilla/sessions v1.2.1 // indirect | github.com/gorilla/sessions v1.2.1 // indirect | ||||