微信订阅号接口自动化测试测试时可以但是实际发送却没有发到指定url上

方倍微信公众平台开发(76) 无高级接口账号获取用户基本信息
本文介绍如何获得微信公众平台关注用户的基本信息,包括昵称、头像、性别、国家、省份、城市、语言。
本文的方法将囊括订阅号和服务号以及自定义菜单各种场景,无论是否有高级接口权限,都有办法来获得用户基本信息,而无需模拟登录。
在本文中,特别要注意的是有两个不同的Access Token,他们产生的方式不一样,一种是使用AppID和AppSecret获取的access_token,一种是OAuth2.0授权中产生的access_token,方倍工作室分别称为全局Access Token和授权Access Token。
一、通过全局Access Token获取用户基本信息
1. 用户关注以及回复消息的时候,均可以获得用户的OpenID
&ToUserName&&![CDATA[gh_b629c48b653e]]&&/ToUserName&
&FromUserName&&![CDATA[ollB4jv7LA3tydjviJp5V9qTU_kA]]&&/FromUserName&
&CreateTime&&/CreateTime&
&MsgType&&![CDATA[event]]&&/MsgType&
&Event&&![CDATA[subscribe]]&&/Event&
&EventKey&&![CDATA[]]&&/EventKey&
其中的FromUserName就是OpenID
2. 然后使用access_token接口,请求获得全局Access Token
https://api./cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
返回结果:
&access_token&: &NU7Kr6v9L9TQaqm5NE3OTPctTZx797Wxw4Snd2WL2HHBqLCiXlDVOw2l-Se0I-WmOLLniAYLAwzhbYhXNjbLc_KAA092cxkmpj5FpuqNO0IL7bB0Exz5s5qC9Umypy-rz2y441W9qgfnmNtIZWSjSQ&,
&expires_in&: 7200
3. 再使用全局ACCESS_TOKEN获取OpenID的详细信息
https://api./cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID
返回如下:
&subscribe&: 1,
&openid&: &oLVPpjqs2BhvzwPj5A-vTYAX4GLc&,
&nickname&: &方倍&,
&language&: &zh_CN&,
&city&: &深圳&,
&province&: &广东&,
&country&: &中国&,
&headimgurl&: &/mmopen/JcDicrZBlREhnNXZRudod9PmibRkIs5K2f1tUQ7lFjC63pYHaXGxNDgMzjGDEuvzYZbFOqtUXaxSdoZG6iane5ko9H30krIbzGv/0&,
&subscribe_time&:
至此,获得用户的基本信息。
二、通过OAuth2.0方式弹出授权页面获得用户基本信息
1. 首先配置回调域名
&2. 构造请求url如下:
https://open./connect/oauth2/authorize?appid=wx8888&redirect_uri=/oauth2.php&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect
页面URL中的
scope=snsapi_userinfo 表示应用授权作用域为请求用户信息
★ 如果使用别人的AppID和AppSecret,那么获得的OpenID是那个有高级接口权限的服务号的,这里可以通过消息回复,获取本公众账号下的OpenID,带入回调中,与另一个OpenID进行关联
https://open./connect/oauth2/authorize?appid=wx8888&redirect_uri=/oauth2.php?userid=oc7tbuPA9BgUCLADib5nB3k2KWWg&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect
将该链接回复给关注用户,用户点击后,弹出应用授权界面
3. 回调页面得到链接如下,回调url中将包含参数code
/oauth2.php?code=00b788e3ba57a8d8ab5d9f&state=1
或者 /oauth2.php?userid=oc7tbuPA9BgUCLADib5nB3k2KWWg&code=00b788e3ba57a8d8ab5d9f&state=1
4. 再使用code换取oauth2的授权access_token
https://api./sns/oauth2/access_token?appid=wx8888&secret=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&code=00b788e3ba57a8d8ab5d9f&grant_type=authorization_code
获得授权Access Token:
&access_token&: &OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5AI1bw2uqN--2jXoBLIM5d6L9RImvm8Vg8cBAiLpWA8Vw&,
&expires_in&: 7200,
&refresh_token&: &OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5CZPAwZksiuz_6x_TfkLoXLU7kdKM2232WDXB3Msuzq1A&,
&openid&: &oLVPpjqs9BhvzwPj5A-vTYAX3GLc&,
&scope&: &snsapi_userinfo,&
5. 再使用授权Access Token获取用户信息
https://api./sns/userinfo?access_token=OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5AI1bw2uqN--2jXoBLIM5d6L9RImvm8Vg8cBAiLpWA8Vw&openid=oLVPpjqs9BhvzwPj5A-vTYAX3GLc
&openid&: &oLVPpjqs9BhvzwPj5A-vTYAX3GLc&,
&nickname&: &方倍&,
&language&: &zh_CN&,
&city&: &Shenzhen&,
&province&: &Guangdong&,
&country&: &CN&,
&headimgurl&: &/mmopen/utpKYf69VAbCRDRlbUsPsdQN38DoibCkrU6SAMCSNx558eTaLVM8PyM6jlEGzOrH67hyZibIZPXu4BK1XNWzSXB3Cs4qpBBg18/0&,
&privilege&: []
获取用户信息完成。此方法详细过程可参考&微信公众平台开发(71)OAuth2.0网页授权
/weixin/987.html
三、通过OAuth2.0方式不弹出授权页面获得用户基本信息
1. 配置回调域名
2. 构造请求url如下:
https://open./connect/oauth2/authorize?appid=wx8888&redirect_uri=/oauth2.php&response_type=code&scope=snsapi_base&state=1#wechat_redirect
页面URL中的
scope=snsapi_base 表示应用授权作用域为 不弹出授权页面,直接跳转,只获取用户openid
3. 返回回调页面如下
?code=02a9bed29bed3a48fe56e700&state=1
这里获得到了code
4. 再使用code获取OpenID
https://api./sns/oauth2/access_token?appid=wx8888&secret=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&code=02a9bed29bed3a48fe56e700&grant_type=authorization_code
&access_token&: &OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-oJ9VmO-0Z-_izfnSAX_s0aqDsYkW4s8W5dLZ4iyNj5Y6vey3dgDtFki5C8r6D0E6mSVxxtb8BjLMhb-mCyT_Yg&,
&expires_in&: 7200,
&refresh_token&: &OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-oJ9VmO-0Z-_izfnSAX_s0aqDsYkW4s8W5dLZ4iyNj5YBkF0ZUH1Ew8Iqea6x_itq13sYDqP1D7ieaDy9u2AHHw&,
&openid&: &oLVPpjqs9BhvzwPj5A-vTYAX3GLc&,
&scope&: &snsapi_base&
5. 然后获取全局Access Token【以下与方法一中相同】
https://api./cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
返回结果:
&access_token&: &NU7Kr6v9L9TQaqm5NE3OTPctTZx797Wxw4Snd2WL2HHBqLCiXlDVOw2l-Se0I-WmOLLniAYLAwzhbYhXNjbLc_KAA092cxkmpj5FpuqNO0IL7bB0Exz5s5qC9Umypy-rz2y441W9qgfnmNtIZWSjSQ&,
&expires_in&: 7200
6. 再使用全局ACCESS_TOKEN获取OpenID的详细信息
https://api./cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID
返回如下:
&subscribe&: 1,
&openid&: &oLVPpjqs2BhvzwPj5A-vTYAX4GLc&,
&nickname&: &方倍&,
&language&: &zh_CN&,
&city&: &深圳&,
&province&: &广东&,
&country&: &中国&,
&headimgurl&: &/mmopen/JcDicrZBlREhnNXZRudod9PmibRkIs5K2f1tUQ7lFjC63pYHaXGxNDgMzjGDEuvzYZbFOqtUXaxSdoZG6iane5ko9H30krIbzGv/0&,
&subscribe_time&:
成功获得用户基本信息。
四、使用哪种方法最合适
有高级接口权限:  消息回复中三种都可以   自定义菜单中使用方法二或方法三 (招商银行信用卡中心使用方法三,康盛微社区使用方法二)
没有高级接口权限: 消息回复中使用方法二   自定义菜单中暂无方法 & & & & & &(没有高级权限可以用别人的Appid和AppSecret)
&目前均无高级接口 & & 消息回复中使用方法二 & & &自定义菜单中暂无方法 & & & & & &(没有高级权限可以用别人的Appid和AppSecret,方倍工作室使用的就是这种)
五、效果展示&
方倍工作室的公众账号是订阅号,其使用第三方appid和appsecret获得用户基本信息截图如下:
关注方倍工作室(二维码见下图),回复&授权&,返回消息,点击图片
弹出获取到的结果(图片做了防盗处理,方法请参考&微信公众平台开发(77) 图片下载)
/weixin/991.
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。3182人阅读
  最近公司在做微信开发,其实就是接口开发,网上找了很多资料,当然园友也写了很多教程,但都是理论说了一大堆,实用指导或代码很少。如果你自己仔细研究下,其实就那么点东西,C#实现起来也很简单,原本不想写这篇文章的,但是本人当时摸索走了很多弯路,这边总结下,希望初次接触微信公众平台的朋友别像当时的我一样。
  自己动手,丰衣足食。
