Commit cac8c9ca authored by wangp's avatar wangp

整理代码

parent a218b29b
package conf
import "time"
//token过期时间
const TokenExpireDuration = time.Hour * 24 * 7
//const TokenExpireDuration = time.Hour * 24 * 7
//Redis过期时间
const RedisExpireDuration = time.Minute*10 //默认(短信验证码)
const RedisExpireDurationExpress = time.Minute*120 //查看物流
//const RedisExpireDuration = time.Minute*10 //默认(短信验证码)
//const RedisExpireDurationExpress = time.Minute*120 //查看物流
//Redis前缀
const RedisPrefix = "system_pay_"
const (
AesKey = "dbcaespassword01"
SmsAes = "dbcaespassword01"
)
//const RedisPrefix = "system_pay_"
//
//const (
// AesKey = "dbcaespassword01"
// SmsAes = "dbcaespassword01"
//)
//采购订单状态
//const (
......
......@@ -21,28 +21,14 @@ database:
#userdb: 'root_dbc:dbc_root888888@tcp(rm-2ze8jnj44l6ta299pro.mysql.rds.aliyuncs.com:3306)/mysql?charset=utf8'
#seconddb: 'root_dbc:dbc_root888888@tcp(rm-2ze095l91j14r251wno.mysql.rds.aliyuncs.com:3306)/mysql?charset=utf8'
#paydb: 'dbc_saas:dbc_saas888888@tcp(rm-2zepcf8kag0aol0q48o.mysql.rds.aliyuncs.com:3306)/diyu_analysis?charset=utf8'
max_open_conns: 200
max_idle_conns: 50
# max_open_conns: 200
# max_idle_conns: 50
# host: "127.0.0.1"
# user: "root"
# password: "rootroot"
# port: 3306
# dbname: "test_food"
# redis
#redis:
# host: '39.96.85.45'
# port: 6382
# password: 'saas123456'
# db: 0
# pool_size: 200
# mongo
#mongo:
# dburl: 'mongodb://saas888:saas888@39.97.234.228:27018'
# max_open_conns: 300
# 日志
log:
logsavepath: logs/
......@@ -53,11 +39,6 @@ log:
max_age: 30
max_backups: 7
#sms:
# smskey: 'dbc2021888000000'
# sendsmsurl: 'https://tsms.pet-dbc.cn/v1/send'
# smscontent: '【谛宝医生】登录验证码为:%s'
# 支付
payurl:
domainname: 'http://tpay-v2.pet-dbc.cn:14880'
......@@ -102,45 +83,3 @@ lakala:
url_preorder: 'https://test.wsmsd.cn/sit/api/v3/labs/trans/preorder' #聚合主扫(微信JSAPI、微信小程序)
url_micropay: 'https://test.wsmsd.cn/sit/api/v3/labs/trans/micropay' #聚合被扫(扫码枪)
url_refund: 'https://test.wsmsd.cn/sit/api/v3/labs/relation/refund' #聚合扫码-退款交易
# gateway
#gateway:
# url: 'http://saas.pet-dbc.cn'
# port: '8003'
# gateway
#gatewaydev:
# url: '127.0.0.1'
# port: '80'
#图片上传目录
#uploadimage:
# upload_dir: 'credit_shop'
# max_file_size: 50000000
# image_types: '(jpg|jpeg|png|pdf|gif|zip|rar)'
# accept_file_types: 'IMAGE_TYPES'
#OSS配置
#oss:
# oss_url: 'https://dbc-static.oss-cn-beijing.aliyuncs.com/'
# accesskeyid: 'LTAIDfwPBC9AnsRt'
# accesskeysecret: 'Z6FtUptrAk0Sl6H8vrVBGZLbBzXEpO'
# endpoint: 'oss-cn-beijing.aliyuncs.com'
# bucket: 'dbc-static'
#阿里云 - 全国快递物流查询
#alicloud:
# appcode: '6d1da9eb15b540688a505c1814e0c25f'
#time_duration: 7200
#e签宝
#esign:
# project_id: "5111575783"
# project_secret: "5255e7159b6262b92b03c4e307a23ed2"
# organ_auth_url: "https://openapi2.tsign.cn:8444/realname/rest/external/organ/orgAuth"
# info_auth_url: "https://openapi2.tsign.cn:8444/realname/rest/external/organ/infoAuth-special"
# jwt 与 des解密
#jwtsecret: 'Rtg8BPKNEf5mo4mgvKONGPZZQSaJWNLijxJ52qRgq0iBb7'
#deskey: 'yaoll123'
#system_pay777
......@@ -23,28 +23,14 @@ database:
# userdb: 'root_dbc:dbc_root888888@tcp(rm-2ze8jnj44l6ta299pro.mysql.rds.aliyuncs.com:3306)/mysql?charset=utf8'
# seconddb: 'root_dbc:dbc_root888888@tcp(rm-2ze095l91j14r251wno.mysql.rds.aliyuncs.com:3306)/mysql?charset=utf8'
# paydb: 'dbc_saas:dbc_saas888888@tcp(rm-2zepcf8kag0aol0q48o.mysql.rds.aliyuncs.com:3306)/diyu_analysis?charset=utf8'
max_open_conns: 200
max_idle_conns: 50
# max_open_conns: 200
# max_idle_conns: 50
# host: "127.0.0.1"
# user: "root"
# password: "rootroot"
# port: 3306
# dbname: "test_food"
# redis
#redis:
# host: '39.97.179.15'
# port: 6382
# password: 'saas123456'
# db: 0
# pool_size: 200
# mongo
#mongo:
# dburl: 'mongodb://saas888:saas888@39.97.179.15:27017'
# max_open_conns: 300
# 日志
log:
logsavepath: logs/
......@@ -55,12 +41,6 @@ log:
max_age: 30
max_backups: 7
# 国际化短信服务
sms:
smskey: 'dbc2021888000000'
sendsmsurl: 'https://sms.pet-dbc.cn/v1/send'
smscontent: '【谛宝多多】登录验证码为:%s'
# 支付
payurl:
domainname: 'http://tpay-v2.pet-dbc.cn:14880'
......@@ -69,7 +49,6 @@ payurl:
# 拉卡拉支付
lakala:
#通用
version: '1.0'
# appid: 'OP00000836' #SAAS
......@@ -120,43 +99,3 @@ lakala:
url_micropay: 'https://s2.lakala.com/api/v3/labs/trans/micropay' #聚合被扫(扫码枪)
url_refund: 'https://s2.lakala.com/api/v3/labs/relation/refund' #聚合扫码-退款交易
# gateway
#gateway:
# url: 'http://saas.pet-dbc.cn'
# port: '8003'
# gateway
#gatewaydev:
# url: '127.0.0.1'
# port: '80'
#图片上传目录
uploadimage:
upload_dir: 'credit_shop'
max_file_size: 50000000
image_types: '(jpg|jpeg|png|pdf|gif|zip|rar)'
accept_file_types: 'IMAGE_TYPES'
#OSS配置
oss:
oss_url: 'https://dbc-static.oss-cn-beijing.aliyuncs.com/'
accesskeyid: 'LTAIDfwPBC9AnsRt'
accesskeysecret: 'Z6FtUptrAk0Sl6H8vrVBGZLbBzXEpO'
endpoint: 'oss-cn-beijing.aliyuncs.com'
bucket: 'dbc-static'
#阿里云 - 全国快递物流查询
alicloud:
appcode: '6d1da9eb15b540688a505c1814e0c25f'
time_duration: 7200
#e签宝
esign:
project_id: "7438819206"
project_secret: "64c6e023ee98c82a1a7180107c320d08"
organ_auth_url: "http://smlrealname.tsign.cn:8080/realname/rest/external/organ/orgAuth"
info_auth_url: "http://smlrealname.tsign.cn:8080/realname/rest/external/organ/infoAuth-special"
# jwt 与 des解密
jwtsecret: 'Rtg8BPKNEf5mo4mgvKONGPZZQSaJWNLijxJ52qRgq0iBb7'
deskey: 'yaoll123'
......@@ -94,10 +94,6 @@ func VerifySignCert(c *gin.Context) error {
return err
}
//timestamp = c.GetHeader("Lklapi-Timestamp")
//nonce = c.GetHeader("Lklapi-Nonce")
//signature = c.GetHeader("Lklapi-Signature")
authorization := c.GetHeader("Authorization")
fmt.Println("wangpei test 验证签名0...")
fmt.Println("Authorization1="+authorization)
......@@ -143,7 +139,6 @@ func VerifySignCert(c *gin.Context) error {
return err
}
reqBody := string(byteBody)
//reqBody, _ := json.MarshalToString(body)
//JAVA demo
......@@ -181,62 +176,3 @@ func VerifySignCert(c *gin.Context) error {
fmt.Println("wangpei test ok")
return nil
}
//
//// Strval 获取变量的字符串值
//// 浮点型 3.0将会转换成字符串3, "3"
//// 非数值或字符类型的变量将会被转换成JSON格式字符串
//func Strval(value interface{}) string {
// // interface 转 string
// var key string
// if value == nil {
// return key
// }
//
// switch value.(type) {
// case float64:
// ft := value.(float64)
// key = strconv.FormatFloat(ft, 'f', -1, 64)
// case float32:
// ft := value.(float32)
// key = strconv.FormatFloat(float64(ft), 'f', -1, 64)
// case int:
// it := value.(int)
// key = strconv.Itoa(it)
// case uint:
// it := value.(uint)
// key = strconv.Itoa(int(it))
// case int8:
// it := value.(int8)
// key = strconv.Itoa(int(it))
// case uint8:
// it := value.(uint8)
// key = strconv.Itoa(int(it))
// case int16:
// it := value.(int16)
// key = strconv.Itoa(int(it))
// case uint16:
// it := value.(uint16)
// key = strconv.Itoa(int(it))
// case int32:
// it := value.(int32)
// key = strconv.Itoa(int(it))
// case uint32:
// it := value.(uint32)
// key = strconv.Itoa(int(it))
// case int64:
// it := value.(int64)
// key = strconv.FormatInt(it, 10)
// case uint64:
// it := value.(uint64)
// key = strconv.FormatUint(it, 10)
// case string:
// key = value.(string)
// case []byte:
// key = string(value.([]byte))
// default:
// newValue, _ := json.Marshal(value)
// key = string(newValue)
// }
//
// return key
//}
\ No newline at end of file
......@@ -29,15 +29,14 @@ func (l *PayController) UnifiedOrder(c *gin.Context) {
//fmt.Println("ContentType="+c.ContentType())
err := c.ShouldBindJSON(ph)
if err != nil {
zap.L().Error(err.Error())
zap.L().Error(err.Error()) //logs错误日志
base.ResponseErrorWithMsg(c, base.ServerError)
return
}
// clientIp ip
//ip = c.Ctx.Input.IP()
ip := c.ClientIP()
fmt.Println("ip="+ip)
//fmt.Println("ip="+ip)
// 拉卡拉统一支付
rtn, err := pay.UnifiedOrder(ph, ip)
......
package base
import (
"github.com/gin-gonic/gin"
)
// 获取登录时保存的常量
func GetMyClaimsItem(c *gin.Context, name string) (string) {
return c.MustGet(name).(string)
}
//// GetHospitalCode 获取hospital code
//func GetHospitalCode(c *gin.Context) string {
//
// hospitalCode := c.MustGet("hospital_code").(string)
//
// if hospitalCode == "" {
//
// token := c.Request.Header.Get("Authorization")
//
// parseToken, err := utils.ParseToken(token)
// if err != nil {
// zap.L().Error("获取hospital code 失败", zap.Error(err))
// return ""
// }
//
// hospitalCode = utils.ToDesDecrypt(parseToken.HospitalCode)
// }
//
// return hospitalCode
//}
//
//
//
//
//// GetChainID get chainID
//func GetChainID(c *gin.Context) string {
//
// ChainID := c.MustGet("chain_id").(string)
//
// if ChainID == "" {
//
// token := c.Request.Header.Get("Authorization")
//
// parseToken, err := utils.ParseToken(token)
// if err != nil {
// zap.L().Error("chain_id 失败", zap.Error(err))
// return ""
// }
//
// ChainID = utils.ToDesDecrypt(parseToken.ChainID)
// }
//
// return ChainID
//}
//
//// GetUserPhone 获取user phone
//func GetUserPhone(c *gin.Context) string {
//
// userPhone := c.MustGet("user_phone").(string)
//
// if userPhone == "" {
//
// token := c.Request.Header.Get("Authorization")
//
// parseToken, err := utils.ParseToken(token)
// if err != nil {
// zap.L().Error("获取hospital code 失败", zap.Error(err))
// return ""
// }
//
// userPhone = utils.ToDesDecrypt(parseToken.UserPhone)
// }
//
// return userPhone
//
//}
//
//// GetChainCode 获取chain code
//func GetChainCode(c *gin.Context) string {
//
// chainCode := c.MustGet("chain_code").(string)
//
// if chainCode == "" {
//
// token := c.Request.Header.Get("Authorization")
//
// parseToken, err := utils.ParseToken(token)
// if err != nil {
// zap.L().Error("获取hospital code 失败", zap.Error(err))
// return ""
// }
//
// chainCode = utils.ToDesDecrypt(parseToken.ChainCode)
// }
//
// return chainCode
//
//}
//
//// GetHospitalID 获取hospital id
//func GetHospitalID(c *gin.Context) string {
//
// hospitalID := c.MustGet("hospital_id").(string)
//
// if hospitalID == "" {
//
// token := c.Request.Header.Get("Authorization")
//
// parseToken, err := utils.ParseToken(token)
// if err != nil {
// zap.L().Error("获取hospital id 失败", zap.Error(err))
// return ""
// }
//
// hospitalID = utils.ToDesDecrypt(parseToken.HospitalID)
// }
//
// return hospitalID
//
//}
//
//// GetHospitalIDAndChainCode 获取hospital id
//func GetHospitalIDAndChainCode(c *gin.Context) (hospitalIDS, chainCodeS string) {
//
// hospitalID := c.MustGet("hospital_id").(string)
//
// if hospitalID == "" {
//
// token := c.Request.Header.Get("Authorization")
//
// parseToken, err := utils.ParseToken(token)
// if err != nil {
// zap.L().Error("获取hospital id 失败", zap.Error(err))
// return "", ""
// }
//
// hospitalID = utils.ToDesDecrypt(parseToken.HospitalID)
// }
//
// chainCode := c.MustGet("chain_code").(string)
//
// if chainCode == "" {
//
// token := c.Request.Header.Get("Authorization")
//
// parseToken, err := utils.ParseToken(token)
// if err != nil {
// zap.L().Error("获取hospital code 失败", zap.Error(err))
// return "", ""
// }
//
// chainCode = utils.ToDesDecrypt(parseToken.ChainCode)
// }
//
// return hospitalID, chainCode
//
//}
//
//
//// GetHospitalIDAndChainID 获取hospital id and chain id
//func GetHospitalIDAndChainID(c *gin.Context) (hospitalIDS, chainIDS string) {
//
// hospitalID := c.MustGet("hospital_id").(string)
//
// if hospitalID == "" {
//
// token := c.Request.Header.Get("Authorization")
//
// parseToken, err := utils.ParseToken(token)
// if err != nil {
// zap.L().Error("获取hospital id 失败", zap.Error(err))
// return "", ""
// }
//
// hospitalID = utils.ToDesDecrypt(parseToken.HospitalID)
// }
//
// ChainID := c.MustGet("chain_id").(string)
//
// if ChainID == "" {
//
// token := c.Request.Header.Get("Authorization")
//
// parseToken, err := utils.ParseToken(token)
// if err != nil {
// zap.L().Error("chain_id 失败", zap.Error(err))
// return "", "" }
//
// ChainID = utils.ToDesDecrypt(parseToken.ChainID)
// }
//
//
// return hospitalID, ChainID
//
//}
//
//
//
//// GetHospitalName 获取hospital name
//func GetHospitalName(c *gin.Context) (name string) {
//
// hospitalName := c.MustGet("hospital_name").(string)
//
// if hospitalName == "" {
//
// token := c.Request.Header.Get("Authorization")
//
// parseToken, err := utils.ParseToken(token)
// if err != nil {
// zap.L().Error("获取hospital name 失败", zap.Error(err))
// return ""
// }
//
// hospitalName = utils.ToDesDecrypt(parseToken.HospitalName)
// }
//
//
//
// return hospitalName
//
//}
//
//func ParamInt(c *gin.Context, key string) (int, error) {
//
// showType := c.Param(key)
//
// showTypeInt, err := strconv.Atoi(showType)
//
// return showTypeInt, err
//}
//
//
//func QueryInt(c *gin.Context, key string) int {
//
// showType := c.Query(key)
//
// showTypeInt, _ := strconv.Atoi(showType)
//
// return showTypeInt
//}
......@@ -3,31 +3,8 @@ package base
/*
返回码
*/
const (
// Success 请求成功
//Success = 1000
Success = 0
// ServerError 服务器错误
//ServerError = 1100
ServerError = 9
// Warning 警告
//Warning = 1200
Warning = 1
// FailedToObtainVerificationCode 验证码获取失败
//FailedToObtainVerificationCode = 1001
// PleaseCheckIfThePhoneNumberIsEnteredCorrectly 请检查电话号码是否输入正确
//PleaseCheckIfThePhoneNumberIsEnteredCorrectly = 1002
// VerificationCodeError 验证码错误
//VerificationCodeError = 1003
// AuthorizationEmpty token为空
//AuthorizationEmpty = 1004
AuthorizationEmpty = 4
// ThisAccountDoesNotHavePermission 此账号没有权限
//ThisAccountDoesNotHavePermission = 1005
// ParameterValidationFailed 参数效验失败
//ParameterValidationFailed = 1006
// 此国家暂不支持
//NotCurrentlySupportedInThisCountry = 1007
Success = 0 //请求成功
ServerError = 9 //服务器错误
Warning = 1 //警告
)
......@@ -33,53 +33,4 @@ func InternationalizedMsg(ctx *gin.Context, code int) string {
translateMsg := t.Translate(ctx, stringCode)
return translateMsg
}
// InternationalizedMsgByLanguageType 国际化msg
func InternationalizedMsgByLanguageType(languageType string, code int) string {
t = gi18n.New()
// 设置默认语言类型
if languageType == "" {
languageType = "zh-CN"
}
// 设置语言类型
t.SetLanguage(languageType)
// 传入错误码
stringCode := strconv.Itoa(code)
// 拿到对应国家的错误信息
translateMsg := t.Translate(nil, stringCode)
return translateMsg
}
func GetLanguageType(c *gin.Context) string {
languageType := c.Request.Header.Get("language")
if languageType == "" {
languageType = "zh-CN"
}
return languageType
}
// BuriedPointMsg 国际化msg
func BuriedPointMsg(code int) string {
t = gi18n.New()
//languageType := ctx.Request.Header.Get("language")
// 设置默认语言类型
//if languageType == "" {
languageType := "bp"
//}
// 设置语言类型
t.SetLanguage(languageType)
// 传入错误码
stringCode := strconv.Itoa(code)
// 拿到对应国家的错误信息
translateMsg := t.Translate(nil, stringCode)
return translateMsg
}
}
\ No newline at end of file
......@@ -11,15 +11,9 @@ import (
"msg": xx, // 提示信息
"data": {}, // 数据
}
*/
// ResponseData 统一返回数据
//type ResponseData struct {
// Code int `json:"code"`
// Msg interface{} `json:"msg"`
// Data interface{} `json:"data,omitempty"`
//}
type ResponseData struct {
Status int `json:"Status"`
Message interface{} `json:"Message"`
......@@ -27,13 +21,6 @@ type ResponseData struct {
}
// ResponseErrorWithMsg 返回错误
//func ResponseErrorWithMsg(c *gin.Context, code int) {
// c.JSON(http.StatusOK, &ResponseData{
// Code: code,
// Msg: InternationalizedMsg(c, code),
// Data: nil,
// })
//}
func ResponseErrorWithMsg(c *gin.Context, code int) {
c.JSON(http.StatusOK, &ResponseData{
Status: code,
......@@ -43,13 +30,6 @@ func ResponseErrorWithMsg(c *gin.Context, code int) {
}
// ResponseSuccess 返回正确
//func ResponseSuccess(c *gin.Context, data interface{}) {
// c.JSON(http.StatusOK, &ResponseData{
// Code: Success,
// Msg: InternationalizedMsg(c, Success),
// Data: data,
// })
//}
func ResponseSuccess(c *gin.Context, data interface{}) {
c.JSON(http.StatusOK, &ResponseData{
Status: Success,
......@@ -59,13 +39,6 @@ func ResponseSuccess(c *gin.Context, data interface{}) {
}
// ResponseErrorMsg 直接返回msg
//func ResponseErrorMsg(c *gin.Context, msg string) {
// c.JSON(http.StatusOK, &ResponseData{
// Code: Warning,
// Msg: msg,
// Data: nil,
// })
//}
func ResponseErrorMsg(c *gin.Context, msg string) {
c.JSON(http.StatusOK, &ResponseData{
Status: Warning,
......
......@@ -2,4 +2,3 @@
1000 = "success"
1100 = "サーバエラー"
1004 = "authorizationeが正しくない"
# 1007 = "この国はしばらくサポートしていません"
# 简体中文
1000 = "success"
1100 = "服务器错误"
# 1001 = "验证码获取失败"
# 1002 = "请检查电话号码是否输入正确"
# 1003 = "验证码错误"
1004 = "Authorization不正确" #Authorization为空
# 1005 ="此帐号没有权限"
# 1006 ="参数效验失败"
# 1007 = "此国家暂时不支持"
# 警告信息
# 1200 = "您已经是VIP用户,无需试用"
# 1201 = "试用已经到期, 请付费后使用"
# 1202 = "正在试用中"
# 1203 = "服务已经到期, 请付费后使用"
# 项目中key
# 1300 = "经营销售业绩"
# 1301 = "次卡业绩"
# 1302 = "服务业绩"
# 1303 = "年"
# 1304 = "个月"
# 1305 = "日"
# 1306 = "充值金额"
# 1307 = "充值次数"
# 1308 = "消费次数"
# 1309 = "新增次卡"
#
# 1500 = "用户名长度错误,应保持在3到25位之间"
# 1501 = "密码长度错误,应保持在6-20位之间"
# 1502 = "手机号码格式错误"
\ No newline at end of file
1004 = "Authorization不正确" #Authorization为空
\ No newline at end of file
......@@ -40,7 +40,6 @@ func main() {
//runCommand()
}
// 日志
if err := logger.Init(setting.Conf.LogSetting); err != nil {
panic("init logger failed, new_error:"+ err.Error())
......@@ -48,22 +47,6 @@ func main() {
//return
}
// redis
//if err := redis.Init(setting.Conf.Redis); err != nil {
// panic("init redis failed, new_error:"+ err.Error())
// //fmt.Printf("init redis failed, new_error:%v\n", new_error)
// //return
//}
// 关闭项目时候关闭redis连接
//defer redis.Close()
// mongo
//MongoDB, err := mongo.ConnectToMongoDB()
//if err != nil {
// panic("err" + err.Error())
//}
//defer mongo.Close(MongoDB)
// 注册路由
r := routers.InitRouter()
......
package jwt
//var DataAnalysisCh chan models.DataAnalysisModel
func init() {
//DataAnalysisCh = make(chan models.DataAnalysisModel, 1000)
//go DataAnalysisChannel()
}
// JWTAuthMiddleWare 基于JWT的认证中间件
//func JWTAuthMiddleWare() func(c *gin.Context) {
// return func(c *gin.Context) {
// //客户端携带Token放在请求头
// authHeader := c.Request.Header.Get("Authorization")
// if authHeader == "" {
// base.ResponseErrorWithMsg(c, base.AuthorizationEmpty)
// c.Abort()
// return
// }
//
// mc, err := utils.ParseToken(authHeader)
// if err != nil {
// base.ResponseErrorWithMsg(c, base.AuthorizationEmpty)
// c.Abort()
// return
// }
//
// // des解密
// phoneMob := utils.ToDesDecrypt(mc.PhoneMob)
// userId := utils.ToDesDecrypt(mc.UserId)
// userName := utils.ToDesDecrypt(mc.UserName)
// //hospitalCode := utils.ToDesDecrypt(mc.HospitalCode)
// //chainCode := utils.ToDesDecrypt(mc.ChainCode)
// //hospitalID := utils.ToDesDecrypt(mc.HospitalID)
// //hospitalName := utils.ToDesDecrypt(mc.HospitalName)
// //ChainID := utils.ToDesDecrypt(mc.ChainID)
// // 将当前请求的username信息保存到请求的上下文c上
// c.Set("phone_mob", phoneMob)
// fmt.Println(phoneMob)
// c.Set("user_id", userId)
// fmt.Println(userId)
// c.Set("user_name", userName)
// fmt.Println(userName)
// //c.Set("hospital_code", hospitalCode)
// //c.Set("chain_code", chainCode)
// //c.Set("hospital_id", hospitalID)
// //c.Set("hospital_name", hospitalName)
// //c.Set("chain_id", ChainID)
// // 后续的处理函数可以用过c.Get("username")来获取当前请求的用户信息
//
// // 埋点生产者
// //BuriedProducer(c, hospitalCode, hospitalName, hospitalID)
// c.Next()
// }
//}
// 埋点消费者
//func DataAnalysisChannel() {
//
// for {
// select {
// case c := <-DataAnalysisCh:
// buried_point.BuriedPointDistribution(c)
// default:
// //fmt.Println("当前没有处理的数据")
// time.Sleep(500 * time.Millisecond )
// }
// }
//}
//
//func BuriedProducer(c *gin.Context, hospitalCode, hospitalName, hospitalID string) {
//
// // 记录埋点
// var d models.DataAnalysisModel
// d.HospitalCode = hospitalCode
// d.HospitalName = hospitalName
// d.HospitalID = hospitalID
// d.RequestBody = c.Request.Body
// d.RequestTime = time.Now().Format("2006-01-02 15:04:05")
// d.RequestUrl = c.Request.RequestURI
// d.RequestPath = c.Request.URL.Path
// d.RequestShowType = base.QueryInt(c, "showType")
//
// //为防止对接口入侵达到最小 达到接口隔离效果 舍弃此方法 副本传递到下一方法
// //data, _ := c.GetRawData()
// //d.RequestData = data
// ////解决gin框架框架的数据不能重复用的问题(拿出来后放回去) 关键点
// //c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(data))
//
// // 埋点生产者
// DataAnalysisCh <- d
//}
......@@ -18,25 +18,6 @@ type WxNoticeInput struct {
SplitInfo interface{} `json:"split_info" description:""`
}
//订单交易信息
//type OrderTradeInfo struct {
// AccTradeNo string `json:"acc_trade_no"`
// AccType string `json:"acc_type"`
// BusiType string `json:"busi_type"`
// LogNo string `json:"log_no"`
// PayMode string `json:"pay_mode"`
// PayerAmount int64 `json:"payer_amount"`
// SettleMerchantNo string `json:"settle_merchant_no"`
// SettleTermNo string `json:"settle_term_no"`
// TradeAmount int64 `json:"trade_amount"`
// TradeNo string `json:"trade_no"`
// TradeStatus string `json:"trade_status"`
// TradeTime string `json:"trade_time"`
// TradeType string `json:"trade_type"`
// UserId1 string `json:"user_id1"`
// UserId2 string `json:"user_id2"`
//}
// CallbackResponse is 回调给业务方的信息
type CallbackResponse struct {
OutTradeNo string `json:"out_trade_no"` // 订单号
......
......@@ -28,24 +28,6 @@ type PlaceAnOrderParamInput struct {
ServeNoticeUrl string `json:"-" description:"传递给支付渠道的、而不是业务方的"`
}
//func (this *PlaceAnOrderParamInput) ValidPlaceAnOrderParamInput() (err error) {
// valid := validation.Validation{}
//
// if b, _ := valid.Valid(this); !b {
// //表示获取验证的结构体
// st := reflect.TypeOf(PlaceAnOrderParamInput{})
// for _, err := range valid.Errors {
// //获取验证的字段名和提示信息的别名
// filed, _ := st.FieldByName(err.Field)
// var alias= filed.Tag.Get("alias")
// //返回验证的错误信息
// return errors.New(alias + err.Message)
// }
// }
//
// return nil
//}
//退款
type RefundParamInput struct {
OrderId string `json:"order_id" description:"随机生成的订单号 商户订单号"`
......
......@@ -6,34 +6,6 @@ import (
"system_pay/setting"
)
//var (
// shopDB *sqlx.DB
// //db *sqlx.DB
// // 0 ~ h
// //userDB *sqlx.DB
// // i ~ z
// //secondDB *sqlx.DB
// // PayDB 支付
// //payDB *sqlx.DB
// err error
//)
// NewShopConn is 连接谛宝多多库
//func NewShopConn() (*sqlx.DB, error) {
// if shopDB == nil {
// shopDB, err = sqlx.Connect("mysql", setting.Conf.DatabaseSetting.ShopDB)
// return shopDB, err
// }
// //shopDB.SetMaxOpenConns(setting.Conf.DatabaseSetting.MaxOpenConns)
// return shopDB, err
//}
//
//// ShopDBClose 关闭MySQL连接
//func ShopDBClose() {
// _ = shopDB.Close()
//}
var (
systemdb *sql.DB
err error
......@@ -56,66 +28,4 @@ func CloseTx(tx *sql.Tx, err error) {
tx.Rollback()
}
tx.Commit()
}
// NewAccountConn is 连接医院用户库
//func NewAccountConn() (*sqlx.DB, error) {
// if db == nil {
// db, err = sqlx.Connect("mysql", setting.Conf.DatabaseSetting.AccountDB)
// return db, err
// }
// //db.SetMaxOpenConns(setting.Conf.DatabaseSetting.MaxOpenConns)
// return db, err
//}
// NewUserConn 连接用户存放数据的库
//func NewUserConn(chainCode string) (*sqlx.DB, error) {
//
// chainCode = strings.ToLower(chainCode)
// if len(chainCode[:1]) != 1 {
// return nil, err
// }
// word := chainCode[:1]
// if word > "h" {
// if secondDB == nil {
// secondDB, err = sqlx.Connect("mysql", setting.Conf.DatabaseSetting.SecondDB)
// return secondDB, err
// }
// //secondDB.SetMaxOpenConns(setting.Conf.DatabaseSetting.MaxOpenConns)
// return secondDB, err
// }
//
// if userDB == nil {
// userDB, err = sqlx.Connect("mysql", setting.Conf.DatabaseSetting.UserDB)
// return userDB, err
// }
// //userDB.SetMaxOpenConns(setting.Conf.DatabaseSetting.MaxOpenConns)
// return userDB, err
//}
// NewPayConn 支付
//func NewPayConn() (*sqlx.DB, error) {
// if payDB == nil {
// payDB, err = sqlx.Connect("mysql", setting.Conf.DatabaseSetting.PayDB)
// return payDB, err
// }
// //payDB.SetMaxOpenConns(setting.Conf.DatabaseSetting.MaxOpenConns)
// return payDB, err
//}
// Close 关闭MySQL连接
//func Close() {
// _ = db.Close()
//}
// PayDBClose 关闭MySQL连接
//func PayDBClose() {
// _ = payDB.Close()
//}
\ No newline at end of file
}
\ No newline at end of file
package sms
//func TestSendSmsChina(t *testing.T) {
//
// var tModel Send
//
// tModel.AreaCode = "86"
// tModel.Phone = "17538147716"
// tModel.Content = "【谛宝医生】验证码:433212,三分钟内有效"
// tModel.Source = 2
// tModel.SourceName = "谛语智慧"
//
// b, _ := json.Marshal(tModel)
//
// sign, _ := AesEncrypt(b, []byte("dbc2021888000000"))
//
// t.Log("sign: ", sign)
//
// client := &http.Client{}
// req, err := http.NewRequest("POST", "https://tsms.pet-dbc.cn/v1/send", bytes.NewReader(b))
// if err != nil {
// panic(err)
// }
//
// req.Header.Set("Content-Type", "application/json")
// req.Header.Set("sign", sign)
//
// resp, err := client.Do(req)
// if err != nil {
// panic(err)
// }
//
// defer resp.Body.Close()
// body, err := ioutil.ReadAll(resp.Body)
// if err != nil {
// panic(err)
// }
//
// fmt.Println("body: ", string(body))
//}
//
//func TestSendSmsOtherRegion(t *testing.T) {
//
// var tModel Send
//
// tModel.AreaCode = "60"
// // 手机号在刚哥那里
// tModel.Phone = "1139427345"
// tModel.Content = "【DBC】Verification code: 229900, Valid within three minutes"
//
// b, _ := json.Marshal(tModel)
//
// sign, _ := AesEncrypt(b, []byte("dbc2021888000000"))
//
// t.Log("sign: ", sign)
//
// client := &http.Client{}
// req, err := http.NewRequest("POST", "https://tsms.pet-dbc.cn/v1/send", bytes.NewReader(b))
// if err != nil {
// panic(err)
// }
//
// req.Header.Set("Content-Type", "application/json")
// req.Header.Set("sign", sign)
//
// resp, err := client.Do(req)
// if err != nil {
// panic(err)
// }
//
// defer resp.Body.Close()
// body, err := ioutil.ReadAll(resp.Body)
// if err != nil {
// panic(err)
// }
//
// fmt.Println("body: ", string(body))
//}
package sms
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"encoding/base64"
"strings"
)
//Aes 对称加密
func AesEncrypt(origData, key []byte) (string, error) {
block, err := aes.NewCipher(key)
if err != nil {
return "", err
}
blockSize := block.BlockSize()
origData = PKCS7Padding(origData, blockSize)
blockMode := cipher.NewCBCEncrypter(block, key[:blockSize])
crypted := make([]byte, len(origData))
blockMode.CryptBlocks(crypted, origData)
result := base64.StdEncoding.EncodeToString(crypted)
return result, nil
}
//Aes 对称解密
func AesDecrypt(crypted, key []byte) (string, error) {
ciphertext := strings.Replace(string(crypted), " ", "", -1)
cryptedOri, err := base64.StdEncoding.DecodeString(ciphertext)
if err != nil {
return "", err
}
block, err := aes.NewCipher(key)
if err != nil {
return "", err
}
blockSize := block.BlockSize()
blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
origData := make([]byte, len(cryptedOri))
blockMode.CryptBlocks(origData, cryptedOri)
origData = PKCS7UnPadding(origData)
return string(origData), nil
}
func PKCS7Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padtext...)
}
func PKCS7UnPadding(origData []byte) []byte {
length := len(origData)
unpadding := int(origData[length-1])
return origData[:(length - unpadding)]
}
package sms
type Send struct {
Phone string `json:"phone" description:"手机号"`
Content string `json:"content" description:"发送的内容、注意需要携带短信签名 【】"`
AreaCode string `json:"area_code" description:"区号"`
Source int `json:"source" description:"来源 1:谛宝多多 2:谛宝医生 3:收银台 4:谛宠有品 5:CRM 6:谛赋"`
SourceName string `json:"source_name" description:"业务子系统名称 业务系统自定义"`
}
\ No newline at end of file
package redis
//
//import (
// "fmt"
// "github.com/go-redis/redis"
// "system_pay/setting"
//)
//
//var (
// Redisclient *redis.Client
// Nil = redis.Nil
//)
//
//// Init 初始化连接
//func Init(cfg *setting.RedisConfig) (err error) {
//
// Redisclient = redis.NewClient(&redis.Options{
// Addr: fmt.Sprintf("%s:%d", cfg.Host, cfg.Port),
// Password: cfg.Password, // no password set
// DB: cfg.DB, // use default DB
// PoolSize: cfg.PoolSize,
// MinIdleConns: cfg.MinIdleConns,
// })
//
//
// _, err = Redisclient.Ping().Result()
// if err != nil {
// return err
// }
// return err
//}
//
//func Close() {
// _ = Redisclient.Close()
//}
package repository
import (
"strings"
)
////QueryChainCodeAndLocalIDByPhone 查询用户信息
//func QueryChainCodeAndLocalIDByPhone(phone string) (string, int, error) {
//
// db, err := mysql.NewAccountConn()
// if err != nil {
// return "", 0, err
// }
// // 查询医院是否存在
// var chainCode string
// var employeeLocalID int
// err = db.QueryRow(`select default_chain_code, employee_local_id from hos_database.employee_wx
// where employee_phone = ?`, phone).Scan(&chainCode, &employeeLocalID)
// switch {
// case err == sql.ErrNoRows:
// return "", 0, errors.New("没有这个用户")
// case err != nil:
// return "", 0, err
// }
//
// return chainCode, employeeLocalID, nil
//}
//
//// 根据医院code 获取云端id
//func GetHospitalIdByCode(hospitalCode string) (string, error) {
//
// db, err := mysql.NewAccountConn()
// if err != nil {
// return "", err
// }
//
// var hospitalId string
//
// err = db.QueryRow("select id from hospital_main where hospital_code = ?", hospitalCode).Scan(&hospitalId)
// if err != nil {
// return "", err
// }
//
// return hospitalId, nil
//}
//
//// QueryChainCodeByPhone 查询用户使用的是哪个医院的数据
//func QueryChainCodeByPhone(phone string) (chain string, err error) {
//
// db, err := mysql.NewAccountConn()
// if err != nil {
// return "", err
// }
//
// // 查询医院是否存在
// var chainCode string
// err = db.QueryRow(`select default_chain_code from employee_wx
// where employee_phone = ?`, phone).Scan(&chainCode)
// if err != nil {
// return "", err
// }
//
// if chainCode == "" {
// return "", errors.New("查不到这个用户")
// }
//
// return chainCode, nil
//}
//
//// QueryChainCode 查询chain_code
//func QueryChainCode(phone string) (string, error) {
//
// db, err := mysql.NewAccountConn()
// if err != nil {
// return "", err
// }
//
// var code string
//
// err = db.QueryRow(`select c.chain_code from hospital_main as h
// LEFT JOIN chain_main as c on h.chain_id = c.id
// where c.delflag = 0 AND h.delflag = 0 AND h.create_phone = ?`, phone).Scan(&code)
//
// if err != nil {
// return "", err
// }
//
// return code, nil
//}
//
//// QueryChainID 查询chain_ID
//func QueryChainID(phone string) (int, error) {
//
// db, err := mysql.NewAccountConn()
// if err != nil {
// return 0, err
// }
//
// var id int
//
// err = db.QueryRow(`select c.id from hospital_main as h
// LEFT JOIN chain_main as c on h.chain_id = c.id
// where c.delflag = 0 AND h.delflag = 0 AND h.create_phone = ?`, phone).Scan(&id)
//
// if err != nil {
// return 0, err
// }
//
// return id, nil
//}
//
//// QueryHospitalCode 查询医院码
//func QueryHospitalCode(phone string) (string, error) {
//
// db, err := mysql.NewAccountConn()
// if err != nil {
// return "", err
// }
//
// var code string
//
// err = db.QueryRow(`select hospital_code from hospital_main where delflag = 0 and create_phone = ?`, phone).Scan(&code)
//
// if err != nil {
// return "", err
// }
//
// return code, nil
//}
//
//// CheckHospitalPhone 检查手机号码是否有效
//func CheckHospitalPhone(phone string) (bool, error) {
//
// db, err := mysql.NewAccountConn()
// if err != nil {
// return false, err
// }
//
// var (
// code int
// authorizeState int
// storageMethod int
// chainID int64
// )
// // 查询是否注册过
// err = db.QueryRow(`select count(*) from hospital_main where create_phone = ?`, phone).Scan(&code)
// if err != nil {
// return false, err
// }
//
// //chain_id
// err = db.QueryRow(`select chain_id from hospital_main where create_phone = ?`, phone).Scan(&chainID)
// if err != nil {
// return false, err
// }
//
// // 查询是否授权
// err = db.QueryRow(`SELECT IFNULL(b.authorize_state ,0) FROM hospital_main AS a left join hospital_operate AS b
// ON a.id = b.hospital_main_id WHERE a.create_phone = ? `, phone).Scan(&authorizeState)
// if err != nil {
// return false, err
// }
//
// // 查询是否授权
// err = db.QueryRow(`SELECT store_type FROM chain_config where chain_main_id = ? `, chainID).Scan(&storageMethod)
// if err != nil {
// return false, err
// }
//
// if authorizeState == 1 && code > 0 && storageMethod == 0 {
// return true, nil
// }
//
// return false, err
//}
// PackingDatabaseName 包装数据库名称
func PackingDatabaseName(tableName, code string) string {
return "dbc_" + strings.ToLower(code) + "." + tableName
}
// QueryHospitalID 查询医院码
//func QueryHospitalID(chainCode, hospitalCode string) (int, string, error) {
//
// db, err := mysql.NewUserConn(chainCode)
// if err != nil {
// return 0, "", err
// }
//
// tableName := PackingDatabaseName("sys_hospital", chainCode)
//
// querySQL := fmt.Sprintf(`select id,_name from %s
// where delflag = 0 and hospital_code = ?`, tableName)
//
// var (
// id int
// name string
// )
//
// err = db.QueryRow(querySQL, hospitalCode).Scan(&id, &name)
// if err != nil {
// zap.L().Error("err", zap.Error(err))
// return 0, "", err
// }
// return id, name, err
//}
//GetTheCostOfGoods 获取商品成本
//func GetTheCostOfGoods(chainCode, hospitalID string, db *sqlx.DB) ([]models.CommodityCost, error) {
//
// commodityCosts := make([]models.CommodityCost, 0)
//
// getTheCostOfGoodsSQL := fmt.Sprintf(`select con_commodity_id,costmoney from g_stock
// where delflag = 0 and sys_hospital_id = %d`, hospitalID)
//
// rows, err := db.Query(getTheCostOfGoodsSQL)
// if err != nil {
// zap.L().Error("err", zap.Error(err))
// return nil, err
// }
//
// for rows.Next() {
// var t models.CommodityCost
// err = rows.Scan(&t.CommodityID, t.CommodityCostPrice)
// if err != nil {
// zap.L().Error("err", zap.Error(err))
// return nil, err
// }
// commodityCosts = append(commodityCosts, t)
// }
//
// return commodityCosts, err
//
//}
......@@ -14,13 +14,13 @@ import (
"fmt"
"github.com/astaxie/beego/httplib"
uID "github.com/satori/go.uuid"
"io/ioutil"
rand2 "math/rand"
"strconv"
"strings"
"system_pay/models"
"system_pay/mysql"
"system_pay/setting"
"system_pay/utils"
"time"
)
......@@ -33,9 +33,6 @@ func UnifiedOrder(input *models.PlaceAnOrderParamInput, ip string) (interface{},
if input.PlatformType==0 {
return nil, errors.New("输入项「platform_type」为空错误")
}
//if input.SourceCode<0 || input.SourceCode>6 {
// return errors.New("输入参数「source_code」错误"), "", nil
//}
fmt.Println("谛宝多多输入参数")
fmt.Println(input)
......@@ -364,7 +361,6 @@ func getAuthorization(platform_type uint8, body string) (string, error) {
appid := setting.Conf.Lakala.Appid
mchSerialNo := setting.Conf.Lakala.SerialNo
nonceStr := RandomString(32) // 构造随机数
timestamp := strconv.FormatInt(time.Now().Unix(), 10)
......@@ -408,8 +404,8 @@ func getAuthorization(platform_type uint8, body string) (string, error) {
//todo 退款时,证书???
//return "", errors.New("输入项「平台类型(platform_type)」数据错误")
//base64Sig, err := utils.RSASign([]byte(message), "./cert/dev/OP00000003_private_key.pem")
base64Sig, err := utils.RSASign([]byte(message), path_private_key)
//base64Sig, err := RSASign([]byte(message), "./cert/dev/OP00000003_private_key.pem")
base64Sig, err := RSASign([]byte(message), path_private_key)
if err != nil {
return "", err
}
......@@ -884,3 +880,50 @@ func RandomString(n int) string {
}
return string(result)
}
// 私钥签名过程
func RSASign(data []byte, filename string) (string, error) {
// 1、选择hash算法,对需要签名的数据进行hash运算
myhash := crypto.SHA256
hashInstance := myhash.New()
hashInstance.Write(data)
hashed := hashInstance.Sum(nil)
// 2、读取私钥文件,解析出私钥对象
privateKey, err := ReadParsePrivaterKey(filename)
if err != nil {
return "", err
}
// 3、RSA数字签名(参数是随机数、私钥对象、哈希类型、签名文件的哈希串),生成base64编码的签名字符串
bytes, err := rsa.SignPKCS1v15(rand.Reader, privateKey, myhash, hashed)
if err != nil {
return "", err
}
return base64.StdEncoding.EncodeToString(bytes), nil
}
// 读取私钥文件,解析出私钥对象
func ReadParsePrivaterKey(filename string) (*rsa.PrivateKey, error) {
// 1、读取私钥文件,获取私钥字节
privateKeyBytes, err := ioutil.ReadFile(filename)
if err != nil {
return nil, err
}
// 2、对私钥文件进行编码,生成加密块对象
block, _ := pem.Decode(privateKeyBytes)
fmt.Println(block.Type)
if block == nil {
return nil, errors.New("私钥信息错误!")
}
// 3、解析DER编码的私钥,生成私钥对象
//privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
//if err != nil {
// return nil, err
//}
prkI, err := x509.ParsePKCS8PrivateKey(block.Bytes)
if err != nil {
return nil, err
}
privateKey := prkI.(*rsa.PrivateKey)
return privateKey, nil
}
\ No newline at end of file
......@@ -16,7 +16,6 @@ func InitRouter() *gin.Engine {
r := gin.Default()
// 测试与开发状态启用swagger
if gin.Mode() == gin.TestMode || gin.Mode() == gin.DebugMode {
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
......@@ -30,57 +29,5 @@ func InitRouter() *gin.Engine {
// 拉卡拉统一支付
v1_router.PayRouter(r)
// 登录
//v1_router.LoginRouter(r)
// 注册
//v1_router.RegisterRouter(r)
// 上传
//v1_router.UploadRouter(r)
// v1版本接口
//v1 := r.Group("/api/v1")
//v1.Use(jwt.JWTAuthMiddleWare())
//{
// // 全国快递物流
// v1_router.ExpressRouter(v1)
//
// // 谛宝多多账号
// v1_router.MemberRouter(v1)
//
// // 采购订单
// v1_router.PurchaseOrderRouter(v1)
//
// // 数据概览
// //v1_router.DataOverview(v1)
// //
// //// 顾客分析
// //v1_router.CustomerAnalysisRouter(v1)
// //
// //// 会员卡分析
// //v1_router.MembershipCardAnalysis(v1)
// //
// //// 次卡分析
// //v1_router.SecondaryCardAnalysis(v1)
// //
// //// 医疗消费
// //v1_router.MedicalConsumptionAnalysis(v1)
// //
// //// 病历量分析
// //v1_router.MedicalRecordsAnalysis(v1)
// //
// //// 商品分析
// //v1_router.CommodityAnalysis(v1)
// //
// //// 员工分析
// //v1_router.EmployeeAnalysis(v1)
// //
// //// 支付相关
// //v1_router.PayMoney(v1)
// //
// //// 埋点
// //v1_router.BuriedPoint(v1)
//}
return r
}
......@@ -15,37 +15,9 @@ type Config struct {
ServerSetting *Server `mapstructure:"server"`
AppSetting *App `mapstructure:"app"`
DatabaseSetting *Database `mapstructure:"database"`
//Redis *RedisConfig `mapstructure:"redis"`
LogSetting *Log `mapstructure:"log"`
Sms *SmsInternationalConfig `mapstructure:"sms"`
UploadImage *UploadImage `mapstructure:"uploadimage"`
Oss *Oss `mapstructure:"oss"`
AliCloud *AliCloud `mapstructure:"alicloud"`
Esign *Esign `mapstructure:"esign"`
JwtSecret string `mapstructure:"jwtsecret"`
DesKey string `mapstructure:"deskey"`
PayUrl *PayUrlDetail `mapstructure:"payurl"`
Lakala *Lakala `mapstructure:"lakala"`
//SmsInternational *SmsInternationalConfig `mapstructure:"newsms"`
//GateWay *GateWayDetail `mapstructure:"gateway"`
//GateWayDev *GateWayDevDetail `mapstructure:"gatewaydev"`
//Mongo *MongoConfig `mapstructure:"mongo"`
}
type App struct {
Name string `mapstructure:"name"`
Version string `mapstructure:"version"`
TimeFormat string `mapstructure:"timeformat""`
}
type Log struct {
LogSavePath string `mapstructure:"logsavepath"`
LogSaveName string `mapstructure:"logsavename"`
LogFileExt string `mapstructure:"logfileext"`
Level string `mapstructure:"level"`
MaxSize int `mapstructure:"max_size"`
MaxAge int `mapstructure:"max_age"`
MaxBackups int `mapstructure:"max_backups"`
}
// Server 服务
......@@ -56,65 +28,31 @@ type Server struct {
WriteTimeout time.Duration `mapstructure:"writetimeout"`
}
type App struct {
Name string `mapstructure:"name"`
Version string `mapstructure:"version"`
TimeFormat string `mapstructure:"timeformat""`
}
// Database DB
type Database struct {
Type string `mapstructure:"type""`
ShopDB string `mapstructure:"shopdb"`
SystemDB string `mapstructure:"systemdb"`
UserDB string `mapstructure:"userdb"`
SecondDB string `mapstructure:"seconddb"`
AccountDB string `mapstructure:"accountdb"`
PayDB string `mapstructure:"paydb"`
//MaxOpenConns int `mapstructure:"max_open_conns"`
//MaxIdleConns int `mapstructure:"max_idle_conns"`
//Host string `mapstructure:"host"`
//User string `mapstructure:"user""`
//Password string `mapstructure:"password""`
//Port int `mapstructure:"port"`
//DB string `mapstructure:"dbname"`
}
// RedisConfig redis
//type RedisConfig struct {
// Host string `mapstructure:"host"`
// Password string `mapstructure:"password"`
// Port int `mapstructure:"port"`
// DB int `mapstructure:"db"`
// PoolSize int `mapstructure:"pool_size"`
// MinIdleConns int `mapstructure:"min_idle_conns"`
//}
// MongoConfig mongo设置
//type MongoConfig struct {
// DBUrl string `mapstructure:"dburl"`
// MaxOpenConns uint64 `mapstructure:"max_open_conns"`
//}
// SmsInternationalConfig 国际化短信
type SmsInternationalConfig struct {
SmsKey string `mapstructure:"smskey"`
SendSmsUrl string `mapstructure:"sendsmsurl"`
SmsContent string `mapstructure:"smscontent"`
type Log struct {
LogSavePath string `mapstructure:"logsavepath"`
LogSaveName string `mapstructure:"logsavename"`
LogFileExt string `mapstructure:"logfileext"`
Level string `mapstructure:"level"`
MaxSize int `mapstructure:"max_size"`
MaxAge int `mapstructure:"max_age"`
MaxBackups int `mapstructure:"max_backups"`
}
//
//// GateWayDetail 网关
//type GateWayDetail struct {
// URL string `mapstructure:"url"`
// Port string `mapstructure:"port"`
//}
//
//// GateWayDevDetail 网关
//type GateWayDevDetail struct {
// URL string `mapstructure:"url"`
// Port string `mapstructure:"port"`
//}
//
// PayUrlDetail 网关
type PayUrlDetail struct {
DomainName string `mapstructure:"domainname"`
//CheckOrder string `mapstructure:"checkorder"`
//OrderState string `mapstructure:"orderstate"`
}
// 拉卡拉支付
......@@ -138,6 +76,7 @@ type Lakala struct {
// 4.扫码枪
MerchantNo4 string `mapstructure:"merchant_no4"`
TermNo4 string `mapstructure:"term_no4"`
// 配置项
// 谛宝多多自营
DbcPathPrivateKey string `mapstructure:"dbc_path_private_key"` //私钥
......@@ -155,34 +94,6 @@ type Lakala struct {
UrlRefund string `mapstructure:"url_refund"` //聚合扫码-退款交易
}
type UploadImage struct {
UploadDir string `mapstructure:"upload_dir"`
MaxFileSize int `mapstructure:"max_file_size"`
ImageTypes string `mapstructure:"image_types""`
AcceptFileTypes string `mapstructure:"accept_file_types""`
}
type Oss struct {
OssUrl string `mapstructure:"oss_url"`
AccessKeyID string `mapstructure:"accesskeyid"`
AccessKeySecret string `mapstructure:"accesskeysecret""`
EndPoint string `mapstructure:"endpoint""`
Bucket string `mapstructure:"bucket""`
}
type AliCloud struct {
AppCode string `mapstructure:"appcode"`
TimeDuration int `mapstructure:"time_duration"`
}
//e签宝
type Esign struct {
ProjectId string `mapstructure:"project_id"`
ProjectSecret string `mapstructure:"project_secret"`
OrganAuthUrl string `mapstructure:"organ_auth_url"`
InfoAuthUrl string `mapstructure:"info_auth_url"`
}
// Init 支持热修改的viper设置
func Init() error {
viper.SetConfigFile("conf/config.yaml") // 指定配置文件路径
......@@ -207,7 +118,6 @@ func Init() error {
})
return err
}
func GetPort() string {
......
package utils
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"crypto/md5"
"encoding/base64"
"fmt"
"io"
"strings"
)
//Utf8ToGBK is will encoding utf8 to gbk
//func Utf8ToGBK(content string) string {
// enc := mahonia.NewEncoder("gbk")
// return enc.ConvertString(content)
//}
//MD55 will create str out md5
func MD55(str string) string {
m := md5.New()
io.WriteString(m, str)
return strings.ToLower(fmt.Sprintf("%x", m.Sum(nil)))
}
//Aes 对称加密
func AesEncrypt(origData, key []byte) (string, error) {
block, err := aes.NewCipher(key)
if err != nil {
return "", err
}
blockSize := block.BlockSize()
origData = PKCS7Padding(origData, blockSize)
blockMode := cipher.NewCBCEncrypter(block, key[:blockSize])
crypted := make([]byte, len(origData))
blockMode.CryptBlocks(crypted, origData)
result := base64.StdEncoding.EncodeToString(crypted)
return result, nil
}
//Aes 对称解密
func AesDecrypt(crypted, key []byte) (string, error) {
ciphertext := strings.Replace(string(crypted), " ", "", -1)
cryptedOri, err := base64.StdEncoding.DecodeString(ciphertext)
if err != nil {
return "", err
}
block, err := aes.NewCipher(key)
if err != nil {
return "", err
}
blockSize := block.BlockSize()
blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
origData := make([]byte, len(cryptedOri))
blockMode.CryptBlocks(origData, cryptedOri)
origData = PKCS7UnPadding(origData)
return string(origData), nil
}
func PKCS7Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padtext...)
}
func PKCS7UnPadding(origData []byte) []byte {
length := len(origData)
unpadding := int(origData[length-1])
return origData[:(length - unpadding)]
}
package utils
import (
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/sha1"
"crypto/x509"
"encoding/base64"
"encoding/hex"
"encoding/pem"
"errors"
"fmt"
"io/ioutil"
)
//func test() {
// str := "from A to B 500RMB"
// base64Sig, _ := RSASign([]byte(str), "../cert/OP00000003_private_key.pem")
// fmt.Println("签名后的信息:", base64Sig)
//
// err := RSAVerify([]byte(str), base64Sig, "../cert/OP00000003_cert.cert")
// if err == nil {
// fmt.Println("验证成功!")
// } else {
// fmt.Println("验证失败!")
// }
//}
// 私钥签名过程
func RSASign(data []byte, filename string) (string, error) {
// 1、选择hash算法,对需要签名的数据进行hash运算
myhash := crypto.SHA256
hashInstance := myhash.New()
hashInstance.Write(data)
hashed := hashInstance.Sum(nil)
// 2、读取私钥文件,解析出私钥对象
privateKey, err := ReadParsePrivaterKey(filename)
if err != nil {
return "", err
}
// 3、RSA数字签名(参数是随机数、私钥对象、哈希类型、签名文件的哈希串),生成base64编码的签名字符串
bytes, err := rsa.SignPKCS1v15(rand.Reader, privateKey, myhash, hashed)
if err != nil {
return "", err
}
return base64.StdEncoding.EncodeToString(bytes), nil
}
// 公钥验证签名过程
func RSAVerify(data []byte, base64Sig, filename string) error {
// 1、对base64编码的签名内容进行解码,返回签名字节
bytes, err := base64.StdEncoding.DecodeString(base64Sig)
if err != nil {
return err
}
// 2、选择hash算法,对需要签名的数据进行hash运算
myhash := crypto.SHA256
hashInstance := myhash.New()
hashInstance.Write(data)
hashed := hashInstance.Sum(nil)
// 3、读取公钥文件,解析出公钥对象
publicKey, err := ReadParsePublicKey(filename)
if err != nil {
return err
}
// 4、RSA验证数字签名(参数是公钥对象、哈希类型、签名文件的哈希串、签名后的字节)
return rsa.VerifyPKCS1v15(publicKey, myhash, hashed, bytes)
}
// 读取公钥文件,解析出公钥对象
func ReadParsePublicKey(filename string) (*rsa.PublicKey, error) {
// 1、读取公钥文件,获取公钥字节
publicKeyBytes, err := ioutil.ReadFile(filename)
if err != nil {
return nil, err
}
// 2、解码公钥字节,生成加密块对象
block, _ := pem.Decode(publicKeyBytes)
if block == nil {
return nil, errors.New("公钥信息错误!")
}
// 3、解析DER编码的公钥,生成公钥接口
//publicKeyInterface2, err := asn1.Marshal(block.Bytes)
//fmt.Println(publicKeyInterface2)
publicKeyInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
//publicKeyInterface, err := x509.ParseCertificate(block.Bytes)
if err != nil {
fmt.Println(8888888888)
return nil, err
}
// 4、公钥接口转型成公钥对象
publicKey := publicKeyInterface.(*rsa.PublicKey)
return publicKey, nil
}
// 读取私钥文件,解析出私钥对象
func ReadParsePrivaterKey(filename string) (*rsa.PrivateKey, error) {
// 1、读取私钥文件,获取私钥字节
privateKeyBytes, err := ioutil.ReadFile(filename)
if err != nil {
return nil, err
}
// 2、对私钥文件进行编码,生成加密块对象
block, _ := pem.Decode(privateKeyBytes)
fmt.Println(block.Type)
if block == nil {
return nil, errors.New("私钥信息错误!")
}
// 3、解析DER编码的私钥,生成私钥对象
//privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
//if err != nil {
// return nil, err
//}
prkI, err := x509.ParsePKCS8PrivateKey(block.Bytes)
if err != nil {
return nil, err
}
privateKey := prkI.(*rsa.PrivateKey)
return privateKey, nil
}
//(3)签名:采用sha1算法进行签名并输出为hex格式(私钥PKCS8格式)
func RsaSignWithSha1Hex(data string, prvKey string) (string, error) {
//keyByts, err := hex.DecodeString(prvKey)
keyByts := []byte(prvKey)
//if err != nil {
// fmt.Println("DecodeString err", err)
// return "", err
//}
privateKey, err := x509.ParsePKCS8PrivateKey(keyByts)
if err != nil {
fmt.Println("ParsePKCS8PrivateKey err", err)
return "", err
}
h := sha1.New()
h.Write([]byte([]byte(data)))
hash := h.Sum(nil)
signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey.(*rsa.PrivateKey), crypto.SHA1, hash[:])
if err != nil {
fmt.Printf("Error from signing: %s\n", err)
return "", err
}
out := hex.EncodeToString(signature)
return out, nil
}
//(4)验签:对采用sha1算法进行签名后转base64格式的数据进行验签
func RsaVerySignWithSha1Base64(originalData, signData, pubKey string) error{
sign, err := base64.StdEncoding.DecodeString(signData)
if err != nil {
return err
}
//public, _ := base64.StdEncoding.DecodeString(pubKey)
public := []byte(pubKey)
pub, err := x509.ParsePKIXPublicKey(public)
if err != nil {
return err
}
hash := sha1.New()
hash.Write([]byte(originalData))
return rsa.VerifyPKCS1v15(pub.(*rsa.PublicKey), crypto.SHA1, hash.Sum(nil), sign)
}
//func VerifySignCert(signData, sign, signType, aliPayPublicKeyPath string) (err error) {
// var (
// h hash.Hash
// hashs crypto.Hash
// block *pem.Block
// pubKey *x509.Certificate
// publicKey *rsa.PublicKey
// ok bool
// bytes []byte
// )
// if bytes, err = ioutil.ReadFile(aliPayPublicKeyPath); err != nil {
// return fmt.Errorf("支付宝公钥文件读取失败: %w", err)
// }
// signBytes, _ := base64.StdEncoding.DecodeString(sign)
// if block, _ = pem.Decode(bytes); block == nil {
// return errors.New("支付宝公钥Decode错误")
// }
// if pubKey, err = x509.ParseCertificate(block.Bytes); err != nil {
// return fmt.Errorf("x509.ParseCertificate:%w", err)
// }
// if publicKey, ok = pubKey.PublicKey.(*rsa.PublicKey); !ok {
// return errors.New("支付宝公钥转换错误")
// }
// switch signType {
// case "RSA":
// hashs = crypto.SHA1
// case "RSA2":
// hashs = crypto.SHA256
// default:
// hashs = crypto.SHA256
// }
// h = hashs.New()
// h.Write([]byte(signData))
// return rsa.VerifyPKCS1v15(publicKey, hashs, h.Sum(nil), signBytes)
//}
//func VerifyDerCert(der_cert []byte, der_signing_cert []byte) (bool, error) {
//func VerifyDerCert(der_cert []byte, filename string) (bool, error) {
// // 1、读取私钥文件,获取私钥字节
// der_signing_cert, err := ioutil.ReadFile(filename)
// if err != nil {
// return false, err
// }
//
// roots := x509.NewCertPool()
// opts := x509.VerifyOptions{
// Roots: roots,
// }
//
// // Verify key
// policy_cert, err := x509.ParseCertificate(der_signing_cert)
// if err != nil {
// return false, errors.New("Signing ParseCertificate fails")
// }
// roots.AddCert(policy_cert)
// fmt.Printf("Root cert: %x\n", der_signing_cert)
//
// // Verify key
// cert, err := x509.ParseCertificate(der_cert)
// if err != nil {
// return false, errors.New("Cert ParseCertificate fails")
// }
//
// roots.AddCert(policy_cert)
// opts.Roots = roots
// chains, err := cert.Verify(opts)
// if err != nil {
// return false, errors.New("Verify fails")
// }
// if chains != nil {
// return true, nil
// } else {
// return false, nil
// }
//
//}
\ No newline at end of file
package utils
import (
"bytes"
"crypto/cipher"
"crypto/des"
"encoding/base64"
"go.uber.org/zap"
"system_pay/setting"
)
//利用秘钥通过DES算法实现明文的加密
//利用秘钥通过DES算法实现密文的解密
//在加密和解密之前,首先需要补码和去码的操作
// PKCS5Padding 补码
func PKCS5Padding(orgData []byte, blockSize int) []byte {
//abc55555
padding := blockSize - len(orgData)%8
padtxt := bytes.Repeat([]byte{byte(padding)}, padding)
return append(orgData, padtxt...)
}
// PKCS5UnPadding 去码
func PKCS5UnPadding(cipherTxt []byte) []byte {
length := len(cipherTxt)
unpadding := int(cipherTxt[length-1])
return cipherTxt[:length-unpadding]
//cipherTxt[:4]
}
// DesEncrypt DES加密,加密会用到补码
func DesEncrypt(orig []byte, key []byte) []byte {
//首先检验秘钥是否合法
//DES加密算法,秘钥的长度必须为8bit block.BlockSize() = 8;
block, _ := des.NewCipher(key)
//补码
origData := PKCS5Padding(orig, block.BlockSize())
//设置加密方式
blockMode := cipher.NewCBCEncrypter(block, key)
//加密处理
crypted := make([]byte, len(origData)) //存放加密后的密文
blockMode.CryptBlocks(crypted, origData)
return crypted
}
// DesDecrypt DES解密,解密要用到去码
func DesDecrypt(cipherTxt []byte, key []byte) []byte {
//校验key的有效性
block, _ := des.NewCipher(key)
//设置解码方式
blockMode := cipher.NewCBCDecrypter(block, key)
//创建缓冲,存放解密后的数据
orgData := make([]byte, len(cipherTxt))
//开始解密
blockMode.CryptBlocks(orgData, cipherTxt)
//去掉编码
orgData = PKCS5UnPadding(orgData)
return orgData
}
// GetEncryptDes 进行des加密
func GetEncryptDes(s string) string {
return base64.StdEncoding.EncodeToString(DesEncrypt([]byte(s), []byte(setting.Conf.DesKey)))
// 通过base64处理秘文 打印成string
// base64.StdEncoding.EncodeToString(cipherTxt)
}
// ToDesDecrypt des对称解密
func ToDesDecrypt(cipherTxt string) string {
decodeString, err := base64.StdEncoding.DecodeString(cipherTxt)
if err != nil {
zap.L().Error("解密错误")
}
return string(DesDecrypt(decodeString, []byte(setting.Conf.DesKey)))
}
package utils
import (
"crypto/hmac"
"crypto/sha256"
"encoding/hex"
"encoding/json"
"errors"
"github.com/astaxie/beego"
"github.com/astaxie/beego/httplib"
"system_pay/setting"
)
//func SignflowsGet(url, token string) (interface{}, error) {
// Writelog(url, time.Now().Format("2006-01-02")+"SignflowsGetReq")
// req := httplib.Get(url)
// req.Header("X-Tsign-Open-App-Id", beego.AppConfig.String("PROJECT_ID"))
// req.Header("X-Tsign-Open-Token", token)
// req.Header("Content-Type", "application/json")
// body, err := req.Bytes()
// fmt.Println(string(body))
// Writelog(string(body), time.Now().Format("2006-01-02")+"SignflowsGetReply")
// if err != nil {
// return nil, err
// }
// temp := make(map[string]interface{}, 0)
// if err = json.Unmarshal(body, &temp); err != nil {
// return nil, err
// }
// errCode, ok := temp["code"].(float64)
//
// if ok != true {
// return nil, errors.New("获取签署失败")
// }
//
// if errCode != 0 {
// return nil, errors.New(temp["message"].(string))
// }
// return temp["data"], err
//}
//func SignHttpPost(url string, data map[string]interface{}, request string, response string) (map[string]interface{}, error) {
// byte, _ := json.Marshal(data)
// //Writelog(string(byte), time.Now().Format("2006-01-02")+request)
// req := httplib.Post(url)
// req.Header("X-Tsign-Open-App-Id", beego.AppConfig.String("PROJECT_ID"))
// req.Header("X-Tsign-Open-App-Secret", beego.AppConfig.String("PROJECT_SECRET"))
// req.Header("Content-Type", "application/json")
// req.Body(byte)
// body, err := req.Bytes()
// //Writelog(string(body), time.Now().Format("2006-01-02")+response)
// if err != nil {
// return nil, err
// }
// temp := make(map[string]interface{}, 0)
// if err = json.Unmarshal(body, &temp); err != nil {
// return nil, err
// }
// return temp, err
//}
//
//, request string, response string
func OrganizeAuthPost(url string, data []byte) (map[string]interface{}, error) {
//Writelog(url, time.Now().Format("2006-01-02")+"url")
//Writelog(string(data), time.Now().Format("2006-01-02")+request)
signature := ComputeHmacSha256(string(data), beego.AppConfig.String("PROJECT_SECRET"))
req := httplib.Post(url)
req.Header("X-timevale-mode", "package")
req.Header("X-timevale-project-id", beego.AppConfig.String("PROJECT_ID"))
req.Header("X-timevale-signature", signature)
req.Header("X-timevale-signature-algorithm", "hmac-sha256")
req.Header("Content-Type", "application/json")
req.Body(data)
body, err := req.Bytes()
//Writelog(string(body), time.Now().Format("2006-01-02")+response)
temp := make(map[string]interface{}, 0)
if err = json.Unmarshal(body, &temp); err != nil {
return nil, err
}
return temp, err
}
func ComputeHmacSha256(message string, secret string) string {
key := []byte(secret)
h := hmac.New(sha256.New, key)
h.Write([]byte(message))
sha := hex.EncodeToString(h.Sum(nil))
return sha
}
//func HttpPost(url string, data []byte, request string, response string) (map[string]interface{}, error) {
// Writelog(string(data), time.Now().Format("2006-01-02")+request)
// req := httplib.Post(url)
// req.Body(data)
// body, err := req.Bytes()
// Writelog(string(body), time.Now().Format("2006-01-02")+response)
// if err != nil {
// return nil, err
// }
// temp := make(map[string]interface{}, 0)
// if err = json.Unmarshal(body, &temp); err != nil {
// return nil, err
// }
// fmt.Println(temp)
// return temp, err
//}
//
//func CreateData(url string, param map[string]interface{}) (interface{}, error) {
//
// data, err := SignHttpPost(url, param, "", "")
//
// if err != nil {
// return nil, err
// }
//
// errCode, ok := data["errCode"].(float64)
//
// if ok != true {
// return nil, errors.New("CreateData转换失败")
// }
//
// if errCode != 0 {
// return nil, errors.New(data["msg"].(string))
// }
//
// return data["data"], nil
//}
//
//func SendHttpPUT(url, contentBase64Md5 string, fileContent []byte) (map[string]interface{}, error) {
// req := httplib.Put(url)
// req.Header("Content-Type", "application/pdf")
// req.Header("Content-Md5", contentBase64Md5)
// req.Body(fileContent)
// body, err := req.Bytes()
// temp := make(map[string]interface{}, 0)
//
// err = json.Unmarshal(body, &temp)
//
// if err != nil {
// return nil, err
// }
// return temp, err
//}
//
//func GetUploadurl(url string, param map[string]interface{}) (map[string]interface{}, error) {
//
// filePath, ok := param["filePath"].(string)
//
// if ok != true {
// return nil, errors.New("文件直传filePath转换失败")
// }
//
// req := httplib.Get(filePath)
// fileContent, err := req.Bytes()
//
// uuidValue, err := uuid.NewV4()
//
// if err != nil {
// return nil, err
// }
//
// //产生文件唯一值
// guid := uuidValue.String()
// f, err := os.Create(guid + ".pdf")
// defer f.Close()
//
// if err != nil {
// return nil, err
// }
// _, err = f.Write(fileContent)
//
// fileSize := len(fileContent)
//
// fileMd5, err := GetContentBase64Md5(guid + ".pdf")
// if err != nil {
// return nil, err
// }
//
// //删除文件
// if err = os.Remove(guid + ".pdf"); err != nil {
// return nil, err
// }
//
// param["fileSize"] = fileSize
// param["contentType"] = "application/pdf"
// param["contentMd5"] = fileMd5
//
// data, err := CreateData(url, param)
//
// if err != nil {
// return nil, err
// }
//
// contentMd5, ok := fileMd5.(string)
//
// if ok != true {
// return nil, errors.New(languages.AssertionFailure)
// }
//
// if ok != true {
// return nil, errors.New(languages.AssertionFailure)
// }
//
// uploadUrl, ok := data.(map[string]interface{})["uploadUrl"].(string)
//
// if ok != true {
// return nil, errors.New(languages.AssertionFailure)
// }
//
// uploadRes, err := SendHttpPUT(uploadUrl, contentMd5, fileContent)
//
// if err != nil || uploadRes["errCode"].(float64) != 0 {
// return nil, err
// }
//
// return data.(map[string]interface{}), nil
//}
//阿里云 - 全国快递物流查询
func SendHttpExpress(querys string) (map[string]interface{}, error) {
//appcode := beego.AppConfig.String("AppCode")
appcode := setting.Conf.AliCloud.AppCode
//appcode = "6d1da9eb15b540688a505c1814e0c25f"
//querys = "no=JDVB03807259358&type=JD" //example
//querys = "no=432230466057007"
url := "https://wuliu.market.alicloudapi.com/kdi?" + querys //url拼接
//fmt.Println(appcode)
//fmt.Println(url)
req := httplib.Get(url)
req.Header("Authorization", "APPCODE "+appcode)
req.Body("")
body, err := req.Bytes()
temp := make(map[string]interface{}, 0)
err = json.Unmarshal(body, &temp)
//fmt.Println(temp)
if err != nil {
return nil, err
}
if temp["status"] != "0" {
if temp["msg"]=="" {
err = errors.New("物流信息取得失败")
} else {
err = errors.New(temp["msg"].(string))
}
}
return temp, err
}
package utils
import (
"github.com/dgrijalva/jwt-go"
"github.com/pkg/errors"
"system_pay/conf"
"system_pay/setting"
"time"
)
// MyClaims 自定义声明结构体并内嵌jwt.StandardClaims
// jwt包自带的jwt.StandardClaims只包含了官方字段
// 我们这里需要额外记录一个username字段,所以要自定义结构体
// 如果想要保存更多信息,都可以添加到这个结构体中
type MyClaims struct {
UserName string `json:"user_name" description:"用户名称"` // 用户名称
UserId string `json:"user_id" description:"用户ID"` // 用户ID
PhoneMob string `json:"phone_mob" description:"用户手机号"` // 用户手机号
//HospitalCode string `json:"hospital_code" description:"医院唯一码"` // 医院唯一码
//ChainCode string `json:"chain_code" description:"连锁码"` // 连锁码
//HospitalID string `json:"hospital_id" description:"医院ID"` // 医院ID
//HospitalName string `json:"hospital_name" description:"医院名称"` // 医院名称
//ChainID string `json:"chain_id" description:"连锁ID"` // 连锁ID
jwt.StandardClaims
}
var MySecret = []byte(setting.Conf.JwtSecret)
//const TokenExpireDuration = time.Hour * 24 * 7
// ParseToken 解析JWT
func ParseToken(tokenString string) (*MyClaims, error) {
// 解析token
token, err := jwt.ParseWithClaims(tokenString, &MyClaims{}, func(token *jwt.Token) (i interface{}, err error) {
return MySecret, nil
})
if err != nil {
return nil, err
}
if claims, ok := token.Claims.(*MyClaims); ok && token.Valid { // 校验token
return claims, nil
}
return nil, errors.New("invalid token")
}
// GetToken 生成JWT
func GetToken(phoneMob, userId, userName string) (string, error) {
// 进行des加密
desUserName := GetEncryptDes(userName)
desUserId := GetEncryptDes(userId)
desPhoneMob := GetEncryptDes(phoneMob)
//desHospitalCode := GetEncryptDes(hospitalCode)
//
//desChainCode := GetEncryptDes(chainCode)
//
//desHospitalName := GetEncryptDes(hospitalName)
//
//strHospitalID := strconv.Itoa(hospitalID)
//
//desHospitalID := GetEncryptDes(strHospitalID)
//
//strChainID := strconv.Itoa(chainID)
//
//desChainID := GetEncryptDes(strChainID)
// 创建一个我们自己的声明
c := MyClaims{
desUserName, // 自定义字段
desUserId, // 自定义字段
desPhoneMob, // 自定义字段
//"", // 自定义字段
//"", // 自定义字段
//"",
//"",
//"", // 自定义字段
jwt.StandardClaims{
ExpiresAt: time.Now().Add(conf.TokenExpireDuration).Unix(), // 过期时间
Issuer: "system_pay", // 签发人
},
}
//使用指定的签名方法创建签名对象
token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)
//使用指定的secret签名并获得完整的编码后的字符串token
return token.SignedString(MySecret)
}
// GetToken 生成JWT
//func GetToken(userPhone, hospitalCode, chainCode, hospitalName string, hospitalID int, chainID int) (string, error) {
//
// // 进行des加密
// desUserPhone := GetEncryptDes(userPhone)
//
// desHospitalCode := GetEncryptDes(hospitalCode)
//
// desChainCode := GetEncryptDes(chainCode)
//
// desHospitalName := GetEncryptDes(hospitalName)
//
// strHospitalID := strconv.Itoa(hospitalID)
//
// desHospitalID := GetEncryptDes(strHospitalID)
//
// strChainID := strconv.Itoa(chainID)
//
// desChainID := GetEncryptDes(strChainID)
//
// // 创建一个我们自己的声明
// c := MyClaims{
// desUserPhone, // 自定义字段
// desHospitalCode, // 自定义字段
// desChainCode, // 自定义字段
// desHospitalID,
// desHospitalName,
// desChainID, // 自定义字段
// jwt.StandardClaims{
// ExpiresAt: time.Now().Add(TokenExpireDuration).Unix(), // 过期时间
// Issuer: "system_pay", // 签发人
// },
// }
// //使用指定的签名方法创建签名对象
// token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)
// //使用指定的secret签名并获得完整的编码后的字符串token
// return token.SignedString(MySecret)
//
//}
// GetTheInformationCarriedInTheToken 获取token中信息
//func GetTheInformationCarriedInTheToken(token string) (userPhone string, chainCode string, err error) {
//
// parseToken, err := ParseToken(token)
// if err != nil {
// zap.L().Error("解析token失败")
// return "", "", err
// }
//
// return ToDesDecrypt(parseToken.UserPhone), ToDesDecrypt(parseToken.HospitalCode), nil
//
//}
package utils
import (
"crypto/md5"
"encoding/hex"
)
// EncodeMD5 md5 encryption
func EncodeMD5(value string) string {
m := md5.New()
m.Write([]byte(value))
return hex.EncodeToString(m.Sum(nil))
}
// MD5 md5加密
func MD5(s string) string {
h := md5.New()
h.Write([]byte(s))
x := h.Sum(nil)
y := make([]byte, 32)
hex.Encode(y, x)
return string(y)
}
package utils
import (
// import mysql
_ "github.com/go-sql-driver/mysql"
)
//var (
// db *sql.DB
// err error
//)
//
//// NewPayConn is 连接支付库
//func NewPayConn() (*sql.DB, error) {
// if db == nil {
// db, err = sql.Open("mysql", beego.AppConfig.String("PayURL"))
// return db, err
// }
// return db, nil
//}
// GetResultRow is 获取返回值, 获取一条
//func GetResultRow(rows *sql.Rows) map[string]string {
// columns, _ := rows.Columns()
// scanArgs := make([]interface{}, len(columns))
// values := make([][]byte, len(columns))
// for j := range values {
// scanArgs[j] = &values[j]
// }
// record := make(map[string]string)
// for rows.Next() {
// rows.Scan(scanArgs...)
// for i, v := range values {
// if v != nil {
// record[columns[i]] = string(v)
// }
// }
// }
// return record
//}
// GetResultRows is 获取所有
//func GetResultRows(rows *sql.Rows) map[int]map[string]string {
// columns, _ := rows.Columns()
// values := make([][]byte, len(columns))
// scans := make([]interface{}, len(columns))
// for k, _ := range values {
// scans[k] = &values[k]
// }
// i := 0
// result := make(map[int]map[string]string)
// for rows.Next() {
// rows.Scan(scans...)
// row := make(map[string]string)
// for k, v := range values {
// key := columns[k]
// row[key] = string(v)
// }
// result[i] = row
// i++
// }
// return result
//}
//// CloseTx is 有错误则关闭事务、没错则提交事务
//func CloseTx(tx *sql.Tx, err error) {
// if err != nil {
// tx.Rollback()
// }
// tx.Commit()
//}
package utils
import (
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"system_pay/setting"
"time"
)
var(
//setting
//accessKeyID = setting.Conf.JwtSecret
//endPoint = setting.Conf.endPoint
//bucket = setting.Conf.bucket
//accessKeySecret = setting.Conf.accessKeySecret
//accessKeyID = setting.Conf.Oss.AccessKeyID
//accessKeySecret = setting.Conf.Oss.AccessKeySecret
//endPoint = setting.Conf.Oss.EndPoint
//bucket = setting.Conf.Oss.Bucket
//accessKeyID = "LTAIDfwPBC9AnsRt"
//endPoint = "Z6FtUptrAk0Sl6H8vrVBGZLbBzXEpO"
//bucket = "oss-cn-beijing.aliyuncs.com"
//accessKeySecret = "dbc-static"
Buckets *oss.Bucket
)
func GetOssBucket() (*oss.Bucket, error) {
// oss
accessKeyID := setting.Conf.Oss.AccessKeyID
accessKeySecret := setting.Conf.Oss.AccessKeySecret
endPoint := setting.Conf.Oss.EndPoint
bucket := setting.Conf.Oss.Bucket
if Buckets == nil {
client, err := oss.New(endPoint, accessKeyID, accessKeySecret)
if err != nil {
return nil, err
}
// 获取存储空间。
Buckets, err = client.Bucket(bucket)
if err != nil {
return nil, err
}
}
return Buckets, nil
}
func GetDate() string {
year := time.Now().Format("2006")
month := time.Now().Format("01")
day := time.Now().Format("02")
return year + month + day
}
package utils
type PageData struct {
Page int64
PageSize int64
TotalCount int64
TotalPage int64
Data interface{}
}
//GetPageData 获取分页数据
func GetPageData(page, pageSize, total int64) (int64, int64, PageData) {
if page <= 0 {
page = 1
}
if pageSize <= 0 {
pageSize = 10
}
var pageData PageData
pageData.Page = page
pageData.PageSize = pageSize
pageData.TotalCount = total
pageData.TotalPage = total / pageSize
if total%pageSize > 0 {
pageData.TotalPage += 1
}
if page > pageData.TotalPage {
page = pageData.TotalPage
pageData.Page = page
}
start := pageSize * (page - 1)
if start < 0 {
start = 0
}
return pageSize, start, pageData
}
package utils
import (
"regexp"
)
//检查手机号格式
func CheckPhoneNo(phone_no string)(bool) {
reg := `^1\d{10}$`
rgx := regexp.MustCompile(reg)
if (!rgx.MatchString(phone_no)) {
return false
}
return true
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment