苏飞论坛

标题: OA系统集成腾讯企业邮箱模块获取access_token时报错 [打印本页]

作者: zuoyexingchen    时间: 2014-5-5 17:43
标题: OA系统集成腾讯企业邮箱模块获取access_token时报错
第一次接触腾讯的接口开发,不是很熟悉; 后台程序是用asp.net+c#写的,程序第一步是要获取token ,在执行调试的时候总是报了一个错误   System.Net.WebException   {"远程服务器返回错误: (400) 错误的请求。"},不知道是哪里的原因,知道的朋友能否给点例子参考一下,谢谢
作者: 站长苏飞    时间: 2014-5-5 17:51
这个一般是请求的参数或者是头信息不对,最好是能看下你请求的代码,建议使用我的Httphelper类
作者: ......    时间: 2014-5-5 22:28
你可以先试试,正常通过浏览请求,看看是否正常,如果浏览器请求正常的话,你在抓包看看,抓包后,主要对比你正常的请求,和你C#软件请求的不同之处,看看问题出在那里。
作者: zuoyexingchen    时间: 2014-5-6 09:49
站长苏飞 发表于 2014-5-5 17:51
这个一般是请求的参数或者是头信息不对,最好是能看下你请求的代码,建议使用我的Httphelper类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Net;
using System.Text;
using LitJson;
using System.Runtime.Serialization.Json;
using System.Web.Script.Serialization;
using System.ServiceModel.Web;
using System.Net.Security;
using System.Security;

namespace WebApplication1
{
    public partial class WebForm2 : System.Web.UI.Page
    {
         string client_id = "abc.com"; //注册的管理员帐号@后面的部分(能否理解为域名?)
         string client_secret = "abcdefg000111";//通过帐号获取的key(key已经获取,这里只是举例写了一个别的)
         string alias = "admin@abc.com";//腾讯企业邮箱登录用的邮箱帐号
         protected void btnOAuth_Click(object sender, EventArgs e)
        {
            try
            {
                string postUrl = "https://exmail.qq.com/cgi-bin/token"; //要发送的HTTPS地址
                string postData = "grant_type=client_credentials&client_id=abc.com&client_secret=abcdefg000111";//要与HTTPS一起发送的参数
           
                HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(postUrl);
                Request.Method = "POST";
                Request.ContentType = "application/x-www-form-urlencoded";
                byte[] data = Encoding.UTF8.GetBytes(postData);
                Stream newStream = Request.GetRequestStream();
                newStream.Write(data, 0, data.Length);
                HttpWebResponse response = (HttpWebResponse)Request.GetResponse();//程序允许到这里就报错了 就是我帖子里描述的: 远程服务器返回错误: (400) 错误的请求。
                Stream stream = response.GetResponseStream();
                StreamReader reader = new StreamReader(stream, System.Text.Encoding.UTF8, true);

                txtOAuth.Text = reader.ReadToEnd();//请求成功后返回的是JSON格式的数据, 这里只是简单的先看一下有没有数据返回,后期还得找方法解析JSON数据,楼主要是有类似的方法希望给点实例吧,谢谢了
            }
            catch (Exception ex)
            {
                txtOAuth.Text = ex.Message;
            }
        }
    }
}

//上面这些代码是我上网根据查的一些资料写的,不知道是不是少什么方法,请楼主给点提示什么的吧,折腾好几天了没结果
作者: zuoyexingchen    时间: 2014-5-6 09:50
站长苏飞 发表于 2014-5-5 17:51
这个一般是请求的参数或者是头信息不对,最好是能看下你请求的代码,建议使用我的Httphelper类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Net;
using System.Text;
using LitJson;
using System.Runtime.Serialization.Json;
using System.Web.Script.Serialization;
using System.ServiceModel.Web;
using System.Net.Security;
using System.Security;

namespace WebApplication1
{
    public partial class WebForm2 : System.Web.UI.Page
    {
         string client_id = "abc.com"; //注册的管理员帐号@后面的部分(能否理解为域名?)
         string client_secret = "abcdefg000111";//通过帐号获取的key(key已经获取,这里只是举例写了一个别的)
         string alias = "admin@abc.com";//腾讯企业邮箱登录用的邮箱帐号
         protected void btnOAuth_Click(object sender, EventArgs e)
        {
            try
            {
                string postUrl = "https://exmail.qq.com/cgi-bin/token"; //要发送的HTTPS地址
                string postData = "grant_type=client_credentials&client_id=abc.com&client_secret=abcdefg000111";//要与HTTPS一起发送的参数
           
                HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(postUrl);
                Request.Method = "POST";
                Request.ContentType = "application/x-www-form-urlencoded";
                byte[] data = Encoding.UTF8.GetBytes(postData);
                Stream newStream = Request.GetRequestStream();
                newStream.Write(data, 0, data.Length);
                HttpWebResponse response = (HttpWebResponse)Request.GetResponse();//程序允许到这里就报错了 就是我帖子里描述的: 远程服务器返回错误: (400) 错误的请求。
                Stream stream = response.GetResponseStream();
                StreamReader reader = new StreamReader(stream, System.Text.Encoding.UTF8, true);

                txtOAuth.Text = reader.ReadToEnd();//请求成功后返回的是JSON格式的数据, 这里只是简单的先看一下有没有数据返回,后期还得找方法解析JSON数据,楼主要是有类似的方法希望给点实例吧,谢谢了
            }
            catch (Exception ex)
            {
                txtOAuth.Text = ex.Message;
            }
        }
    }
}

