公众号迁移成功后,无法获取用户的OPENID 昵称 性别等信息,没有迁移前好好的,用的ASP,现在可以提示要获取,但是又立马错误,请看看!

公众号迁移成功后,无法获取用户的OPENID 昵称 性别等信息。
用的ASP,获取的时候会提示要获取头像等信息,然后就提示:获取 access_token 时发生错误,错误信息:{"errcode":41008,"errmsg":"missing code, rid: 646dd077-3a51413d-25cbdf70"}。
ASP 代码为:
from.wx.asp:

<!--#include file="WxApi_jbt.asp"-->
Dim Wx, url
SET Wx = New WxAPI
    url = Wx.GetAuthorization_Code()
    Response.Redirect(url)
Set Wx=Nothing


wxapi_jbt.asp

```html
<script language="jscript" runat="server">
function getjson(str){
        try{
           eval("var jsonStr = (" + str + ")");
        }catch(ex){
           var jsonStr = null;
        }
        return jsonStr;
}
</script>
<%
Class WxAPI
    Private APPID
    Private APPSECRET
    Private CALLBACK_URL
    Private SCOPE
        
    Private Sub Class_Initialize      
        APPID = "wx76fdf0fcf9e60c80"
       APPSECRET = "741319ddeb0003f35322cf9b1a34b9582c"
        CALLBACK_URL = "http://www.zkkae.net/membership/wx_user_jbt.asp"
        SCOPE ="snsapi_userinfo" 
        'SCOPE ="snsapi_base"
                                                
    End Sub
   Private Function RequestUrl(url)
        Set XmlObj = Server.CreateObject("Microsoft.XMLHTTP")
        XmlObj.open "GET",url, false
        XmlObj.send
        If XmlObj.Readystate=4 Then
           RequestUrl = XmlObj.responseText
        Else
           Response.Write("xmlhttp请求超时!") 
           Response.End()
        End If
        Set XmlObj = nothing
    End Function
    
    
    Private Function CheckData(data,str)
        If Instr(data,str)>0 Then
           CheckData = True
        Else
           CheckData = False
        End If
    End Function
    
    
    '生成登录地址
    Public Function GetAuthorization_Code()
        Dim url, params
        url = "https://open.weixin.qq.com/connect/oauth2/authorize"
        params = "appid="&APPID
        params = params & "&redirect_uri=" & server.URLEncode(CALLBACK_URL)
        params = params & "&response_type=code"
        params = params & "&scope="&SCOPE
        params = params & "&state=123#wechat_redirect"
        url = url & "?" & params
        GetAuthorization_Code = (url)
    End Function
    

'https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=URL&response_type=code&scope=snsapi_base&state=#wechat_redirect

    Public Function GetAccess_Token(sCode)
        Dim url, params,Temp
        Url="https://api.weixin.qq.com/sns/oauth2/access_token"
        params = "appid="&APPID
        params = params & "&secret=" & APPSECRET
        params = params & "&code=" & sCode
        params = params & "&grant_type=authorization_code"
        url = Url & "?" & params
        Temp=RequestUrl(url)
        If CheckData(Temp,"access_token") = True Then
           set obj = getjson(Temp)
           if isobject(obj) Then
               GetAccess_Token = Array(obj.access_token,obj.openid)
           End If
          set obj = Nothing
        Else
           Response.Write("获取 access_token 时发生错误,错误信息:"&Temp) 
           Response.End()
        End If
    End Function
    
    Public Function CheckLogin()
        Dim Code,mState
        Session("Code")=Trim(Request.QueryString("code"))
        If Code<>"" Then
            CheckLogin = True
        Else
            CheckLogin = False
        End If
    End Function
    
    
    
    Public Function GetUserInfo()
        Dim url, params, result
        url = "https://api.weixin.qq.com/sns/userinfo?"
        'url = "api.weixin.qq.com/cgi-bin/user/info?"
        params = params & "&access_token=" & Access_Token
        params = params & "&openid=" & Openid
        params = params & "&lang=zh_CN"
        url = url & "?" & params
        Temp = RequestUrl(url)
        If CheckData(Temp,"nickname") = False Then
            set obj = getjson(Temp)
           if isobject(obj) Then
               ret = obj.errcode
               msg = obj.errmsg
           End If
          set obj = Nothing
           Response.Write("获取用户信息时发生错误,错误代码:"&ret&" , 错误描述:"&msg) 
           Response.End()
        End If
        GetUserInfo = Temp
        
    End Function

    Public Function GetUserName(json)
        Dim nickname,sex,headimgurl,obj
        set obj = getjson(json)
           if isobject(obj) Then
               nickname = obj.nickname
               sex = obj.sex
               headimgurl = obj.headimgurl
           End If
          set obj = Nothing
        GetUserName = Array(nickname,sex,headimgurl)
    End Function
End Class
%>


wx_user.jbt.asp

<!--#include file="WxApi_jbt.asp"-->
<!--#include file="born_20txt.asp"-->
<!--#include file="./reg/md5.asp"-->

<%


'获得用户真实IP
userip = Request.ServerVariables("HTTP_X_FORWARDED_FOR") 
If userip = "" Then userip = Request.ServerVariables("REMOTE_ADDR") 



session.Timeout = 999
Server.ScriptTimeOut=999
Response.Charset = "utf-8"
Code = Trim(Request.QueryString("code"))
SET Wx = New WxAPI
      TokenArray = Wx.GetAccess_Token(Code)
       Access_Token=TokenArray(0)
       Openid=TokenArray(1)
       subs = TokenArray(2)
    'End If

     UserInfo=Wx.GetUserInfo()
    nickname = Wx.GetUserName(UserInfo)(0)
    sex = Wx.GetUserName(UserInfo)(1)
    icon = Wx.GetUserName(UserInfo)(2)
    city = Wx.GetUserName(UserInfo)(3)

Set Wx=Nothing
If sex="1" then
   sex = "男"
Else
   sex = "女"
End If



set rs=server.createobject("adodb.recordset") 
sql="select * from hy_jbt_0063 where hy_wx ='"&openid&"'"
rs.open sql,conn,1,3
if rs.eof then
rs.close

Session.Contents("wx_oi_notreg_jbt") = Openid
Session.Contents("wx_nickname_notreg_jbt") = nickname
Session.Contents("wx_sex_jbt") = sex
Session.Contents("wx_icon_jbt") = icon

response.end

else

hy_card = rs("hy_card_0063")
hy_tel = rs("hy_tel_0063")

rs("hy_last_date_0063") = now()
rs("hy_wx_sex_0063") = sex
rs("hy_wx_img_0063") = icon
rs("hy_wx_name_0063") = nickname
rs.update

rs.close


set rs=server.createobject("adodb.recordset") 
exec="select * from hy_login_record_0063"
rs.open exec,conn,1,3
rs.addnew
rs("hy_tel_0063") = hy_tel
rs("hy_wx_oi_0063") = Openid
rs("login_time_0063") = now()
rs("login_ip_0063") = userip
rs.update
rs.close





Session.Contents("from_wx") = md5(Openid & hy_hash)
Session.Contents("mem_wx_oi_jbt") = Openid
Response.Cookies("tel")=hy_tel
Response.Cookies("tel").expires = DateAdd("h", 1, Now())

'response.write Session.Contents("from_wx")
'response.end



response.Redirect("./")
response.end

end if

%>

请帮忙看看,怎么办?

这个错误提示是缺少授权码(code),可能是你在获取access token时没有传递正确的授权码。
获取access token时是否传递了正确的授权码。
同时,也可以检查一下你的应用是否已经被用户授权,如果没有被授权,需要先引导用户进行授权操作。
也可能是appid或者secret不对,根据errcode去开发者平台看下对应的是什么错误就知道了

同样的程序 没有迁移之前好好地能用,迁移之后出问题了。
那么可以确定,基本不是程序的问题。
因为用户的OPENID、昵称、性别等信息在不同的公众号之间是不共享的,每个公众号都有自己独立的用户信息库。在公众号迁移后,原公众号中的用户信息无法自动迁移至新的公众号

根据你提供的错误信息,错误代码为 41008,错误描述为 missing code,这个错误通常是由于 code 参数丢失或过期引起的。你在获取 access_token 时需要传递 code 参数,这个参数是用户授权后返回的,它的有效期只有 5 分钟,如果过了有效期就会报错。

建议你检查一下获取 code 参数的流程是否正常,并且确保在获取 access_token 时传递的 code 参数是有效的,可以先输出一下 code 参数来检查它的值是否正确。另外,也可以考虑在获取 access_token 时增加一些错误处理的代码,比如如果返回的结果中没有 access_token 字段,就提示错误信息并结束程序。这样可以帮助你更快地定位问题所在。

你是用的新的还是旧的?
温馨提示:

1)例如帐号A迁移至B,那迁移完成,A帐号被回收,B帐号获得A帐号的粉丝等信息继续使用,但主体还是B;

根据提供的代码和错误信息,可能存在以下问题和解决方案:

  1. 错误信息:{"errcode":41008,"errmsg":"missing code, rid: 646dd077-3a51413d-25cbdf70"}。这个错误提示缺少授权码(code)。这可能是因为在获取用户信息之前没有成功获取到授权码。

解决方案:确保在获取用户信息之前成功获取到授权码。检查以下几个方面:

  • 确认回调URL(CALLBACK_URL)是否正确,与微信公众号的设置相匹配。
  • 确认在用户授权后是否正确重定向到回调URL,并将授权码作为查询参数(code)传递。
  • 检查网络连接是否正常,确保可以从微信服务器获取到授权码。
  1. ASP代码中可能存在一些问题,例如:
  • wx_user_jbt.aspGetAccess_Token函数中的变量Code未赋值。
  • wx_user_jbt.aspGetUserInfo函数中的URL拼接时,params变量未初始化。
  • wx_user_jbt.asp中的WxAPI类的GetUserName方法中,获取用户信息后的索引可能不正确。

解决方案:检查上述代码中的问题并进行修正。确保变量的赋值和使用正确,URL的拼接正确,以及对获取到的JSON数据进行正确的解析。

另外,请注意以下几点:

  • 确保在微信公众号后台设置中已经开启了相应的接口权限,并填写了正确的回调URL。
  • 确保微信公众号的APPID和APPSECRET正确且与代码中的一致。

如果以上解决方案无法解决问题,请提供更多代码相关的信息以及完整的错误堆栈信息,这样我才能更准确地帮助你解决问题。

可能是因为公众号迁移后,与之前的服务器接口不一致导致的。可以尝试重新配置ASP代码,确保与新的服务器接口一致。另外,也可以联系微信公众平台的技术支持人员进行咨询和帮助解决问题。

这个错误信息表示缺失授权码,可能是您的 ASP 代码中缺少授权信息的获取或者授权信息的传递不正确导致的。建议您检查您的 ASP 代码是否正确,还可以参考以下步骤尝试解决该问题:

  1. 确认您的公众号是否已经完成微信认证。如果您的公众号没有完成认证,那么就无法获取用户信息。
  2. 确认您的 ASP 代码中已经包含了获取授权信息的代码。您可以参考微信公众平台提供的官方文档,详细了解获取用户授权信息的方法和步骤。
  3. 确认您的 ASP 代码中将授权信息正确传递到了页面中,可以通过查看页面源代码来确认。
  4. 如果以上步骤都已经确认无误,但仍然无法获取用户信息,可以尝试重新生成 access_token 和授权码。您可以在微信公众平台的开发者中心重新生成相应的令牌和授权码,然后通过 ASP 代码重新获取用户信息。
    需要注意的是,公众号迁移后,原先用户的OPENID等信息可能会发生变化,因此需要重新授权和获取用户信息。如果您仍然无法解决问题,可以联系微信公众号技术支持寻求帮助,他们可能会对问题进行进一步的诊断和解决。

可以借鉴下

protected void Button12_Click(object sender, EventArgs e)
{
    string nextOpenid = "";
    string strwhere = "";
    StringBuilder sbALLopenid = new StringBuilder();
    string tocken = GetWeiXinAccessToken(appid, appsecret);
    //提前已知公众号有3万多粉丝,一次读1万,所以循环4次
    for (int i = 0; i < 4; i++)
    {
        if (i>0)
        {
            strwhere = "&next_openid="+ nextOpenid;
        }
        string url = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=" + tocken + ""+ strwhere;//
        string msgVal = HttpGet(url);
        //Dictionary<string, object> resultJSON = JsonHelper.DataRowFromJSON(msgVal);
        //if (resultJSON != null && resultJSON["next_openid"] != null)
        //{
        //    sbALLopenid.Append(resultJSON["count"].ToString());
        //    nextOpenid = resultJSON["next_openid"].ToString();
        //}
        var obj = JsonConvert.DeserializeObject(msgVal);
        //Console.WriteLine(obj.GetType()); //Newtonsoft.Json.Linq.JObject
        foreach (var x in obj as JObject)
        {
            Console.WriteLine("{0} {1}", x.Key, x.Value);
            if (x.Key== "data")
            {
                Dictionary<string, object> resultJSON = JsonHelper.DataRowFromJSON(x.Value.ToString());
                if (resultJSON != null && resultJSON["openid"] != null)
                {
                    ArrayList arrOpenID = (ArrayList)resultJSON["openid"];
                    foreach (string openid in arrOpenID)
                    {
                        sbALLopenid.Append(" INSERT INTO dbo.tablename (cont) VALUES ('"+ openid + "'); ");
                    }
                    //string stropenid = resultJSON["openid"].ToString();
                    string str02 = "";
                }
            }
            if (x.Key == "next_openid")
            {
                nextOpenid = x.Value.ToString();
            }
        }
    }
 
    int iresult01 = SqlHelper.ExecuteNonQuery(sbALLopenid.ToString(), CommandType.Text);
    string str01 = "";
}
 
//HTTP GET方式请求数据.
public static string HttpGet(string url)
{
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
    request.Method = "GET";
    //request.ContentType = "application/x-www-form-urlencoded";
    request.Accept = "*/*";
    request.Timeout = 5000;
    request.AllowAutoRedirect = false;
 
    WebResponse response = null;
    string responseStr = null;
 
    try
    {
        response = request.GetResponse();
 
        if (response != null)
        {
            StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
            responseStr = reader.ReadToEnd();
            reader.Close();
        }
    }
    catch (Exception)
    {
        throw;
    }
    finally
    {
        request = null;
        response = null;
    }
 
    return responseStr;
}
 

根据错误信息 {"errcode":41008,"errmsg":"missing code, rid: 646dd077-3a51413d-25cbdf70"},可能是因为获取用户信息时缺少了必要的参数导致的。

建议从以下几个方面进行检查处理:

  1. 检查 ASP 程序中的获取 access_token 的代码。如何获取 access_token 的方式不同,可参考微信公众平台文档中获取 access_token 的接口说明

  2. 确保SP 程序中获取到的 access_token 是有效的。可以使用 access_token 来调用微信公众平台提供的各种接口,如拉取用户信息、发送消息等,而 access_token 的有效期为 2 小时。过期后需要重新获取。

  3. 检查获取用户信息时的 URL 地址是否正确,并且包含了参数 access_tokencode。获取用户信息的 URL 格式如下:

https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

其中 ACCESS_TOKEN 是通过调用接口获取到的 access_token,而 OPENID 是用户的唯一标识。

  1. 检查获取用户信息时,参数是否正确。包括小写英文字母 code 和用户的唯一标识 openid 是否正确。

该回答引用ChatGPT4与博主@晓码自在合作编写:

根据你的描述,缺失code造成无法获取access_token和openid的问题。这是因为微信授权时的callback URL配置有误导致的。

我的分析和建议如下:

  1. callback URL需要在微信开放平台的网站应用中进行配置。你需要将wx_user_jbt.asp中的CALLBACK_URL的值,配置到该网站应用的callback URL选项中。
  2. 目前代码中CALLBACK_URL使用的是public语法,应修改为可公网访问的URL。因为用户授权后,微信会重定向到该URL,如果无法访问会导致code获取失败。
  3. code作为临时授权码,有效期为5分钟。所以在wx_user_jbt.asp中获取code后,需要尽快调用GetAccess_Token获取access_token,否则code失效会导致无法获取。
  4. 除非需要获取敏感信息,否则SCOPE可以设置为snsapi_base。这种方式可以获取openid,而用户信息需要用户授权。使用snsapi_userinfo scope需要用户勾选授权个人信息选项。

综上,我的建议步骤是:

  1. 配置网站应用的callback URL,将代码中CALLBACK_URL的值设置为可公网访问的地址。
  2. 检查GetAccess_Token中是否在5分钟内调用,如果超时会导致获取失败。
  3. 根据需求选择合适的SCOPE。一般snsapi_base可以满足基本需求。
  4. code只能使用一次,每次需要用户授权时应重新获取code。
  5. 除微信开放平台网站应用设置外,服务端代码配合没有问题。