优化小程序

This commit is contained in:
hero920103 committed 2026-10-31 01:21:55 +08:00
1 parent 2e2b837a20
commit 727319a6eb
24 files changed
+1509 -200

No files matched your search

+42 -14
View File
@@ -5,6 +5,8 @@ import (
"strings"
"time"
"github.com/beego/beego/v2/core/logs"
"server/models"
)
@@ -18,6 +20,13 @@ import (
// WechatBindTypeRegister 注册验证码会话类型(yz_platform_wechat_mp_verify_code.bind_type)
const WechatBindTypeRegister = "register"
// ErrRegisterCodeInvalid 账号注册:验证码无效 / 已使用(引导语指向「注册」而非绑定用的「验证码」)
var ErrRegisterCodeInvalid = errors.New("验证码不正确或已过期:请在公众号内重新发送「注册」获取")
// RegisterQRDownNotice 带参二维码不可用(IP 白名单 40164 / 未认证 48001 等)时,
// 回显给注册页的用户级引导:详细原因见服务端日志,不暴露服务器出口 IP。
const RegisterQRDownNotice = "二维码暂不可用:请在公众号内直接发送「注册」获取验证码"
// StartRegisterVerify 创建注册验证码会话并生成带参二维码。
// 带参二维码生成失败(未认证公众号 48001 等)时回退:qrURL 为空、
// notice 返回引导(用户在公众号内发送「注册」获取验证码),scene 仍有效可轮询。
@@ -48,24 +57,43 @@ func StartRegisterVerify(ttl time.Duration) (scene, qrURL, notice string, expire
}
qrURL, err = CreateQRCode(cfg, scene, int(ttl.Seconds())+120)
if err != nil {
// 不吞真实错误:与扫码登录 StartScanLogin 一致,把微信返回的
// errcode 与排查建议(IP 白名单 / 48001 未认证等)透出,便于定位;
// 同时保留「公众号内发送注册」兜底路径,会话仍有效可轮询核销。
notice := "请在公众号内直接发送「注册」获取验证码"
var apiErr *APIError
if errors.As(err, &apiErr) {
notice = "生成带参二维码失败(" + apiErr.Error() + ")。" + notice
if hint := apiErr.Explain(); hint != "" {
notice += ":" + hint
}
} else {
notice = "生成带参二维码失败:" + err.Error() + "。" + notice
}
return scene, "", notice, expireAt, nil
// 注册页匿名可访问:errcode / errmsg / 服务器出口 IP 等排查信息已在
// CreateQRCode 内落到服务端日志(见 logAPIError),此处只回显用户级引导,
// 避免向访客泄露服务器出口 IP 与内部错误细节;
// 会话仍然有效,「公众号内发送注册」这条兜底路径可正常核销。
logs.Warning("[wechat-mp] 注册二维码不可用,已回退公众号发送「注册」:%v", err)
return scene, "", RegisterQRDownNotice, expireAt, nil
}
return scene, qrURL, "", expireAt, nil
}
// ConfirmAccountRegisterVerify 账号注册的验证码核销:
// 优先按 scene 核销二维码会话;该会话尚未扫码(用户没扫码,改为在公众号内发送
// 「注册」取码)、scene 失效或验证码不属于该会话时,直接按验证码认领会话。
//
// 账号注册不绑定手机号,服务号无法按手机号把「发送者」与网页会话关联起来,
// 因此不要求网页会话必须先被扫码:验证码有效即视为公众号内本人操作。
func ConfirmAccountRegisterVerify(scene, code string) (string, error) {
code = strings.TrimSpace(code)
if code == "" {
return "", ErrCodeNotPending
}
if strings.TrimSpace(scene) != "" {
if openID, err := ConfirmRegisterVerify(scene, code); err == nil {
return openID, nil
}
}
openID, err := ConfirmRegisterVerifyByCode(code)
if err != nil {
// 按码认领失败的提示要指向注册场景(发送「注册」),而非绑定场景的「验证码」
if errors.Is(err, ErrCodeNotPending) || errors.Is(err, ErrCodeUsed) {
return "", ErrRegisterCodeInvalid
}
return "", err
}
return openID, nil
}
// GetRegisterVerifyStatus 查询注册会话扫码状态(网页轮询展示「已扫码」)
func GetRegisterVerifyStatus(scene string) (scanned bool, expireAt time.Time, err error) {
row, err := GetVerifyCode(scene)