Foxtable(狐表)用户栏目专家坐堂 → 判断是否有关注公众号


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

主题:判断是否有关注公众号

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


加好友 发短信
等级:九尾狐 帖子:2355 积分:16187 威望:0 精华:0 注册:2013/9/1 8:09:00
判断是否有关注公众号  发帖心情 Post By:2017/12/19 22:27:00 [只看该作者]

蓝老师,你帮忙看下。。。

    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,secret,e.GetValues("code"))
        Dim hc As new HttpClient(ul)
        Dim jo As JObject = JObject.Parse(hc.GetData)
        If jo("openid") IsNot Nothing Then '如果获取openid成功(成功的话,还会同时返回一个accesstiken,用于获取用户详情)
            OpenID = jo("openid")
            If e.GetValues("state") = "gugisrq" Then
                popmessage(openid)  '正常执行
                Dim url As String = "https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&openid={1}&lang=zh_CN"
                url = CExp(url, Functions.Execute("GetAccessToken12","变量A"), openid)   'oI4erjj48vvEdVxFzbAj6fZ8SSLw
                Dim hc1 As New HttpClient(url)
                Dim jo1 As JObject = Jobject.Parse(hc1.GetDaTa)
                popmessage(jo1("subscribe"))
                If jo1("openid") IsNot Nothing Then
                    If jo1("subscribe") = "0" Then
                        e.WriteString("请先关注公众号")
                        Return
                    ElseIf jo1("subscribe") = "1" Then
                        e.writestring("可以访问网页")
                        Return
                    End If    
                Else
                    e.WriteString(jo.ToString) '在用户浏览器显示错误信息
                    Return
                End If
                以上黄色这段单独测试没问题(用固定的openid),整段去掉黄色的也没问题。就是这样放在一起,一访问这个页面就死掉。不知道什么原因。。。
            End If
            
            Dim drwx As DataRow = DataTables("WXUsers").sqlFind("openid ='" & Openid & "'")
            If drwx IsNot Nothing Then
            Else
                ul = "https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang=zh_CN "
                '根据openid和accesstoken获取用户详情,注意这里这个accesstoken不是普通accesston,只能用于网页授权
                hc = New HttpClient(CExp(ul, jo("access_token"), OpenId))
                jo = jo.Parse(hc.GetData)
                If jo("openid") IsNot Nothing Then
                    drwx = DataTables("WXUsers").sqlAddNew()
                    Dim nms() As String = {"openid","nickname","sex","city","country","province","headimgurl"} '""
                    For Each nm As String In nms
                        drwx(nm) = jo(nm)
                    Next
                    drwx("账套") = zhangtao
                    drwx("addtime") = Date.now
                    drwx.Save
                Else
                    e.WriteString(jo.ToString) '在用户浏览器显示错误信息
                    Return
                End If
            End If
            e.AppendCookie("openid",OpenID)
            sb.Append("<meta http-equiv='refresh' c>")
            e.WriteString(sb.ToString)
        Else
            e.WriteString(jo.ToString) '在用户浏览器显示错误信息
            Return
        End If
    End If

[此贴子已经被作者于2017/12/19 22:31:19编辑过]

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


加好友 发短信
等级:超级版主 帖子:110574 积分:562760 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2017/12/19 22:47:00 [只看该作者]

测试一下提示框是否能够出现
……
If jo("openid") IsNot Nothing Then '如果获取openid成功(成功的话,还会同时返回一个accesstiken,用于获取用户详情)
            OpenID = jo("openid")
            If e.GetValues("state") = "gugisrq" Then
                popmessage(openid)  '正常执行
                Dim url As String = "https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&openid={1}&lang=zh_CN"
                url = CExp(url, Functions.Execute("GetAccessToken12","变量A"), openid)   'oI4erjj48vvEdVxFzbAj6fZ8SSLw
                Dim hc1 As New HttpClient(url)
                Dim jo1 As JObject = Jobject.Parse(hc1.GetDaTa)
                popmessage(jo1("subscribe")) ‘能够弹出来吗
                If jo1("openid") IsNot Nothing Then
                    If jo1("subscribe") = "0" Then
msgbox(0)
                        e.WriteString("请先关注公众号")
                        Return
                    ElseIf jo1("subscribe") = "1" Then
                        e.writestring("可以访问网页")
msgbox(1)
                        Return
                    End If    
                Else
                    e.WriteString(jo.ToString) '在用户浏览器显示错误信息
msgbox(2)
                    Return
                End If
msgbox(3)
                以上黄色这段单独测试没问题(用固定的openid),整段去掉黄色的也没问题。就是这样放在一起,一访问这个页面就死掉。不知道什么原因。。。
            End If
            ……

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


加好友 发短信
等级:九尾狐 帖子:2355 积分:16187 威望:0 精华:0 注册:2013/9/1 8:09:00
  发帖心情 Post By:2017/12/19 22:49:00 [只看该作者]

蓝老师,
就到这里:
            If e.GetValues("state") = "gugisrq" Then
                popmessage(openid)  '正常执行
下面的就死了。

