You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
247 lines
7.4 KiB
247 lines
7.4 KiB
package newcomer |
|
|
|
import ( |
|
"context" |
|
"encoding/json" |
|
"errors" |
|
"net/http" |
|
"net/url" |
|
"strconv" |
|
"strings" |
|
"time" |
|
|
|
"fmt" |
|
"go-common/app/interface/main/creative/conf" |
|
"go-common/app/interface/main/creative/dao/tool" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
"go-common/library/xstr" |
|
"math/rand" |
|
) |
|
|
|
func init() { |
|
rand.Seed(time.Now().UnixNano()) |
|
} |
|
|
|
// Mall receive mall coupon code. |
|
func (d *Dao) Mall(c context.Context, mid int64, couponID, uname string) (err error) { |
|
type params struct { |
|
MID int64 `json:"mid"` |
|
CouponID string `json:"couponId"` |
|
Uname string `json:"uname"` |
|
} |
|
p := params{} |
|
p.MID = mid |
|
p.CouponID = couponID //优惠券id |
|
p.Uname = uname //抱团购类型 uname必传 |
|
paramJSON, err := json.Marshal(p) |
|
if err != nil { |
|
log.Error("Mall json.Marshal param(%+v) error(%v)", p, err) |
|
return |
|
} |
|
paramStr := string(paramJSON) |
|
|
|
var ( |
|
req *http.Request |
|
) |
|
if req, err = http.NewRequest("POST", d.mallURI, strings.NewReader(paramStr)); err != nil { |
|
log.Error("Mall http.NewRequest url(%s) error(%v)", d.mallURI+"?"+paramStr, err) |
|
err = ecode.CreativeNewcomerMallAPIErr |
|
return |
|
} |
|
log.Info("Mall url(%s)", d.mallURI+"?"+paramStr) |
|
|
|
req.Header.Set("Content-Type", "application/json") |
|
var res struct { |
|
Code int `json:"code"` |
|
Msg string `json:"msg"` |
|
} |
|
if err = d.client.Do(c, req, &res); err != nil { |
|
log.Error("Mall d.client.Do url(%s) res(%v) err(%v)", d.mallURI+"?"+paramStr, res, err) |
|
err = ecode.CreativeNewcomerMallAPIErr |
|
return |
|
} |
|
if res.Code != 0 { |
|
log.Error("Mall url(%s) res(%v)", d.mallURI+"?"+paramStr, res) |
|
err = ecode.Int(res.Code) |
|
} |
|
return |
|
} |
|
|
|
// BCoin receive b coin. |
|
func (d *Dao) BCoin(c context.Context, mid int64, activityID string, money int64) (err error) { |
|
var ( |
|
req *http.Request |
|
params = url.Values{} |
|
) |
|
params.Set("mid", strconv.FormatInt(mid, 10)) |
|
params.Set("activity_id", activityID) //活动券id uat-217 pre-266 |
|
params.Set("money", strconv.FormatInt(money, 10)) //decimal 类型 领取的数量,最大保留两位小数 |
|
params.Set("appkey", conf.Conf.App.Key) |
|
params.Set("appsecret", conf.Conf.App.Secret) |
|
params.Set("ts", strconv.FormatInt(time.Now().Unix(), 10)) |
|
|
|
var ( |
|
query, _ = tool.Sign(params) |
|
mallURL = d.bPayURI |
|
) |
|
log.Info("BCoin url(%s)", mallURL+"?"+query) |
|
|
|
if req, err = http.NewRequest("POST", mallURL, strings.NewReader(params.Encode())); err != nil { |
|
log.Error("BCoin url(%s) error(%v)", mallURL, err) |
|
err = ecode.CreativeNewcomerBCoinAPIErr |
|
return |
|
} |
|
req.Header.Set("Content-Type", "application/x-www-form-urlencoded") |
|
var res struct { |
|
Code int `json:"code"` |
|
Msg string `json:"msg"` |
|
} |
|
if err = d.client.Do(c, req, &res); err != nil { |
|
log.Error("BCoin d.client.Do url(%s) res(%+v) err(%v)", mallURL, res, err) |
|
err = ecode.CreativeNewcomerBCoinAPIErr |
|
return |
|
} |
|
|
|
if res.Code != 0 { |
|
log.Error("BCoin url(%s) res(%+v)", d.bPayURI+"?"+params.Encode(), res) |
|
err = ecode.Int(res.Code) |
|
} |
|
return |
|
} |
|
|
|
// Pendant receive pendant. |
|
func (d *Dao) Pendant(c context.Context, mid int64, priceID string, expires int64) (err error) { |
|
var ( |
|
req *http.Request |
|
params = url.Values{} |
|
) |
|
pid, err := strconv.ParseInt(priceID, 10, 64) |
|
if err != nil { |
|
return |
|
} |
|
params.Set("mids", strconv.FormatInt(mid, 10)) |
|
params.Set("pid", strconv.FormatInt(pid, 10)) //挂件ID |
|
params.Set("expire", strconv.FormatInt(expires, 10)) //有效期(单位:天) |
|
params.Set("appkey", conf.Conf.App.Key) |
|
params.Set("appsecret", conf.Conf.App.Secret) |
|
params.Set("ts", strconv.FormatInt(time.Now().Unix(), 10)) |
|
var ( |
|
query, _ = tool.Sign(params) |
|
pendURL = d.pendantURI |
|
) |
|
log.Info("Pendant url(%s)", pendURL+"?"+query) |
|
if req, err = http.NewRequest("POST", pendURL, strings.NewReader(params.Encode())); err != nil { |
|
log.Error("Pendant url(%s) error(%v)", pendURL, err) |
|
err = ecode.CreativeNewcomerPendantAPIErr |
|
return |
|
} |
|
req.Header.Set("Content-Type", "application/x-www-form-urlencoded") |
|
var res struct { |
|
Code int `json:"code"` |
|
Msg string `json:"msg"` |
|
} |
|
|
|
if err = d.client.Do(c, req, &res); err != nil { |
|
log.Error("Pendant d.client.Do url(%s) res(%+v) err(%v)", pendURL, res, err) |
|
err = ecode.CreativeNewcomerPendantAPIErr |
|
return |
|
} |
|
if res.Code != 0 { |
|
log.Error("Pendant url(%s) res(%v)", pendURL, res) |
|
err = ecode.Int(res.Code) |
|
} |
|
return |
|
} |
|
|
|
// BigMemberCoupon receive Coupon |
|
func (d *Dao) BigMemberCoupon(c context.Context, mid int64, batchToken string) (err error) { |
|
var ( |
|
req *http.Request |
|
params = url.Values{} |
|
) |
|
|
|
params.Set("mid", strconv.FormatInt(mid, 10)) |
|
params.Set("batch_token", batchToken) //资源批次需提前申请,金额固定,不允许更改 |
|
params.Set("order_no", genOrderNO(mid)) //每次领取的订单号不允许重复,同一订单同一业务方AppKey只允许领取一次 |
|
params.Set("appkey", conf.Conf.App.Key) |
|
params.Set("appsecret", conf.Conf.App.Secret) |
|
params.Set("ts", strconv.FormatInt(time.Now().Unix(), 10)) |
|
var ( |
|
query, _ = tool.Sign(params) |
|
bigMemberURL = d.bigMemberURI |
|
) |
|
log.Info("BigMemberCoupon url(%s)", bigMemberURL+"?"+query) |
|
|
|
if req, err = http.NewRequest("POST", bigMemberURL, strings.NewReader(params.Encode())); err != nil { |
|
log.Error("BigMemberCoupon url(%s) error(%v)", bigMemberURL, err) |
|
err = ecode.CreativeNewcomerBigMemberErr |
|
return |
|
} |
|
req.Header.Set("Content-Type", "application/x-www-form-urlencoded") |
|
var res struct { |
|
Code int `json:"code"` |
|
Msg string `json:"message"` |
|
Data string `json:"data"` |
|
} |
|
|
|
if err = d.client.Do(c, req, &res); err != nil { |
|
log.Error("BigMemberCoupon d.client.Do url(%s) res(%+v) err(%v)", bigMemberURL, res, err) |
|
err = ecode.CreativeNewcomerBigMemberErr |
|
return |
|
} |
|
if res.Code != 0 { |
|
log.Error("BigMemberCoupon url(%s) res(%v)", bigMemberURL, res) |
|
err = ecode.Int(res.Code) |
|
} |
|
return |
|
} |
|
|
|
// generate orderNo |
|
func genOrderNO(mid int64) string { |
|
s := fmt.Sprintf("%v%s", mid, time.Now().Format("20060102150405")) |
|
if len(s) >= 32 { |
|
return s[0:32] |
|
} |
|
size := 32 - len(s) |
|
bys := make([]byte, size) |
|
for i := 0; i < size; i++ { |
|
bys[i] = uint8(48 + rand.Intn(10)) |
|
} |
|
return s + string(bys) |
|
} |
|
|
|
// SendNotify send msg notify user |
|
func (d *Dao) SendNotify(c context.Context, mids []int64, mc, title, context string) (err error) { |
|
var ( |
|
params = url.Values{} |
|
res struct { |
|
Code int `json:"code"` |
|
Msg string `json:"msg"` |
|
Data *struct { |
|
TotalCount int `json:"total_count"` |
|
ErrorCount int `json:"error_count"` |
|
ErrorMidList []int64 `json:"error_mid_list"` |
|
} `json:"data"` |
|
} |
|
) |
|
params.Set("mc", mc) //消息码,用于识别消息类别 |
|
params.Set("data_type", "4") //消息类型:1、回复我的 2、@我 3、收到的爱 4、业务通知 5、系统公告 |
|
params.Set("title", title) //消息标题 |
|
params.Set("context", context) //消息实体内容 |
|
params.Set("mid_list", xstr.JoinInts(mids)) //用于接收该消息的用户mid列表,不超过1000个(半角逗号分割) |
|
|
|
log.Info("SendNotify params(%+v)|msgURI(%s)", params.Encode(), d.msgNotifyURI) |
|
if err = d.client.Post(c, d.msgNotifyURI, "", params, &res); err != nil { |
|
log.Error("d.httpClient.Post(%s,%v,%d)", d.msgNotifyURI, params, err) |
|
return |
|
} |
|
if res.Code != 0 { |
|
err = errors.New("code != 0") |
|
log.Error("d.httpClient.Post(%s,%v,%v,%d)", d.msgNotifyURI, params, err, res.Code) |
|
} |
|
if res.Data != nil { |
|
log.Info("SendNotify log total_count(%d) error_count(%d) error_mid_list(%v)", res.Data.TotalCount, res.Data.ErrorCount, res.Data.ErrorMidList) |
|
} |
|
return |
|
}
|
|
|