首先让我吐槽下:微信就是一个渣渣,提供的开发文档都是坑。完全就是给他填坑 坑填完了 也就出来了。 先说下注意事项 然后提供源码吧。
坑1: Response.Redirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=http://www.gsg.cq.cqtiandu.com/home/index&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect"); 这个是第一步,估计很多人都已经死在这里了。 注意第一个必须是HTTPS 第二个 回调连接 是http 如果你填写https 也就在微信浏览器打不开了。
坑2:这个是一个大坑大坑。 坑1的作用是拿出来code, 然后 var url = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", appid, appsecret, codes);来拿出openid 和access_token。 这个地方 code 可以拿出来,我TM secret不对都拿出来了,整了一天。就是返回40029(code 无效) 我用你给的code居然说code无效。然后找啊找啊 找不出来原因。肯定访问一次 而且肯定没超过5分钟。然后第二天就把密钥重置了下。然后可以了。这个SB 微信给了个错误的appsecret。(《!-- 不是同事拉着我我就砍死MHT了 !--》)
坑3: 微信里面是不支持跳转的,在第一步拿取code的时候是有个 回调连接的,这个必须写到你的要展现页面,如果写到一个方法 方法在跳转页面。是跳不过去的。
坑4:其他小坑都是自己问题,只能说明微信不人性化给的接口太复杂。多次恶心。 下面给源码。
public void Index1(string id) { //弹出授权页面(如在不弹出授权页面基础下未获得openid,弹出授权页面,提示用户授权) if (id == "1") { Response.Redirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=http://www.gsg.cq.cqtiandu.com/home/index&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect"); } else { //不弹出授权页面 Response.Redirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=http://www.gsg.cq.cqtiandu.com/home/index&response_type=code&scope=snsapi_base&state=1#wechat_redirect"); } }// 这个测试的时候用 /地址/home/index1/0 生成二维码然后微信扫描。刚进入官网也是用这个 生成的连接 public ActionResult Index() { string codes = Request["code"]; string codes1 = Request.Form["code"]; string codes2 = Request.RawUrl; var client = new System.Net.WebClient(); client.Encoding = System.Text.Encoding.UTF8; var url = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", appid, appsecret, codes); HttpWebResponse hp = GetResponse(url); string htmlval = Html(hp); string logins = htmlval.Replace("{", "").Replace("}", "").Replace(‘"‘, ‘ ‘); string[] log = logins.Split(‘,‘); if (log.Length > 3) { string[] OK = log[3].Split(‘:‘); string openid = OK[1].ToString(); string[] access = log[0].Split(‘:‘); string access_token = access[1].ToString(); LoginUser lguser = new LoginUser { UserId = openid.Trim(), access_token = access_token }; Session["Lguser"] = lguser; SqlParameter[] pms = { new SqlParameter("@openid",openid), new SqlParameter("@access_token",access_token) }; MessasgeInfor mginfor = Datafun.Mgfunctioninfor("insert into tb_openid(openid,access_token) values(@openid,@access_token)", pms); } MessasgeData mgdata = Datafun.MgfunctionData("select * from tb_tel"); ViewBag.tel = mgdata.Mgdata.Rows[0]["tel"]; return View(); }这个是首页 也就是拿取openid,我只要openid 所以就那个Openid 就是分割处理了