劲创营---任务项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

svc_pay.go 5.6 KiB

3 weeks ago
2 weeks ago
3 weeks ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. package svc
  2. import (
  3. "applet/app/cfg"
  4. "applet/app/comm/db"
  5. "applet/app/comm/e"
  6. "applet/app/comm/svc"
  7. "applet/app/comm/utils"
  8. "applet/app/comm/utils/logx"
  9. "applet/app/store/md"
  10. "code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git/pay"
  11. "code.fnuoos.com/go_rely_warehouse/zyos_model.git/src/implement"
  12. "code.fnuoos.com/go_rely_warehouse/zyos_model.git/src/models"
  13. "encoding/json"
  14. "fmt"
  15. "github.com/gin-gonic/gin"
  16. "github.com/iGoogle-ink/gopay/alipay"
  17. "io/ioutil"
  18. "net/url"
  19. "time"
  20. )
  21. func CallBack(c *gin.Context, OrderType string) {
  22. orderId, err := AlipayCallback(c)
  23. fmt.Println("callback orderId is ", orderId)
  24. if err != nil || orderId == "" {
  25. _ = logx.Warn(err)
  26. return
  27. }
  28. if OrderType == "money" {
  29. err = CommMoneyCallback(c, orderId)
  30. }
  31. if err != nil {
  32. _ = logx.Error(err)
  33. c.String(200, "fail")
  34. return
  35. }
  36. c.String(200, "success")
  37. return
  38. }
  39. func CommMoneyCallback(c *gin.Context, oid string) error {
  40. sess := svc.MasterDb(c).NewSession()
  41. defer sess.Close()
  42. sess.Begin()
  43. var data models.CampTaskStoreUserAmountOrder
  44. sess.Where("oid=?", oid).Get(&data)
  45. if data.Id == 0 {
  46. sess.Rollback()
  47. return e.NewErr(400, "订单不存在")
  48. }
  49. if data.State == 1 {
  50. sess.Rollback()
  51. return nil
  52. }
  53. data.State = 1
  54. _, err := svc.MasterDb(c).Where("oid=?", data.Oid).Update(&data)
  55. if err != nil {
  56. sess.Rollback()
  57. return e.NewErr(400, "修改失败")
  58. }
  59. amountDb := implement.NewCampTaskStoreUserAmountDb(svc.MasterDb(c))
  60. amountData, _ := amountDb.GetCampTaskAmountByStoreId(utils.IntToStr(data.StoreId))
  61. if amountData == nil {
  62. amountData = &models.CampTaskStoreUserAmount{
  63. StoreId: data.StoreId,
  64. Amount: "0",
  65. }
  66. _, err := sess.Insert(amountData)
  67. if err != nil {
  68. sess.Rollback()
  69. return err
  70. }
  71. }
  72. amountData.Amount = utils.Float64ToStr(utils.StrToFloat64(amountData.Amount) + utils.StrToFloat64(data.Money))
  73. var flow = models.CampTaskDeductMoneyList{
  74. Type: 0,
  75. CreateTime: time.Now(),
  76. Money: data.Money,
  77. AfterMoney: amountData.Amount,
  78. StoreId: data.StoreId,
  79. Title: "预存款充值",
  80. OrdType: "buy",
  81. }
  82. _, err = svc.MasterDb(c).InsertOne(&flow)
  83. if err != nil {
  84. sess.Rollback()
  85. return e.NewErr(400, "修改失败")
  86. }
  87. _, err = svc.MasterDb(c).Where("id=?", amountData.Id).Update(amountData)
  88. if err != nil {
  89. sess.Rollback()
  90. return e.NewErr(400, "修改失败")
  91. }
  92. sess.Commit()
  93. return nil
  94. }
  95. func AlipayCallback(c *gin.Context) (string, error) {
  96. data, ok := c.Get("callback")
  97. if data == nil || !ok {
  98. return "", e.NewErrCode(e.ERR_INVALID_ARGS)
  99. }
  100. args := data.(*md.AliPayCallback)
  101. c.Set("mid", args.MasterID)
  102. // 回调交易状态失败
  103. if args.TradeStatus != "TRADE_SUCCESS" {
  104. return "", logx.Warn("Alipay Failed : trade status failed")
  105. }
  106. return args.OutTradeNo, nil
  107. }
  108. func CheckAllCallbackParams(c *gin.Context) (interface{}, string, string) {
  109. body, _ := ioutil.ReadAll(c.Request.Body)
  110. fmt.Println(body)
  111. utils.FilePutContents("CheckAllCallbackParams", string(body))
  112. dataAlipay, _ := GetAlipayCallbackParams(body)
  113. if dataAlipay != nil {
  114. return dataAlipay, dataAlipay.OrderType, dataAlipay.PayMethod
  115. }
  116. return nil, "", ""
  117. }
  118. func GetAlipayCallbackParams(body []byte) (*md.AliPayCallback, error) {
  119. decodeArgs, err := url.QueryUnescape(string(body))
  120. if err != nil {
  121. _ = logx.Warn(err)
  122. return nil, logx.Warn("回调参数解码错误")
  123. }
  124. data, err := url.ParseQuery(decodeArgs)
  125. if err != nil {
  126. return nil, err
  127. }
  128. dataMap := make(map[string]interface{})
  129. for k := range data {
  130. dataMap[k] = data.Get(k)
  131. }
  132. callbackStr := utils.Serialize(dataMap)
  133. fmt.Println("支付宝回调数据", string(callbackStr))
  134. var args md.AliPayCallback
  135. if err := json.Unmarshal(callbackStr, &args); err != nil {
  136. return nil, logx.Warn(err)
  137. }
  138. return &args, nil
  139. }
  140. func AlipayPc(c *gin.Context, p *md.AliPayPayParams) (string, error) {
  141. req, err := CommAlipayConfig(c, p)
  142. if err != nil {
  143. return "", err
  144. }
  145. param, err := pay.AlipayPc(req)
  146. return utils.AnyToString(param), nil
  147. }
  148. func CommAlipayConfig(c *gin.Context, p *md.AliPayPayParams) (map[string]string, error) {
  149. //获取支付配置
  150. req := map[string]string{
  151. "pay_ali_use_type": db.SysCfgGet(c, "pay_ali_use_type"),
  152. "private_key": db.SysCfgGet(c, "pay_ali_private_key"),
  153. "app_id": db.SysCfgGet(c, "pay_ali_app_id"),
  154. "rsa": db.SysCfgGet(c, "pay_ali_key_len_type"),
  155. "pkcs": db.SysCfgGet(c, "pay_ali_key_format_type"),
  156. }
  157. if req["private_key"] == "" || req["app_id"] == "" {
  158. return req, e.NewErr(400, "请在后台正确配置支付宝")
  159. }
  160. if req["pay_ali_use_type"] == "1" {
  161. req["private_key"] = db.SysCfgGet(c, "pay_ali_new_private_key")
  162. req["app_id"] = db.SysCfgGet(c, "pay_ali_new_app_id")
  163. appCertSN, err := alipay.GetCertSN(cfg.WxappletFilepath.URL + "/" + db.SysCfgGet(c, "pay_app_cert_sn"))
  164. if err != nil {
  165. fmt.Println(err)
  166. return nil, err
  167. }
  168. if appCertSN == "" {
  169. fmt.Println(err)
  170. return nil, err
  171. }
  172. req["pay_app_cert_sn"] = appCertSN
  173. aliPayPublicCertSN, err := alipay.GetCertSN(cfg.WxappletFilepath.URL + "/" + db.SysCfgGet(c, "pay_alipayrsa_public_key"))
  174. if err != nil {
  175. fmt.Println(err)
  176. return nil, err
  177. }
  178. if aliPayPublicCertSN == "" {
  179. fmt.Println(err)
  180. return nil, err
  181. }
  182. req["pay_alipayrsa_public_key"] = aliPayPublicCertSN
  183. }
  184. req["ord_id"] = p.OrdId
  185. req["amount"] = p.Amount
  186. req["subject"] = p.Subject
  187. req["order_type"] = p.OrderType
  188. host := c.Request.Host
  189. if cfg.Prd == false {
  190. host = "https://n40j680693.goho.co"
  191. }
  192. req["notify_url"] = fmt.Sprintf("%s/api/v1/campTask/store/alipay/pay/callback?master_id=%s&order_type=%s", host, c.GetString("mid"), p.OrderType)
  193. req["platform"] = "pc"
  194. req["page_url"] = c.GetString("page_url")
  195. fmt.Println(req)
  196. return req, nil
  197. }