主要更新uniapp相关功能
This commit is contained in:
1 parent
aa92ca40a2
commit
5b4dbb2b46
65 files changed
+8532
-1921
No files matched your search
@@ -108,15 +108,18 @@ func (c *AuthLoginController) LoginSubmit() {
|
||||
}
|
||||
|
||||
// 开启人机验证时:先极验通过,再走账号密码校验
|
||||
if err := authsvc.VerifyLoginCaptcha(0, authsvc.CaptchaResult{
|
||||
CaptchaID: req.CaptchaID,
|
||||
LotNumber: req.LotNumber,
|
||||
PassToken: req.PassToken,
|
||||
GenTime: req.GenTime,
|
||||
CaptchaOutput: req.CaptchaOutput,
|
||||
}); err != nil {
|
||||
c.serveJSON(map[string]interface{}{"code": 400, "msg": err.Error()})
|
||||
return
|
||||
// 小程序端(yz-miniapp)无法集成极验 SDK 且运行于微信沙箱内,跳过人机验证
|
||||
if strings.TrimSpace(req.ClientID) != "yz-miniapp" {
|
||||
if err := authsvc.VerifyLoginCaptcha(0, authsvc.CaptchaResult{
|
||||
CaptchaID: req.CaptchaID,
|
||||
LotNumber: req.LotNumber,
|
||||
PassToken: req.PassToken,
|
||||
GenTime: req.GenTime,
|
||||
CaptchaOutput: req.CaptchaOutput,
|
||||
}); err != nil {
|
||||
c.serveJSON(map[string]interface{}{"code": 400, "msg": err.Error()})
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
clientIP := c.Ctx.Input.IP()
|
||||
|
||||
@@ -177,6 +177,59 @@ func (c *AuthWechatMiniController) Login() {
|
||||
c.serveJSON(resp)
|
||||
}
|
||||
|
||||
// Bind 把当前小程序 openid 绑定到已登录身份
|
||||
// POST /auth/wechat/miniapp/bind { "code": "wx.login的code" } Header: Bearer 令牌
|
||||
//
|
||||
// 用途:小程序认证中 / 未开通「手机号快速验证」时,getPhoneNumber 拿不到手机号,
|
||||
// 一键登录退化为「按 openid 匹配已绑定身份」。用户先用账号密码登录一次,
|
||||
// 前端调用本接口静默绑定 openid,之后即可无手机号完成微信一键登录。
|
||||
// 显式绑定视为本人操作(同时持有微信与该账号登录态),允许换绑覆盖旧绑定。
|
||||
func (c *AuthWechatMiniController) Bind() {
|
||||
claims := claimsFromCtxThird(c.Ctx)
|
||||
if claims == nil || claims.UserID <= 0 {
|
||||
c.Ctx.Output.SetStatus(401)
|
||||
c.serveJSON(map[string]interface{}{"code": 401, "msg": "未登录"})
|
||||
return
|
||||
}
|
||||
|
||||
var req struct {
|
||||
Code string `json:"code"`
|
||||
}
|
||||
body := c.Ctx.Input.RequestBody
|
||||
if len(body) == 0 {
|
||||
body, _ = io.ReadAll(c.Ctx.Request.Body)
|
||||
}
|
||||
if err := json.Unmarshal(body, &req); err != nil {
|
||||
c.fail("", 400, "参数错误")
|
||||
return
|
||||
}
|
||||
req.Code = strings.TrimSpace(req.Code)
|
||||
if req.Code == "" {
|
||||
c.fail("", 400, "缺少登录凭证,请重新进入小程序")
|
||||
return
|
||||
}
|
||||
|
||||
cfg, err := wechatmini.LoadEnabledConfig()
|
||||
if err != nil {
|
||||
c.fail(MiniReasonNotConfigured, 400, "小程序登录未开通")
|
||||
return
|
||||
}
|
||||
|
||||
session, err := wechatmini.Code2Session(cfg, req.Code)
|
||||
if err != nil {
|
||||
msg := err.Error()
|
||||
if hint, ok := wechatmini.ExplainError(err); ok {
|
||||
msg = hint
|
||||
}
|
||||
logs.Warn("[wechat-mini] 绑定 code 换取 openid 失败: %v", err)
|
||||
c.fail(MiniReasonWechatAPI, 400, msg)
|
||||
return
|
||||
}
|
||||
|
||||
c.syncBinding(cfg, uint64(claims.UserID), session, true)
|
||||
c.serveJSON(map[string]interface{}{"code": 200, "msg": "绑定成功"})
|
||||
}
|
||||
|
||||
// resolveIdentity 定位身份并维护小程序绑定关系。
|
||||
// mobile 非空表示本次已通过微信手机号验证,是可信的强证据,优先采用。
|
||||
func (c *AuthWechatMiniController) resolveIdentity(cfg *wechatmini.Config, mobile string, session *wechatmini.Session) (*models.AuthIdentity, error) {
|
||||
|
||||
Reference in new issue
Block a user