123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- package telecom
- import (
- "context"
- "crypto/md5"
- "encoding/hex"
- "net/http"
- "net/url"
- "strconv"
- "strings"
- "time"
- "go-common/app/interface/main/app-wall/model/telecom"
- "go-common/library/ecode"
- "go-common/library/log"
- "github.com/xxtea/xxtea-go/xxtea"
- )
- const (
- _telecomAppsecret = "FD9B667503E74DDDBcF28E2327F88EEA"
- _telecomAppID = "1000000053"
- _telecomFormat = "json"
- _telecomClientType = "3"
- _flowPackageID = 279
- _payInfo = "/api/v1/0/getPayInfo.do"
- _cancelRepeatOrder = "/api/v1/0/cancelRepeatOrder.do"
- _sucOrderList = "/api/v1/0/getSucOrderList.do"
- _phoneArea = "/api/v1/0/queryOperatorAndProvince.do"
- _orderState = "/api/v1/0/queryOrderStatus.do"
- )
- // PayInfo
- func (d *Dao) PayInfo(c context.Context, requestNo int64, phone, isRepeatOrder, payChannel, payAction int, orderID int64, ipStr string,
- beginTime, firstOrderEndtime time.Time) (data *telecom.Pay, err error, msg string) {
- var payChannelStr string
- switch payChannel {
- case 1:
- payChannelStr = "31"
- ipStr = ""
- case 2:
- payChannelStr = "29"
- }
- params := url.Values{}
- params.Set("requestNo", strconv.FormatInt(requestNo, 10))
- params.Set("flowPackageId", strconv.Itoa(_flowPackageID))
- params.Set("contractId", "100174")
- params.Set("activityId", "101043")
- params.Set("phoneId", strconv.Itoa(phone))
- params.Set("bindApps", "tv.danmaku.bilianime|tv.danmaku.bili")
- params.Set("bindAppNames", "哔哩哔哩|哔哩哔哩")
- params.Set("isRepeatOrder", strconv.Itoa(isRepeatOrder))
- params.Set("payChannel", payChannelStr)
- if ipStr != "" {
- params.Set("userIp", ipStr)
- }
- params.Set("payPageType", "1")
- if d.telecomReturnURL != "" {
- params.Set("returnUrl", d.telecomReturnURL)
- }
- if d.telecomCancelPayURL != "" {
- params.Set("cancelPayUrl", d.telecomCancelPayURL)
- }
- params.Set("payAction", strconv.Itoa(payAction))
- // if startTime := beginTime.Format("20060102"); startTime != "19700101" && !beginTime.IsZero() {
- // params.Set("beginTime", startTime)
- // }
- // if endTime := firstOrderEndtime.Format("20060102"); endTime != "19700101" && !firstOrderEndtime.IsZero() {
- // params.Set("firstOrderEndtime", endTime)
- // }
- if orderID > 0 {
- params.Set("orderId", strconv.FormatInt(orderID, 10))
- }
- var res struct {
- Code int `json:"resCode"`
- Detail struct {
- OrderID int64 `json:"orderId"`
- PayInfo struct {
- PayURL string `json:"payUrl"`
- } `json:"payInfo"`
- } `json:"detail"`
- Msg string `json:"resMsg"`
- }
- if err = d.wallHTTPPost(c, d.payInfoURL, params, &res); err != nil {
- log.Error("telecom_payInfoURL url(%s) error(%v)", d.payInfoURL+"?"+params.Encode(), err)
- return
- }
- if res.Code != 10000 {
- err = ecode.Int(res.Code)
- log.Error("telecom_url(%s) res code(%d) or res.data(%v)", d.payInfoURL+"?"+params.Encode(), res.Code, res.Detail)
- msg = res.Msg
- return
- }
- data = &telecom.Pay{
- RequestNo: requestNo,
- OrderID: res.Detail.OrderID,
- PayURL: res.Detail.PayInfo.PayURL,
- }
- return
- }
- // wallHTTPPost
- func (d *Dao) wallHTTPPost(c context.Context, urlStr string, params url.Values, res interface{}) (err error) {
- newParams := url.Values{}
- encryptData := xxtea.Encrypt([]byte(params.Encode()), []byte(_telecomAppsecret))
- hexStr := hex.EncodeToString(encryptData)
- newParams.Set("paras", hexStr)
- mh := md5.Sum([]byte(_telecomAppID + _telecomClientType + _telecomFormat + hexStr + _telecomAppsecret))
- newParams.Set("sign", hex.EncodeToString(mh[:]))
- newParams.Set("appId", _telecomAppID)
- newParams.Set("clientType", _telecomClientType)
- newParams.Set("format", _telecomFormat)
- req, err := http.NewRequest("POST", urlStr, strings.NewReader(newParams.Encode()))
- if err != nil {
- log.Error("telecom_http.NewRequest url(%s) error(%v)", urlStr+"?"+newParams.Encode(), err)
- return
- }
- req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
- req.Header.Set("X-BACKEND-BILI-REAL-IP", "")
- return d.client.Do(c, req, &res)
- }
- // CancelRepeatOrder
- func (d *Dao) CancelRepeatOrder(c context.Context, phone int, signNo string) (msg string, err error) {
- params := url.Values{}
- params.Set("phoneId", strconv.Itoa(phone))
- params.Set("signNo", signNo)
- var res struct {
- Code int `json:"resCode"`
- Msg string `json:"resMsg"`
- }
- if err = d.wallHTTPPost(c, d.cancelRepeatOrderURL, params, &res); err != nil {
- log.Error("telecom_payInfoURL url(%s) error(%v)", d.cancelRepeatOrderURL+"?"+params.Encode(), err)
- return
- }
- if res.Code != 10000 {
- err = ecode.Int(res.Code)
- log.Error("telecom_url(%s) res code(%d)", d.cancelRepeatOrderURL+"?"+params.Encode(), res.Code)
- msg = res.Msg
- return
- }
- msg = res.Msg
- return
- }
- // SucOrderList user order list
- func (d *Dao) SucOrderList(c context.Context, phone int) (res *telecom.SucOrder, err error, msg string) {
- params := url.Values{}
- params.Set("phoneId", strconv.Itoa(phone))
- var resData struct {
- Code int `json:"resCode"`
- Detail struct {
- AccessToken string `json:"accessToken"`
- Orders []*telecom.SucOrder `json:"orders"`
- } `json:"detail"`
- Msg string `json:"resMsg"`
- }
- if err = d.wallHTTPPost(c, d.sucOrderListURL, params, &resData); err != nil {
- log.Error("telecom_sucOrderListURL url(%s) error(%v)", d.sucOrderListURL+"?"+params.Encode(), err)
- return
- }
- if resData.Code != 10000 {
- err = ecode.Int(resData.Code)
- log.Error("telecom_url(%s) res code(%d)", d.sucOrderListURL+"?"+params.Encode(), resData.Code)
- msg = resData.Msg
- return
- }
- if len(resData.Detail.Orders) == 0 {
- err = ecode.NothingFound
- msg = "订单不存在"
- log.Error("telecom_order list phone(%v) len 0", phone)
- return
- }
- for _, r := range resData.Detail.Orders {
- if r.FlowPackageID == strconv.Itoa(_flowPackageID) {
- r.OrderID, _ = strconv.ParseInt(r.OrderIDStr, 10, 64)
- r.OrderIDStr = ""
- r.PortInt, _ = strconv.Atoi(r.Port)
- r.Port = ""
- res = r
- res.AccessToken = resData.Detail.AccessToken
- break
- }
- }
- if res == nil {
- log.Error("telecom_order bili phone(%v) is null", phone)
- msg = "订单不存在"
- err = ecode.NothingFound
- return
- }
- msg = resData.Msg
- return
- }
- // PhoneArea phone by area
- func (d *Dao) PhoneArea(c context.Context, phone int) (area string, err error, msg string) {
- params := url.Values{}
- params.Set("phoneId", strconv.Itoa(phone))
- var resData struct {
- Code int `json:"resCode"`
- Detail struct {
- RegionCode string `json:"regionCode"`
- AreaName string `json:"areaName"`
- } `json:"detail"`
- Msg string `json:"resMsg"`
- }
- if err = d.wallHTTPPost(c, d.phoneAreaURL, params, &resData); err != nil {
- log.Error("telecom_phoneAreaURL url(%s) error(%v)", d.phoneAreaURL+"?"+params.Encode(), err)
- return
- }
- if resData.Code != 10000 {
- err = ecode.Int(resData.Code)
- log.Error("telecom_url(%s) res code(%d)", d.phoneAreaURL+"?"+params.Encode(), resData.Code)
- msg = resData.Msg
- return
- }
- area = resData.Detail.RegionCode
- return
- }
- // OrderState
- func (d *Dao) OrderState(c context.Context, orderid int64) (res *telecom.OrderPhoneState, err error) {
- params := url.Values{}
- params.Set("orderId", strconv.FormatInt(orderid, 10))
- var resData struct {
- Code int `json:"resCode"`
- Detail *telecom.OrderPhoneState `json:"detail"`
- Msg string `json:"resMsg"`
- }
- if err = d.wallHTTPPost(c, d.orderStateURL, params, &resData); err != nil {
- log.Error("telecom_orderStateURL url(%s) error(%v)", d.orderStateURL+"?"+params.Encode(), err)
- return
- }
- if resData.Code != 10000 && resData.Code != 10013 {
- err = ecode.Int(resData.Code)
- log.Error("telecom_url(%s) res code(%d)", d.orderStateURL+"?"+params.Encode(), resData.Code)
- return
- }
- if resData.Code == 10013 {
- res = &telecom.OrderPhoneState{
- OrderState: 6,
- }
- return
- }
- res = resData.Detail
- if res.FlowPackageID != _flowPackageID {
- res.OrderState = 5
- return
- }
- switch resData.Detail.OrderState {
- case 5:
- res.OrderState = 6
- }
- return
- }
|