Foxtable(狐表)用户栏目专家坐堂 → 求助:微信开发,文本框字数控制和openid获取


  共有3989人关注过本帖树形打印复制链接

主题:求助:微信开发,文本框字数控制和openid获取

帅哥哟,离线,有人找我吗?
qwz405
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:526 积分:5083 威望:0 精华:0 注册:2015/4/15 15:25:00
求助:微信开发,文本框字数控制和openid获取  发帖心情 Post By:2017/5/18 14:50:00 [显示全部帖子]

1.虽然文本框有提示:输入多少字数的内容。但若使用者超出字数,还是会提交,服务器就会报错,操作中断。
请教:如何控制当输入超出时,中断提交并报错。


2.请:是否可以在使用者提交时,获取对方的:Openid、国家、城市、省份、地理位置等信息。


3.网页代码:
Dim e As RequestEventArgs = args(0)

Dim wb As New weui

wb.AddPageTitle("","message","用户留言","***有限公司")      '标题

If e.PostValues.Count = 0 Then     '生成用户留言网页
    
    wb.AddTopTips("","toptip1","留言内容/联系电话,必须填写数据!")         '用于显示动态错误提示
    
    wb.AddForm("","form1","s50000_message.htm").Attribute=""       '表单...submit-->接收此表单数据页面为:s50000_message.htm...使用js脚本文件,判断是否有输入完整数据
    
    With wb.AddInputGroup("form1","ipg1","留言内容")
        .AddTextArea("留言内容",5).Placeholder = "请输入200字以内的内容."
    End With
    
    With wb.AddInputGroup("form1","ipg2")
        '.AddInput("留言内容","留言内容","text")
        .AddInput("联系电话","联系电话","text").Placeholder = "请输入15字以内的内容."
        .AddInput("联系地址","联系地址","text").Placeholder = "请输入50字以内的内容."
        .AddInput("电子邮箱","电子邮箱","text").Placeholder = "请输入30字以内的内容."
    End With
    With wb.AddButtonGroup("form1","btg1",True)
        .Add("btn1", "留言", "submit")
        '.Add("btn2", "返回","***")
    End With
Else     '保存新增的订单
    Dim dr As DataRow = DataTables("用户留言").AddNew()
    Dim nms() As String = {"留言内容","联系电话","联系地址","电子邮箱"}
    For Each nm As String In nms
        dr(nm) = e.PostValues(nm)
    Next
    dr("留言时间") = Date.Now()
    dr.Save()
    With wb.AddMsgPage("","msgpage","留言成功", "我们会尽快与您取得联系!")      '留言成功成功提示信息
        .AddButton("btn1","继续增加","s50000_message.htm")
        '.AddButton("btn1","返回列表","list.htm")
    End With
End If

wb.AppendHTML("<script src='./lib/ajaxform.js'></script>")      '引入脚本文件

e.WriteString(wb.Build) '生成网页


4.脚本代码:
function getmessage(){
   var v1 = document.getElementById("留言内容").value;
   var v2 = document.getElementById("联系电话").value;
   if (v1 && v2){return true}
   show("toptip1",2500);        //2500毫秒=2.5秒
   return false;
}