服务号和订阅号
  服务号是公司申请的微信公共账号,订阅号是个人申请的,我个人也申请了一个,不过没怎么用。
  服务号
1个月(30天)内仅可以发送1条群发消息。发给订阅用户(粉丝)的消息,会显示在对方的聊天列表中。在发送消息给用户时,用户将收到即时的消息提醒。服务号会在订阅用户(粉丝)的通讯录中。可申请自定义菜单。
  订阅号
每天(24小时内)可以发送1条群发消息。发给订阅用户(粉丝)的消息,将会显示在对方的订阅号文件夹中。在发送消息给订阅用户(粉丝)时,订阅用户不会收到即时消息提醒。在订阅用户(粉丝)的通讯录中,订阅号将被放入订阅号文件夹中。订阅号不支持申请自定义菜单。
  启用开发模式需要先成为开发者,而且编辑模式和开发模式只能选择一个,进入微信公众平台-开发模式,如下:
  需要填写url和token,当时本人填写这个的时候花了好久,我本以为填写个服务器的url就可以了(80端口),但是不行,主要是没有仔细的阅读提示信息,所以总是提示
  从上面可以看出,点击提交后微信会向我们填写的服务器发送几个参数,然后需要原样返回出来,所以在提交url的时候,先在服务器创建接口测试返回echostr参数内容。代码:
