公众号迁移成功后,无法获取用户的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;
根据提供的代码和错误信息,可能存在以下问题和解决方案:
{"errcode":41008,"errmsg":"missing code, rid: 646dd077-3a51413d-25cbdf70"}
。这个错误提示缺少授权码(code)。这可能是因为在获取用户信息之前没有成功获取到授权码。解决方案:确保在获取用户信息之前成功获取到授权码。检查以下几个方面:
CALLBACK_URL
)是否正确,与微信公众号的设置相匹配。code
)传递。wx_user_jbt.asp
中GetAccess_Token
函数中的变量Code
未赋值。wx_user_jbt.asp
中GetUserInfo
函数中的URL拼接时,params
变量未初始化。wx_user_jbt.asp
中的WxAPI
类的GetUserName
方法中,获取用户信息后的索引可能不正确。解决方案:检查上述代码中的问题并进行修正。确保变量的赋值和使用正确,URL的拼接正确,以及对获取到的JSON数据进行正确的解析。
另外,请注意以下几点:
如果以上解决方案无法解决问题,请提供更多代码相关的信息以及完整的错误堆栈信息,这样我才能更准确地帮助你解决问题。
可能是因为公众号迁移后,与之前的服务器接口不一致导致的。可以尝试重新配置ASP代码,确保与新的服务器接口一致。另外,也可以联系微信公众平台的技术支持人员进行咨询和帮助解决问题。
这个错误信息表示缺失授权码,可能是您的 ASP 代码中缺少授权信息的获取或者授权信息的传递不正确导致的。建议您检查您的 ASP 代码是否正确,还可以参考以下步骤尝试解决该问题:
可以借鉴下
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"}
,可能是因为获取用户信息时缺少了必要的参数导致的。
建议从以下几个方面进行检查处理:
检查 ASP 程序中的获取 access_token 的代码。如何获取 access_token 的方式不同,可参考微信公众平台文档中获取 access_token 的接口说明。
确保SP 程序中获取到的 access_token 是有效的。可以使用 access_token 来调用微信公众平台提供的各种接口,如拉取用户信息、发送消息等,而 access_token 的有效期为 2 小时。过期后需要重新获取。
检查获取用户信息时的 URL 地址是否正确,并且包含了参数 access_token
和 code
。获取用户信息的 URL 格式如下:
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
其中 ACCESS_TOKEN
是通过调用接口获取到的 access_token,而 OPENID
是用户的唯一标识。
code
和用户的唯一标识 openid
是否正确。该回答引用ChatGPT4与博主@晓码自在合作编写:
根据你的描述,缺失code造成无法获取access_token和openid的问题。这是因为微信授权时的callback URL配置有误导致的。
我的分析和建议如下:
综上,我的建议步骤是: