com_handler_asset_recharge.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package services
  2. import (
  3. "app/commons/constant"
  4. "app/commons/core"
  5. "app/commons/core/exchange"
  6. "app/commons/model/entity"
  7. "fmt"
  8. "github.com/shopspring/decimal"
  9. )
  10. //
  11. // 处理充值 回调处理逻辑
  12. func (s *CommonService) handleRecharge(callbackLog *entity.AssetRwCallbackLog) {
  13. if callbackLog.State != constant.RwCallbackStateWaiting || callbackLog.Type != exchange.TransferUserToApp {
  14. return
  15. }
  16. var err error
  17. defer func() {
  18. callbackLog.State = constant.RwCallbackStateFinish
  19. callbackLog.ErrDesc = "success"
  20. if err != nil {
  21. callbackLog.State = constant.RwCallbackStateFail
  22. callbackLog.ErrDesc = err.Error()
  23. }
  24. if err = s.DB().Model(&entity.AssetRwCallbackLog{}).Where("id", callbackLog.Id).Updates(map[string]interface{}{
  25. "state": callbackLog.State,
  26. "err_desc": callbackLog.ErrDesc,
  27. }).Error; err != nil {
  28. core.Log.Error(err.Error())
  29. }
  30. }()
  31. // 币种获取检查
  32. coinInfo, err := s.FirstCoin(s.DB().Where("symbol", callbackLog.Currency))
  33. if err != nil {
  34. core.Log.Error(err)
  35. return
  36. }
  37. symbol := coinInfo.Symbol
  38. user, err := s.GetUserInfoByOpenId(callbackLog.OpenId)
  39. if err != nil {
  40. core.Log.Error(err)
  41. return
  42. }
  43. amount, err := decimal.NewFromString(callbackLog.Amount)
  44. if err != nil {
  45. core.Log.Error(err)
  46. return
  47. }
  48. if amount.LessThanOrEqual(decimal.Zero) {
  49. err = fmt.Errorf("充值金额:%s", amount)
  50. return
  51. }
  52. // 构建转账订单 成功
  53. rwOrder := s.buildRwRecord(
  54. coinInfo.Symbol,
  55. user.Id,
  56. callbackLog.OpenId,
  57. callbackLog.OrderId,
  58. constant.RwDirectionRecharge,
  59. amount,
  60. decimal.Zero,
  61. decimal.Zero,
  62. decimal.Zero,
  63. amount,
  64. )
  65. // todo:转入成功 开启事务处理
  66. userAsset, err := s.GetAssetBySymbol(user.Id, coinInfo.Symbol)
  67. if err != nil {
  68. err = fmt.Errorf("用户资产信息获取失败:%d-%s", user.Id, symbol)
  69. return
  70. }
  71. dbTx := s.DB().Begin()
  72. // 修改订单状态
  73. rwOrder.Status = constant.RwStateFinish
  74. // 构建流水
  75. err = dbTx.Create(&rwOrder).Error
  76. if err != nil {
  77. core.Log.Error(err)
  78. dbTx.Rollback()
  79. return
  80. }
  81. bs := constant.BsById(constant.BsAssetDeposit)
  82. bs.ContextName = rwOrder.TableName()
  83. bs.ContextValue = rwOrder.OrderId
  84. err = s.GenBillAndActionAsset(dbTx,
  85. userAsset.UserId,
  86. userAsset.Symbol,
  87. amount,
  88. decimal.Zero, bs)
  89. if err != nil {
  90. dbTx.Rollback()
  91. return
  92. }
  93. dbTx.Commit()
  94. return
  95. }