|
@@ -0,0 +1,353 @@
|
|
|
+package miniprogram
|
|
|
+
|
|
|
+import (
|
|
|
+ "encoding/json"
|
|
|
+ "jy/src/jfw/modules/app/src/app/jyutil"
|
|
|
+ "jy/src/jfw/modules/app/src/jfw/config"
|
|
|
+ "log"
|
|
|
+ "net/http"
|
|
|
+
|
|
|
+ . "app.yhyue.com/moapp/jybase/api"
|
|
|
+ "app.yhyue.com/moapp/jybase/common"
|
|
|
+ "app.yhyue.com/moapp/jybase/go-xweb/xweb"
|
|
|
+ . "app.yhyue.com/moapp/jybase/mongodb"
|
|
|
+ "app.yhyue.com/moapp/jybase/redis"
|
|
|
+ "app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
|
|
|
+ "app.yhyue.com/moapp/jypkg/public"
|
|
|
+ "bp.jydev.jianyu360.cn/BaseService/userCenter/rpc/pb"
|
|
|
+ "github.com/gogf/gf/v2/frame/g"
|
|
|
+ "github.com/gogf/gf/v2/os/gctx"
|
|
|
+ "github.com/gogf/gf/v2/os/gtime"
|
|
|
+ "github.com/gogf/gf/v2/util/gconv"
|
|
|
+)
|
|
|
+
|
|
|
+const (
|
|
|
+ HeaderMiniProgram = "MiniprogramCode"
|
|
|
+ MiniProgramKey = "miniProgram"
|
|
|
+)
|
|
|
+
|
|
|
+type MiniProgramInfo struct {
|
|
|
+ Code string //小程序code
|
|
|
+ Name string //小程序名字
|
|
|
+ Appid string //小程序appid
|
|
|
+ Appsecret string //小程序密钥
|
|
|
+}
|
|
|
+
|
|
|
+type JsonParam struct {
|
|
|
+ Token string `json:"token"`
|
|
|
+ Phone string `json:"phone"`
|
|
|
+ Openid string `json:"openid"`
|
|
|
+ Unionid string `json:"unionid"`
|
|
|
+ Source string `json:"source"`
|
|
|
+ Code string `json:"code"`
|
|
|
+ MiniProgramInfo *MiniProgramInfo
|
|
|
+}
|
|
|
+
|
|
|
+func init() {
|
|
|
+ xweb.AddAction(&MiniProgram{})
|
|
|
+}
|
|
|
+
|
|
|
+type MiniProgram struct {
|
|
|
+ *xweb.Action
|
|
|
+ autoLogin xweb.Mapper `xweb:"/jyapp/miniprogram/autoLogin"`
|
|
|
+ login xweb.Mapper `xweb:"/jyapp/miniprogram/login"`
|
|
|
+ bindPhone xweb.Mapper `xweb:"/jyapp/miniprogram/bindphone"`
|
|
|
+ transfer xweb.Mapper `xweb:"/jyapp/miniprogram/transfer"`
|
|
|
+}
|
|
|
+
|
|
|
+func (m *MiniProgram) getJsonParam() *JsonParam {
|
|
|
+ jsonPram := &JsonParam{}
|
|
|
+ if err := json.Unmarshal(m.Body(), &jsonPram); err != nil {
|
|
|
+ log.Println(err)
|
|
|
+ }
|
|
|
+ return jsonPram
|
|
|
+}
|
|
|
+func (m *MiniProgram) AutoLogin() {
|
|
|
+ m.reSetCookie()
|
|
|
+ jsonPram := m.getJsonParam()
|
|
|
+ if jsonPram.Token != "8817684142977367382" {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ miniprogramCode := m.Header(HeaderMiniProgram)
|
|
|
+ if miniprogramCode == "" || jsonPram.Phone == "" || jsonPram.Openid == "" || jsonPram.Unionid == "" {
|
|
|
+ m.ServeJson(Result{
|
|
|
+ Error_code: Error_code_1001,
|
|
|
+ Error_msg: Error_msg_1002,
|
|
|
+ })
|
|
|
+ return
|
|
|
+ }
|
|
|
+ m.Session().SetMultiple(map[string]interface{}{
|
|
|
+ "unionid": jsonPram.Unionid,
|
|
|
+ "openid": jsonPram.Openid,
|
|
|
+ "source": jsonPram.Source,
|
|
|
+ })
|
|
|
+ status := m.createSession(jsonPram.Unionid, jsonPram.Openid, miniprogramCode)
|
|
|
+ if status == -1 {
|
|
|
+ if m.createUser(jsonPram.Unionid, jsonPram.Openid, miniprogramCode, jsonPram.Phone, "") > 0 {
|
|
|
+ status = m.createSession(jsonPram.Unionid, jsonPram.Openid, miniprogramCode)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ m.ServeJson(Result{Data: M{"status": 1}})
|
|
|
+ return
|
|
|
+}
|
|
|
+func (m *MiniProgram) Login() error {
|
|
|
+ m.reSetCookie()
|
|
|
+ jsonPram := m.getJsonParam()
|
|
|
+ if ok := m.check(jsonPram); !ok {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ ctx := gctx.New()
|
|
|
+ status := func() int {
|
|
|
+ rb := g.Client().GetVar(ctx, "https://api.weixin.qq.com/sns/jscode2session", g.Map{
|
|
|
+ "appid": jsonPram.MiniProgramInfo.Appid,
|
|
|
+ "secret": jsonPram.MiniProgramInfo.Appsecret,
|
|
|
+ "js_code": jsonPram.Code,
|
|
|
+ "grant_type": "authorization_code",
|
|
|
+ })
|
|
|
+ //rb := gvar.New(`{"openid":"wcj_openid","session_key":"wcj_session_key","unionid":"wcj_unionid","errcode":0,"errmsg":"xxxxx"}`)
|
|
|
+ log.Println("Code", jsonPram.Code, "Source", jsonPram.Source, "miniprogramCode", jsonPram.MiniProgramInfo.Code, "appid", jsonPram.MiniProgramInfo.Appid, "appsecret", jsonPram.MiniProgramInfo.Appsecret, "根据code获取用户信息返回结果", string(rb.Bytes()))
|
|
|
+ r := rb.MapStrVar()
|
|
|
+ if r["errcode"].Int() != 0 {
|
|
|
+ return 0
|
|
|
+ }
|
|
|
+ openid := r["openid"].String()
|
|
|
+ unionid := r["unionid"].String()
|
|
|
+ if openid == "" {
|
|
|
+ log.Println(jsonPram.Code, "未获取到openid")
|
|
|
+ return 0
|
|
|
+ } else if unionid == "" {
|
|
|
+ log.Println(jsonPram.Code, "未获取到unionid")
|
|
|
+ return 0
|
|
|
+ }
|
|
|
+ if sessErr := m.Session().SetMultiple(map[string]interface{}{
|
|
|
+ "unionid": unionid,
|
|
|
+ "openid": openid,
|
|
|
+ "sessionKey": r["session_key"].String(),
|
|
|
+ "source": jsonPram.Source,
|
|
|
+ }); sessErr != nil {
|
|
|
+ log.Println(jsonPram.Code, "用户信息存入session出错", string(rb.Bytes()), sessErr)
|
|
|
+ return 0
|
|
|
+ }
|
|
|
+ return m.createSession(unionid, openid, jsonPram.MiniProgramInfo.Code)
|
|
|
+ }()
|
|
|
+ m.ServeJson(Result{
|
|
|
+ Data: M{"status": status, "sessionId": string(m.Session().Id())},
|
|
|
+ })
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+//
|
|
|
+func (m *MiniProgram) BindPhone() error {
|
|
|
+ jsonPram := m.getJsonParam()
|
|
|
+ if ok := m.check(jsonPram); !ok {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ status := func() int {
|
|
|
+ ctx := gctx.New()
|
|
|
+ accessToken := jyutil.GetWxAccessToken(ctx, jsonPram.MiniProgramInfo.Appid)
|
|
|
+ if accessToken == "" {
|
|
|
+ return 0
|
|
|
+ }
|
|
|
+ rb := g.Client().ContentJson().PostVar(ctx, "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token="+accessToken, g.Map{
|
|
|
+ "code": jsonPram.Code,
|
|
|
+ })
|
|
|
+ //rb := gvar.New(`{"errcode":0,"errmsg":"ok","phone_info": {"phoneNumber":"15037870765","purePhoneNumber":"15037870765","countryCode":86,"watermark":{"timestamp":1637744274,"appid":"xxxx"}}}`)
|
|
|
+ log.Println(jsonPram.Code, jsonPram.MiniProgramInfo.Code, "根据code获取手机号返回结果", string(rb.Bytes()))
|
|
|
+ r := rb.MapStrVar()
|
|
|
+ if r["errcode"].Int() != 0 {
|
|
|
+ return 0
|
|
|
+ }
|
|
|
+ phone := r["phone_info"].MapStrVar()["phoneNumber"].String()
|
|
|
+ sessVal := m.Session().GetMultiple()
|
|
|
+ unionid := common.ObjToString(sessVal["unionid"])
|
|
|
+ openid := common.ObjToString(sessVal["openid"])
|
|
|
+ source := common.ObjToString(sessVal["source"])
|
|
|
+ if createRes := m.createUser(unionid, openid, jsonPram.MiniProgramInfo.Code, phone, source); createRes > 0 {
|
|
|
+ status := m.createSession(unionid, openid, jsonPram.MiniProgramInfo.Code)
|
|
|
+ nsqPath, _ := config.Sysconfig["nsq"].(string)
|
|
|
+ nsq_topic, _ := config.Sysconfig["nsq_topic"].(string)
|
|
|
+ sessVal := m.Session().GetMultiple()
|
|
|
+ mgoUserId := common.ObjToString(sessVal["mgoUserId"])
|
|
|
+ if createRes == 1 {
|
|
|
+ if err := jy.Publish(public.Mgo_Log, nsqPath, nsq_topic, jy.Jyapp_phone_register, mgoUserId, jy.Jyapp_node1, nil); err != nil {
|
|
|
+ log.Println("nsq队列写入失败-->", err, jy.Jyapp_phone_register, mgoUserId)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if createRes == 2 {
|
|
|
+ if err := jy.Publish(public.Mgo_Log, nsqPath, nsq_topic, "task", mgoUserId, jy.Jyweb_node2, map[string]interface{}{
|
|
|
+ "code": 1007,
|
|
|
+ "types": "bindPhone",
|
|
|
+ "num": 50,
|
|
|
+ "baseUserId": sessVal["base_user_id"],
|
|
|
+ "positionId": sessVal["positionId"],
|
|
|
+ "isOnlyBind": true,
|
|
|
+ }); err != nil {
|
|
|
+ log.Println("nsq队列写入失败-->", err, jy.Jyapp_phone_register, sessVal["mgoUserId"])
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return status
|
|
|
+ }
|
|
|
+ return 0
|
|
|
+ }()
|
|
|
+ m.ServeJson(Result{Data: M{"status": status}})
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+func (m *MiniProgram) Transfer() error {
|
|
|
+ sid := m.GetString("sid")
|
|
|
+ b, err := redis.GetNewBytes("session", sid)
|
|
|
+ if err == nil && b != nil {
|
|
|
+ data := map[string]interface{}{}
|
|
|
+ json.Unmarshal(*b, &data)
|
|
|
+ data["needSyncSessionId"] = sid
|
|
|
+ m.Session().Clear()
|
|
|
+ m.Session().SetMultiple(data)
|
|
|
+ }
|
|
|
+ return m.Redirect(m.GetString("to"))
|
|
|
+}
|
|
|
+
|
|
|
+//
|
|
|
+func (m *MiniProgram) reSetCookie() {
|
|
|
+ m.SetCookie(&http.Cookie{
|
|
|
+ Name: "SESSIONID",
|
|
|
+ Value: string(m.Session().Id()),
|
|
|
+ Path: "/",
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+//
|
|
|
+func (m *MiniProgram) check(jsonParam *JsonParam) bool {
|
|
|
+ miniprogramCode := m.Header(HeaderMiniProgram)
|
|
|
+ var ctx = gctx.New()
|
|
|
+ appid := g.Cfg().MustGet(ctx, "miniprogram."+miniprogramCode+".appid").String()
|
|
|
+ appsecret := g.Cfg().MustGet(ctx, "miniprogram."+miniprogramCode+".appsecret").String()
|
|
|
+ if jsonParam.Code == "" {
|
|
|
+ m.ServeJson(Result{
|
|
|
+ Error_code: Error_code_1002,
|
|
|
+ Error_msg: Error_msg_1002 + "code",
|
|
|
+ })
|
|
|
+ return false
|
|
|
+ } else if miniprogramCode == "" {
|
|
|
+ m.ServeJson(Result{
|
|
|
+ Error_code: Error_code_1002,
|
|
|
+ Error_msg: "请求头中缺少参数" + HeaderMiniProgram,
|
|
|
+ })
|
|
|
+ return false
|
|
|
+ } else if appid == "" || appsecret == "" {
|
|
|
+ R.InvalidReqParam(m.ResponseWriter, m.Request, HeaderMiniProgram)
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ jsonParam.MiniProgramInfo = &MiniProgramInfo{
|
|
|
+ Code: miniprogramCode,
|
|
|
+ Appid: appid,
|
|
|
+ Appsecret: appsecret,
|
|
|
+ }
|
|
|
+ return true
|
|
|
+}
|
|
|
+
|
|
|
+//
|
|
|
+func (m *MiniProgram) createUser(unionid, openid, miniprogramCode, phone, source string) int {
|
|
|
+ if phone == "" || unionid == "" || openid == "" {
|
|
|
+ log.Println("phone", phone, "unionid", unionid, "openid", openid, "创建用户失败,缺少phone、unionid、openid")
|
|
|
+ return 0
|
|
|
+ }
|
|
|
+ users, ok := public.MQFW.Find("user", map[string]interface{}{"i_appid": 2, "s_unionid": unionid}, `{"_id":-1}`, `{"_id":1,"s_phone":1,"s_m_phone":1,"s_unionid":1}`, false, 0, 1)
|
|
|
+ if ok && (users == nil || len(*users) == 0) {
|
|
|
+ users, ok = public.MQFW.Find("user", map[string]interface{}{
|
|
|
+ "i_appid": 2,
|
|
|
+ "$or": []map[string]interface{}{
|
|
|
+ map[string]interface{}{
|
|
|
+ "s_phone": phone,
|
|
|
+ }, map[string]interface{}{
|
|
|
+ "s_m_phone": phone,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ }, `{"s_phone":-1}`, `{"_id":1,"s_phone":1,"s_m_phone":1,"s_unionid":1}`, false, 0, 1)
|
|
|
+ }
|
|
|
+ nowUnix := gtime.Timestamp()
|
|
|
+ if !ok {
|
|
|
+ log.Println(miniprogramCode, unionid, openid, phone, "查询mog库user表失败")
|
|
|
+ } else if users == nil || len(*users) == 0 {
|
|
|
+ if resp := config.Middleground.UserCenter.UserAdd(pb.UserAddReq{
|
|
|
+ Appid: "10000",
|
|
|
+ Phone: phone,
|
|
|
+ }); resp != nil && resp.Data.Id > 0 {
|
|
|
+ _id := public.MQFW.Save("user", map[string]interface{}{
|
|
|
+ "s_platform": "xcx",
|
|
|
+ "s_sourceid": miniprogramCode,
|
|
|
+ "l_registedate": nowUnix,
|
|
|
+ "base_user_id": resp.Data.Id,
|
|
|
+ "i_appid": 2,
|
|
|
+ "s_phone": phone,
|
|
|
+ "s_unionid": unionid,
|
|
|
+ miniprogramCode + "_registerdate": nowUnix,
|
|
|
+ miniprogramCode + "_openid": openid,
|
|
|
+ miniprogramCode + "_source": source,
|
|
|
+ })
|
|
|
+ if _id != "" {
|
|
|
+ public.Mgo_Log.Save("register_log", map[string]interface{}{
|
|
|
+ "userid": _id,
|
|
|
+ "phone": phone,
|
|
|
+ "way": "xcx",
|
|
|
+ "system": common.GetSystem(m.UserAgent()),
|
|
|
+ "source": gconv.String(m.GetSession("source")),
|
|
|
+ "ip": common.GetIp(m.Request),
|
|
|
+ "user_agent": m.UserAgent(),
|
|
|
+ "create_time": gtime.Timestamp(),
|
|
|
+ "code": miniprogramCode,
|
|
|
+ })
|
|
|
+ return 1
|
|
|
+ } else {
|
|
|
+ log.Println(miniprogramCode, unionid, openid, phone, "mgo库user表用户创建失败")
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ log.Println(miniprogramCode, unionid, openid, phone, "调用usercenter失败")
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ set := map[string]interface{}{
|
|
|
+ miniprogramCode + "_source": source,
|
|
|
+ miniprogramCode + "_openid": openid,
|
|
|
+ miniprogramCode + "_registerdate": gtime.Timestamp(),
|
|
|
+ }
|
|
|
+ if gconv.String((*users)[0]["s_phone"]) == "" && gconv.String((*users)[0]["s_m_phone"]) == "" {
|
|
|
+ set["s_phone"] = phone
|
|
|
+ set["l_bindphonetime"] = nowUnix
|
|
|
+ }
|
|
|
+ if gconv.String((*users)[0]["s_unionid"]) == "" {
|
|
|
+ set["s_unionid"] = unionid
|
|
|
+ }
|
|
|
+ if public.MQFW.Update("user", map[string]interface{}{"_id": (*users)[0]["_id"]}, map[string]interface{}{"$set": set}, false, false) {
|
|
|
+ return 2
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return 0
|
|
|
+}
|
|
|
+
|
|
|
+func (m *MiniProgram) createSession(unionid, openid, miniprogramCode string) int {
|
|
|
+ if unionid == "" || openid == "" || miniprogramCode == "" {
|
|
|
+ log.Println("缺少unionid、openid、miniprogramCode", miniprogramCode, unionid, openid)
|
|
|
+ return 0
|
|
|
+ }
|
|
|
+ userRes, userOk := public.MQFW.FindOneByField("user", map[string]interface{}{"i_appid": 2, "s_unionid": unionid}, `{"_id":1,"s_phone":1,"s_m_phone":1}`)
|
|
|
+ if !userOk {
|
|
|
+ log.Println(openid, miniprogramCode, "获取用户信息出错")
|
|
|
+ return 0
|
|
|
+ } else if userRes == nil || len(*userRes) == 0 || (gconv.String((*userRes)["s_phone"]) == "" && gconv.String((*userRes)["s_m_phone"]) == "") {
|
|
|
+ return -1
|
|
|
+ }
|
|
|
+ public.MQFW.Update("user", map[string]interface{}{"_id": (*userRes)["_id"]}, map[string]interface{}{"$set": map[string]interface{}{miniprogramCode + "_openid": openid}}, false, false)
|
|
|
+ m.Session().Del("source")
|
|
|
+ jy.JyAppCreateSession(public.MQFW, m.Session(), BsonIdToSId((*userRes)["_id"]), 0, m.ResponseWriter, true, config.Middleground, "", 0)
|
|
|
+ ctx := gctx.New()
|
|
|
+ m.Session().SetMultiple(map[string]interface{}{
|
|
|
+ "s_m_openid": openid,
|
|
|
+ MiniProgramKey: &MiniProgramInfo{
|
|
|
+ Code: miniprogramCode,
|
|
|
+ Name: g.Cfg().MustGet(ctx, "miniprogram."+miniprogramCode+".name").String(),
|
|
|
+ Appid: g.Cfg().MustGet(ctx, "miniprogram."+miniprogramCode+".appid").String(),
|
|
|
+ Appsecret: g.Cfg().MustGet(ctx, "miniprogram."+miniprogramCode+".appsecret").String(),
|
|
|
+ },
|
|
|
+ })
|
|
|
+ log.Println(miniprogramCode, openid, "创建session成功", m.Session().Id())
|
|
|
+ return 1
|
|
|
+}
|