智慧食堂
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

hdl_pay.go 12 KiB

1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
11ヶ月前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
1年前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. package hdl
  2. import (
  3. "applet/app/cfg"
  4. enum2 "applet/app/customer/enum"
  5. "applet/app/customer/lib/validate"
  6. "applet/app/customer/md"
  7. "applet/app/customer/svc"
  8. "applet/app/db"
  9. "applet/app/db/model"
  10. "applet/app/e"
  11. "applet/app/enum"
  12. svc3 "applet/app/svc"
  13. "applet/app/utils"
  14. "encoding/json"
  15. "fmt"
  16. "github.com/gin-gonic/gin"
  17. "github.com/wechatpay-apiv3/wechatpay-go/core"
  18. "github.com/wechatpay-apiv3/wechatpay-go/services/partnerpayments/jsapi"
  19. jsapi2 "github.com/wechatpay-apiv3/wechatpay-go/services/payments/jsapi"
  20. utils2 "github.com/wechatpay-apiv3/wechatpay-go/utils"
  21. "strconv"
  22. "time"
  23. )
  24. func BuyPackage(c *gin.Context) {
  25. var req md.BuyPackageReq
  26. err := c.ShouldBindJSON(&req)
  27. if err != nil {
  28. err = validate.HandleValidateErr(err)
  29. err1 := err.(e.E)
  30. e.OutErr(c, err1.Code, err1.Error())
  31. return
  32. }
  33. fmt.Println("req>>>>>>>>>>>>", utils.Serialize(req))
  34. outTradeNo, tradeNo, total, err := svc.BuyPackageForAli(c, req)
  35. if err != nil {
  36. e.OutErr(c, e.ERR, err.Error())
  37. return
  38. }
  39. e.OutSuc(c, map[string]interface{}{
  40. "out_trade_no": outTradeNo,
  41. "trade_no": tradeNo,
  42. "total": total,
  43. }, nil)
  44. return
  45. }
  46. func BuyPackageForWx(c *gin.Context) {
  47. var req md.BuyPackageReq
  48. err := c.ShouldBindJSON(&req)
  49. if err != nil {
  50. err = validate.HandleValidateErr(err)
  51. err1 := err.(e.E)
  52. e.OutErr(c, err1.Code, err1.Error())
  53. return
  54. }
  55. fmt.Println("req>>>>>>>>>>>>", utils.SerializeStr(req))
  56. outTradeNo, total, resp, err := svc.BuyPackageForWx(c, req)
  57. if err != nil {
  58. e.OutErr(c, e.ERR, err.Error())
  59. return
  60. }
  61. e.OutSuc(c, map[string]interface{}{
  62. "out_trade_no": outTradeNo,
  63. "prams": resp,
  64. "total": total,
  65. }, nil)
  66. return
  67. }
  68. func RePayBuyPackageForWx(c *gin.Context) {
  69. prepayId := c.DefaultQuery("prepay_id", "")
  70. centralKitchenForSchoolPackageOrd := db.CentralKitchenForSchoolPackageOrd{}
  71. centralKitchenForSchoolPackageOrd.Set("")
  72. ord, err := centralKitchenForSchoolPackageOrd.GetCentralKitchenForSchoolPackageOrdByPrepayId(prepayId)
  73. if err != nil {
  74. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  75. return
  76. }
  77. if ord == nil {
  78. e.OutErr(c, e.ERR_NO_DATA, "未查询到对应订单记录")
  79. return
  80. }
  81. sysCfgDb := db.SysCfgDb{}
  82. sysCfgDb.Set()
  83. client, err := svc3.NewWxPayClient(c)
  84. if err != nil {
  85. e.OutErr(c, e.ERR, err.Error())
  86. return
  87. }
  88. wxSvc := jsapi.JsapiApiService{Client: client}
  89. resp := new(jsapi2.PrepayWithRequestPaymentResponse)
  90. sysCfg := sysCfgDb.SysCfgFindWithDb(enum.WxAppletAppId)
  91. resp.PrepayId = &prepayId
  92. resp.SignType = core.String("RSA")
  93. appid := sysCfg[enum.WxAppletAppId]
  94. resp.Appid = &appid
  95. resp.TimeStamp = core.String(strconv.FormatInt(time.Now().Unix(), 10))
  96. nonce, err := utils2.GenerateNonce()
  97. if err != nil {
  98. e.OutErr(c, e.ERR, err.Error())
  99. return
  100. }
  101. resp.NonceStr = core.String(nonce)
  102. resp.Package = core.String("prepay_id=" + prepayId)
  103. message := fmt.Sprintf("%s\n%s\n%s\n%s\n", *resp.Appid, *resp.TimeStamp, *resp.NonceStr, *resp.Package)
  104. signatureResult, err := wxSvc.Client.Sign(c, message)
  105. if err != nil {
  106. e.OutErr(c, e.ERR, err.Error())
  107. return
  108. }
  109. resp.PaySign = core.String(signatureResult.Signature)
  110. e.OutSuc(c, map[string]interface{}{
  111. //"out_trade_no": ord.OutTradeNo,
  112. "prams": resp,
  113. //"total": ord.TradeNo,
  114. }, nil)
  115. return
  116. }
  117. func OrdState(c *gin.Context) {
  118. outTradeNo := c.DefaultQuery("out_trade_no", "")
  119. centralKitchenForSchoolPackageOrd := db.CentralKitchenForSchoolPackageOrd{}
  120. centralKitchenForSchoolPackageOrd.Set(outTradeNo)
  121. ord, err := centralKitchenForSchoolPackageOrd.GetCentralKitchenForSchoolPackageOrd()
  122. if err != nil {
  123. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  124. return
  125. }
  126. if ord == nil {
  127. e.OutErr(c, e.ERR_NO_DATA, "未查询到对应订单记录")
  128. return
  129. }
  130. if !cfg.Prd && ord.PayWay == enum2.PayWayForAli {
  131. if ord.State == enum.CentralKitchenForSchoolPackageOrdStateForWait {
  132. //处于待支付状态,请求支付宝同步订单状态
  133. sysCfgDb := db.SysCfgDb{}
  134. sysCfgDb.Set()
  135. sysCfg := sysCfgDb.SysCfgFindWithDb(enum.JsapiPayAppAutToken, enum.OpenAlipayAppid, enum.OpenAlipayAppPrivateKey, enum.OpenAlipayPublicKey)
  136. err2, result := svc.CurlAlipayTradeQuery(md.CurlAlipayTradeQueryReq{
  137. Config: struct {
  138. PayAliAppId string `json:"pay_ali_app_id" label:"支付宝开放平台-第三方应用-appid"`
  139. PayAliPrivateKey string `json:"pay_ali_private_key" label:"支付宝开放平台-第三方应用-接口加签-应用私钥"`
  140. PayAliPublicKey string `json:"pay_ali_public_key" label:"支付宝开放平台-第三方应用-接口加签-支付宝公钥"`
  141. }{
  142. PayAliAppId: sysCfg[enum.OpenAlipayAppid],
  143. PayAliPrivateKey: sysCfg[enum.OpenAlipayAppPrivateKey],
  144. PayAliPublicKey: sysCfg[enum.OpenAlipayPublicKey],
  145. },
  146. OutTradeNo: outTradeNo,
  147. AppAuthToken: sysCfg[enum.JsapiPayAppAutToken],
  148. })
  149. if err2 != nil {
  150. e.OutErr(c, e.ERR, err2.Error())
  151. return
  152. }
  153. ord.State, err2 = svc.DealCentralKitchenForSchoolOrderCallBack(outTradeNo, result.TradeStatus)
  154. if err != nil {
  155. e.OutErr(c, e.ERR, err2.Error())
  156. return
  157. }
  158. }
  159. }
  160. e.OutSuc(c, map[string]interface{}{
  161. "sate": ord.State,
  162. "sate_zh": enum.CentralKitchenForSchoolPackageOrdState.String(enum.CentralKitchenForSchoolPackageOrdState(ord.State)),
  163. }, nil)
  164. return
  165. }
  166. func NursingHomeBuyPackage(c *gin.Context) {
  167. var req md.NursingHomeBuyPackageReq
  168. err := c.ShouldBindJSON(&req)
  169. if err != nil {
  170. err = validate.HandleValidateErr(err)
  171. err1 := err.(e.E)
  172. e.OutErr(c, err1.Code, err1.Error())
  173. return
  174. }
  175. outTradeNo, tradeNo, total, err := svc.NursingHomeBuyPackageReq(c, req)
  176. if err != nil {
  177. e.OutErr(c, e.ERR, err.Error())
  178. return
  179. }
  180. e.OutSuc(c, map[string]interface{}{
  181. "out_trade_no": outTradeNo,
  182. "trade_no": tradeNo,
  183. "total": total,
  184. }, nil)
  185. return
  186. }
  187. func NursingHomeOrdState(c *gin.Context) {
  188. outTradeNo := c.DefaultQuery("out_trade_no", "")
  189. centralKitchenForSchoolPackageOrd := db.NursingHomePackageOrd{}
  190. centralKitchenForSchoolPackageOrd.Set(outTradeNo)
  191. ord, err := centralKitchenForSchoolPackageOrd.GetNursingHomePackageOrd()
  192. if err != nil {
  193. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  194. return
  195. }
  196. if ord == nil {
  197. e.OutErr(c, e.ERR_NO_DATA, "未查询到对应订单记录")
  198. return
  199. }
  200. if ord.State == enum.NursingHomePackageOrdStateForWait {
  201. //处于待支付状态,请求支付宝同步订单状态
  202. sysCfgDb := db.SysCfgDb{}
  203. sysCfgDb.Set()
  204. sysCfg := sysCfgDb.SysCfgFindWithDb(enum.JsapiPayAppAutToken, enum.OpenAlipayAppid, enum.OpenAlipayAppPrivateKey, enum.OpenAlipayPublicKey)
  205. err2, result := svc.CurlAlipayTradeQuery(md.CurlAlipayTradeQueryReq{
  206. Config: struct {
  207. PayAliAppId string `json:"pay_ali_app_id" label:"支付宝开放平台-第三方应用-appid"`
  208. PayAliPrivateKey string `json:"pay_ali_private_key" label:"支付宝开放平台-第三方应用-接口加签-应用私钥"`
  209. PayAliPublicKey string `json:"pay_ali_public_key" label:"支付宝开放平台-第三方应用-接口加签-支付宝公钥"`
  210. }{
  211. PayAliAppId: sysCfg[enum.OpenAlipayAppid],
  212. PayAliPrivateKey: sysCfg[enum.OpenAlipayAppPrivateKey],
  213. PayAliPublicKey: sysCfg[enum.OpenAlipayPublicKey],
  214. },
  215. OutTradeNo: outTradeNo,
  216. AppAuthToken: sysCfg[enum.JsapiPayAppAutToken],
  217. })
  218. if err2 != nil {
  219. e.OutErr(c, e.ERR, err2.Error())
  220. return
  221. }
  222. if result.TradeStatus == "TRADE_CLOSED" {
  223. ord.State = enum.NursingHomePackageOrdStateForFail
  224. }
  225. if result.TradeStatus == "TRADE_SUCCESS" {
  226. ord.State = enum.NursingHomePackageOrdStateForSuccess
  227. ord.OrdState = enum.NursingHomePackageOrdOrdStateForSuccess
  228. //TODO::将预留数据插入到 `central_kitchen_for_school_user_with_day`
  229. var data []*model.NursingHomeUserWithDay
  230. err4 := json.Unmarshal([]byte(ord.WithDayData), &data)
  231. if err4 != nil {
  232. e.OutErr(c, e.ERR, err4.Error())
  233. return
  234. }
  235. var hasMonths = map[string]map[string]interface{}{}
  236. var hasKinds = map[string]map[string]string{}
  237. var hasTotalPrice = map[string]map[string]float64{}
  238. for _, v := range data {
  239. date, _ := time.ParseInLocation("2006-01-02", v.Date, time.Local)
  240. if hasMonths[utils.TimeParseStd(v.Date).Month().String()] == nil {
  241. hasMonths[utils.TimeParseStd(v.Date).Month().String()] = make(map[string]interface{})
  242. hasMonths[utils.TimeParseStd(v.Date).Month().String()]["meal_time_start"] = date.Format("2006-01-02")
  243. hasMonths[utils.TimeParseStd(v.Date).Month().String()]["meal_time_end"] = date.Format("2006-01-02")
  244. } else {
  245. startTime, _ := time.ParseInLocation("2006-01-02", utils.AnyToString(hasMonths[utils.TimeParseStd(v.Date).Month().String()]["meal_time_start"]), time.Local)
  246. if startTime.After(date) {
  247. hasMonths[utils.TimeParseStd(v.Date).Month().String()]["meal_time_start"] = date.Format("2006-01-02")
  248. }
  249. endTime, _ := time.ParseInLocation("2006-01-02", utils.AnyToString(hasMonths[utils.TimeParseStd(v.Date).Month().String()]["meal_time_end"]), time.Local)
  250. if endTime.Before(date) {
  251. hasMonths[utils.TimeParseStd(v.Date).Month().String()]["meal_time_end"] = date.Format("2006-01-02")
  252. }
  253. }
  254. if hasTotalPrice[utils.TimeParseStd(v.Date).Month().String()] == nil {
  255. hasTotalPrice[utils.TimeParseStd(v.Date).Month().String()] = make(map[string]float64)
  256. }
  257. if hasKinds[utils.TimeParseStd(v.Date).Month().String()] == nil {
  258. hasKinds[utils.TimeParseStd(v.Date).Month().String()] = make(map[string]string)
  259. }
  260. hasMonths[utils.TimeParseStd(v.Date).Month().String()]["month"] = int(utils.TimeParseStd(v.Date).Month())
  261. hasKinds[utils.TimeParseStd(v.Date).Month().String()][utils.IntToStr(v.Kind)] = utils.IntToStr(v.Kind)
  262. hasTotalPrice[utils.TimeParseStd(v.Date).Month().String()][utils.IntToStr(v.Kind)] += utils.StrToFloat64(v.Amount)
  263. v.OrdNo = outTradeNo
  264. }
  265. centralKitchenForSchoolUserWithDayDb := db.NursingHomeUserWithDayDb{}
  266. centralKitchenForSchoolUserWithDayDb.Set(0)
  267. _, err5 := centralKitchenForSchoolUserWithDayDb.BatchAddNursingHomeUserWithDays(data)
  268. if err != nil {
  269. e.OutErr(c, e.ERR, err5.Error())
  270. return
  271. }
  272. //TODO::插入数据至 `nursing_home_package_ord_for_reserve`
  273. centralKitchenForSchoolPackageOrdForReserve := db.NursingHomePackageOrdForReserve{}
  274. centralKitchenForSchoolPackageOrdForReserve.Set(outTradeNo)
  275. var isHasKind []string
  276. for k, v := range hasMonths {
  277. for _, v1 := range hasKinds[k] {
  278. if !utils.InArr(v1, isHasKind) {
  279. _, err3 := centralKitchenForSchoolPackageOrdForReserve.NursingHomePackageOrdForReserveInsert(&model.NursingHomePackageOrdForReserve{
  280. EnterpriseId: ord.EnterpriseId,
  281. Uid: ord.Uid,
  282. UserIdentityName: ord.UserIdentityName,
  283. UserIdentityId: ord.UserIdentityId,
  284. Kind: utils.StrToInt(v1),
  285. OutTradeNo: ord.OutTradeNo,
  286. ReserveMonth: utils.AnyToString(v["month"]),
  287. MealTimeStart: utils.AnyToString(v["meal_time_start"]),
  288. MealTimeEnd: utils.AnyToString(v["meal_time_end"]),
  289. TotalPrice: utils.Float64ToStr(hasTotalPrice[k][v1]),
  290. CreateAt: time.Now().Format("2006-01-02 15:04:05"),
  291. UpdateAt: time.Now().Format("2006-01-02 15:04:05"),
  292. })
  293. if err3 != nil {
  294. e.OutErr(c, e.ERR, err3.Error())
  295. return
  296. }
  297. isHasKind = append(isHasKind, v1)
  298. }
  299. }
  300. }
  301. }
  302. _, err3 := centralKitchenForSchoolPackageOrd.NursingHomePackageOrdUpdate(ord, "state", "ord_state")
  303. if err3 != nil {
  304. e.OutErr(c, e.ERR_DB_ORM, err3.Error())
  305. return
  306. }
  307. }
  308. e.OutSuc(c, map[string]interface{}{
  309. "sate": ord.State,
  310. "sate_zh": enum.NursingHomePackageOrdState.String(enum.NursingHomePackageOrdState(ord.State)),
  311. }, nil)
  312. return
  313. }