소스 검색

wangchuanjin

yuelujie 7 달 전
부모
커밋
e20c8fc460

+ 1 - 0
src/jfw/modules/app/src/app/filter/loginfilter.go

@@ -42,6 +42,7 @@ var urls = []*regexp.Regexp{
 	regexp.MustCompile("^/jyapp/workbench/$"),
 	regexp.MustCompile("^/jyapp/freesubscribe/$"),
 	regexp.MustCompile("^/jyapp/notFind$"),
+	regexp.MustCompile("^/jyapp/miniprogram"),
 }
 
 type loginFilter struct {

+ 7 - 2
src/jfw/modules/app/src/app/front/commonPay.go

@@ -1,9 +1,11 @@
 package front
 
 import (
-	util "app.yhyue.com/moapp/jybase/common"
 	"errors"
 	"fmt"
+	"strings"
+
+	util "app.yhyue.com/moapp/jybase/common"
 
 	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
 )
@@ -25,7 +27,7 @@ var (
 		"areaPack":          {"省份订阅包"},
 		"filePack":          {"附件下载包"},
 		"buyerPortraitPack": {"采购单位画像包"},
-		"docMember":          {"剑鱼文库会员"},
+		"docMember":         {"剑鱼文库会员"},
 	}
 )
 
@@ -58,6 +60,9 @@ func (w *AppPayCommon) ToCreateOrderPage(doType string) error {
 	w.T["t"] = t
 	w.T["doType"] = doType
 	w.T["orderCode"] = orderCode
+	if strings.Contains(w.UserAgent(), "miniProgram") {
+		return w.Render("/me/pay-mini.html", &w.T)
+	}
 	return w.Render("/commonPay/checkout.html", &w.T)
 }
 

+ 12 - 5
src/jfw/modules/app/src/app/front/login.go