//上面这些代码是我上网根据查的一些资料写的,不知道是不是少什么方法,请楼主给点提示什么的吧,折腾好几天了没结果非常感谢你帮了我的大忙,真的太感谢你啦!
作者: 站长苏飞    时间: 2014-5-6 09:53
这个接口没写过,你确定你的网址是对的,参数是对的吗?貌似像是网址不对
作者: zuoyexingchen    时间: 2014-5-6 10:27
站长苏飞 发表于 2014-5-6 09:53
这个接口没写过,你确定你的网址是对的,参数是对的吗?貌似像是网址不对

噢,腾讯企业邮箱有一个相关文档,里面是这样的写的。
根据申请到的 client_id 和 client_secret,采用 ClientCredentials 方式获取 access_token。
其中 client_id 为管理员帐号,client_secret 为管理端开放接口申请到的 key。
假设 client_id 为 biz0876xa,client_secret 为 yuw_0dfuxUa。
请求示例如下:
POST https://exmail.qq.com/cgi-bin/token HTTP /1.1
Host: exmail.qq.com
Content-Length: 75
grant_type=client_credentials&client_id=biz0876xa&client_secret=yuw_0dfuxUa
或者:
POST https://exmail.qq.com/cgi-bin/token HTTP /1.1
Host: exmail.qq.com
Authorization: Basic Yml6MDg3NnhhOnl1d18wZGZ1eFVh
Content-Length: 29
grant_type=client_credentials
如果验证通过,返回:
{
"access_token":"jIFA9ju6v5XP",
"token_type":"Bearer",
"expires_in":86400,
"refresh_token":""
}

相关文档链接:http://wenku.baidu.com/view/43298d0cfe4733687e21aa7f.html
作者: zuoyexingchen    时间: 2014-5-6 10:37
...... 发表于 2014-5-5 22:28
你可以先试试,正常通过浏览请求,看看是否正常,如果浏览器请求正常的话,你在抓包看看,抓包后,主要对比 ...

将这一行HTTPS链接(https://exmail.qq.com/cgi-bin/to ... p;client_secret=xxx) 直接输入浏览器地址栏中请求吗?我刚才用360浏览器又试了一下,返回的内容为:{
"error":"invalid_request"
}
用IE9.0也试了一下 返回的网页标题为:HTTP 400 错误的请求,网页中的“详细信息”内容为:此错误(HTTP 400 错误的请求)意味着 Internet Explorer 可以连接到 Web 服务器,但是因为地址问题无法找到该网页。不知道什么原因?
作者: 552312627    时间: 2014-6-30 18:22
zuoyexingchen 发表于 2014-5-6 10:37
将这一行HTTPS链接(https://exmail.qq.com/cgi-bin/token?grant_type=client_credentials&client_id=abc ...

管理账户不对;
http://wenku.baidu.com/view/69050447be1e650e52ea990b.html?re=view&qq-pf-to=pcqq.c2c
作者: ching126    时间: 2014-9-9 22:59
我只是路过打酱油的。
作者: vip_pom    时间: 2014-10-29 14:54
楼主在写代码之前,不妨先用Fildder工具测试下参数是否正确。然后再写代码。
Filder参考教程这里。http://wenku.baidu.com/link?url=urIS3U3mavXFr3g3yq7_I6NBkvnATBDvSw9pVg2TVYz25goiSy4WdgMqaFijymQoxddIZu6M-JAj9LOtOcYcnt5DDNOr3njw-h-2F1qQSgm

问下楼主是否成功了?  本机的版本号Ver,在哪里获取啊???
作者: vip_pom    时间: 2014-10-29 15:06
ca
作者: vip_pom    时间: 2014-11-28 14:10
我们一起研究啊。我这里只差下发新邮件了。如果版本号变更,我都能获取到了。
就是收不到新邮件提醒,有知道的给我留言啊。我一定回复。
http://www.sodoeasy.com/gotoandlearn/?p=289
作者: vip_pom    时间: 2014-11-28 14:11
本帖最后由 vip_pom 于 2014-11-28 14:14 编辑

没人啊

作者: mayifeixiang    时间: 2016-4-19 15:22
我现在也在写这个,以前没做过这方面的啊,楼主你那还有这个代码吗?发一份这一部分的行不?我邮箱:904698669@qq.com




欢迎光临 苏飞论坛 (http://www.sufeinet.com/) Powered by Discuz! X3.4