@@ -5,14 +5,19 @@ import ( | |||||
svc2 "applet/app/admin/svc/enterprise_manage" | svc2 "applet/app/admin/svc/enterprise_manage" | ||||
"applet/app/customer/md" | "applet/app/customer/md" | ||||
"applet/app/customer/svc" | "applet/app/customer/svc" | ||||
"applet/app/db" | |||||
"applet/app/e" | "applet/app/e" | ||||
"applet/app/enum" | |||||
svc3 "applet/app/svc" | svc3 "applet/app/svc" | ||||
"context" | "context" | ||||
"github.com/chromedp/chromedp" | "github.com/chromedp/chromedp" | ||||
"github.com/chromedp/chromedp/device" | "github.com/chromedp/chromedp/device" | ||||
"github.com/gin-gonic/gin" | "github.com/gin-gonic/gin" | ||||
"github.com/wechatpay-apiv3/wechatpay-go/core" | |||||
"github.com/wechatpay-apiv3/wechatpay-go/services/certificates" | "github.com/wechatpay-apiv3/wechatpay-go/services/certificates" | ||||
"github.com/wechatpay-apiv3/wechatpay-go/services/partnerpayments/jsapi" | |||||
"io/ioutil" | "io/ioutil" | ||||
"time" | |||||
) | ) | ||||
func CurlAlipayPlanetEcocampusApiRosterSignUpInfo(c *gin.Context) { | func CurlAlipayPlanetEcocampusApiRosterSignUpInfo(c *gin.Context) { | ||||
@@ -54,6 +59,49 @@ func DownloadCertificates(c *gin.Context) { | |||||
return | return | ||||
} | } | ||||
func WxPay(c *gin.Context) { | |||||
client, err := svc3.NewWxPayClient(c) | |||||
if err != nil { | |||||
e.OutErr(c, e.ERR, err.Error()) | |||||
return | |||||
} | |||||
wxSvc := jsapi.JsapiApiService{Client: client} | |||||
sysCfgDb := db.SysCfgDb{} | |||||
sysCfgDb.Set() | |||||
sysCfg := sysCfgDb.SysCfgFindWithDb(enum.WxSpAppId, enum.WxSpMchId, enum.WxAppletAppId, enum.WxMchId) | |||||
resp, result, err := wxSvc.Prepay(c, | |||||
jsapi.PrepayRequest{ | |||||
SpAppid: core.String(sysCfg[enum.WxSpAppId]), | |||||
SpMchid: core.String(sysCfg[enum.WxSpMchId]), | |||||
SubAppid: core.String(sysCfg[enum.WxAppletAppId]), | |||||
SubMchid: core.String(sysCfg[enum.WxMchId]), | |||||
Description: core.String("Image形象店-深圳腾大-QQ公仔"), | |||||
OutTradeNo: core.String("1217752501201407033233368018"), | |||||
TimeExpire: core.Time(time.Now()), | |||||
Attach: core.String("自定义数据说明"), | |||||
NotifyUrl: core.String("https://www.weixin.qq.com/wxpay/pay.php"), | |||||
Amount: &jsapi.Amount{ | |||||
Currency: core.String("CNY"), | |||||
Total: core.Int64(100), | |||||
}, | |||||
Payer: &jsapi.Payer{ | |||||
//SpOpenid: core.String("oUpF8uMuAJO_M2pxb1Q9zNjWeS6o"), | |||||
SubOpenid: core.String("o0mnM4nlX9W5HXbagffM9eTDHaPo"), | |||||
}, | |||||
}, | |||||
) | |||||
if err != nil { | |||||
// 处理错误 | |||||
e.OutErr(c, e.ERR, err.Error()) | |||||
return | |||||
} else { | |||||
// 处理返回结果 | |||||
println("status=%d resp=%s", result.Response.StatusCode, resp) | |||||
} | |||||
return | |||||
} | |||||
func Demo(c *gin.Context) { | func Demo(c *gin.Context) { | ||||
ordNo := c.DefaultQuery("ord_no", "") | ordNo := c.DefaultQuery("ord_no", "") | ||||
svc2.JudgePackageOrdOrdState(ordNo) | svc2.JudgePackageOrdOrdState(ordNo) | ||||
@@ -357,3 +357,109 @@ func CalcByDay(uid int, isTeacher bool, buyPackageReq md2.BuyPackageReq) (totalP | |||||
return | return | ||||
} | } | ||||
func CalcSupplementaryByDay(uid int, isTeacher bool, buyPackageReq md2.BuyPackageReq) (totalPrice float64, data []*model.CentralKitchenForSchoolUserWithDay, err error) { | |||||
//sysCfgDb := db.SysCfgDb{} | |||||
//sysCfgDb.Set() | |||||
//cfg, err := sysCfgDb.SysCfgGetOne(enum.CentralKitchenForSchoolReserveMealTime) | |||||
//if err != nil { | |||||
// return | |||||
//} | |||||
//1、查询出套餐基础设置 | |||||
centralKitchenForSchoolWithSpec := db.CentralKitchenForSchoolWithSpec{} | |||||
centralKitchenForSchoolWithSpec.Set(buyPackageReq.EnterpriseId) | |||||
centralKitchenForSchoolWithSpecData, err := centralKitchenForSchoolWithSpec.GetCentralKitchenForSchoolWithSpec() | |||||
if err != nil { | |||||
return | |||||
} | |||||
classWithUserDb := db.ClassWithUserDb{} | |||||
classWithUserDb.Set() | |||||
classWithUserInfo, err := classWithUserDb.GetInfoByUserIdentityId(buyPackageReq.UserIdentityId) | |||||
if err != nil { | |||||
return | |||||
} | |||||
//now := time.Now() | |||||
//today, _ := time.ParseInLocation("2006-01-02", time.Now().Format("2006-01-02"), time.Local) | |||||
//tomorrowDay := today.AddDate(0, 0, 1) | |||||
//centralKitchenForSchoolReserveMealTime, _ := time.ParseInLocation("2006-01-02 15:04:05", now.Format("2006-01-02")+" "+cfg.Val+":00", time.Local) | |||||
//2、循环拼接数据 | |||||
for _, v1 := range buyPackageReq.WithDays { | |||||
//2.1、判断是否小于今天 | |||||
//date, _ := time.ParseInLocation("2006-01-02", v1.Date, time.Local) | |||||
//if today.After(date) || today.Equal(date) { | |||||
// continue | |||||
//} | |||||
//if tomorrowDay.Equal(date) { | |||||
// //2.2、判断是否过了今日可订餐时间 | |||||
// if now.After(centralKitchenForSchoolReserveMealTime) { | |||||
// continue | |||||
// } | |||||
//} | |||||
//2.3、计算价格 && 组装数据 | |||||
if v1.IsBuyBreakfast == 1 && buyPackageReq.IsBuyBreakfast == 1 { | |||||
//早餐 | |||||
var amount string | |||||
if isTeacher { | |||||
amount = centralKitchenForSchoolWithSpecData.BreakfastUnitPriceForTeacher | |||||
} else { | |||||
amount = classWithUserInfo.Period.BreakfastUnitPrice | |||||
} | |||||
data = append(data, &model.CentralKitchenForSchoolUserWithDay{ | |||||
Uid: uid, | |||||
EnterpriseId: buyPackageReq.EnterpriseId, | |||||
IdentityId: buyPackageReq.UserIdentityId, | |||||
Kind: enum.CentralKitchenForSchoolUserWithDayKindForBreakfast, | |||||
Date: v1.Date, | |||||
Amount: amount, | |||||
State: enum.CentralKitchenForSchoolUserWithDayStateForWait, | |||||
}) | |||||
totalPrice += utils.StrToFloat64(amount) | |||||
} | |||||
if v1.IsBuyLunch == 1 && buyPackageReq.IsBuyLunch == 1 { | |||||
var amount string | |||||
if isTeacher { | |||||
amount = centralKitchenForSchoolWithSpecData.LunchUnitPriceForTeacher | |||||
} else { | |||||
amount = classWithUserInfo.Period.LunchUnitPrice | |||||
} | |||||
totalPrice += utils.StrToFloat64(amount) | |||||
data = append(data, &model.CentralKitchenForSchoolUserWithDay{ | |||||
Uid: uid, | |||||
EnterpriseId: buyPackageReq.EnterpriseId, | |||||
IdentityId: buyPackageReq.UserIdentityId, | |||||
Kind: enum.CentralKitchenForSchoolUserWithDayKindForLunch, | |||||
Date: v1.Date, | |||||
State: enum.CentralKitchenForSchoolUserWithDayStateForWait, | |||||
Amount: amount, | |||||
}) | |||||
} | |||||
if v1.IsBuyDinner == 1 && buyPackageReq.IsBuyDinner == 1 { | |||||
var amount string | |||||
if isTeacher { | |||||
amount = centralKitchenForSchoolWithSpecData.DinnerUnitPriceForTeacher | |||||
} else { | |||||
amount = classWithUserInfo.Period.DinnerUnitPrice | |||||
} | |||||
totalPrice += utils.StrToFloat64(amount) | |||||
data = append(data, &model.CentralKitchenForSchoolUserWithDay{ | |||||
Uid: uid, | |||||
EnterpriseId: buyPackageReq.EnterpriseId, | |||||
IdentityId: buyPackageReq.UserIdentityId, | |||||
Kind: enum.CentralKitchenForSchoolUserWithDayKindForDinner, | |||||
Amount: amount, | |||||
Date: v1.Date, | |||||
State: enum.CentralKitchenForSchoolUserWithDayStateForWait, | |||||
}) | |||||
} | |||||
} | |||||
return | |||||
} |
@@ -64,7 +64,7 @@ func BuyPackage(c *gin.Context, req md.BuyPackageReq) (outTradeNo, tradeNo, tota | |||||
} | } | ||||
} | } | ||||
if req.Kind == 4 { | if req.Kind == 4 { | ||||
totalPrice, data, err = CalcByDay(user.Id, isTeacher, req) | |||||
totalPrice, data, err = CalcSupplementaryByDay(user.Id, isTeacher, req) | |||||
if err != nil { | if err != nil { | ||||
return | return | ||||
} | } | ||||
@@ -34,8 +34,10 @@ const ( | |||||
WxAppletAppId = "wx_applet_app_id" | WxAppletAppId = "wx_applet_app_id" | ||||
WxAppletAppSecret = "wx_applet_app_secret" | WxAppletAppSecret = "wx_applet_app_secret" | ||||
WxMchId = "wx_mch_id" | WxMchId = "wx_mch_id" | ||||
WxMchApiV3Key = "wx_mch_api_v3_key" | |||||
WxMchCertificateSerialNumber = "wx_mch_certificate_serial_number" | |||||
WxSpMchApiV3Key = "wx_sp_mch_api_v3_key" | |||||
WxSpMchCertificateSerialNumber = "wx_sp_mch_certificate_serial_number" | |||||
WxSpAppId = "wx_sp_app_id" | |||||
WxSpMchId = "wx_sp_mch_id" | |||||
) | ) | ||||
func (gt SysCfg) String() string { | func (gt SysCfg) String() string { | ||||
@@ -98,10 +100,14 @@ func (gt SysCfg) String() string { | |||||
return "微信-小程序-appSecret" | return "微信-小程序-appSecret" | ||||
case WxMchId: | case WxMchId: | ||||
return "微信商户id" | return "微信商户id" | ||||
case WxMchApiV3Key: | |||||
return "微信商户apiV3密钥" | |||||
case WxMchCertificateSerialNumber: | |||||
return "微信商户证书序列号" | |||||
case WxSpMchApiV3Key: | |||||
return "微信服务商-商户apiV3密钥" | |||||
case WxSpMchCertificateSerialNumber: | |||||
return "微信服务商-商户证书序列号" | |||||
case WxSpAppId: | |||||
return "微信服务商-appid" | |||||
case WxSpMchId: | |||||
return "微信服务商-商户id" | |||||
default: | default: | ||||
return "未知" | return "未知" | ||||
} | } | ||||
@@ -26,6 +26,7 @@ func CustomerInit(r *gin.RouterGroup) { | |||||
r.GET("/wxGetAccessToken", hdl.WxGetAccessToken) | r.GET("/wxGetAccessToken", hdl.WxGetAccessToken) | ||||
r.POST("/wxDecryptUserInfo", hdl.WxDecryptUserInfo) | r.POST("/wxDecryptUserInfo", hdl.WxDecryptUserInfo) | ||||
r.POST("/wxDecryptMobile", hdl.WxDecryptMobile) | r.POST("/wxDecryptMobile", hdl.WxDecryptMobile) | ||||
r.POST("/wxPay", hdl.WxPay) | |||||
r.POST("/register", hdl.Register) | r.POST("/register", hdl.Register) | ||||
r.POST("/aesDecrypt", hdl.AesDecrypt) | r.POST("/aesDecrypt", hdl.AesDecrypt) | ||||
@@ -12,12 +12,12 @@ import ( | |||||
func NewWxPayClient(ctx *gin.Context) (client *core.Client, err error) { | func NewWxPayClient(ctx *gin.Context) (client *core.Client, err error) { | ||||
sysCfgDb := db.SysCfgDb{} | sysCfgDb := db.SysCfgDb{} | ||||
sysCfgDb.Set() | sysCfgDb.Set() | ||||
sysCfg := sysCfgDb.SysCfgFindWithDb(enum.WxMchId, enum.WxMchApiV3Key, enum.WxMchCertificateSerialNumber) | |||||
sysCfg := sysCfgDb.SysCfgFindWithDb(enum.WxSpAppId, enum.WxSpMchApiV3Key, enum.WxSpMchCertificateSerialNumber) | |||||
var ( | var ( | ||||
mchID string = sysCfg[enum.WxMchId] // 商户号 | |||||
mchCertificateSerialNumber string = sysCfg[enum.WxMchCertificateSerialNumber] // 商户证书序列号 | |||||
mchAPIv3Key string = sysCfg[enum.WxMchApiV3Key] // 商户APIv3密钥 | |||||
mchID string = sysCfg[enum.WxSpAppId] // 商户号 | |||||
mchCertificateSerialNumber string = sysCfg[enum.WxSpMchCertificateSerialNumber] // 商户证书序列号 | |||||
mchAPIv3Key string = sysCfg[enum.WxSpMchApiV3Key] // 商户APIv3密钥 | |||||
) | ) | ||||
// 使用 utils 提供的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名 | // 使用 utils 提供的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名 | ||||
@@ -18,7 +18,7 @@ func SyncCentralKitchenForSchoolUserWithDayState(eg *xorm.Engine) { | |||||
}() | }() | ||||
now := time.Now() | now := time.Now() | ||||
today, _ := time.ParseInLocation("2006-01-02", time.Now().Format("2006-01-02"), time.Local) | |||||
today := now.Format("2006-01-02") | |||||
breakfastMealTime, _ := time.ParseInLocation("2006-01-02 15:04:05", now.Format("2006-01-02")+" 06:30", time.Local) | breakfastMealTime, _ := time.ParseInLocation("2006-01-02 15:04:05", now.Format("2006-01-02")+" 06:30", time.Local) | ||||
lunchMealTime, _ := time.ParseInLocation("2006-01-02 15:04:05", now.Format("2006-01-02")+" 12:00", time.Local) | lunchMealTime, _ := time.ParseInLocation("2006-01-02 15:04:05", now.Format("2006-01-02")+" 12:00", time.Local) | ||||
dinnerMealTime, _ := time.ParseInLocation("2006-01-02 15:04:05", now.Format("2006-01-02")+" 17:00", time.Local) | dinnerMealTime, _ := time.ParseInLocation("2006-01-02 15:04:05", now.Format("2006-01-02")+" 17:00", time.Local) | ||||
@@ -1,28 +1,28 @@ | |||||
-----BEGIN PRIVATE KEY----- | -----BEGIN PRIVATE KEY----- | ||||
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDGgwnKlRY+VV+O | |||||
JPsHjOMqwD5xUmX5aEZyI/LwL4xG7eRntSRh+iEGZFHAhS14oaSUokPeeJBB3UIP | |||||
UTvGzANQysLF7n52K9MCst2rzEdqP2eCIZZxzdr78AbnSqP41CbDaEOG8tBtAYg1 | |||||
AWUA8vej8BpyPS66UeoL8cZ6ymHW3eT9lUno6jmQ6U+aZDKDKVoXNMdlVr9E3TWy | |||||
fa9FI63nzvXu3XKftrfXkupAE+KDdHS0cyYHWHJrRSSfqR3ibSeXJILs0fZbUWtz | |||||
JdbZJhMqZ7oGlxFb06kvAEkHUmfbBKBvqMUjWoBDYfdT2EfAYQukXBXk4qjn1HP6 | |||||
OSsMMpMXAgMBAAECggEAFscyeGxjAQQK0uSraVJhPqaQg7BQwy2T58T4O1c5YWoq | |||||
qzu90QBCidk5CD4/2XeyyttTrlNnOieJTPilQ0pllv+tGckj+atNqyGbDfuCtk5Q | |||||
Mj5oZOaaGg6QvDl0VzkAuatdFD8Ia3mhh3OBg3pdsBH89t7OXdLIaFZ1z+EpGN5p | |||||
hS9j/pL63/ND/zbUsTinXlvnki5T55TPJQgSTG9Kaa9bFg4ovcPTjceKlgx5CbXO | |||||
0qp+2AAM5JKSFry1uLnaata8lgHAb2trki8xWp8nLV3SvIHY67owVacy44SnXcqw | |||||
/lU0RrQDWAjhCDsnbYUcIeV+2VzAcrPZEZXJ82ETAQKBgQDo2UewxxcbfUNUcJnn | |||||
OW7hHliRpjUY//N2/G7uiBskVrRxdJxSihVPcnvWqQbu6BXopfs6jpBXAic9N9i9 | |||||
ONlMfNIFHsiSeRUw+sMJCXFj8LKf7qwp/O4i4s82FInZjhESLiBytry5SJB26SHn | |||||
ntmXYIKwV5virUtrJF9DJvml9QKBgQDaP8dLT+KXcNoi1yy/k1nFiItlMvKZilXo | |||||
UQvHqnXI/SmbK4FwSpTV0jF7KVRV+9EvLBvRPf5omREmRYo7+9a+nqPw1+XEQJss | |||||
Y93IB8ppFH+4Pm8TkokQG3Vpu4OON6OHaaC+aRDoVv99p9izt28o3E3u2a55cn29 | |||||
fASK/NAhWwKBgCXIK9PJWjyBpM0swCw+q3knvWNUvsThsxWZfD6EIzNQRlMqgrr5 | |||||
4N9VSjbYkmFtkzB+zjcALvePR+KtDyQU911r24AtMIpjz0Z1SfRLbfSzd6hvx8vA | |||||
WLucZdb2mi+M18RFa8pxUEoYNii1R2UX52KirFIExSyQxe4KptJ0nomJAoGADpHJ | |||||
ZR6tGrz+4uqIYzWb/ZLS82uGRHe2qm6WobqgaE12NJSf7HYeH3QLt5QXvDG2UjbY | |||||
mIxR6nulaG+l/cEfIdSHTzGqdgJ2GW2FRbA3c/JZYFxSn/TdT4T1vpw0+Q5/zS9g | |||||
+rUa2tfL8IB+9+hb9FdYoIRJoHPjLv4Tc4/S+RcCgYEAwaALk8h2dzwdkQ9SqPVZ | |||||
UMYuwjJwKWraw8DgttpDvZW7mM1QUe8xM5RTR/pEw9GNveNVPgJR9ZMn7DHDcJow | |||||
orFFMk8JU6TjYX57cOpPF11SVyLDZ8L9O8B2x0ganNWF6Dqt2VS7m9LBdk9ZJM/c | |||||
GbUdBkFO0THQ91leDwRLxMg= | |||||
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDFC1f98VxgQQTy | |||||
QUdzFFzlR4thFPnEnveblGcWq1w5+KjGKQrVP0izoytifmy/N4Kfy9K1O6fOY00r | |||||
5D1i60neXRlaYgerIxJFPVvXTWPerd57U1OpbCq1gIcfM6wbvJ2ZGn6Qv+OcSNjs | |||||
R2QLN1JdaKRC0j+dTtFiEdOSNKyO+ca+klXMgxUH/BKcFHJs/q4CDgnJ3pVTL0I+ | |||||
Qp0GnIPE8E/lkMqqFG7BL5HWyFOkM7T6qgBVahpzedKgzShFsypBC8G0KILpCAZ1 | |||||
y1R7hu6DZTqSUA5NS8qJ2LyzqtZsCmMSmD54N9Z7uakDE/M+FrcvZhHEgxXEbBOb | |||||
BeMLht2VAgMBAAECggEADSB6VjKUIt1yBOmQZvw+TA/+GxOYqB6nBDhYvcvgswP7 | |||||
ymfFjvtOTplaNI+TkxGRpC+h8+zrevZml7v20vY1z5iILdtGA4Ksnuw9iBRhyN3w | |||||
amrcsfbAyaKsXcnFd3uTTDXVpLMD6M95lBQVeCHRXOOxvbnf/wzXKh9h5uWXcVbY | |||||
kM/5Yy823kU1JAfuEthRbuGBkqCRfuxB/B+ZttBywmYvBCd5fTR4RvHJQy19NY6k | |||||
7uvRIjQ18opznbgHVPbjWcV77pxzN6VGFMajHk6FsLIjdx3579HIlqmQ3paQrizY | |||||
p2OTtjZAF4IUzxcYXIwRTUmcSop5QX8px1cD1YG0aQKBgQDqboWipuDzVHYj6RUM | |||||
goqIG4p9fZuQuk1RL6WlULiDXeCs8kEhlFGcAqcJCX7sRddcH1vT0d9zApBo0CHQ | |||||
AitgGAAesP6zcUHj4uVe7DnXpDJgl2Nei0MljF6XF3rZdJyyxvkk9fD1/QhoEdfO | |||||
eb6hHwFgg4SIVHMAK/lOuMfAfwKBgQDXLEArZdylbOwb5Io9S4e3PqVLjqDTm7Yl | |||||
klTbMIua6h0KIMh4JMYjG8JWFbclSMqrUqRdLfkdBMP+vN8dziFlCPtaiLYTPoR6 | |||||
4AUKuvJSm6lI2ALJ68xYCPXk3j5WhGofOAYdgilspX+hRPig3AHm15TMN5Fi3sSy | |||||
5Ce3l0JX6wKBgBwgbIoqSX0IWjBOy8a3dtWDsGcEBgEkSRh/hflCqRCh184INsZH | |||||
nE8ChnXwHLlOW9tiq8rLOGr9GMRqjFP/nqKl3oXQKI7w/L3RwEFWSE5WFfE+2J5E | |||||
SScdI1Avcf7bHd3ZP5UuqN1qoXKTCXhtZPDB3pFs1h7hOvb/T6chRl4TAoGBANUs | |||||
Yeac5Bx/7Os1YD+ZtLs2tUxF4c/DVJGkh60gSy8PAfYmxHVC+YmO1tmyad/mXeOd | |||||
3Hj0Mvks34BgXiuJLEyMuXjYOIqYRWf2yQf4blqpHO2uFBU4JxqQxgwYomnUhc6o | |||||
EmbprWCWFfwP+MJlNP0eV6x64O6zBOy2XSLmGDRBAoGBAKmDa0tNt4CRD0YQFRcD | |||||
3rL08pJhPQhZkXIhMd6LT43tEkG7UXAmdO8HUA4iRLItJ6zSYyqdbezwMdylJPTr | |||||
lNOrnf8rl7FtcUNII3FyKWxnKBeRxXEfcC7NdcFYesfhtXLsJRoUe75ZRVo5GyBR | |||||
59lsC+r0kk/WSt6oXi5LLl8A | |||||
-----END PRIVATE KEY----- | -----END PRIVATE KEY----- |