web_paymsg.go 38 KB

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