//成为开发者url测试,返回echoStr
public void InterfaceTest()
string token = &填写的token&;
if (string.IsNullOrEmpty(token))
string echoString = HttpContext.Current.Request.QueryString[&echoStr&];
string signature = HttpContext.Current.Request.QueryString[&signature&];
string timestamp = HttpContext.Current.Request.QueryString[&timestamp&];
string nonce = HttpContext.Current.Request.QueryString[&nonce&];
if (!string.IsNullOrEmpty(echoString))
HttpContext.Current.Response.Write(echoString);
HttpContext.Current.Response.End();
  在一般处理程序ashx的ProcessRequest的方法内调用上面的方法,url填写的就是这个ashx的服务器地址,token是一个服务器标示,可以随便输入,代码中的token要和申请填写的一致,成为开发者才能做开发。
  我们添加一些微信服务号,聊天窗口下面有些菜单,这个可以在编辑模式简单配置,也可以在开发模式代码配置。微信公众平台开发者文档:,可以看到创建菜单的一些要点,下面的,只是调试接口是否可用,并不是直接创建菜单的,菜单分为两种:
click:&用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event 的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互。view:&用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的url值 (即网页链接),达到打开网页的目的,建议与网页授权获取用户基本信息接口结合,获得用户的登入个人信息。
  click菜单需要填一个key,这个是在我们菜单点击事件的时候会用到,view只是一个菜单超链接。菜单数据是json格式,官网是php示例,其实C#实现起来也很简单,就是post发送一个json数据,示例代码:
