wx-pay.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package seller
  2. import (
  3. "Wine-Server/utils"
  4. "Wine-Server/utils/tables"
  5. "encoding/json"
  6. "errors"
  7. "github.com/gin-gonic/gin"
  8. "github.com/wechatpay-apiv3/wechatpay-go/core/auth/verifiers"
  9. "github.com/wechatpay-apiv3/wechatpay-go/core/downloader"
  10. "github.com/wechatpay-apiv3/wechatpay-go/core/notify"
  11. )
  12. func updateWineIncome(trade *tradeRedis) (uint16, error) {
  13. wine := tables.WineTable{Id: trade.Wine}
  14. err := wine.Get()
  15. if err != nil {
  16. utils.Logger.Println("wine get error:", err)
  17. return 0, err
  18. }
  19. wine.Income += uint64(trade.Cash)
  20. wine.Order++
  21. err = wine.UpdateSelf()
  22. if err != nil {
  23. utils.Logger.Println("wine update error:", err)
  24. return 0, err
  25. }
  26. return uint16(50*float64(trade.Weight)/float64(wine.Density)/1000 + 0.5), nil
  27. }
  28. func updateDeviceIncome(trade *tradeRedis, volume uint16) (string, error) {
  29. table := tables.DeviceTable{Id: trade.Device}
  30. err := table.Get()
  31. if err != nil {
  32. utils.Logger.Println("device get error:", err)
  33. return "", err
  34. }
  35. table.Order++
  36. table.Income += uint64(trade.Cash)
  37. table.Wines[trade.Cell].Remain -= volume
  38. err = table.UpdateSelf()
  39. if err != nil {
  40. utils.Logger.Println("device update error:", err)
  41. return "", err
  42. }
  43. return table.Manager, nil
  44. }
  45. func updateManagerIncome(mid string, trade *tradeRedis) error {
  46. if mid == "" {
  47. utils.Logger.Println("blank manager id")
  48. return errors.New("blank manager id")
  49. }
  50. table := tables.ManagerTable{Id: mid}
  51. err := table.Get()
  52. if err != nil {
  53. utils.Logger.Println("manager get error:", err)
  54. return err
  55. }
  56. table.Order++
  57. table.Income += uint64(trade.Cash)
  58. err = table.UpdateSelf()
  59. if err != nil {
  60. utils.Logger.Println("manager update error:", err)
  61. return err
  62. }
  63. return nil
  64. }
  65. func wxPayHandler(ctx *gin.Context) {
  66. err := downloader.MgrInstance().RegisterDownloaderWithPrivateKey(
  67. utils.WxPayCli, utils.WxPrivateKey, utils.WxCertSeq, utils.WxMchId, utils.WxV3Key,
  68. )
  69. visitor := downloader.MgrInstance().GetCertificateVisitor(utils.WxMchId)
  70. handler, _ := notify.NewRSANotifyHandler(utils.WxV3Key, verifiers.NewSHA256WithRSAVerifier(visitor))
  71. var wxNotify notifyParam
  72. _, err = handler.ParseNotifyRequest(utils.WxPayCli, ctx.Request, &wxNotify)
  73. if wxNotify.TradeState != "SUCCESS" {
  74. utils.Logger.Printf("trade[%s] status[%s]\n", wxNotify.TradeNo, wxNotify.TradeState)
  75. ctx.JSON(utils.HttpOk, utils.Success(nil))
  76. return
  77. }
  78. dbKey := utils.Format("WxPay_%s", wxNotify.TradeNo)
  79. exist, err := utils.Redis.Exists(utils.WxPayCli, dbKey).Result()
  80. if exist != 1 {
  81. utils.Logger.Println("re-notified or expire of:", wxNotify.TradeNo)
  82. ctx.JSON(utils.HttpOk, utils.Success(nil))
  83. return
  84. }
  85. res, err := utils.Redis.Get(utils.WxPayCli, dbKey).Result()
  86. var dbTrade tradeRedis
  87. err = json.Unmarshal([]byte(res), &dbTrade)
  88. utils.Redis.Del(utils.WxPayCli, dbKey)
  89. volume, err := updateWineIncome(&dbTrade)
  90. manager, err := updateDeviceIncome(&dbTrade, volume)
  91. err = updateManagerIncome(manager, &dbTrade)
  92. wine := tables.WineTable{Id: dbTrade.Wine}
  93. _ = wine.Get()
  94. table := tables.TradeTable{
  95. Id: wxNotify.TransactionId, Trade: wxNotify.TradeNo, Device: dbTrade.Device, Payer: wxNotify.Payer.Openid,
  96. Wine: dbTrade.Wine, Price: wine.Price, Weight: dbTrade.Weight, Cash: dbTrade.Cash, Manager: manager,
  97. }
  98. err = table.Insert()
  99. if err != nil {
  100. ctx.JSON(utils.HttpError, utils.Fail("server error"))
  101. return
  102. }
  103. if device, din := utils.SellerDevices[dbTrade.Device]; din && device.Online {
  104. _ = device.Conn.WriteJSON(utils.WsEvent("qrcodeScanned", nil))
  105. utils.Sleep(1)
  106. _ = device.Conn.WriteJSON(utils.WsEvent("orderPayed", volume))
  107. ctx.JSON(utils.HttpOk, utils.Success(nil))
  108. return
  109. }
  110. ctx.JSON(utils.HttpError, utils.Fail("server error"))
  111. }