Foxtable(狐表)用户栏目专家坐堂 → [求助]获取OPENID


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

主题:[求助]获取OPENID

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


加好友 发短信
等级:六尾狐 帖子:1347 积分:9817 威望:0 精华:0 注册:2015/6/30 8:46:00
[求助]获取OPENID  发帖心情 Post By:2019/11/30 15:19:00 [显示全部帖子]

问题一: 程序经常会用到OPENID,想在第一个网页中获取ID后存在变量里,不作网页授权可以吗?

问题二:以下代码PopMessage 显示为空??什么原因

 

 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,"AppID","AppSecret",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
        PopMessage(openid)


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


加好友 发短信
等级:六尾狐 帖子:1347 积分:9817 威望:0 精华:0 注册:2015/6/30 8:46:00
  发帖心情 Post By:2019/11/30 16:11:00 [显示全部帖子]

   Case "hello.htm"
     PopMessage(Functions.Execute("getopenid",e,"hello.htm")) ‘ 这样PopMessage 出来的也是空的、

 

内部函数,

Dim e As RequestEventArgs = Args(0)
Dim url As String = args(1)
Dim wb As New weui
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,"AppID","AppSecret",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("WXUsers").Find("openid  ='" & OpenID & "'") '根据openid找出对应的行
If OpenId > "" AndAlso dr IsNot Nothing AndAlso dr("permit") = True '授权成功
    Verified  = True
ElseIf e.GetValues.ContainsKey("code") = False Then '如果授权失败,且不是通过授权链接跳转而来,那么就跳转到授权链接
   
    Dim ul1 As String = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope=snsapi_base&state={2}#wechat_redirect"
    Dim ul2 As String = UrlEncode(www.xxx.com/ & args(1) & url) '这里是不是要改为自己的网址
    ul1 = CExp(ul1,"AppID",ul2,"123")
       
    sb.Append("<meta http-equiv='Refresh' c>") '跳转到授权链接
    e.WriteString(sb.ToString)
    Return OpenId
End If

[此贴子已经被作者于2019/11/30 16:15:40编辑过]

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


加好友 发短信
等级:六尾狐 帖子:1347 积分:9817 威望:0 精华:0 注册:2015/6/30 8:46:00
  发帖心情 Post By:2019/11/30 16:53:00 [显示全部帖子]

以下是引用有点蓝在2019/11/30 16:30:00的发言:
1、同样的道理,第一次进来还没有授权的时候,肯定为空
     怎么样能能第一次进去就是有OPENID的。

 
2、 '肯定要改为自己的网址


3、Return OpenId放到函数的最后   PopMessage 还是显示为空

    


Dim ul2 As String = UrlEncode("www.xxx.com/" & url) '这里是不是要改为自己的网址
    ul1 = CExp(ul1,"AppID",ul2,"123")
       
    sb.Append("<meta http-equiv='Refresh' c>") '跳转到授权链接
    e.WriteString(sb.ToString)
    End If

Return OpenId

[此贴子已经被作者于2019/11/30 16:53:29编辑过]

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


加好友 发短信
等级:六尾狐 帖子:1347 积分:9817 威望:0 精华:0 注册:2015/6/30 8:46:00
  发帖心情 Post By:2019/11/30 17:33:00 [显示全部帖子]

以下是引用有点蓝在2019/11/30 17:31:00的发言:
别人访问的时候直接读通过下面这种授权地址访问,才有可能第一次就获取openid。

"https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope=snsapi_base&state={2}#wechat_redirect"

其实按照上面的用法,在这段代码就可以获取

    If jo("openid") IsNot Nothing Then
        OpenID = jo("openid")
        e.AppendCookie("openid",OpenID) '将openid存储在Cookie中
    End If

为什么我的就是不行,代码那里有问题,请老师帮忙改一下。


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


加好友 发短信
等级:六尾狐 帖子:1347 积分:9817 威望:0 精华:0 注册:2015/6/30 8:46:00
  发帖心情 Post By:2019/12/1 22:19:00 [显示全部帖子]

以下是引用有点蓝在2019/11/30 17:37:00的发言:
Dim ul2 As String = UrlEncode("http://www.xxx.com/" & url)

老师,我已经是这样子修改了,可是还是空值!


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


加好友 发短信
等级:六尾狐 帖子:1347 积分:9817 威望:0 精华:0 注册:2015/6/30 8:46:00
  发帖心情 Post By:2019/12/2 8:16:00 [显示全部帖子]

以下是引用有点蓝在2019/12/1 22:21:00的发言:
上传实例说明

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


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


加好友 发短信
等级:六尾狐 帖子:1347 积分:9817 威望:0 精华:0 注册:2015/6/30 8:46:00
  发帖心情 Post By:2019/12/2 11:44:00 [显示全部帖子]