public partial class createMenu : System.Web.UI.Page
protected void Page_Load(object sender, EventArgs e)
FileStream fs1 = new FileStream(Server.MapPath(&.&)+&\\menu.txt&, FileMode.Open);
StreamReader sr = new StreamReader(fs1, Encoding.GetEncoding(&GBK&));
string menu = sr.ReadToEnd();
sr.Close();
fs1.Close();
GetPage(&https://api./cgi-bin/menu/create?access_token=access_token&, menu);
public string GetPage(string posturl, string postData)
Stream outstream = null;
Stream instream = null;
StreamReader sr = null;
HttpWebResponse response = null;
HttpWebRequest request = null;
Encoding encoding = Encoding.UTF8;
byte[] data = encoding.GetBytes(postData);
// 准备请求...
// 设置参数
request = WebRequest.Create(posturl) as HttpWebR
CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieC
request.AllowAutoRedirect = true;
request.Method = &POST&;
request.ContentType = &application/x-www-form-urlencoded&;
request.ContentLength = data.L
outstream = request.GetRequestStream();
outstream.Write(data, 0, data.Length);
outstream.Close();
//发送请求并获取相应回应数据
response = request.GetResponse() as HttpWebR
//直到request.GetResponse()程序才开始向目标网页发送Post请求
instream = response.GetResponseStream();
sr = new StreamReader(instream, encoding);
//返回结果网页(html)代码
string content = sr.ReadToEnd();
string err = string.E
Response.Write(content);
catch (Exception ex)
string err = ex.M
return string.E
  menu.text里面的内容就是json示例菜单,大家可以从示例复制下来,按照你的需要修改一些就行了。
  关于access_token,其实就是一个请求标示,获取方式:https://api./cgi-bin/token?grant_type=client_credential&appid=appid&secret=secret;appid和secret是开发者标示,在你的信息里面可以看到,通过这个链接返回一个json数据,就可以得到access_token值。
  需要注意的是:access_token有一定的时效性,失效的话就需要重新获取下,这个在本机就可以创建,不需要上传到服务器,创建菜单正确,返回{&errcode&:0,&errmsg&:&ok&}提示信息。这边就不截图了,大家试下就可以看到效果,一般创建菜单是一到两分钟生效,实在不行就重新关注下。
查询、删除菜单
  查询和删除菜单也很简单,只不过是get请求,不需要传数据,看下示例代码:
public partial class selectMenu : System.Web.UI.Page
protected void Page_Load(object sender, EventArgs e)
GetPage(&https://api./cgi-bin/menu/get?access_token=access_token&);
//GetPage(&https://api./cgi-bin/menu/delete?access_token=access_token&);
public string GetPage(string posturl)
Stream instream = null;
StreamReader sr = null;
HttpWebResponse response = null;
HttpWebRequest request = null;
Encoding encoding = Encoding.UTF8;
// 准备请求...
// 设置参数
request = WebRequest.Create(posturl) as HttpWebR
CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieC
request.AllowAutoRedirect = true;
request.Method = &GET&;
request.ContentType = &application/x-www-form-urlencoded&;
//发送请求并获取相应回应数据
response = request.GetResponse() as HttpWebR
//直到request.GetResponse()程序才开始向目标网页发送Post请求
instream = response.GetResponseStream();
sr = new StreamReader(instream, encoding);
//返回结果网页(html)代码
string content = sr.ReadToEnd();
string err = string.E
Response.Write(content);
catch (Exception ex)
string err = ex.M
return string.E
  access_token获取方式上面已经讲过了,查询菜单返回的是json数据,其实就是我们创建菜单的menu.txt里面的内容。
  删除成功返回信息提示:{&errcode&:0,&errmsg&:&ok&},这个也只要在本地运行就可以了。
  微信公众平台开发者文档:,我们使用微信就是要对用户发送的信息进行处理,这边以接受普通消息为例,语音、图片消息等,举一反三可得。
  从文档上可以看出接受消息获得的是一个xml格式文件,当时有点犯傻的是,我要在哪边进行接受消息啊?还郁闷了半天,其实就是你一开始填写的url,是不是很汗颜啊,哈哈。
&ToUserName&&![CDATA[toUser]]&&/ToUserName&
&FromUserName&&![CDATA[fromUser]]&&/FromUserName&
&CreateTime&&/CreateTime&
&MsgType&&![CDATA[text]]&&/MsgType&
&Content&&![CDATA[this is a test]]&&/Content&
&MsgId&3456&/MsgId&
  我们在ashx添加下面代码:
public void ProcessRequest(HttpContext param_context)
string postString = string.E
if (HttpContext.Current.Request.HttpMethod.ToUpper() == &POST&)
using (Stream stream = HttpContext.Current.Request.InputStream)
Byte[] postBytes = new Byte[stream.Length];
stream.Read(postBytes, 0, (Int32)stream.Length);
postString = Encoding.UTF8.GetString(postBytes);
Handle(postString);
/// &summary&
/// 处理信息并应答
/// &/summary&
private void Handle(string postStr)
messageHelp help = new messageHelp();
string responseContent = help.ReturnMessage(postStr);
HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
HttpContext.Current.Response.Write(responseContent);
  messageHelp是消息处理帮助类,这边提供下部分代码,完整的可以下载来,获取的postString是xml,格式如上,我们这边只需要转换成XmlDocument进行解析就行了:
//接受文本消息
public string TextHandle(XmlDocument xmldoc)
string responseContent = &&;
XmlNode ToUserName = xmldoc.SelectSingleNode(&/xml/ToUserName&);
XmlNode FromUserName = xmldoc.SelectSingleNode(&/xml/FromUserName&);
XmlNode Content = xmldoc.SelectSingleNode(&/xml/Content&);
if (Content != null)
responseContent = string.Format(ReplyType.Message_Text,
FromUserName.InnerText,
ToUserName.InnerText,
DateTime.Now.Ticks,
&欢迎使用微信公共账号,您输入的内容为:& + Content.InnerText+&\r\n&a href=\&\&&点击进入&/a&&);
return responseC
/// &summary&
/// 普通文本消息
/// &/summary&
public static string Message_Text
get { return @&&xml&
&ToUserName&&![CDATA[{0}]]&&/ToUserName&
&FromUserName&&![CDATA[{1}]]&&/FromUserName&
&CreateTime&{2}&/CreateTime&
&MsgType&&![CDATA[text]]&&/MsgType&
&Content&&![CDATA[{3}]]&&/Content&
&/xml&&; }
  上面的代码就是接受消息,并做一些处理操作,返回消息。
发送消息(图文、菜单事件响应)
  这边发送消息我分为三种:普通消息、图文消息和菜单事件响应。普通消息其实上面说接受消息的时候讲到了,完整的代码下边下载来看。
  我们先看下图文消息和菜单事件响应,微信公众平台开发者文档:,xml格式为:
2 &ToUserName&&![CDATA[toUser]]&&/ToUserName&
3 &FromUserName&&![CDATA[fromUser]]&&/FromUserName&
4 &CreateTime&&/CreateTime&
5 &MsgType&&![CDATA[news]]&&/MsgType&
6 &ArticleCount&2&/ArticleCount&
7 &Articles&
9 &Title&&![CDATA[title1]]&&/Title&
10 &Description&&![CDATA[description1]]&&/Description&
11 &PicUrl&&![CDATA[picurl]]&&/PicUrl&
12 &Url&&![CDATA[url]]&&/Url&
13 &/item&
15 &Title&&![CDATA[title]]&&/Title&
16 &Description&&![CDATA[description]]&&/Description&
17 &PicUrl&&![CDATA[picurl]]&&/PicUrl&
18 &Url&&![CDATA[url]]&&/Url&
19 &/item&
20 &/Articles&
  图文消息分为两种,我们先看下效果,找的圆通速递的微信服务号做示例:
  刚开始做的时候,我以为这两种应该不是用的同一个接口,但是在文档中找了半天也没有找到除这个之外的,就试了下两个图文消息,发现就是这个接口发送的,如果多个的话,item中的Description会失效,只会显示Title,大家试下就知道了,示例代码:
public string EventHandle(XmlDocument xmldoc)
string responseContent = &&;
XmlNode Event = xmldoc.SelectSingleNode(&/xml/Event&);
XmlNode EventKey = xmldoc.SelectSingleNode(&/xml/EventKey&);
XmlNode ToUserName = xmldoc.SelectSingleNode(&/xml/ToUserName&);
XmlNode FromUserName = xmldoc.SelectSingleNode(&/xml/FromUserName&);
if (Event!=null)
//菜单单击事件
if (Event.InnerText.Equals(&CLICK&))
if (EventKey.InnerText.Equals(&click_one&))//click_one
responseContent = string.Format(ReplyType.Message_Text,
FromUserName.InnerText,
ToUserName.InnerText,
DateTime.Now.Ticks,
&你点击的是click_one&);
else if (EventKey.InnerText.Equals(&click_two&))//click_two
responseContent = string.Format(ReplyType.Message_News_Main,
FromUserName.InnerText,
ToUserName.InnerText,
DateTime.Now.Ticks,
string.Format(ReplyType.Message_News_Item,&我要寄件&,&&,
&/orderPlace.jpg&,
string.Format(ReplyType.Message_News_Item, &订单管理&, &&,
&/orderManage.jpg&,
else if (EventKey.InnerText.Equals(&click_three&))//click_three
responseContent = string.Format(ReplyType.Message_News_Main,
FromUserName.InnerText,
ToUserName.InnerText,
DateTime.Now.Ticks,
string.Format(ReplyType.Message_News_Item, &标题&, &摘要&,
&/jieshao.jpg&,
return responseC
/// &summary&
/// 图文消息主体
/// &/summary&
public static string Message_News_Main
return @&&xml&
&ToUserName&&![CDATA[{0}]]&&/ToUserName&
&FromUserName&&![CDATA[{1}]]&&/FromUserName&
&CreateTime&{2}&/CreateTime&
&MsgType&&![CDATA[news]]&&/MsgType&
&ArticleCount&{3}&/ArticleCount&
&Articles&
&/Articles&
/// &summary&
/// 图文消息项
/// &/summary&
public static string Message_News_Item
return @&&item&
&Title&&![CDATA[{0}]]&&/Title&
&Description&&![CDATA[{1}]]&&/Description&
&PicUrl&&![CDATA[{2}]]&&/PicUrl&
&Url&&![CDATA[{3}]]&&/Url&
  需要注意的是:XmlNode Event = xmldoc.SelectSingleNode(&/xml/Event&)表示获取的是事件类型,XmlNode
EventKey = xmldoc.SelectSingleNode(&/xml/EventKey&)表示事件标示,就是我们创建菜单添加click的key,通过key我们就可以判断出是点的哪个菜单。
  还有一点是回复超链接,有时候在服务号会发送一些链接,我们打开直接就会链接到相关网址,只需要在回复内容中添加:&a href=&&&点击进入&/a&,就可以了。
示例Demo下载
  下载地址:
  关于微信公众平台当然还有许多其他的东西,本篇只是一些经验之谈,希望可以起到抛砖引玉的作用。有时候我们发现一些新鲜事物,觉得很难,就远远的看着,如果你用心的去感受它,其实也就这么回事。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:190995次
积分:4104
积分:4104
排名:第2470名
原创:182篇
转载:244篇
评论:52条
(2)(18)(45)(13)(28)(4)(15)(7)(42)(26)(13)(24)(36)(22)(10)(9)(5)(17)(7)(11)(26)(10)(13)(15)(10)微信公众号开发接口 有没有给指定的账号发送信息呢?_百度知道
微信公众号开发接口 有没有给指定的账号发送信息呢?
注意:不是广播群发,而是针对特定的某一个或者几小个发送发送发信? 求解答~!!!!!!急急急
提问者采纳
为了避免骚扰事件,微信公众平台特别做了设置,只有当对方主动与你互动48小时内,你可以跟对方进行主动推送信息。或者你可以将那些人先分组,然后群发给他们信息。其他的方式都有被封号的可能,强烈建议不要使用!
您看看能不能试下这样一个功能,利用微信的开发接口
写一个程序,当满足某个条件的时候就向特定的用户发送指定的信息,然后这一系列的动作都是程序来完成的。
可以,不过需要对方先要主动和你互动,编程我不懂,不过微信的规则是不能改变的
提问者评价
谢谢你 我知道了
其他类似问题
按默认排序
其他1条回答
微信公众平台-编辑模式和开发模式,都可以针对某一个人或者是一个组发相应的信息。(这种消息也是以群发消息的途径,但是只发送给指定的人群)
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁微信自定义菜单开发问题
[问题点数:40分]
微信自定义菜单开发问题
[问题点数:40分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。&在笔者的小q机器人(号:xiaoqrobot)中有一个非常好玩的功能&人脸检测&,它能够检测出用户发送的图片中有多少张人脸,并且还能分析出每张脸所对应的人种、性别和年龄。几乎每天都有一些用户在使用&人脸检测&,该功能的趣味性和娱乐性在于能够让用户知道自己的长相与真实年龄是否相符,是否男(女)性化。本文将为读者介绍人脸检测应用的完整实现过程。
&&&&&&& 人脸检测属于人脸识别的范畴,它是一个复杂的具有挑战性的模式匹配问题,国内外许多组织、科研机构都在专门研究该问题。国内的Face++团队专注于研发人脸检测、识别、分析和重建技术,并且向广大开发者开放了人脸识别API,本文介绍的&人脸检测&应用正是基于Face++ API进行开发。
Face++简介
& & & & Face++是北京旷视有限公司旗下的人脸识别云服务平台,Face++平台通过提供云端API、离线SDK、以及面向用户的自主研发产品等形式,将人脸识别技术广泛应用到互联网及移动应用场景中。Face++为广大开发者提供了简单易用的API,开发者可以轻松搭建属于自己的云端身份认证、用户兴趣挖掘、移动体感交互、社交娱乐分享等多种类型的应用。
& & & & Face++提供的技术服务包括人脸检测、人脸分析和人脸识别,主要说明如下:
& & & & & & & &&1)人脸检测:可以从图片中快速、准确的定位面部的关键区域位置,包括眉毛、眼睛、鼻子、嘴巴等。
& & & & & & & &&2)人脸分析:可以从图片或实时视频流中分析出人脸的性别(准确度达96%)、年龄、种族等多种属性。
& & & & & & & &&3)人脸识别:可以快速判定两张照片是否为同一个人,或者快速判定视频中的人像是否为某一位特定的人。
& & & &&Face++的中文网址为,要使用Face++ API,需要注册成为Face++开发者,也就是要注册一个Face++账号。注册完成后,先创建应用,创建应用时需要填写&应用名称&、&应用描述&、&API服务器&、&应用类型&和&应用平台&,读者可以根据实际情况填写。应用创建完成后,可以看到应用的详细信息,如下图所示。
& & & & & & & &&
& & & & 上图中,最重要的是API KEY和API SECRET,在调用Face++提供的API时,需要传入这两个参数。
人脸检测API介绍
& & & & 在Face++网站的&API文档&中,能够看到Face++提供的所有API,我们要使用的人脸检测接口是detect分类下的&/detection/detect&,它能够检测出给定图片(Image)中的所有人脸(Face)的位置和相应的面部属性,目前面部属性包括性别(gender)、年龄(age)、种族(race)、微笑程度(smiling)、眼镜(glass)和姿势(pose)。
& & & & 读者可以在中了解到人脸检测接口的详细信息,该接口的请求地址如下:
&/v2/detection/detect?url=URL&api_secret=API_SECRET&api_key=API_KEY&&
调用上述接口,必须要传入参数api_key、api_secret和待检测的图片。其中,待检测的图片可以是URL,也可以是POST方式提交的二进制数据。在账号后台,接收用户发送的图片,得到的是图片的访问路径(PicUrl),因此,在本例中,直接使用待检测图片的URL是最方便的。调用人脸检测接口返回的是JSON格式数据如下:
这里只对本文将要实现的&人脸检测&功能中主要用到的参数进行说明,参数说明如下:
1)face是一个数组,当一张图片中包含多张人脸时,所有识别出的人脸信息都在face数组中。
2)age中的value表示估计年龄,range表示误差范围。例如,上述结果中value=23,range=5,表示人的真实年龄在18岁至28岁左右。
3)gender中的value表示性别,男性为Male,女性为Female;gender中的confidence表示检测结果的可信度。
4)race中的value表示人种,黄色人种为Asian,白色人种为White,黑色人种为Black;race中的confidence表示检测结果的可信度。
5)center表示人脸框中心点坐标,可以将x用于计算人脸的左右顺序,即x坐标的值越小,人脸的位置越靠近图片的左侧。
人脸检测API的使用方法
& & & & 为了方便开发者调用人脸识别API,Face++团队提供了基于Objective-C、Java(Android)、Matlab、Ruby、C#等多种语言的,读者可以在Face++网站的&工具下载&版块下载相关的SDK。在本例中,笔者并不打算使用官方提供的SDK进行开发,主要原因如下:1)人脸检测API的调用比较简单,自己写代码实现也并不复杂;2)如果使用SDK进行开发,笔者还要花费大量篇幅介绍SDK的使用,这些并不是本文的重点;3)自己写代码实现比较灵活。当图片中有多张人脸时,人脸检测接口返回的数据是无序的,开发者可以按照实际使用需求进行排序,例如,将图片中的人脸按照从左至右的顺序进行排序。
编程调用人脸检测API
& & & & 首先,要对人脸检测接口返回的结构进行封装,建立与之对应的Java对象。由于人脸检测接口返回的参数较多,笔者只是将本例中需要用到的参数抽取出来,封装成Face对象,对应的代码如下:
与普通Java类不同的是,Face类实现了Comparable接口,并实现了该接口的compareTo()方法,这正是Java中对象排序的关键所在。112-119行代码是通过比较每个Face的脸部中心点的横坐标来决定对象的排序方式,这样能够实现检测出的多个Face按从左至右的先后顺序进行排序。
& & & & 接下来,是人脸检测API的调用及相关处理逻辑,笔者将这些实现全部封装在FaceService类中,该类的完整实现如下:
上述代码虽然多,但条理很清晰,并不难理解,所以笔者只挑重点的进行讲解,主要说明如下:
1)70行:参数url表示图片的链接,由于链接中存在特殊字符,作为参数传递时必须进行URL编码。请读者记住:不管是什么应用,调用什么接口,凡是通过GET传递的参数中可能会包含特殊字符,都必须进行URL编码,除了中文以外,特殊字符还包括等号&=&、与&&&、空格& &等。
2)76-97行:使用JSON-lib解析人脸检测接口返回的JSON数据,并将解析结果存入List中。
3)99行:对集合中的对象进行排序,使用Collections.sort()方法排序的前提是集合中的Face对象实现了Comparable接口。
4)146-203行:组装返回给用户的消息内容。考虑到的文本消息内容长度有限制,当一张图片中识别出的人脸过多,则只返回一些汇总信息给用户。
5)211-219行:detect()方法是public的,提供给其他类调用。笔者可以在本地的开发工具中运行上面的main()方法,测试detect()方法的输出。
公众账号后台的实现
在公众账号后台的CoreService类中,需要对用户发送的消息类型进行判断,如果是图片消息,则调用人脸检测方法进行分析,如果是其他消息,则返回人脸检测的使用指南。CoreService类的完整代码如下:
到这里,人脸检测应用就全部开发完成了,整个项目的完整结构如下:
运行结果如下:
笔者用自己的相片测试了两次,测试结果分别是26岁、30岁,这与笔者的实际年龄相差不大,可见,Face++的人脸检测准确度还是比较高的。为了增加人脸检测应用的趣味性和娱乐性,笔者忽略了年龄估计值的正负区间。读者可以充分发挥自己的想像力和创造力,使用Face++ API实现更多实用、有趣的功能。应用开发不是简单的接口调用!
地区: 微信公众平台,人脸识别,微信公众帐号,Face++,对象排序
共有0人喜欢&&共0条评论
&&&&&&&&表情
还没有评论内容
上一篇: 下一篇:
精品账号随机推荐
微信使用技巧
简介:微信网-微信公众平台账号大全收录了各种微信公众号,微信,微信订阅号,微信网页版,等各种微信公众平台账号。
说明:微信网和腾讯微信没有任何关联,微信网是微信公众平台账号第三方推广平台。
地址:太原市迎泽区南内环街9号&&&&&

我要回帖

更多关于 接口测试用例 的文章

 

随机推荐