@@ -1,13 +1,8 @@
 package front
 
 import (
-	"app.yhyue.com/moapp/jybase/date"
-	"app.yhyue.com/moapp/jybase/encrypt"
-	. "app.yhyue.com/moapp/jybase/mongodb"
-	. "app.yhyue.com/moapp/jypkg/identity"
 	"encoding/json"
 	"fmt"
-	"github.com/gogf/gf/v2/util/gconv"
 	"jy/src/jfw/modules/app/src/app/jyutil"
 	utils "jy/src/jfw/modules/app/src/app/jyutil"
 	"jy/src/jfw/modules/app/src/jfw/config"
@@ -19,6 +14,12 @@ import (
 	"sync"
 	"time"
 
+	"app.yhyue.com/moapp/jybase/date"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	. "app.yhyue.com/moapp/jybase/mongodb"
+	. "app.yhyue.com/moapp/jypkg/identity"
+	"github.com/gogf/gf/v2/util/gconv"
+
 	qutil "app.yhyue.com/moapp/jybase/common"
 	"app.yhyue.com/moapp/jybase/redis"
 	qrpc "app.yhyue.com/moapp/jybase/rpc"
@@ -121,6 +122,9 @@ func (l *Login) Login() error {
 		//普通登录,跳转到登录页面
 		if sign == "" {
 			l.T["kicked"] = kickedTip
+			if strings.Contains(l.UserAgent(), "miniProgram") {
+				return l.Render("/me/login-mini.html", &l.T)
+			}
 			return l.Render("/me/login.html", &l.T)
 		} else { //带有签名的登录
 			if url := l.GetString("url"); url != "" {
@@ -133,6 +137,9 @@ func (l *Login) Login() error {
 				} else if status == -3 {
 					return l.Redirect("/jyapp/free/login?flag=kicked&back=index")
 				} else {
+					if strings.Contains(l.UserAgent(), "miniProgram") {
+						return l.Render("/me/login-mini.html")
+					}
 					return l.Render("/me/login.html")
 				}
 			} else {

+ 24 - 0
src/jfw/modules/app/src/app/jyutil/rpccall.go

@@ -1,10 +1,13 @@
 package jyutil
 
 import (
+	"context"
 	"jy/src/jfw/modules/app/src/jfw/config"
 	"log"
 	"net/rpc"
+
 	util "app.yhyue.com/moapp/jybase/common"
+	"github.com/gogf/gf/v2/frame/g"
 )
 
 var rpcserver string
@@ -30,3 +33,24 @@ func GetQrCodeFromWx(id string) string {
 	}, func(e interface{}) {})
 	return ret
 }
+
+func GetWxAccessToken(ctx context.Context, code string) string {
+	var repl string
+	client, err := rpc.DialHTTP("tcp", g.Config().MustGet(ctx, "wxTokenRpc").String())
+	if err != nil {
+		log.Println(code, err)
+		return repl
+	}
+	defer client.Close()
+	err = client.Call("WxTokenRpc.GetAccessToken", code, &repl)
+	if err != nil {
+		log.Println(code, err)
+		return repl
+	}
+	if repl == "" {
+		log.Println(code, "未获取到accessToken")
+	} else {
+		log.Println(code, "获取到accessToken", repl)
+	}
+	return repl
+}

+ 353 - 0
src/jfw/modules/app/src/app/miniprogram/miniprogram.go

@@ -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
+}

+ 6 - 0
src/jfw/modules/app/src/config.yaml

@@ -4,4 +4,10 @@ etcd:
 userCenterKey: "usercenter.rpc" #用户中台rpc
 powerCheckCenterKey: "powercheck.rpc" #权益校验中台
 entManageApplication: "entmanageapplication.rpc" #企业管理中台
+miniprogram:
+  jyzbw:
+    name: "剑鱼招标网"
+    appid: "wx37f06c38292f7d82"
+    appsecret: "f7dba667a47b4b10c1f581e3de46d0d3"
+wxTokenRpc: "192.168.3.149:1166"
 GuideRegistedate: 1735034400  #该时间之前注册的付费用户不用进订阅向导

+ 1 - 0
src/jfw/modules/app/src/main.go

@@ -7,6 +7,7 @@ import (
 	_ "jy/src/jfw/modules/app/src/app/filter"
 	_ "jy/src/jfw/modules/app/src/app/followent"
 	_ "jy/src/jfw/modules/app/src/app/front"
+	_ "jy/src/jfw/modules/app/src/app/miniprogram"
 	"jy/src/jfw/modules/app/src/app/tag"
 	. "jy/src/jfw/modules/app/src/jfw/config"
 	_ "jy/src/jfw/modules/app/src/public"

+ 37 - 0
src/jfw/modules/app/src/web/templates/me/login-mini.html

@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html lang="zh">
+<header>
+  <title>登录  -  剑鱼标讯</title>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0,minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
+  <script src=//res2.wx.qq.com/open/js/jweixin-1.6.0.js></script>
+  <script>
+    try {
+      if (window.navigator.userAgent.indexOf('miniProgram') !== -1) {
+        wx.miniProgram.navigateTo({
+          url: '/pages/login/index?type=jyzbw&time='+ Date.now(),
+          complete: function () {
+            setTimeout(() => {
+              window.history.back()
+            }, 500)
+          }
+        })
+      }
+    } catch (e) {
+      console.log(e)
+    }
+  </script>
+  <style>
+    .load {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      height: 100vh;
+      font-size: 30px;
+    }
+  </style>
+</header>
+<body class="load">
+加载中
+</body>
+</html>

+ 40 - 0
src/jfw/modules/app/src/web/templates/me/pay-mini.html

@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html lang="zh">
+<header>
+  <title>收银台  -  剑鱼标讯</title>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0,minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
+  <script src=//res2.wx.qq.com/open/js/jweixin-1.6.0.js></script>
+  <script>
+    try {
+      var orderCode = {{.T.orderCode}}
+      var price = {{.T.price}}
+      var doType = {{.T.doType}}
+      if (window.navigator.userAgent.indexOf('miniProgram') !== -1) {
+        wx.miniProgram.navigateTo({
+          url: `/pages/order/pay/index?id=${orderCode}&type=${doType}&price=${price}&auto=1&time=`+ Date.now(),
+          complete: function () {
+            setTimeout(() => {
+              window.history.back()
+            }, 500)
+          }
+        })
+      }
+    } catch (e) {
+      console.log(e)
+    }
+  </script>
+  <style>
+    .load {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      height: 100vh;
+      font-size: 30px;
+    }
+  </style>
+</header>
+<body class="load">
+加载中
+</body>
+</html>

+ 7 - 0
src/jfw/modules/app/src/web/templates/me/setting.html

@@ -116,11 +116,18 @@
                 // 点击事件
                 this.linkClickEvents()
                 this.actionClickEvents()
+                this.miniApp()
                 // 获取版本编号
                 // this.getVersion()
                 // 获取更新开关状态
                 // this.updateNoticeSwitch()
             },
+            miniApp () {
+              // 适配小程序
+              if (window.navigator.userAgent.indexOf('miniProgram') !== -1) {
+                $('.j-footer.j-button-group').hide()
+              }
+            },
             // ios返回刷新
             iosBackRefresh: function () {
                 var isPageHide = false;

+ 6 - 3
src/jfw/modules/publicapply/src/identity/service/service.go

@@ -8,11 +8,10 @@ import (
 	"log"
 	"strings"
 
-	"app.yhyue.com/moapp/jybase/redis"
-
 	. "app.yhyue.com/moapp/jybase/api"
 	util "app.yhyue.com/moapp/jybase/common"
 	"app.yhyue.com/moapp/jybase/encrypt"
+	"app.yhyue.com/moapp/jybase/redis"
 	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
 	. "app.yhyue.com/moapp/jypkg/identity"
 )
@@ -100,9 +99,13 @@ func (f *Identity) SwitchIdentity() {
 	identityInfo := decode(token)
 	status := 0
 	if identityInfo != nil && identityInfo.Switch(f.Session(), &Mgo) {
-		mgoUserId, _ := f.GetSession("mgoUserId").(string)
+		sessVal := f.Session().GetMultiple()
+		mgoUserId, _ := sessVal["mgoUserId"].(string)
 		key := fmt.Sprintf("jy_identitySwitch_%s", mgoUserId)
 		redis.Del("newother", key)
+		if needSyncSessionId, _ := sessVal["needSyncSessionId"].(string); needSyncSessionId != "" {
+			redis.Put("session", needSyncSessionId, sessVal, int(f.App.AppConfig.SessionTimeout))
+		}
 		status = 1
 	}
 	f.ServeJson(Result{

+ 11 - 0
src/jfw/modules/subscribepay/src/config.yaml

@@ -39,9 +39,20 @@ pdfPackPrice:
   市场分析定制报告下载包:
     - num: 1
       price: 199900
+<<<<<<< HEAD
 
 ossProxy:
   open: false #默认关闭,开启后走附件下载权限校验
   addr: https://oss.jianyu360.cn #若非新域名,则不用配置此地址,默认使用剑鱼web域名
   lineTimeout: 18000 #链接过期时间
 
+=======
+miniprogram:
+  jyzbw:
+    name: "剑鱼招标网"
+    appid: "wx37f06c38292f7d82"
+consultingVipMemberH5: /jyapp/view/672352bb6b45456266a57127
+consultingVipMemberApp: /jyapp/view/672352bb6b45456266a57127
+consultingVipMemberWX: https://h5-editor.jydev.jianyu360.cn/view/67247f741d749c1b910c61d3
+consultingVipMemberMini: https://h5-editor.jydev.jianyu360.cn/view/67247f741d749c1b910c61d3
+>>>>>>> master

+ 64 - 28
src/jfw/modules/subscribepay/src/service/commonAction.go

@@ -1,16 +1,11 @@
 package service
 
 import (
-	. "app.yhyue.com/moapp/jybase/api"
-	. "app.yhyue.com/moapp/jybase/date"
-	"app.yhyue.com/moapp/jypkg/public"
 	"database/sql"
 	"encoding/base64"
 	"encoding/json"
 	"errors"
 	"fmt"
-	"github.com/gogf/gf/v2/util/gconv"
-	"github.com/google/uuid"
 	"jy/src/jfw/modules/subscribepay/src/config"
 	"jy/src/jfw/modules/subscribepay/src/entity"
 	"jy/src/jfw/modules/subscribepay/src/pay"
@@ -23,12 +18,21 @@ import (
 	"strings"
 	"time"
 
+	. "app.yhyue.com/moapp/jybase/api"
+	. "app.yhyue.com/moapp/jybase/date"
+	"app.yhyue.com/moapp/jypkg/public"
+	"github.com/gogf/gf/v2/util/gconv"
+	"github.com/google/uuid"
+
+	"github.com/gogf/gf/v2/os/gctx"
+
 	qutil "app.yhyue.com/moapp/jybase/common"
 	"app.yhyue.com/moapp/jybase/encrypt"
 	elastic "app.yhyue.com/moapp/jybase/es"
 	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
 	"app.yhyue.com/moapp/jybase/redis"
 	"github.com/SKatiyar/qr"
+	"github.com/gogf/gf/v2/frame/g"
 )
 
 // 付费公用方法
@@ -239,6 +243,13 @@ func (d *CommonAction) DeleteOrder() error {
 func (p *CommonAction) IsPaySuccess() {
 	defer qutil.Catch()
 	code := p.GetString("code")
+	var paramStruct struct {
+		Code string
+	}
+	json.Unmarshal(p.Body(), &paramStruct)
+	if code == "" {
+		code = paramStruct.Code
+	}
 	userId, _ := p.GetSession("userId").(string)
 	if code != "" || userId != "" {
 		data := util.Mysql.FindOne("dataexport_order", map[string]interface{}{
@@ -348,8 +359,20 @@ dotype 产品类型
 */
 func (this *CommonAction) GetCommonPayParam() {
 	orderCode := this.GetString("orderCode")
-	userId := qutil.ObjToString(this.GetSession("userId"))
 	payway_req := this.GetString("payway")
+	var paramStruct struct {
+		OrderCode string
+		Payway    string
+	}
+	json.Unmarshal(this.Body(), &paramStruct)
+	if orderCode == "" {
+		orderCode = paramStruct.OrderCode
+	}
+	if payway_req == "" {
+		payway_req = paramStruct.Payway
+	}
+	userId := qutil.ObjToString(this.GetSession("userId"))
+	miniprogramCode := this.Header("MiniprogramCode")
 	r := func() *entity.FuncResult {
 		query := map[string]interface{}{
 			"user_id":      userId,
@@ -367,46 +390,59 @@ func (this *CommonAction) GetCommonPayParam() {
 		payParam := qutil.ObjToString((*oData)["code_url"])
 		payway := qutil.ObjToString((*oData)["pay_way"])
 		totalfee := qutil.IntAll((*oData)["order_money"])
-		//上次订单支付串是否可用
-		if prepayTime, err := time.ParseInLocation(Date_Full_Layout, qutil.ObjToString((*oData)["prepay_time"]), time.Local); err == nil && payParam != "" {
-			if time.Now().Before(prepayTime.Add(time.Hour * 2)) { //支付串未过期
-				if payway == payway_req {
-					if payParam != "" {
-						return &entity.FuncResult{true, nil, map[string]interface{}{
-							"orderCode": orderCode,
-							"res":       payParam,
-							"price":     totalfee,
-							"timeout":   prepayTime.Unix() + 2*60*60 - time.Now().Unix(),
-							"payWay":    payway}}
-					}
-				} else {
-					//关闭之前支付串(防止重复支付)
-					if !pay.CloseOrder(qutil.ObjToString((*oData)["out_trade_no"]), payway) {
-						log.Printf("GetCommonPayParam 关闭订单%s出错\n", orderCode)
-						return &entity.FuncResult{false, errors.New("支付方式切换异常"), nil}
+		var product_type = qutil.ObjToString((*oData)["product_type"])
+		appid := ""
+		if miniprogramCode == "" {
+			//上次订单支付串是否可用
+			if prepayTime, err := time.ParseInLocation(Date_Full_Layout, qutil.ObjToString((*oData)["prepay_time"]), time.Local); err == nil && payParam != "" {
+				if time.Now().Before(prepayTime.Add(time.Hour * 2)) { //支付串未过期
+					if payway == payway_req {
+						if payParam != "" {
+							return &entity.FuncResult{true, nil, map[string]interface{}{
+								"orderCode": orderCode,
+								"res":       payParam,
+								"price":     totalfee,
+								"timeout":   prepayTime.Unix() + 2*60*60 - time.Now().Unix(),
+								"payWay":    payway}}
+						}
+					} else {
+						//关闭之前支付串(防止重复支付)
+						if !pay.CloseOrder(qutil.ObjToString((*oData)["out_trade_no"]), payway) {
+							log.Printf("GetCommonPayParam 关闭订单%s出错\n", orderCode)
+							return &entity.FuncResult{false, errors.New("支付方式切换异常"), nil}
+						}
 					}
 				}
 			}
+		} else {
+			payway_req = "wx_js"
+			appid = g.Cfg().MustGet(gctx.New(), "miniprogram."+miniprogramCode+".appid").String()
+			if appid == "" {
+				return &entity.FuncResult{false, errors.New(fmt.Sprint("没有找到该小程序%s的appid", miniprogramCode)), nil}
+			}
 		}
-		var product_type = qutil.ObjToString((*oData)["product_type"])
 		//重新生成支付串
 		productFlag, ok := pay.PayWayAndSign[product_type][payway_req]
 		if !ok {
 			return &entity.FuncResult{false, errors.New("未知支付类型:" + payway_req), nil}
 		}
-		tradeno, prepayid, payParam, err := pay.CreateOrderPay(totalfee, productFlag, this.IP(), qutil.ObjToString(this.GetSession("s_m_openid")), "", payway_req, orderCode, 0, product_type)
+		//tradeno, prepayid, payParam, err := pay.CreateOrderPay(totalfee, productFlag, this.IP(), qutil.ObjToString(this.GetSession("s_m_openid")), appid, payway_req, orderCode, product_type)
+		tradeno, prepayid, payParam, err := pay.CreateOrderPay(totalfee, productFlag, this.IP(), qutil.ObjToString(this.GetSession("s_m_openid")), appid, payway_req, orderCode, 0, product_type)
 		if err != nil {
 			return &entity.FuncResult{false, errors.New(fmt.Sprintf("创建支付失败[%v]", err)), nil}
 		}
 		//更新订单表
 		now := time.Now()
-		ok = util.Mysql.Update("dataexport_order", query, map[string]interface{}{
-			"code_url":     payParam,
+		update := map[string]interface{}{
 			"prepay_time":  FormatDate(&now, Date_Full_Layout),
 			"out_trade_no": tradeno,
 			"prepay_id":    prepayid,
 			"pay_way":      payway_req,
-		})
+		}
+		if miniprogramCode == "" {
+			update["code_url"] = payParam
+		}
+		ok = util.Mysql.Update("dataexport_order", query, update)
 		if !ok {
 			return &entity.FuncResult{false, errors.New("数据库操作异常"), nil}
 		}

+ 5 - 3
src/jfw/modules/subscribepay/src/service/userAccountInfo.go

@@ -215,9 +215,11 @@ func getAccountVipAttr(session *httpsession.Session, powerRes *pcc.CheckResp) (r
 	//付费用户根据结束时间排序展示会员,省份订阅包和其他产品并存,省份订阅包不展
 	if powerRes.Member.Status > 0 { //大会员
 		rData = append(rData, &VipDetail{Name: fmt.Sprintf("大会员%s", memberCodeNameMapping[powerRes.Member.Status]), EndTime: powerRes.Member.GetEndTime(), Attr: g.Map{
-			"h5":  g.Cfg().MustGet(context.TODO(), "consultingVipMemberH5", "https://host.huiju.cool/p/18dea1").String(),
-			"app": g.Cfg().MustGet(context.TODO(), "consultingVipMemberApp", "https://host.huiju.cool/p/f01de").String(),
-			"pc":  g.Cfg().MustGet(context.TODO(), "consultingVipMemberPc", "https://www.jianyu360.cn/hjpc/dhyxfzxxshd").String(),
+			"h5":   g.Cfg().MustGet(context.TODO(), "consultingVipMemberH5", "https://host.huiju.cool/p/18dea1").String(),
+			"app":  g.Cfg().MustGet(context.TODO(), "consultingVipMemberApp", "https://host.huiju.cool/p/f01de").String(),
+			"pc":   g.Cfg().MustGet(context.TODO(), "consultingVipMemberPc", "https://www.jianyu360.cn/hjpc/dhyxfzxxshd").String(),
+			"wx":   g.Cfg().MustGet(context.TODO(), "consultingVipMemberWX", "https://host.huiju.cool/p/18dea1").String(),
+			"mini": g.Cfg().MustGet(context.TODO(), "consultingVipMemberMini", "https://host.huiju.cool/p/18dea1").String(), //微信小程序
 		}})
 	}
 	if powerRes.Entniche.Status > 0 {