[此贴子已经被作者于2017/5/18 14:51:33编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
qwz405
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:526 积分:5083 威望:0 精华:0 注册:2015/4/15 15:25:00
  发帖心情 Post By:2017/5/18 14:52:00 [显示全部帖子]

程序文件....论坛不灵光,我上传了N次才成功的。


 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:http20170518.foxdb


[此贴子已经被作者于2017/5/18 14:56:02编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
qwz405
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:526 积分:5083 威望:0 精华:0 注册:2015/4/15 15:25:00
  发帖心情 Post By:2017/5/18 15:06:00 [显示全部帖子]

用IP地址(开通80端口),或者申请个域名,或者用现有域名的二级域名。

移动开发指南-->微信接口,一开始就讲这个。

 回到顶部
帅哥哟,离线,有人找我吗?
qwz405
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:526 积分:5083 威望:0 精华:0 注册:2015/4/15 15:25:00
  发帖心情 Post By:2017/5/19 15:54:00 [显示全部帖子]

试用《网页简单授权》的代码
1.确认微信已关注此测试号;
2.能开启网页 s50000_message.htm;
3.已将网址abc.ngrok.cc加入到网页授权;

问题:打开 abc.ngrok.cc 时,弹错误:未关注该测试号


Dim fl As String = "e:\baidu\web\" & e.path     '设置网页根目录
If filesys.FileExists(fl)
    Dim idx As Integer = fl.LastIndexOf(".")
    Dim ext As String  = fl.SubString(idx)
    Select Case ext
        Case ".jpg",".gif",".png",".bmp",".wmf",".js",".css" ,".html",".htm",".zip",".rar"
            e.WriteFile(fl)
            Return   '这里必须返回
    End Select
End If

Select Case e.path
    Case "abc","abc1"    '接口配置
        If e.Request.HttpMethod.ToUpper = "GET"
            If Functions.Execute("VerifySignature",e) Then
                e.WriteString(e.GetValues("echostr"))
            End If
        End If
        
    Case "s50000_message.htm"    '用户留言
        Functions.Execute("s50000_message",e)
        
End Select



If e.host = "abc.ngrok.cc" Then '需要授权才能访问的域名
    Dim OpenID As String
    Dim sb As New StringBuilder
    sb.AppendLine("<meta name='viewport' c>")
    If e.GetValues.ContainsKey("code") Then '如果通过授权链接跳转而来,就根据传递过来的code参数调用接口,获取用户的OpenID
        Dim ul As String  = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code"
        ul = CExp(ul,"wx4718459301f2db8f","827cafff19659d5b93e8c7663db3999a",e.GetValues("code"))
        Dim hc As new HttpClient(ul)
        Dim jo As JObject = JObject.Parse(hc.GetData)
        If jo("openid") IsNot Nothing Then
            OpenID = jo("openid")
            e.AppendCookie("openid",OpenID) '将openid存储在Cookie中
        End If
    Else
        OpenId =  e.Cookies("openid") '否则从cookie中提取openid
    End If
    Dim Verified As Boolean
    Dim dr As DataRow = DataTables("Users").Find("openid  ='" & OpenID & "'") '根据openid找出对应的行
    If OpenId > "" AndAlso dr IsNot Nothing Then '授权成功
        Verified  = True
    ElseIf e.GetValues.ContainsKey("code") = False Then '如果授权失败,且不是通过授权链接跳转而来,那么就跳转到授权链接
        Dim ul As String = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx8acdb7df5beb68fd&redirect_uri=http%3a%2f%2fwexin.foxtable.com&response_type=code&scope=snsapi_base&state=123#wechat_redirect"
        sb.Append("<meta http-equiv='Refresh' c>") '跳转到授权链接
        e.WriteString(sb.ToString)
        Return
    End If
    If Verified = False Then
        sb.AppendLine("你无权访问本系统")
    Else
        sb.AppendLine("Foxtable欢迎您, <a href='http://wexin.foxtable.com'>刷新页面</a>")
    End If
    e.WriteString(sb.ToString)
End If
[此贴子已经被作者于2017/5/19 15:54:20编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
qwz405
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:526 积分:5083 威望:0 精华:0 注册:2015/4/15 15:25:00
  发帖心情 Post By:2017/5/19 16:27:00 [显示全部帖子]

看了帮助、视频,还是一头浆糊,只能拷贝代码测试

我是想只有openid在我的users表中的人,才能进行相应的操作。

是公司内部的管理系统,openid我会事先登记到users表中。

我先测试,一点点弄,不懂请教老师。



 回到顶部
帅哥哟,离线,有人找我吗?
qwz405
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:526 积分:5083 威望:0 精华:0 注册:2015/4/15 15:25:00
  发帖心情 Post By:2017/5/19 16:59:00 [显示全部帖子]

 s50000_message.htm 是我的测试网址,能正常使用,说明http服务是可用的。

我登陆是授权网址 abc.ngrok.cc,应该是我url弄错了~

 回到顶部
帅哥哟,离线,有人找我吗?
qwz405
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:526 积分:5083 威望:0 精华:0 注册:2015/4/15 15:25:00
  发帖心情 Post By:2017/5/21 11:48:00 [显示全部帖子]

老师,身份通过验证的用户(即:Verified  = True),允许登陆系统首页:http://www.***.com/default.htm

如果首次登陆/或未验证的,显示登陆页:http://www.***.com/logon.htm


但如果知道系统首页,不通过验证,好像可以通过输入网址直接访问系统:http://www.***.com/default.htm

这要如何处理?

 回到顶部
帅哥哟,离线,有人找我吗?
qwz405
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:526 积分:5083 威望:0 精华:0 注册:2015/4/15 15:25:00
  发帖心情 Post By:2017/5/21 16:00:00 [显示全部帖子]

老师,调试了半天代码,大概知道上面的问题是不会发生的:因为如果没有经过验证,程序已经return了,回到登陆页。不可能跳过登陆页,直接打开系统首页。是否可以这样理解?


HttpRequest事件代码:

'通用事件头
Dim
 fl As String = "d:\web\" & e.path
If
 filesys.FileExists(fl)
    Dim idx As Integer = fl.LastIndexOf(".")
    
Dim ext As String  = fl.SubString(idx)
    Select Case ext
        Case ".jpg",".gif",".png",".bmp",".wmf",".js",".css" ,".html",".htm",".zip",".rar"
            e.WriteFile(fl)
            Return '
这里必须返回
    End Select

End
 If
Dim
 wb As New weui
'
身份验证
Dim
 Verified As Boolean '用于标记用户是否通过了身份验证
Dim
 UserName As String = e.Cookies("username"'cookie中获取用户名
Dim
 Password As String = e.Cookies("password"'cookie中获取用户密码
If
 e.Path = "logon.htm" '如果是通过登录页面访问,PostValues即可中提取用户名和密码
    If e.PostValues.ContainsKey("username"AndAlso e.PostValues.ContainsKey("password")  Then
        UserName = e.PostValues("username")
        Password = e.PostValues("password")
    End If

End
 If
If
 UserName = "张三" AndAlso Password = "888" Then  '实际使用的时候,请改为从数据库读取用户名和密码进行比较
    Verified  = True

ElseIf
 Username = "李四" AndAlso Password="999" Then
    Verified  = True

End
 If
If
 Verified AndAlso e.Path = "logon.htm"  Then '如果用户访问的是登录页,且身份验证成功
    wb.AppendCookie("username",UserName) '
将用户名和密码写入cookie
    wb.AppendCookie("password",Password)
    wb.InsertHTML("<meta http-equiv='Refresh' c>"'
直接跳转到首页
    e.WriteString(wb.Build) '
生成网页
    Return '
必须的
ElseIf
 Verified = False AndAlso e.Path <> "logon.htm" Then '如果用户身份验证失败,且访问的不是登录页面
    wb.InsertHTML("<meta http-equiv='Refresh' c>"'
那么直接跳转到登录页面
    e.WriteString(wb.Build) '
生成网页
    Return '
必须的
End
 If
'
开始生成网页

………


 回到顶部
帅哥哟,离线,有人找我吗?
qwz405
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:526 积分:5083 威望:0 精华:0 注册:2015/4/15 15:25:00
  发帖心情 Post By:2017/5/21 22:14:00 [显示全部帖子]

老师,您好。

微信移动开发指南 --> WeUI框架 --> 让登陆变得更安全 --> 第88行代码:wb.DeleteCookie("password")

因为经过加密,Cookie中不出现密码,出现的是随机生成UserID,个人感觉应该为:wb.DeleteCookie("userid")

现在的代码,运行正常的,userid会存在Cookies表中不清除。








 回到顶部
帅哥哟,离线,有人找我吗?
qwz405
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:526 积分:5083 威望:0 精华:0 注册:2015/4/15 15:25:00
  发帖心情 Post By:2017/5/22 16:20:00 [显示全部帖子]

老师,我想把《让登陆变得更安全》中的临时表,改为数据表,目的:查看系统当前哪些人在线。
红我字体是我改动的。
目前测试超出30分钟的登录资料不会删除
另外,我不知道这样改会不会影响速度,或者存在隐患。

还有,就是网页中加密后的username和数据表中的usermane不一样(数据表中用=替换了%***),到时我会解密username,允许用户修改密码的。


Static ClearTime As Date
If (Date.Now - ClearTime).TotalMinutes >= 30 Then    '清除超过30分钟没有操作的登录信息
    DataTables("UsersNow").DeleteFor("ActiveTime < #" & Date.Now.AddMinutes(-30) & "#")
    ClearTime = Date.Now()
End If

Dim wb As New weui
'
身份验证
Dim
 UserName As String
Dim
 Password As String
Dim
 UserID As String
If
 e.Path = "logon.htm" '验证用户名和密码
    If e.PostValues.ContainsKey("username") AndAlso e.PostValues.ContainsKey("password")  Then
        Dim Verified As Boolean '
用于标记用户是否通过了身份验证
        UserName = e.PostValues("username")
        Password = e.PostValues("password")
        If UserName = "
张三" AndAlso Password = "888" Then  '实际使用的时候,请改为从数据库读取用户名和密码进行比较
            Verified  = True
        ElseIf Username = "
李四" AndAlso Password="999" Then
            Verified  = True
        End If
        If Verified Then
            UserID = Rand.NextString(16) '
生成随机用户ID
            UserName = EncryptText(UserName,"123","123") '
将用户名加密.
            'Dim dr As DataRow = UserTable.Find("UserName = '" & UserName & "'")
                Dim dr As DataRow = DataTables("UsersNow").Find("UserName = '" & UserName & "'")
            If  dr IsNot Nothing Then '如果是重复登录,删除以前的登录信息
                dr.Delete()
                 dr.Save()
            End If
            'dr = UserTable.AddNew()
                dr = DataTables("UsersNow").AddNew()
            dr("UserName") = UserName
            dr("UserID") = UserId
            dr("ActiveTime") = Date.Now '
记录登录时间
                   DataTables("UsersNow").Save()
            wb.AppendCookie("username",UserName'
将用户名和密码写入cookie
            wb.AppendCookie("userid",UserID)
            wb.InsertHTML("<meta http-equiv='Refresh' c>") '
直接跳转到首页
            e.WriteString(wb.Build) '
生成网页
            Return '
必须的
        End If
    End If

Else
 '其它页面从Cookie提取登录信息进行验证
    UserName = e.Cookies("username")  '
cookie中获取用户名
    UserID = e.Cookies("userid")  '
cookie中获取 随机ID
    'Dim dr As DataRow = UserTable.Find("UserName = '" & UserName & "'")
     Dim dr As DataRow = DataTables("UsersNow").Find("UserName = '" & UserName & "'")
    If dr IsNot Nothing AndAlso dr("UserID") = UserID Then  '
如果通过验证,更新活动时候,继续访问其它页面.
        dr("ActiveTime") = Date.Now '
更新活动时间
    Else '
如果验证失败
        wb.InsertHTML("<meta http-equiv='Refresh' c>") '
那么直接跳转到登录页面
        e.WriteString(wb.Build) '
生成网页
        Return '
必须的
    End If

End
 If
[此贴子已经被作者于2017/5/22 16:37:18编辑过]

 回到顶部
总数 13 1 2 下一页