劲创营---任务项目
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 

204 satır
5.5 KiB

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