但是单独测试黄色整段的都没有问题。
[此贴子已经被作者于2017/12/19 22:49:35编辑过]

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


加好友 发短信
等级:超级版主 帖子:110574 积分:562760 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2017/12/19 22:52:00 [只看该作者]

If e.GetValues("state") = "gugisrq" Then
                popmessage(openid)  '正常执行
                Dim url As String = "https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&openid={1}&lang=zh_CN"
dim acc as string = Functions.Execute("GetAccessToken12","变量A")
msgbox(acc)
                url = CExp(url, acc, openid)   'oI4erjj48vvEdVxFzbAj6fZ8SSLw
                Dim hc1 As New HttpClient(url)
dim ret as strng = hc1.GetDaTa
msgbox(ret)
                Dim jo1 As JObject = Jobject.Parse(ret)
                popmessage(jo1("subscribe")) ‘能够弹出来吗
                If jo1("openid") IsNot Nothing Then
                    If jo1("subscribe") = "0" Then
msgbox(0)
                        e.WriteString("请先关注公众号")

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


加好友 发短信
等级:九尾狐 帖子:2355 积分:16187 威望:0 精华:0 注册:2013/9/1 8:09:00
  发帖心情 Post By:2017/12/19 22:55:00 [只看该作者]


[此贴子已经被作者于2017/12/19 22:56:20编辑过]

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


加好友 发短信
等级:九尾狐 帖子:2355 积分:16187 威望:0 精华:0 注册:2013/9/1 8:09:00
  发帖心情 Post By:2017/12/19 23:06:00 [只看该作者]

蓝老师,就到第一个弹窗:

    If e.GetValues.ContainsKey("code") And e.GetValues("state") = "arq" 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,secret,e.GetValues("code"))
        Dim hc As new HttpClient(ul)
        Dim jo As JObject = JObject.Parse(hc.GetData)
        If jo("openid") IsNot Nothing Then '如果获取openid成功(成功的话,还会同时返回一个accesstiken,用于获取用户详情)
            OpenID = jo("openid")
            
            messagebox.show(openid)  '就到这里。下面就死了
            Dim url As String = "https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&openid={1}&lang=zh_CN"
            '   url = CExp(url, Functions.Execute("GetAccessToken12","变量A"), openid)  'oI4erjj48vvEdVxFzbAj6fZ8SSLw
            Dim acc As String = Functions.Execute("GetAccessToken12","变量A")
            messagebox.show(acc)
            url = CExp(url, acc, openid)   'oI4erjj48vvEdVxFzbAj6fZ8SSLw
            Dim hc1 As New HttpClient(url)
            Dim ret As String = hc1.GetDaTa
            messagebox.show(ret)
            Dim jo1 As JObject = Jobject.Parse(ret)
            messagebox.show(jo1("subscribe"))
            If jo1("subscribe") = "0" Then
                e.WriteString("请先关注公众号")
                messagebox.show("0")
                Return
            ElseIf jo1("subscribe") = "1" Then
                sb.Append("<meta http-equiv='refresh' c>")
                e.WriteString(sb.ToString)
                Return
            End If
        Else
            e.WriteString(jo.ToString) '在用户浏览器显示错误信息
            Return
        End If
    End If
[此贴子已经被作者于2017/12/19 23:06:36编辑过]

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


加好友 发短信
等级:九尾狐 帖子:2355 积分:16187 威望:0 精华:0 注册:2013/9/1 8:09:00
  发帖心情 Post By:2017/12/19 23:23:00 [只看该作者]

Functions.Execute("GetAccessToken12","变量A") 函数的代码是这样:

Dim _zhangtao As String= Args(0)

Dim hc As New HttpClient("http://www.yft.net/GetAccessToken/") '请改为中控服务器的实际IP
hc.FormData.Add("name","yonghuming") '添加用户名和密码
hc.FormData.Add("password","mima")
hc.FormData.Add("zhangtao",_zhangtao)
Dim AccessTocken =  hc.GetData '获取AccessToken
output.Show(AccessTocken)
Return AccessTocken
这个在 命令窗口执行没有问题


图片点击可在新窗口打开查看此主题相关图片如下:微信截图_20171219232402.png
图片点击可在新窗口打开查看

[此贴子已经被作者于2017/12/19 23:24:25编辑过]

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


加好友 发短信
等级:超级版主 帖子:110574 积分:562760 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2017/12/20 8:49:00 [只看该作者]

中控服务是如何处理的,写了什么代码?Dim hc As New HttpClient("http://www.yft.net/GetAccessToken/")

www.yft.net是否是和微信服务是同一台电脑的?是云服务器还是本地服务器?

如果中控服务和微信服务是在同一个项目的,直接调用获取AccessToken的函数;如果不是同一个项目但是在同一台服务器的,通过本地ip访问,如"http://127.0.0.1/GetAccessToken/"

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


加好友 发短信
等级:九尾狐 帖子:2355 积分:16187 威望:0 精华:0 注册:2013/9/1 8:09:00
  发帖心情 Post By:2017/12/21 [只看该作者]

对,就是这个问题。
谢谢蓝老师,解决了

 回到顶部