web_paymsg.go 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043
  1. package msg
  2. import (
  3. "bytes"
  4. "crypto/hmac"
  5. "crypto/md5"
  6. "encoding/hex"
  7. "encoding/json"
  8. "encoding/xml"
  9. "fmt"
  10. "io"
  11. "net/http"
  12. "net/url"
  13. "rocommon/service"
  14. "rocommon/util"
  15. "roserver/baseserver/model"
  16. selfmodel "roserver/gmweb/model"
  17. "roserver/serverproto"
  18. "sort"
  19. "strconv"
  20. "strings"
  21. "time"
  22. "github.com/gin-gonic/gin"
  23. )
  24. // https://blog.csdn.net/chunyouhai5703/article/details/100978656?utm_medium=distribute.pc_relevant.none-task-blog-title-1&spm=1001.2101.3001.4242
  25. type QuickPayNotify struct {
  26. XMLName xml.Name `xml:"quicksdk_message"`
  27. Message QuickTBData `xml:"message"`
  28. }
  29. type QuickTBData struct {
  30. IsTest bool `xml:"is_test"`
  31. Channel string `xml:"channel"`
  32. ChannelUid string `xml:"channel_uid"`
  33. GameOrder string `xml:"game_order"`
  34. PayTime string `xml:"pay_time"`
  35. Amount float32 `xml:"amount"`
  36. Status int32 `xml:"status"`
  37. ExtrasParams string `xml:"extras_params"`
  38. }
  39. /*
  40. <?xml version="1.0" encoding="UTF-8" standalone="no">
  41. <quicksdk_message>
  42. <message>
  43. <is_test>0</is_test>
  44. <channel>8888</channel>
  45. <channel_uid>231845</channel_uid>
  46. <game_order>123456789</game_order>
  47. <order_no>12520160612114220441168433</order_no>
  48. <pay_time>2016-06-12 11:42:20</pay_time>
  49. <amount>1.00</amount>
  50. <status>0</status>
  51. <extras_params>{1}_{2}</extras_params>
  52. </message>
  53. </quicksdk_message>
  54. */
  55. func WebPayQuickNotify(c *gin.Context) {
  56. //ntData := c.PostForm("nt_data")
  57. //sign := c.PostForm("sign")
  58. //md5Sign := c.PostForm("md5Sign")
  59. //
  60. //data := ntData + sign + service.GetServiceConfig().SDKConfig.QuickMd5key
  61. //tmpSign := md5.Sum([]byte(data))
  62. //md5Str := fmt.Sprintf("%x", tmpSign)
  63. //util.DebugF("WebPayQuickNotify ntData=%v sign=%v md5sign=%v tmpsign=%v", ntData, sign, md5Sign, md5Str)
  64. //if md5Str == md5Sign {
  65. // util.InfoF("WebPayQuickNotify ok")
  66. //} else {
  67. // util.ErrorF("WebPayQuickNotify sign invalid!!!")
  68. // c.JSON(http.StatusOK, "FAILED")
  69. // return
  70. //}
  71. //
  72. ////decode nt_data
  73. //tmpNtDataList := strings.Split(ntData, "@")
  74. //tmpNtData := make([]byte, len(tmpNtDataList))
  75. //tmpKeyData := []byte(service.GetServiceConfig().SDKConfig.QuickCallbackKey)
  76. //for idx := 1; idx < len(tmpNtDataList); idx++ {
  77. // tmpVal, _ := strconv.Atoi(tmpNtDataList[idx])
  78. // tmpNtData[idx] = (byte)(tmpVal - (int)(0xff&tmpKeyData[(idx-1)%len(tmpKeyData)]))
  79. //}
  80. ////字符串最前面会有一个空格
  81. //if string(tmpNtData[0]) == "\u0000" {
  82. // tmpNtData = append(tmpNtData[:0], tmpNtData[1:]...)
  83. //}
  84. //util.InfoF("WebPayQuickNotify ntdata=%v", string(tmpNtData))
  85. //
  86. //tmpSt := &QuickPayNotify{}
  87. //err := xml.Unmarshal(tmpNtData, tmpSt)
  88. //if err != nil {
  89. // util.ErrorF("WebPayQuickNotify xml decode err=%v", err)
  90. // c.JSON(http.StatusOK, "FAILED")
  91. // return
  92. //}
  93. //
  94. //ntfData := &WebNotifyData{}
  95. //ntfData.CpOrderId = tmpSt.Message.GameOrder
  96. //ntfData.SdkOrderId = ""
  97. //ntfData.PayMethod = ""
  98. //ntfData.PayCurrency = ""
  99. //ntfData.PayTime = uint64(util.GetTimeSeconds())
  100. //ntfData.PayChannel = ""
  101. //webPayNotify(ntfData, tmpSt.Message.Amount, c)
  102. //c.JSON(http.StatusOK, "SUCCESS")
  103. game_order := c.PostForm("game_order") //游戏订单号
  104. order_no := c.PostForm("order_no") //SDK订单ID
  105. amount := c.PostForm("amount") //充值金额
  106. PayChannel := c.PostForm("channel") //充值渠道
  107. serverId := c.PostForm("server_id") //充值服ID
  108. util.DebugF("收到充值订单:GameOrder=%v, SdkOfderId=%v, PauAmount=%v, PayChannel=%v, serverId=%v", game_order, order_no, amount, PayChannel, serverId)
  109. checkPayAmount, _ := model.Str2Float32(amount)
  110. ntfData := &WebNotifyData{}
  111. ntfData.CpOrderId = game_order
  112. ntfData.SdkOrderId = order_no
  113. ntfData.PayMethod = ""
  114. ntfData.PayCurrency = ""
  115. ntfData.PayTime = uint64(util.GetTimeSeconds())
  116. ntfData.PayChannel = PayChannel
  117. retState := webPayNotify(ntfData, checkPayAmount, c)
  118. //c.JSON(http.StatusOK, `success`)
  119. c.Data(http.StatusOK, "text/plain; charset=utf-8", []byte(retState))
  120. }
  121. func getMd5Sign(callbackKey string, params map[string]string) string {
  122. // 删除参数中的 sign 字段
  123. delete(params, "sign")
  124. // 按参数名进行升序排序
  125. var keys []string
  126. for key := range params {
  127. keys = append(keys, key)
  128. }
  129. sort.Strings(keys)
  130. // 拼接参数和值
  131. var signKey strings.Builder
  132. for _, key := range keys {
  133. signKey.WriteString(key)
  134. signKey.WriteString("=")
  135. signKey.WriteString(params[key])
  136. signKey.WriteString("&")
  137. }
  138. // 添加回调密钥
  139. signKey.WriteString(callbackKey)
  140. // 计算 MD5
  141. hash := md5.Sum([]byte(signKey.String()))
  142. return hex.EncodeToString(hash[:])
  143. }
  144. func getMd5RuSign(callbackKey string, params map[string]string) string {
  145. // 删除参数中的 sign 字段
  146. delete(params, "sign")
  147. // 按参数名进行升序排序
  148. var keys []string
  149. for key := range params {
  150. keys = append(keys, key)
  151. }
  152. sort.Strings(keys)
  153. // 拼接参数和值
  154. var signKey strings.Builder
  155. for i, key := range keys {
  156. signKey.WriteString(key)
  157. signKey.WriteString("=")
  158. signKey.WriteString(params[key])
  159. if i != len(keys)-1 {
  160. signKey.WriteString("&")
  161. }
  162. }
  163. // 添加回调密钥
  164. signKey.WriteString(callbackKey)
  165. // 计算 MD5
  166. hash := md5.Sum([]byte(signKey.String()))
  167. return hex.EncodeToString(hash[:])
  168. }
  169. func getMd5DnSign(callbackKey string, username, order_id, server, amount, extra, sandbox, timestamp string) string {
  170. // 拼接参数和值
  171. var signKey strings.Builder
  172. signKey.WriteString(username)
  173. signKey.WriteString(order_id)
  174. signKey.WriteString(server)
  175. signKey.WriteString(amount)
  176. signKey.WriteString(extra)
  177. signKey.WriteString(sandbox)
  178. signKey.WriteString(timestamp)
  179. // 添加回调密钥
  180. signKey.WriteString(callbackKey)
  181. // 计算 MD5
  182. hash := md5.Sum([]byte(signKey.String()))
  183. return hex.EncodeToString(hash[:])
  184. }
  185. type Extras struct {
  186. ServerId int `json:"serverId"`
  187. Platform string `json:"platform"`
  188. SubPlatform string `json:"subPlatform"`
  189. Bima string `json:"bima"`
  190. CpOrderId string `json:"cpOrderId"`
  191. }
  192. type ExtrasRu struct {
  193. AccountId string `json:"accountId"`
  194. Money string `json:"money"`
  195. Addtime string `json:"addtime"`
  196. OrderId string `json:"orderId"`
  197. CustomorderId string `json:"customorderId"`
  198. Paytype string `json:"paytype"`
  199. Success string `json:"success"`
  200. }
  201. type ExtrasDn struct {
  202. OrderNo string `json:"orderNo"`
  203. Uid string `json:"uid"`
  204. Platform string `json:"platform"`
  205. }
  206. // 海外版quick回调
  207. func WebPayHwQuickNotify(c *gin.Context) {
  208. //util.DebugF("支付回调信息:%v", c.Request.PostForm)
  209. params := make(map[string]string)
  210. if err := c.Request.ParseForm(); err != nil {
  211. util.InfoF("parseForm falied")
  212. c.String(http.StatusOK, "FAILED")
  213. return
  214. }
  215. util.DebugF("支付回调信息2:%v", c.Request.PostForm)
  216. for key, value := range c.Request.PostForm {
  217. params[key] = value[0] // 假设每个参数只有一个值
  218. }
  219. sign := params["sign"]
  220. info2 := params["extrasParams"]
  221. info := strings.ReplaceAll(info2, "\\", "")
  222. var extras Extras
  223. err := json.Unmarshal([]byte(info), &extras)
  224. if err != nil {
  225. util.ErrorF("支付回调参数解析错误:%v", err)
  226. }
  227. util.InfoF("支付签名认证:%v params:%v", extras, params)
  228. if extras.Platform == "SDKYOUYI_IOS" || extras.Bima == "SDKYOUYI_IOS" {
  229. util.ErrorF("ios 支付签名认证:%v", info)
  230. newSign := getMd5Sign("58696021497436514481898335416221", params)
  231. if newSign != sign {
  232. util.ErrorF("签名错误%v", sign)
  233. c.String(http.StatusOK, "FAILED")
  234. return
  235. }
  236. } else if extras.Platform == "SDKYOUYI_IOS_MyCard" || extras.Platform == "SDKHwQuick_MyCard" {
  237. util.ErrorF("mycard 支付签名认证:%v", info)
  238. newSign := getMd5Sign("03422134397322604272901806704074", params)
  239. if newSign != sign {
  240. util.ErrorF("签名错误%v", sign)
  241. c.String(http.StatusOK, "FAILED")
  242. return
  243. }
  244. } else {
  245. util.ErrorF("android 支付签名认证:%v", info)
  246. newSign := getMd5Sign("47409863970932353623015025039223", params)
  247. if newSign != sign {
  248. util.ErrorF("签名错误%v", sign)
  249. c.String(http.StatusOK, "FAILED")
  250. return
  251. }
  252. }
  253. uid := c.PostForm("uid")
  254. cpOrderId := c.PostForm("cpOrderNo")
  255. if cpOrderId == "" {
  256. if extras.CpOrderId != "" {
  257. cpOrderId = extras.CpOrderId
  258. } else {
  259. util.ErrorF("mycard pay cporderId is nil extras:%v", extras)
  260. }
  261. }
  262. orderNo := c.PostForm("orderNo")
  263. payAmount := c.PostForm("payAmount")
  264. payCurrency := c.PostForm("payCurrency")
  265. payType := c.PostForm("payType")
  266. usdAmount := c.PostForm("usdAmount")
  267. ntfData := &WebNotifyData{}
  268. ntfData.CpOrderId = cpOrderId
  269. ntfData.SdkOrderId = orderNo
  270. ntfData.PayMethod = payType
  271. ntfData.PayCurrency = payCurrency
  272. ntfData.PayTime = uint64(util.GetTimeSeconds())
  273. ntfData.PayChannel = "qk_hw"
  274. util.WarnF("paycallback uid=%v cpOrderNo=%v orderNo=%v payAmount=%v payCurrency=%v payType=%v usdAmount=%v",
  275. uid, cpOrderId, orderNo, payAmount, payCurrency, payType, usdAmount)
  276. f64, err := strconv.ParseFloat(usdAmount, 32)
  277. if err != nil {
  278. fmt.Println("Error:", err)
  279. return
  280. }
  281. webPayNotify(ntfData, float32(f64), c)
  282. //// 简单粗暴,直接给其他服转发,不需要确认是哪个服
  283. //payPostRouter := service.GetServiceConfig().SDKConfig.PayPostRouter
  284. //util.WarnF("paycallback payPostRouter:%v\n", payPostRouter)
  285. //// 组装转发body
  286. //params["sign"] = sign
  287. //var routerStr strings.Builder
  288. //for key, value := range params {
  289. // routerStr.WriteString(key)
  290. // routerStr.WriteString("=")
  291. // routerStr.WriteString(value)
  292. // routerStr.WriteString("&")
  293. //}
  294. //routerString := routerStr.String()
  295. //util.WarnF("paycallback routerString:%v\n", routerString)
  296. //go sendPosts(payPostRouter, routerString)
  297. c.String(http.StatusOK, "SUCCESS")
  298. }
  299. func WebPayHwRuNotify(c *gin.Context) {
  300. //util.DebugF("支付回调信息:%v", c.Request.PostForm)
  301. params := make(map[string]string)
  302. if err := c.Request.ParseForm(); err != nil {
  303. util.InfoF("parseForm falied")
  304. c.String(http.StatusOK, "FAILED")
  305. return
  306. }
  307. util.DebugF("支付回调信息2:%v", c.Request.PostForm)
  308. for key, value := range c.Request.PostForm {
  309. params[key] = value[0] // 假设每个参数只有一个值
  310. }
  311. sign := params["sign"]
  312. info2 := params["custominfo"]
  313. info := strings.ReplaceAll(info2, "\\", "")
  314. var extras Extras
  315. err := json.Unmarshal([]byte(info), &extras)
  316. if err != nil {
  317. util.ErrorF("支付回调参数解析错误:%v", err)
  318. }
  319. util.InfoF("支付签名认证:%v params:%v", extras, params)
  320. if extras.Platform == "ZT_IOS" || extras.Bima == "ZT_IOS" {
  321. util.ErrorF("ios 支付签名认证:%v", info)
  322. newSign := getMd5RuSign("80c648e7df8aaa72", params)
  323. if newSign != sign {
  324. util.ErrorF("签名错误%v", sign)
  325. c.String(http.StatusOK, "FAILED")
  326. return
  327. }
  328. } else if extras.Platform == "SDKYOUYI_IOS_MyCard" || extras.Platform == "SDKHwQuick_MyCard" {
  329. util.ErrorF("mycard 支付签名认证:%v", info)
  330. newSign := getMd5Sign("03422134397322604272901806704074", params)
  331. if newSign != sign {
  332. util.ErrorF("签名错误%v", sign)
  333. c.String(http.StatusOK, "FAILED")
  334. return
  335. }
  336. } else {
  337. util.ErrorF("android 支付签名认证:%v", info)
  338. newSign := getMd5RuSign("80c648e7df8aaa72", params)
  339. if newSign != sign {
  340. util.ErrorF("签名错误%v", sign)
  341. c.String(http.StatusOK, "FAILED")
  342. return
  343. }
  344. }
  345. uid := c.PostForm("account")
  346. cpOrderId := c.PostForm("customorderid")
  347. orderNo := c.PostForm("orderid")
  348. payAmount := c.PostForm("money")
  349. payCurrency := c.PostForm("currency")
  350. payType := c.PostForm("paytype")
  351. usdAmount := c.PostForm("doller")
  352. ntfData := &WebNotifyData{}
  353. ntfData.CpOrderId = cpOrderId
  354. ntfData.SdkOrderId = orderNo
  355. ntfData.PayMethod = payType
  356. ntfData.PayCurrency = payCurrency
  357. ntfData.PayTime = uint64(util.GetTimeSeconds())
  358. ntfData.PayChannel = "qk_hw"
  359. util.WarnF("paycallback uid=%v cpOrderNo=%v orderNo=%v payAmount=%v payCurrency=%v payType=%v usdAmount=%v",
  360. uid, cpOrderId, orderNo, payAmount, payCurrency, payType, usdAmount)
  361. f64, err := strconv.ParseFloat(payAmount, 32)
  362. if err != nil {
  363. fmt.Println("Error:", err)
  364. return
  365. }
  366. webPayNotify(ntfData, float32(f64), c)
  367. //// 简单粗暴,直接给其他服转发,不需要确认是哪个服
  368. //payPostRouter := service.GetServiceConfig().SDKConfig.PayPostRouter
  369. //util.WarnF("paycallback payPostRouter:%v\n", payPostRouter)
  370. //// 组装转发body
  371. //params["sign"] = sign
  372. //var routerStr strings.Builder
  373. //for key, value := range params {
  374. // routerStr.WriteString(key)
  375. // routerStr.WriteString("=")
  376. // routerStr.WriteString(value)
  377. // routerStr.WriteString("&")
  378. //}
  379. //routerString := routerStr.String()
  380. //util.WarnF("paycallback routerString:%v\n", routerString)
  381. //go sendPosts(payPostRouter, routerString)
  382. c.String(http.StatusOK, "success")
  383. }
  384. func WebPayHwDn2Notify(c *gin.Context) {
  385. //util.DebugF("支付回调信息:%v", c.Request.PostForm)
  386. orderId := c.DefaultQuery("order_id", "")
  387. payAmount := c.DefaultQuery("amount", "")
  388. sign := c.DefaultQuery("sign", "")
  389. extra := c.DefaultQuery("extra", "")
  390. username := c.DefaultQuery("username", "")
  391. server := c.DefaultQuery("server", "")
  392. sandbox := c.DefaultQuery("sandbox", "")
  393. timestamp := c.DefaultQuery("timestamp", "")
  394. var extras ExtrasDn
  395. err := json.Unmarshal([]byte(extra), &extras)
  396. if err != nil {
  397. util.ErrorF("支付回调参数解析错误:%v", err)
  398. }
  399. util.ErrorF("支付回调信息东南亚2:orderId:%v,payAmount:%v,sign:%v,extra:%v,username:%v,server:%v,sandbox:%v,timestamp:%v", orderId, payAmount, sign, extra, username, server, sandbox, timestamp)
  400. if extras.Platform == "XUAN_YOU_Google_Android" {
  401. if sign != getMd5DnSign("e81c2bd2ffb7feb7f0df477dc02b0bbd", username, orderId, server, payAmount, extra, sandbox, timestamp) {
  402. c.JSON(http.StatusOK, gin.H{"status": 1, "msg": "sign error"})
  403. return
  404. }
  405. } else if extras.Platform == "XUAN_YOU_Google_Ios" {
  406. if sign != getMd5DnSign("3f8e9fec0794443f76d3a27cd41e2711", username, orderId, server, payAmount, extra, sandbox, timestamp) {
  407. c.JSON(http.StatusOK, gin.H{"status": 1, "msg": "sign error"})
  408. return
  409. }
  410. } else {
  411. if sign != getMd5DnSign("cee1b45a9aa02a75f9d720d6b9e7b7d4", username, orderId, server, payAmount, extra, sandbox, timestamp) {
  412. c.JSON(http.StatusOK, gin.H{"status": 1, "msg": "sign error"})
  413. return
  414. }
  415. }
  416. cpOrderId := extras.OrderNo
  417. f64, err := strconv.ParseFloat(payAmount, 32)
  418. if err != nil {
  419. fmt.Println("Error:", err)
  420. return
  421. }
  422. util.WarnF("paycallbackDn2 uid=%v cpOrderNo=%v orderNo=%v payAmount=%v",
  423. extras.Uid, cpOrderId, orderId, payAmount)
  424. res := webPayNotifyDn(cpOrderId, f64)
  425. //// 简单粗暴,直接给其他服转发,不需要确认是哪个服
  426. //payPostRouter := service.GetServiceConfig().SDKConfig.PayPostRouter
  427. //util.WarnF("paycallback payPostRouter:%v\n", payPostRouter)
  428. //// 组装转发body
  429. //params["sign"] = sign
  430. //var routerStr strings.Builder
  431. //for key, value := range params {
  432. // routerStr.WriteString(key)
  433. // routerStr.WriteString("=")
  434. // routerStr.WriteString(value)
  435. // routerStr.WriteString("&")
  436. //}
  437. //routerString := routerStr.String()
  438. //util.WarnF("paycallback routerString:%v\n", routerString)
  439. //go sendPosts(payPostRouter, routerString)
  440. if res == "SUCCESS" {
  441. c.JSON(http.StatusOK, gin.H{"status": 0})
  442. } else {
  443. c.JSON(http.StatusOK, gin.H{"status": 1, "msg": "order already complete"})
  444. }
  445. }
  446. func WebPayHwDnOpenServerNotify(c *gin.Context) {
  447. //util.DebugF("支付回调信息:%v", c.Request.PostForm)
  448. sidStr := c.DefaultQuery("sid", "")
  449. nameStr := c.DefaultQuery("name", "")
  450. timeStr := c.DefaultQuery("time", "") //2019-01-01 12:00:00
  451. if nameStr == "" || sidStr == "" || timeStr == "" {
  452. c.JSON(http.StatusOK, "param error:"+nameStr+sidStr+timeStr)
  453. return
  454. }
  455. reqUrl := "https://i.dze-game.com/game/center/sync_server"
  456. now := strconv.FormatInt(time.Now().Unix(), 10)
  457. // 准备表单数据
  458. formData := url.Values{}
  459. formData.Add("GAME_ID", "121")
  460. formData.Add("SID", sidStr)
  461. formData.Add("_SID", sidStr)
  462. formData.Add("NAME", nameStr)
  463. formData.Add("START_TIME", timeStr)
  464. formData.Add("sign", Md5Dn("121", nameStr, sidStr, timeStr, sidStr, now))
  465. formData.Add("timestamp", now)
  466. resp, err := http.Post(
  467. reqUrl,
  468. "application/x-www-form-urlencoded",
  469. strings.NewReader(formData.Encode()),
  470. )
  471. if err != nil {
  472. util.ErrorF("req error:%v", err)
  473. c.JSON(http.StatusOK, "req error:"+nameStr+sidStr+timeStr)
  474. return
  475. }
  476. defer resp.Body.Close()
  477. body, err := io.ReadAll(resp.Body)
  478. if err != nil {
  479. util.ErrorF("red body error:%v", err)
  480. c.JSON(http.StatusOK, "res error:"+nameStr+sidStr+timeStr)
  481. return
  482. }
  483. util.ErrorF("东南亚开服信息,sid:%v,name:%v,time:%v,response:%v", sidStr, nameStr, timeStr, string(body))
  484. c.JSON(http.StatusOK, gin.H{"status": 0})
  485. }
  486. func Md5Dn(gameId, name, sid, time, _sid, timestamp string) string {
  487. key := gameId + name + sid + time + _sid + timestamp + "cee1b45a9aa02a75f9d720d6b9e7b7d4"
  488. hash := md5.Sum([]byte(key))
  489. return hex.EncodeToString(hash[:])
  490. }
  491. func WebPayHwDnNotify(c *gin.Context) {
  492. //util.DebugF("支付回调信息:%v", c.Request.PostForm)
  493. params := make(map[string]string)
  494. if err := c.Request.ParseForm(); err != nil {
  495. util.InfoF("parseForm falied")
  496. c.String(http.StatusOK, "FAILED")
  497. return
  498. }
  499. util.ErrorF("支付回调信息东南亚:%v", c.Request.PostForm)
  500. for key, value := range c.Request.PostForm {
  501. params[key] = value[0] // 假设每个参数只有一个值
  502. }
  503. cpOrderId := params["order_code"]
  504. payAmount := params["amount"]
  505. f64, err := strconv.ParseFloat(payAmount, 32)
  506. if err != nil {
  507. fmt.Println("Error:", err)
  508. return
  509. }
  510. res := webPayNotifyDn(cpOrderId, f64)
  511. //// 简单粗暴,直接给其他服转发,不需要确认是哪个服
  512. //payPostRouter := service.GetServiceConfig().SDKConfig.PayPostRouter
  513. //util.WarnF("paycallback payPostRouter:%v\n", payPostRouter)
  514. //// 组装转发body
  515. //params["sign"] = sign
  516. //var routerStr strings.Builder
  517. //for key, value := range params {
  518. // routerStr.WriteString(key)
  519. // routerStr.WriteString("=")
  520. // routerStr.WriteString(value)
  521. // routerStr.WriteString("&")
  522. //}
  523. //routerString := routerStr.String()
  524. //util.WarnF("paycallback routerString:%v\n", routerString)
  525. //go sendPosts(payPostRouter, routerString)
  526. if res == "SUCCESS" {
  527. c.JSON(http.StatusOK, gin.H{"processingStatus": "completed"})
  528. } else {
  529. c.JSON(404, gin.H{"code": "ORDER_CODE_NOT_FOUND", "message": "order_code does not exist"})
  530. }
  531. }
  532. func sendPosts(urls []string, routerString string) {
  533. for i := 0; i < len(urls); i++ {
  534. sendPostToOtherServer(urls[i], []byte(routerString))
  535. }
  536. }
  537. // http://110.40.223.119:8002/pay/hwQucikFromS1GmWeb
  538. func WebPayHwQuickNotifyFromS1GmWeb(c *gin.Context) {
  539. params := make(map[string]string)
  540. if err := c.Request.ParseForm(); err != nil {
  541. util.InfoF("parseForm falied")
  542. c.String(http.StatusOK, "FAILED")
  543. return
  544. }
  545. for key, value := range c.Request.PostForm {
  546. params[key] = value[0] // 假设每个参数只有一个值
  547. }
  548. sign := params["sign"]
  549. newSign := getMd5Sign("03422134397322604272901806704074", params)
  550. util.ErrorF("sign:%v", sign)
  551. util.ErrorF("newSign:%v", newSign)
  552. util.ErrorF("params:%v", params)
  553. if newSign != sign {
  554. util.ErrorF("签名错误%v", sign)
  555. c.String(http.StatusOK, "FAILED")
  556. return
  557. }
  558. uid := c.PostForm("uid")
  559. cpOrderId := c.PostForm("cpOrderNo")
  560. orderNo := c.PostForm("orderNo")
  561. payAmount := c.PostForm("payAmount")
  562. payCurrency := c.PostForm("payCurrency")
  563. payType := c.PostForm("payType")
  564. usdAmount := c.PostForm("usdAmount")
  565. ntfData := &WebNotifyData{}
  566. ntfData.CpOrderId = cpOrderId
  567. ntfData.SdkOrderId = orderNo
  568. ntfData.PayMethod = payType
  569. ntfData.PayCurrency = payCurrency
  570. ntfData.PayTime = uint64(util.GetTimeSeconds())
  571. ntfData.PayChannel = "qk_hw"
  572. util.DebugF("uid=%v cpOrderNo=%v orderNo=%v payAmount=%v payCurrency=%v payType=%v usdAmount=%v",
  573. uid, cpOrderId, orderNo, payAmount, payCurrency, payType, usdAmount)
  574. f64, err := strconv.ParseFloat(usdAmount, 32)
  575. if err != nil {
  576. fmt.Println("Error:", err)
  577. return
  578. }
  579. webPayNotify(ntfData, float32(f64), c)
  580. c.JSON(http.StatusOK, "SUCCESS")
  581. }
  582. // sendPostToOtherServer 发送给其他服务器
  583. func sendPostToOtherServer(url string, body []byte) {
  584. // 创建请求
  585. req, err := http.NewRequest("POST", url, bytes.NewReader(body))
  586. if err != nil {
  587. util.ErrorF("r1 NewRequest:%v \n", err.Error())
  588. }
  589. // 设置Header
  590. req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
  591. req.Header.Set("Custom-Header", "custom-value")
  592. // 发送请求
  593. client := &http.Client{}
  594. resp, err := client.Do(req)
  595. if err != nil {
  596. util.ErrorF("r1 client.Do(req):%v \n", err.Error())
  597. return
  598. }
  599. defer resp.Body.Close()
  600. }
  601. type KVSt struct {
  602. ParamKey string
  603. ParamVal string
  604. }
  605. func WebPayNBSDKNotify(c *gin.Context) {
  606. tmpReq := c.Request
  607. err := tmpReq.ParseMultipartForm(32 << 20)
  608. if err != nil {
  609. return
  610. }
  611. formCache := tmpReq.PostForm
  612. //util.DebugF("formCache2=%v", formCache)
  613. var kvList []*KVSt
  614. for k, v := range formCache {
  615. if k == "sign" {
  616. continue
  617. }
  618. kv := &KVSt{
  619. ParamKey: k,
  620. ParamVal: v[0],
  621. }
  622. kvList = append(kvList, kv)
  623. }
  624. sort.Slice(kvList, func(i, j int) bool {
  625. return kvList[i].ParamKey < kvList[j].ParamKey
  626. })
  627. //util.DebugF("kvlist=%v", kvList)
  628. verifyStr := ""
  629. for idx := 0; idx < len(kvList); idx++ {
  630. key := url.QueryEscape(kvList[idx].ParamKey)
  631. val := url.QueryEscape(kvList[idx].ParamVal)
  632. if idx == 0 {
  633. verifyStr += key + "=" + val
  634. } else {
  635. verifyStr += "&" + key + "=" + val
  636. }
  637. }
  638. sign := c.PostForm("sign")
  639. sdkOrderId := c.PostForm("sdk_order_id") //SDK订单ID
  640. cpOrderId := c.PostForm("cp_order_id") //游戏方订单ID,由游戏客户端生成(服务器生成给到客户端)
  641. serverId := c.PostForm("server_id") //游戏区服ID
  642. pfUid := c.PostForm("pf_uid") //渠道平台的UID
  643. roleId := c.PostForm("role_id") //游戏方自己的角色ID
  644. payAmount := c.PostForm("pay_amount") //支付金额(int,单位分,CP方需要验证是否与计费点金额一致,不做此判断,后果自负哦!!!)
  645. gameKey := service.GetServiceConfig().SDKConfig.NbGameKey
  646. tmpHmac := hmac.New(md5.New, []byte(gameKey))
  647. tmpHmac.Write([]byte(verifyStr))
  648. tmpSign := hex.EncodeToString(tmpHmac.Sum([]byte("")))
  649. util.DebugF("uid=%v verifyStr=%v cpOrderId=%v pfUid=%v sdkOrderId=%v serverId=%v tmpSign=%v sign=%v gamekey=%v", roleId, verifyStr, cpOrderId, pfUid,
  650. sdkOrderId, serverId, tmpSign, sign, gameKey)
  651. if tmpSign != sign {
  652. util.InfoF("uid=%v WebPayNBSDKNotify sign verify failed cpOrderId=%v", roleId, cpOrderId)
  653. return
  654. }
  655. checkPayAmount, _ := model.Str2Num(payAmount)
  656. ntfData := &WebNotifyData{}
  657. ntfData.CpOrderId = cpOrderId
  658. ntfData.SdkOrderId = sdkOrderId
  659. ntfData.PayMethod = ""
  660. ntfData.PayCurrency = ""
  661. ntfData.PayTime = uint64(util.GetTimeSeconds())
  662. ntfData.PayChannel = ""
  663. ret := webPayNotify(ntfData, float32(checkPayAmount)/100, c)
  664. //c.JSON(http.StatusOK, `success`)
  665. c.Data(http.StatusOK, "text/plain; charset=utf-8", []byte(ret))
  666. }
  667. type UniSDKPayExtraST struct {
  668. Aid int `json:"aid"` //用户唯一标识
  669. PrivateParam string `json:"privateparam"`
  670. PayChannel string `json:"paychannel"` //支付渠道
  671. AppChannel string `json:"appchannel"` //appchannel
  672. Platform string `json:"platfrom"`
  673. UidId string `json:"uidid"` //设备id
  674. GoodsCount int `json:"goodscount"` //商品数量
  675. PayMoney string `json:"paymoney"` //玩家实际支付金额
  676. FreeMoney string `json:"freemoney"` //免费总价,供游戏服写运营日志(如果渠道不提供,该字段为0)
  677. PayCurrency string `json:"paycurrency"` //玩家实际支付币种
  678. Deduct int `json:"deduct"`
  679. DeductPercent string `json:"deductpercent"`
  680. DeductReason string `json:"deductreason"` //扣除原因,是黑设备还是黑币种
  681. JsonData string `json:"jsondata"`
  682. InitTime int `json:"inittime"` //订单创建时间戳,精确到秒;若订单不通过create_order接口创建(例如web 支付),则此值为0
  683. PayTime int `json:"paytime"` //订单支付时间戳,精确到秒
  684. IsTest int `json:"istest"` //订单来源:0,正式环境订单;1,测试环境订单(v3.6.2新增)
  685. FreeYuanBao int `json:"free_yuanbao"`
  686. PayYuanBao int `json:"pay_yuanbao"`
  687. PayMethod string `json:"paymethod"`
  688. }
  689. type UniSDKPayST struct {
  690. GameId string `json:"gameid"`
  691. HostId int `json:"hostid"`
  692. RoleId string `json:"roleid"`
  693. GoodsId string `json:"goodsid"`
  694. UserName string `json:"username"` //玩家渠道帐号(玩家帐号被sdk渠道转换之后的字符串)
  695. SN string `json:"sn"` //游戏订单号
  696. ConsumeSN string `json:"consumesn"` //渠道流水订单号(苹果渠道对应为transaction-id)
  697. ExtraData UniSDKPayExtraST
  698. }
  699. type UniSDKPayResponseST struct {
  700. Code int `json:"code"`
  701. Msg string `json:"msg"`
  702. Data interface{} `json:"data"`
  703. }
  704. func WebPayUniSDKNotify(c *gin.Context) {
  705. sign := c.GetHeader("Gas-Ship-Signature")
  706. payInfo := &UniSDKPayST{}
  707. bodyData, err := c.GetRawData()
  708. if err != nil {
  709. util.ErrorF("WebPayUniSDKNotify body get error=%v", err)
  710. return
  711. }
  712. err = json.Unmarshal(bodyData, payInfo)
  713. if err != nil {
  714. util.ErrorF("WebPayUniSDKNotify body Unmarshal error=%v", err)
  715. return
  716. }
  717. secretKey := service.GetServiceConfig().SDKConfig.UniSecretKey
  718. tmpHmac := hmac.New(md5.New, []byte(secretKey))
  719. tmpHmac.Write(bodyData)
  720. tmpSign := hex.EncodeToString(tmpHmac.Sum([]byte("")))
  721. if tmpSign != sign {
  722. util.InfoF("uid=%v WebPayUniSDKNotify sign verify failed cpOrderId=%v", payInfo.RoleId, payInfo.SN)
  723. c.Header("Gas-Ship-Signature", tmpSign)
  724. responseSt := &UniSDKPayResponseST{
  725. Code: 403,
  726. Msg: "ok",
  727. Data: nil,
  728. }
  729. c.JSON(http.StatusOK, responseSt)
  730. return
  731. }
  732. checkPayAmount, _ := model.Str2Num(payInfo.ExtraData.PayMoney)
  733. ntfData := &WebNotifyData{}
  734. ntfData.CpOrderId = payInfo.SN
  735. ntfData.SdkOrderId = payInfo.ConsumeSN
  736. ntfData.PayMethod = payInfo.ExtraData.PayMethod
  737. ntfData.PayCurrency = payInfo.ExtraData.PayCurrency
  738. ntfData.PayTime = uint64(payInfo.ExtraData.PayTime)
  739. ntfData.PayChannel = payInfo.ExtraData.PayChannel
  740. ret := webPayNotify(ntfData, float32(checkPayAmount)/100, c)
  741. if ret == "FAILED" {
  742. c.JSON(http.StatusOK, "FAILED")
  743. }
  744. c.Header("Gas-Ship-Signature", tmpSign)
  745. responseSt := &UniSDKPayResponseST{
  746. Code: 200,
  747. Msg: "ok",
  748. Data: nil,
  749. }
  750. c.JSON(http.StatusOK, responseSt)
  751. }
  752. func WebPayNBH5Notify(c *gin.Context) {
  753. sdkOrderId := c.PostForm("sdk_order_id") //SDK订单ID
  754. cpOrderId := c.PostForm("cp_order_id") //游戏方订单ID,由游戏客户端生成(服务器生成给到客户端)
  755. serverId := c.PostForm("server_id") //游戏区服ID
  756. pfUid := c.PostForm("pf_uid") //渠道平台的UID
  757. roleId := c.PostForm("role_id") //游戏方自己的角色ID(uid)
  758. payAmount := c.PostForm("pay_amount") //支付金额(int,单位分,CP方需要验证是否与计费点金额一致,不做此判断,后果自负哦!!!)
  759. goodsType := c.PostForm("goods_type")
  760. goodsID := c.PostForm("goods_id")
  761. util.InfoF("WebPayH5Notify roleId=%v pfUid=%v sdkOrderId=%v serverId=%v", roleId, pfUid, sdkOrderId, serverId)
  762. if cpOrderId == "" {
  763. cpOrderId = "WebPayH5Notify"
  764. }
  765. gameRoleId, _ := model.Str2NumU64(roleId)
  766. checkPayAmount, _ := model.Str2Num(payAmount)
  767. if gameRoleId <= 0 || checkPayAmount <= 0 {
  768. c.Data(http.StatusOK, "text/plain; charset=utf-8", []byte("FAILED"))
  769. return
  770. }
  771. ntfData := &WebNotifyData{}
  772. ntfData.GameRoleId = gameRoleId
  773. ntfData.CpOrderId = cpOrderId
  774. ntfData.SdkOrderId = sdkOrderId
  775. ntfData.PayMethod = ""
  776. ntfData.PayCurrency = ""
  777. ntfData.PayTime = uint64(util.GetTimeSeconds())
  778. ntfData.PayChannel = "WebPayH5Notify"
  779. ntfData.GoodsType, _ = model.Str2NumU64(goodsType)
  780. ntfData.GoodsID, _ = model.Str2NumU64(goodsID)
  781. ret := webPayNotifyH5(ntfData, float32(checkPayAmount)/100, c)
  782. c.Data(http.StatusOK, "text/plain; charset=utf-8", []byte(ret))
  783. }
  784. type WebNotifyData struct {
  785. CpOrderId string
  786. SdkOrderId string
  787. PayMethod string
  788. PayCurrency string
  789. PayTime uint64
  790. PayChannel string
  791. GameRoleId uint64
  792. GoodsType uint64
  793. GoodsID uint64
  794. }
  795. func webPayNotify(webNtf *WebNotifyData, payAmount float32, c *gin.Context) string {
  796. //流程处理gmweb保存订单状态到redis中设置为 成功充值状态
  797. //发送给gameserver,成功收到后设置订单状态为成功获取充值状态,如果gameserver没有收到
  798. //每次玩家上线时,重新获取一次订单状态如果是成功充值,但是没有获取成功就获取一次
  799. // 充值成功获取对应的ntdata数据
  800. // 1,回复成/失败消息给quick
  801. // 2,订单状态写入redis(判重处理),并发送给social做获取奖励处理
  802. msgStr, err := service.GetRedis().HGet(model.PayOrderPrefix, webNtf.CpOrderId).Result()
  803. if err != nil {
  804. //util.ErrorF("WebPayQuickNotify order not exist err=%v", err)
  805. util.ErrorF("WebPayQuickNotify order not exist err=%v, cpOrderId=%v, sdkOrderId=%v", err, webNtf.CpOrderId, webNtf.SdkOrderId)
  806. //c.JSON(http.StatusOK, "FAILED")
  807. //return "FAILED"
  808. return fmt.Sprintf("FAILED,cpOrderId=%v err=%v", webNtf.CpOrderId, err)
  809. }
  810. payInfo := &serverproto.PayOrderSaveInfo{}
  811. err = model.GetDecodeMessage(payInfo, msgStr)
  812. if err != nil {
  813. util.ErrorF("WebPayQuickNotify GetDecodeMessage err=%, cpOrderId=%v, sdkOrderId=%v", err, webNtf.CpOrderId, webNtf.SdkOrderId)
  814. //util.ErrorF("WebPayQuickNotify GetDecodeMessage err=%v", err)
  815. //c.JSON(http.StatusOK, "FAILED")
  816. //return "FAILED"
  817. return fmt.Sprintf("FAILED,cpOrderId=%v err=%v", webNtf.CpOrderId, err)
  818. }
  819. if payInfo.OrderState == int32(serverproto.PayOrderState_EPayOrderState_Gen) {
  820. //实际支付 == 订单的钱,否则为支付失败
  821. payAmount := int32(payAmount * 10) //该渠道是以分为单位(游戏以卢布为单位)
  822. //服务器订单实际金额:
  823. orderAmount := int32(payInfo.Amount * 1000)
  824. if payAmount == orderAmount {
  825. payInfo.OrderState = int32(serverproto.PayOrderState_EPayOrderState_PayOk)
  826. } else {
  827. payInfo.OrderState = int32(serverproto.PayOrderState_EPayOrderState_PayFailed)
  828. util.ErrorF("uid=%v WebPayQuickNotify failed payAmount:%v order=%v", payInfo.Uid, payAmount, payInfo)
  829. }
  830. payInfo.OrderProcessTime = util.GetTimeMilliseconds()
  831. payInfo.SdkOrderId = webNtf.SdkOrderId //sdk订单id\
  832. payInfo.PayMethod = webNtf.PayMethod
  833. payInfo.PayCurrency = webNtf.PayCurrency
  834. payInfo.PayTime = webNtf.PayTime
  835. payInfo.PayChannel = webNtf.PayChannel
  836. //订单状态修改,写入数据库(后续玩家发货成功后会再次修改订单状态为PayOrderState_EPayOrderState_PayOkReward)
  837. err, newPayInfoStr := model.GetEncodeMessage(payInfo)
  838. if err == nil {
  839. service.GetRedis().HSet(model.PayOrderPrefix, webNtf.CpOrderId, newPayInfoStr)
  840. }
  841. //完成订单id列表(避免上次发货不成功,玩家下次登陆时可以重新获取一次奖励)
  842. uidStr := strconv.FormatUint(payInfo.Uid, 10)
  843. okListKeyStr := model.PayOrderOKIdListPrefix + uidStr
  844. service.GetRedis().SAdd(okListKeyStr, payInfo.CpOrderId)
  845. if payInfo.OrderState == int32(serverproto.PayOrderState_EPayOrderState_PayOk) {
  846. ssNtfMsg := &serverproto.SSPayInfoOrderNtf{
  847. PayOrderInfo: payInfo,
  848. }
  849. selfmodel.SendSocial(ssNtfMsg)
  850. }
  851. util.InfoF("uid=%v WebPayQuickNotify ok order=%v", payInfo.Uid, payInfo)
  852. } else {
  853. util.ErrorF("WebPayQuickNotify uid=%v state error state=%v", payInfo.Uid, payInfo.OrderState)
  854. //return "FAILED"
  855. return fmt.Sprintf("FAILED,cpOrderId=%v state error=%v", webNtf.CpOrderId, payInfo.OrderState)
  856. }
  857. return "SUCCESS"
  858. }
  859. func webPayNotifyDn(cpOrderId string, Amount float64) string {
  860. //流程处理gmweb保存订单状态到redis中设置为 成功充值状态
  861. //发送给gameserver,成功收到后设置订单状态为成功获取充值状态,如果gameserver没有收到
  862. //每次玩家上线时,重新获取一次订单状态如果是成功充值,但是没有获取成功就获取一次
  863. // 充值成功获取对应的ntdata数据
  864. // 1,回复成/失败消息给quick
  865. // 2,订单状态写入redis(判重处理),并发送给social做获取奖励处理
  866. msgStr, err := service.GetRedis().HGet(model.PayOrderPrefix, cpOrderId).Result()
  867. if err != nil {
  868. //util.ErrorF("WebPayQuickNotify order not exist err=%v", err)
  869. util.ErrorF("WebPayQuickNotify order not exist err=%v, cpOrderId=%v, sdkOrderId=%v", err, cpOrderId, 0)
  870. //c.JSON(http.StatusOK, "FAILED")
  871. //return "FAILED"
  872. return fmt.Sprintf("FAILED,cpOrderId=%v err=%v", cpOrderId, err)
  873. }
  874. payInfo := &serverproto.PayOrderSaveInfo{}
  875. err = model.GetDecodeMessage(payInfo, msgStr)
  876. if err != nil {
  877. util.ErrorF("WebPayQuickNotify GetDecodeMessage err=%, cpOrderId=%v, sdkOrderId=%v", err, cpOrderId, 0)
  878. //util.ErrorF("WebPayQuickNotify GetDecodeMessage err=%v", err)
  879. //c.JSON(http.StatusOK, "FAILED")
  880. //return "FAILED"
  881. return fmt.Sprintf("FAILED,cpOrderId=%v err=%v", cpOrderId, err)
  882. }
  883. if payInfo.OrderState == int32(serverproto.PayOrderState_EPayOrderState_Gen) {
  884. //实际支付 == 订单的钱,否则为支付失败
  885. payAmount := int32(Amount * 10) //该渠道是以分为单位(游戏以卢布为单位)
  886. ////服务器订单实际金额:
  887. orderAmount := int32(payInfo.Amount * 1000)
  888. if payAmount == orderAmount {
  889. payInfo.OrderState = int32(serverproto.PayOrderState_EPayOrderState_PayOk)
  890. } else {
  891. payInfo.OrderState = int32(serverproto.PayOrderState_EPayOrderState_PayFailed)
  892. util.ErrorF("uid=%v WebPayQuickNotify failed payAmount:%v order=%v", payInfo.Uid, payAmount, payInfo)
  893. }
  894. payInfo.OrderState = int32(serverproto.PayOrderState_EPayOrderState_PayOk)
  895. payInfo.OrderProcessTime = util.GetTimeMilliseconds()
  896. //payInfo.SdkOrderId = webNtf.SdkOrderId //sdk订单id\
  897. //payInfo.PayMethod = webNtf.PayMethod
  898. //payInfo.PayCurrency = webNtf.PayCurrency
  899. payInfo.PayTime = util.GetTimeMilliseconds()
  900. payInfo.PayChannel = "dn"
  901. //订单状态修改,写入数据库(后续玩家发货成功后会再次修改订单状态为PayOrderState_EPayOrderState_PayOkReward)
  902. err, newPayInfoStr := model.GetEncodeMessage(payInfo)
  903. if err == nil {
  904. service.GetRedis().HSet(model.PayOrderPrefix, cpOrderId, newPayInfoStr)
  905. }
  906. //完成订单id列表(避免上次发货不成功,玩家下次登陆时可以重新获取一次奖励)
  907. uidStr := strconv.FormatUint(payInfo.Uid, 10)
  908. okListKeyStr := model.PayOrderOKIdListPrefix + uidStr
  909. service.GetRedis().SAdd(okListKeyStr, payInfo.CpOrderId)
  910. if payInfo.OrderState == int32(serverproto.PayOrderState_EPayOrderState_PayOk) {
  911. ssNtfMsg := &serverproto.SSPayInfoOrderNtf{
  912. PayOrderInfo: payInfo,
  913. }
  914. selfmodel.SendSocial(ssNtfMsg)
  915. }
  916. util.InfoF("uid=%v WebPayQuickNotify ok order=%v", payInfo.Uid, payInfo)
  917. } else {
  918. util.ErrorF("WebPayQuickNotify uid=%v state error state=%v", payInfo.Uid, payInfo.OrderState)
  919. //return "FAILED"
  920. return fmt.Sprintf("FAILED,cpOrderId=%v state error=%v", cpOrderId, payInfo.OrderState)
  921. }
  922. return "SUCCESS"
  923. }
  924. // 外层发起主动充值(不走游戏流程)
  925. func webPayNotifyH5(webNtf *WebNotifyData, payAmount float32, c *gin.Context) string {
  926. payInfo := &serverproto.PayOrderSaveInfo{}
  927. payInfo.Uid = webNtf.GameRoleId
  928. payInfo.Amount = payAmount
  929. payInfo.OrderProcessTime = util.GetTimeMilliseconds()
  930. payInfo.SdkOrderId = webNtf.SdkOrderId //sdk订单id\
  931. payInfo.PayMethod = webNtf.PayMethod
  932. payInfo.PayCurrency = webNtf.PayCurrency
  933. payInfo.PayTime = webNtf.PayTime
  934. payInfo.PayChannel = webNtf.PayChannel
  935. payInfo.GoodsType = int32(webNtf.GoodsType)
  936. payInfo.GoodsId = int32(webNtf.GoodsID)
  937. rewardStr := c.DefaultQuery("reward", "")
  938. //reward
  939. rewardStrList := strings.Split(rewardStr, ",")
  940. for idx := 0; idx < len(rewardStrList); idx++ {
  941. key, val := model.Str2Res(rewardStrList[idx])
  942. if key > 0 && val > 0 {
  943. payInfo.RewardList = append(payInfo.RewardList, &serverproto.KeyValueType{Key: key, Value: val})
  944. }
  945. }
  946. payInfo.OrderState = int32(serverproto.PayOrderState_EPayOrderState_PayOk)
  947. //订单状态修改,写入数据库(后续玩家发货成功后会再次修改订单状态为PayOrderState_EPayOrderState_PayOkReward)
  948. err, newPayInfoStr := model.GetEncodeMessage(payInfo)
  949. if err == nil {
  950. service.GetRedis().HSet(model.PayOrderPrefix, webNtf.CpOrderId, newPayInfoStr)
  951. }
  952. //完成订单id列表(避免上次发货不成功,玩家下次登陆时可以重新获取一次奖励)
  953. uidStr := strconv.FormatUint(payInfo.Uid, 10)
  954. okListKeyStr := model.PayOrderOKIdListPrefix + uidStr
  955. service.GetRedis().SAdd(okListKeyStr, payInfo.CpOrderId)
  956. util.InfoF("webPayNotifyH5: %v", payInfo)
  957. ssNtfMsg := &serverproto.SSPayInfoOrderNtf{
  958. PayOrderInfo: payInfo,
  959. }
  960. selfmodel.SendSocial(ssNtfMsg)
  961. return "SUCCESS"
  962. }