顶一下


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


加好友 发短信
等级:六尾狐 帖子:1347 积分:9817 威望:0 精华:0 注册:2015/6/30 8:46:00
  发帖心情 Post By:2019/12/2 13:34:00 [显示全部帖子]

Dim e As RequestEventArgs = Args(0)
Dim url As String = args(1)
Dim wb As New weui
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,"addid","AppSecret",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("WXUsers").Find("openid  ='" & OpenID & "'") '根据openid找出对应的行
If OpenId > "" AndAlso dr IsNot Nothing AndAlso dr("permit") = True '授权成功
    Verified  = True
ElseIf e.GetValues.ContainsKey("code") = False Then '如果授权失败,且不是通过授权链接跳转而来,那么就跳转到授权链接
    Dim ul1 As String = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope=snsapi_base&state={2}#wechat_redirect"
    Dim ul2 As String = UrlEncode("sg.vipgz2.idcfengye.com/" & url)
    ul1 = CExp(ul1,"addid",ul2,"123")   
    sb.Append("<meta http-equiv='Refresh' c>") '跳转到授权链接
    e.WriteString(sb.ToString)
End If
Return OpenId

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


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


加好友 发短信
等级:六尾狐 帖子:1347 积分:9817 威望:0 精华:0 注册:2015/6/30 8:46:00
  发帖心情 Post By:2019/12/2 15:15:00 [显示全部帖子]


图片点击可在新窗口打开查看此主题相关图片如下:无标题.png
图片点击可在新窗口打开查看
 

老师,查过后台,这样的意思 是不是订阅号就没有办法获取得到OPENID了。

 

不更改为服务号的情况,有没有什么办法可以获取用户的OPENID号。

 

以下可以获取得到所有用记的openid,便如何知道当前用户的OPENID?

 

DataTables("WXUsers").DataRows.Clear()
Dim ul As String = "https://api.weixin.qq.com/cgi-bin/user/get?access_token={0}&next_openid={1}"  '获取用户OpenID列表接口
Dim il = "https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token={0}" '批量获取用户信息接口
Dim nms() As String = {"openid","nickname","sex","city","country","province","headimgurl","groupid","remark","language"} '列名
PopMessage(Functions.Execute("GetAccessToken"))
Dim hc As New HttpClient(CExp(ul, Functions.Execute("GetAccessToken"),"")) 
 Dim ids As New List(of String)  'OpenId集合,每次获取10000个
Dim ba As New Jarray '准备用来获取用户信息的OpenId列表,一次不能超过100个
Dim jo As JObject = JObject.Parse(hc.GetData)
 Do '循环获取,一次只能获取10000个OpenID
     If jo("errcode") Is Nothing Then
        Dim cnt As Integer = jo("count")
         If cnt = 0 Then  '如果已经获取完所有用户'
             Exit Do
        End If
        For Each jk As JToken  In jo("data")("openid")
             ids.Add(jk)
         Next
        For i As Integer = 0 To ids.Count - 1   '循环获取用户详情,一次不能超过100个用户
            Dim uo As New JObject
            uo("openid") = ids(i)
              ba.Add(uo)
             If ba.Count = 100 OrElse i = ids.Count - 1 Then '每满100个就获取一次
                Dim bo As New Jobject
                 bo("user_list") = ba
                hc = New HttpClient(CExp(il, Functions.Execute("GetAccessToken")))
                 hc.Content = bo.ToString()
                 Dim ro As JObject = JObject.Parse(hc.GetData)
                 If ro("errcode") Is  Nothing Then
                    Dim ia As JArray = ro("user_info_list") '获取的用户信息列表
                    For  Each jt As JToken In ia
                        Dim dr As DataRow = DataTables("WXUsers").Find("openid = '" & jt("openid").ToString() & "'")
                         If dr Is Nothing Then
                            dr = DataTables("WXUsers").AddNew()
                         End If
                        For Each nm As String In nms
                            dr(nm) = jt(nm)
                         Next
                        dr("tagid_list") = CompressJSON(jt("tagid_list"))
                     Next
                Else
                    MessageBox.Show(ro.ToString)
                     Exit For
                End If
                ba.Clear() '清除集合,准备获取下一批用户详情,每批只能100个.
             End If
        Next
        ids.Clear '清除已经获取的OpenID.,准备接收下一批OpenID
         hc =  New HttpClient(CExp(ul, Functions.Execute("GetAccessToken"),jo("next_openid").Tostring))  '获取下一批OpenID
         jo = JObject.Parse(hc.GetData)
     Else
        MessageBox.Show(jo.ToString)
         Exit Do
    End  If
 Loop
 DataTables("WXUsers").Save()

 

 

 


[此贴子已经被作者于2019/12/2 15:16:43编辑过]

 回到顶部