api.go 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. package telecom
  2. import (
  3. "context"
  4. "crypto/md5"
  5. "encoding/hex"
  6. "net/http"
  7. "net/url"
  8. "strconv"
  9. "strings"
  10. "time"
  11. "go-common/app/interface/main/app-wall/model/telecom"
  12. "go-common/library/ecode"
  13. "go-common/library/log"
  14. "github.com/xxtea/xxtea-go/xxtea"
  15. )
  16. const (
  17. _telecomAppsecret = "FD9B667503E74DDDBcF28E2327F88EEA"
  18. _telecomAppID = "1000000053"
  19. _telecomFormat = "json"
  20. _telecomClientType = "3"
  21. _flowPackageID = 279
  22. _payInfo = "/api/v1/0/getPayInfo.do"
  23. _cancelRepeatOrder = "/api/v1/0/cancelRepeatOrder.do"
  24. _sucOrderList = "/api/v1/0/getSucOrderList.do"
  25. _phoneArea = "/api/v1/0/queryOperatorAndProvince.do"
  26. _orderState = "/api/v1/0/queryOrderStatus.do"
  27. )
  28. // PayInfo
  29. func (d *Dao) PayInfo(c context.Context, requestNo int64, phone, isRepeatOrder, payChannel, payAction int, orderID int64, ipStr string,
  30. beginTime, firstOrderEndtime time.Time) (data *telecom.Pay, err error, msg string) {
  31. var payChannelStr string
  32. switch payChannel {
  33. case 1:
  34. payChannelStr = "31"
  35. ipStr = ""
  36. case 2:
  37. payChannelStr = "29"
  38. }
  39. params := url.Values{}
  40. params.Set("requestNo", strconv.FormatInt(requestNo, 10))
  41. params.Set("flowPackageId", strconv.Itoa(_flowPackageID))
  42. params.Set("contractId", "100174")
  43. params.Set("activityId", "101043")
  44. params.Set("phoneId", strconv.Itoa(phone))
  45. params.Set("bindApps", "tv.danmaku.bilianime|tv.danmaku.bili")
  46. params.Set("bindAppNames", "哔哩哔哩|哔哩哔哩")
  47. params.Set("isRepeatOrder", strconv.Itoa(isRepeatOrder))
  48. params.Set("payChannel", payChannelStr)
  49. if ipStr != "" {
  50. params.Set("userIp", ipStr)
  51. }
  52. params.Set("payPageType", "1")
  53. if d.telecomReturnURL != "" {
  54. params.Set("returnUrl", d.telecomReturnURL)
  55. }
  56. if d.telecomCancelPayURL != "" {
  57. params.Set("cancelPayUrl", d.telecomCancelPayURL)
  58. }
  59. params.Set("payAction", strconv.Itoa(payAction))
  60. // if startTime := beginTime.Format("20060102"); startTime != "19700101" && !beginTime.IsZero() {
  61. // params.Set("beginTime", startTime)
  62. // }
  63. // if endTime := firstOrderEndtime.Format("20060102"); endTime != "19700101" && !firstOrderEndtime.IsZero() {
  64. // params.Set("firstOrderEndtime", endTime)
  65. // }
  66. if orderID > 0 {
  67. params.Set("orderId", strconv.FormatInt(orderID, 10))
  68. }
  69. var res struct {
  70. Code int `json:"resCode"`
  71. Detail struct {
  72. OrderID int64 `json:"orderId"`
  73. PayInfo struct {
  74. PayURL string `json:"payUrl"`
  75. } `json:"payInfo"`
  76. } `json:"detail"`
  77. Msg string `json:"resMsg"`
  78. }
  79. if err = d.wallHTTPPost(c, d.payInfoURL, params, &res); err != nil {
  80. log.Error("telecom_payInfoURL url(%s) error(%v)", d.payInfoURL+"?"+params.Encode(), err)
  81. return
  82. }
  83. if res.Code != 10000 {
  84. err = ecode.Int(res.Code)
  85. log.Error("telecom_url(%s) res code(%d) or res.data(%v)", d.payInfoURL+"?"+params.Encode(), res.Code, res.Detail)
  86. msg = res.Msg
  87. return
  88. }
  89. data = &telecom.Pay{
  90. RequestNo: requestNo,
  91. OrderID: res.Detail.OrderID,
  92. PayURL: res.Detail.PayInfo.PayURL,
  93. }
  94. return
  95. }
  96. // wallHTTPPost
  97. func (d *Dao) wallHTTPPost(c context.Context, urlStr string, params url.Values, res interface{}) (err error) {
  98. newParams := url.Values{}
  99. encryptData := xxtea.Encrypt([]byte(params.Encode()), []byte(_telecomAppsecret))
  100. hexStr := hex.EncodeToString(encryptData)
  101. newParams.Set("paras", hexStr)
  102. mh := md5.Sum([]byte(_telecomAppID + _telecomClientType + _telecomFormat + hexStr + _telecomAppsecret))
  103. newParams.Set("sign", hex.EncodeToString(mh[:]))
  104. newParams.Set("appId", _telecomAppID)
  105. newParams.Set("clientType", _telecomClientType)
  106. newParams.Set("format", _telecomFormat)
  107. req, err := http.NewRequest("POST", urlStr, strings.NewReader(newParams.Encode()))
  108. if err != nil {
  109. log.Error("telecom_http.NewRequest url(%s) error(%v)", urlStr+"?"+newParams.Encode(), err)
  110. return
  111. }
  112. req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
  113. req.Header.Set("X-BACKEND-BILI-REAL-IP", "")
  114. return d.client.Do(c, req, &res)
  115. }
  116. // CancelRepeatOrder
  117. func (d *Dao) CancelRepeatOrder(c context.Context, phone int, signNo string) (msg string, err error) {
  118. params := url.Values{}
  119. params.Set("phoneId", strconv.Itoa(phone))
  120. params.Set("signNo", signNo)
  121. var res struct {
  122. Code int `json:"resCode"`
  123. Msg string `json:"resMsg"`
  124. }
  125. if err = d.wallHTTPPost(c, d.cancelRepeatOrderURL, params, &res); err != nil {
  126. log.Error("telecom_payInfoURL url(%s) error(%v)", d.cancelRepeatOrderURL+"?"+params.Encode(), err)
  127. return
  128. }
  129. if res.Code != 10000 {
  130. err = ecode.Int(res.Code)
  131. log.Error("telecom_url(%s) res code(%d)", d.cancelRepeatOrderURL+"?"+params.Encode(), res.Code)
  132. msg = res.Msg
  133. return
  134. }
  135. msg = res.Msg
  136. return
  137. }
  138. // SucOrderList user order list
  139. func (d *Dao) SucOrderList(c context.Context, phone int) (res *telecom.SucOrder, err error, msg string) {
  140. params := url.Values{}
  141. params.Set("phoneId", strconv.Itoa(phone))
  142. var resData struct {
  143. Code int `json:"resCode"`
  144. Detail struct {
  145. AccessToken string `json:"accessToken"`
  146. Orders []*telecom.SucOrder `json:"orders"`
  147. } `json:"detail"`
  148. Msg string `json:"resMsg"`
  149. }
  150. if err = d.wallHTTPPost(c, d.sucOrderListURL, params, &resData); err != nil {
  151. log.Error("telecom_sucOrderListURL url(%s) error(%v)", d.sucOrderListURL+"?"+params.Encode(), err)
  152. return
  153. }
  154. if resData.Code != 10000 {
  155. err = ecode.Int(resData.Code)
  156. log.Error("telecom_url(%s) res code(%d)", d.sucOrderListURL+"?"+params.Encode(), resData.Code)
  157. msg = resData.Msg
  158. return
  159. }
  160. if len(resData.Detail.Orders) == 0 {
  161. err = ecode.NothingFound
  162. msg = "订单不存在"
  163. log.Error("telecom_order list phone(%v) len 0", phone)
  164. return
  165. }
  166. for _, r := range resData.Detail.Orders {
  167. if r.FlowPackageID == strconv.Itoa(_flowPackageID) {
  168. r.OrderID, _ = strconv.ParseInt(r.OrderIDStr, 10, 64)
  169. r.OrderIDStr = ""
  170. r.PortInt, _ = strconv.Atoi(r.Port)
  171. r.Port = ""
  172. res = r
  173. res.AccessToken = resData.Detail.AccessToken
  174. break
  175. }
  176. }
  177. if res == nil {
  178. log.Error("telecom_order bili phone(%v) is null", phone)
  179. msg = "订单不存在"
  180. err = ecode.NothingFound
  181. return
  182. }
  183. msg = resData.Msg
  184. return
  185. }
  186. // PhoneArea phone by area
  187. func (d *Dao) PhoneArea(c context.Context, phone int) (area string, err error, msg string) {
  188. params := url.Values{}
  189. params.Set("phoneId", strconv.Itoa(phone))
  190. var resData struct {
  191. Code int `json:"resCode"`
  192. Detail struct {
  193. RegionCode string `json:"regionCode"`
  194. AreaName string `json:"areaName"`
  195. } `json:"detail"`
  196. Msg string `json:"resMsg"`
  197. }
  198. if err = d.wallHTTPPost(c, d.phoneAreaURL, params, &resData); err != nil {
  199. log.Error("telecom_phoneAreaURL url(%s) error(%v)", d.phoneAreaURL+"?"+params.Encode(), err)
  200. return
  201. }
  202. if resData.Code != 10000 {
  203. err = ecode.Int(resData.Code)
  204. log.Error("telecom_url(%s) res code(%d)", d.phoneAreaURL+"?"+params.Encode(), resData.Code)
  205. msg = resData.Msg
  206. return
  207. }
  208. area = resData.Detail.RegionCode
  209. return
  210. }
  211. // OrderState
  212. func (d *Dao) OrderState(c context.Context, orderid int64) (res *telecom.OrderPhoneState, err error) {
  213. params := url.Values{}
  214. params.Set("orderId", strconv.FormatInt(orderid, 10))
  215. var resData struct {
  216. Code int `json:"resCode"`
  217. Detail *telecom.OrderPhoneState `json:"detail"`
  218. Msg string `json:"resMsg"`
  219. }
  220. if err = d.wallHTTPPost(c, d.orderStateURL, params, &resData); err != nil {
  221. log.Error("telecom_orderStateURL url(%s) error(%v)", d.orderStateURL+"?"+params.Encode(), err)
  222. return
  223. }
  224. if resData.Code != 10000 && resData.Code != 10013 {
  225. err = ecode.Int(resData.Code)
  226. log.Error("telecom_url(%s) res code(%d)", d.orderStateURL+"?"+params.Encode(), resData.Code)
  227. return
  228. }
  229. if resData.Code == 10013 {
  230. res = &telecom.OrderPhoneState{
  231. OrderState: 6,
  232. }
  233. return
  234. }
  235. res = resData.Detail
  236. if res.FlowPackageID != _flowPackageID {
  237. res.OrderState = 5
  238. return
  239. }
  240. switch resData.Detail.OrderState {
  241. case 5:
  242. res.OrderState = 6
  243. }
  244. return
  245. }