APp苹果id密码格式举例输入及组成不正确,能不能举例指导

博客访问: 361723
博文数量: 100
博客积分: 0
博客等级: 民兵
技术积分: 2020
注册时间:
认证徽章:
西邮大三狗!!!
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: LINUX
关于openssh的介绍我就不多说,不了解的请参考维基:
A:192.168.88.199 &有普通用户nick
B:192.168.88.216 &有普通用户nick
现在要实现的就是从B主机登陆A强制使用密钥(无密码)登陆,考虑安全问题,不允许以root身份登陆。
以下步骤在B上进行操作:&
[nick@silence ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/nick/.ssh/id_rsa): & & & & & & (一路回车,无密码设置)
Enter passphrase (empty for no passphrase):&
Enter same passphrase again:&
Your identification has been saved in /home/nick/.ssh/id_rsa.
Your public key has been saved in /home/nick/.ssh/id_rsa.pub.
The key fingerprint is:
e0:c1:16:41:8d:72:53:6c:51:45:49:6f:69:86:ab:54 nick@
The key's randomart image is:
+--[ RSA 2048]----+
| & & .+*oo.++. & |
| & &..+.+ & .o . |
| & & o=o & &E * &|
| & & o o & . = & |
| & & &. S . . & &|
| & & & & . . & & |
| & & & & &. & & &|
| & & & & & & & & |
| & & & & & & & & |
+-----------------+
注意,现在在B上,nick用户有私钥而root用户没有
将公钥copy到远程主机A上:
[nick@silence .ssh]$ ssh-copy-id -i id_rsa.pub & nick@192.168.88.199(远程主机用户要有~/.ssh这个目录,没有就手动建立)
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.88.199's password: & & & & & & & (第一次ssh是要密码的)
Number of key(s) added: 1
Now try logging into the machine, with: & "ssh 'root@192.168.88.199'"
and check to make sure that only the key(s) you wanted were added.
OK,去配置我们的远程主机B:
vim /etc/ssh/sshd_config
修改以下选项:
PermitRootLogin &&&no &(不允许root登陆)
PasswordAuthentication no &(强制使用密钥登陆)
重启服务: &/etc/sshd restart
现在在A上进行测试:
[root@silence ~]# ssh root@192.168.88.199
The authenticity of host '192.168.88.199 (192.168.88.199)' can't be established.
RSA key fingerprint is 95:6d:56:3a:aa:e3:85:a8:ee:b9:8c:d2:df:df:7a:38.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.88.199' (RSA) to the list of known hosts.
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
[root@silence ~]# ssh nick@192.168.88.199
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
由于远程主机B不允许以root用户登陆,且A主机的root用户没有私钥,所以A上root用户是不可能ssh到B主机的
[nick@silence ~]$ ssh root@192.168.88.199
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
[nick@silence ~]$ ssh nick@192.168.88.199
Last login: Tue Nov 18 16:55:39 2014 from 192.168.88.216
[nick@vm1 ~]$ su -
[root@vm1 ~]#
A上的nick用户由于有私钥,尽管不能以root用户登陆,但是可以以nick用户身份登陆,如果想提高权限,登陆成功之后可以切换成root用户!
解决 ssh 链接慢{
sed -i 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/' /etc/ssh/sshd_config
sed -i '/#UseDNS yes/a\UseDNS no' /etc/ssh/sshd_config
/etc/init.d/sshd restart
阅读(1081) | 评论(0) | 转发(1) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。Apple ID被盗怎么办_苹果appid密码被盗后真实找回经历_最火下载站
您的位置: >
> 苹果appid密码被盗后真实找回经历
苹果appid密码被盗后真实找回经历
Apple ID被盗怎么办,由于密码简单,邮箱密码泄露等原因,大家的苹果ID可能被黑客窃取,如果您的APPLE ID丢失了,应该怎么找回呢,下边给大家附上一个丢失APPLE ID的真实经历,通过这个苹果appid密码被盗,以及找回ID的经历,希望对您有一定帮助!
苹果appid密码被盗后真实找回经历
2015年,网易邮箱数据库泄漏,导致大量邮箱账户被盗,其实从那时开始,apple ID盗号在那时已经大规模的发生了,只是我们谁也没有想过居然会发生在自己的头上。最近手机被锁被盗的太多,据说连苹果那边都已忙不过来了!
先说下盗号者常使用盗取apple id 账号密码的手段。
1、你的账号借给他人使用。
2、APPLE ID邮箱并盗号(绝大多数)。
由于苹果安全验证机制的问题,在获得了同apple id的主邮箱的账号密码以后,便能修改包括apple id 在内所有的信息,包括生日,密保问题,这是极不合理的一件事。
盗号者(一般是中间商问黑客买邮箱信息)获取你的主邮箱账号密码,然后再apple 官网找回密码,这时,你的主邮箱便会收到重置密码的邮件,重置密码后你的apple id 便能登陆了。然后把你的主邮箱名改了,如我的被换成了(我的ID在apple官网查不到了)如下图。
之后添加了救援邮箱,也就是之后所有重置密码以及修改身份的信息都将发送到救援邮箱中。救援邮箱添加好后联系400修改安全提示问题,400修改安全提示问题的的必须条件是登陆apple id 官网,点击左下角拿到pin码(骗子既然有apple id 账号,自然可以实现),一个受信任的苹果设备,只要用你的id登陆一下手边的设备,都能作为受信任的设备(实现),救援邮箱(刚刚被添加,实现),这样,你的安全问题也被改了。之后便是开启两步验证,但是由于刚修改过密码等安全操作,需要3天后才能开启。一旦被开启两步验证,这个账号就彻底和你说88了。
废话不多说了,我将以时间为顺序,来详细说下被盗以及解锁的过程,中间会说下重点。最后会给大家一些安全建议来保护apple id,不要看着很远,很可能下个就是你。
3月9日17点,在家玩电脑,手机突然跳出app store 密码不正确,apple id 密码不正确,要我输入,我以为是apple服务器又抽风了,没有理他.2分钟,手机来电铃响并弹窗。如下图,原谅我那时候哪还有空,网上盗的图。
再过一分钟后,我的手机被强行重启,清空并被开启了手机丢失查找模式。
3月9日17点10分,登陆网易邮箱,我是126的,便看到邮箱里的勒索邮件。
3月9日17点15分,我立马拨打客服电话,说明了我账号被盗并且消失的情况,确认了我联系邮箱和身份后直接转了二线。(记住自己的事件编号)
这里再补充下苹果客服的基本结构和权限,不一定正确,但是是我7天至少20个电话轰炸下来的结果。
一线:权限较低,几乎和用户一致,感受下来唯一的区别就是可以直接跳过生日验证来回答安全问题。别耽误时间了,直接转二线。
二线:所谓账号部门,拥有中等权限,比如锁定app store,验证身份,如果身份验证通过可以直接发送找回密码邮件给您。
三线:最高级,身份验证不通过将转到三线,也就是让你提交资料来解锁账号。
工程部:账号解锁部门。在美国和新加坡,所有解锁都在那边处理。
3月9日17点20分,说了我的ID的情况,然后他们说可以帮我追寻到,并且我在第二天,ID再次再官网上看到,当然我最关心的就是我的盗刷问题,我让客服关闭了我的icloud和app store 所有的操作权限,哪怕免费的也不能下载,并且联系信用卡客服将我卡挂失。然后他们通过确认身份,来确认是否能发送找回密码的邮件。
1、两个安全问题答案(我都被改了,怎么会有! )
2、发送给救援邮箱(刚被骗子添加上去 )
所以无法发送找回密码的邮件了,接下来只能确认账号信息身份来验证这个账号是否是你的,如果验证通过会移交给工程部帮你移除掉救援邮箱。(7~10天)
似乎之后修改过政策,我在16号电话客服的时候身份验证也 通过了,当天是没通过的。
以下是有可能你获取到的几条验证方式
1、安全问题至少1个答案(16号那天索性不用回答了)
2、绑定在apple id 上的信用卡信息(之前听说只能是visa,我是银联的也通过了)
3、设备包装盒上的序列号。
满足两条就可以了。
如果验证通过了,那他直接升级到工程部帮你移除apple id 的救援邮箱了,大概在7到10天左右。
前提是你的ID没有被开启两步验证!!!!!!!!!!!!!!!
前提是你的ID没有被开启两步验证!!!!!!!!!!!!!!!
前提是你的ID没有被开启两步验证!!!!!!!!!!!!!!!
之后和客服沟通下来,身份无法验证通过,只能帮我升级三线部门了,转接时间在30分钟左右。
二线的这次通话,确认了两点,我的主邮箱被替换没有关系,并且最重要没有被开启两步验证,一旦开启,你和这个账号说再见了。
3月9日18点10分,漫长的等待,终于接通,沟通后让知道我无法确认身份,只能通过上传资料来证实iphone 设备是你的,再而帮你移除apple id 上的救援邮箱。
提供的照片有如下,
- 相关文档。包括购买凭证,三包卡,设备包装盒背面,运营商合同,警方报告(如适用)等;
- 设备序列号或 IMEI 的照片。请优先获取设备在 iOS 设置助理 &Hello& 页面的 IMEI 照片。如果此处无法获得 IMEI,请获取机身背面或其他地方的序列号或 IMEI 照片;
- 设备激活锁或丢失模式界面的照片;
- 用户是否已经联系开启丢失模式的人?请提供完整聊天对话记录。
这里说下我的设备,港水,IPHONE 6S,没有保修卡,没有发票,有盒子。
我当晚找卖家补了张发票(无法分辨真假,呵呵,你懂的),但是也一样通过了审核。
苹果对发票确认身份很看重,很多被盗用户都是因为没有发票苹果不恢复才走投无路找骗子,其实我也听过没有发票同样通过审核的例子,可以多传些,比如邮箱之前和apple之间的邮件,勒索邮件等。多和客服软磨硬泡,多打苦情牌,是有通过的可能的。
电话结束前,务必确认自己的案例编号,客服之前发送给您过邮件,您之后可以和这个客服邮件联系,客服也非常的热心。我之后发送的询问邮件基本上也是有问必回的。
之后就是漫长的等待,平均一天2个电话,1封邮件的咨询,但是千万不要为难客服,说实话人家客服也不容易,也是帮你处理问题的。而且大部分都是某邮箱爆发盗号事件引起的,据说最近其他邮箱也发生了apple id被盗事件,可谓焦头烂额了。
等待中最怕什么! 自然是被开启两步验证,如何防止被开启两步验证?苹果方是没有权限阻止的,我们只能靠自己。
修改网易密码并且加强安全防护,增加短信登陆验证等。
登陆网页,按找回密码,输入apple id 后,点解锁,会出现两天选项1、往邮箱(默认主邮箱,如果被绑定救援邮箱,就会被变成救援邮箱,我被盗号了,自然不能选这个)发送重置密码邮件。2、尝试密保问题。
选择2,在尝试密保问题前,会让你输入生日,骗子自然也帮你改了,那你就随便输,尝试错误9次左右,你的apple id会被系统冻结8小时,这时候是无法重置密码的。(我不知道重置密码后开启二步验证是否要再等3天),于是我早上一次,晚上一次,就这样一直尝试改密码,整整一个礼拜。
3月16日13点00分 听说有人通过信用卡通过了身份验证,抱着尝试的心态让客服转了二线,居然真的通过了,于是让客服向工程部申请提交移除援救邮箱。(据说账号部门提交申请移交更快,两面一起提交哪个快哪个就OK,多份保证。)我也和客服确认了移除时间多久,客服由于某些原因是不能下绝对保证的,但基本暗示在7到10天内就能解决的。
3月16日18点 继续做上面的重要操作。我的主邮箱居然收到了苹果的告警邮件了,说尝试密码过多被锁定,我就知道救援邮箱被移除了。(在有救援邮箱的情况下,告警邮件是发送到救援邮箱的,主邮箱收不到任何苹果邮件),但是已经尝试过多锁掉了(没被锁掉也收不到邮件 ),只能第二天一早再来验证。
3月17日07点一早爬起来第一件事,点找回密码,果然,重要操作中提到的第一项,可以看到邮箱已经变为我自己的@后缀的邮箱了。(原先显示的是@)
马上重置,并联系客服,重置所有信息后并开启了二次验证。
至此,丢失的账号算是被找回了。总共花了7天。
最后总结下:
apple id 被盗几种情况:
一、没有被两步验证,被修改了密保,生日,救援邮箱。
1、知道密保情况下让客服发送修改密码邮件。
2、不知道密保的情况下身份验证通过,7到10天内帮你救援邮箱。
3、身份验证也不通过的上传资料,15天内帮你救援邮箱。(我是这种情况,只花了7天)
二、被两步验证
1、上传资料验证设备属于你,帮你移除设备上的ID锁,你的apple ID作废,当一部新手机使用。一周了解下来,短则20天,长则3个月&&
所以各位!!知道安全的重点了么!
两步验证!!
没被盗号之前根本就不知道两步验证是什么有木有!!!!!!!!!!!!!!!!
苹果明显的安全逻辑验证错误,居然也不发公告提醒用户两步验证!
最后几句话,
被盗号了也不要慌,一个渠道,打苹果客服!!!打苹果客服!!!打苹果客服!!!
千万别给骗子打钱,助长这种气焰!
我也算吃一堑长一智吧,提醒各位,我们有一个受害群,看着人数一天天再长,真的很难过,不希望更多人被敲诈了,也希望大家都花上几分钟绑定下两步验证。
上一篇: 下一篇:微信公众平台开发教程(五)自定义菜单(含实例源码) - 停留的风 - 博客园
posts - 234, comments - 1238, trackbacks - 5, articles - 27
微信公众平台开发教程(五)自定义菜单
请尊重作者版权,如需转载,请标明出处。
应大家强烈要求,将自定义菜单功能课程提前。
一、概述:
如果只有输入框,可能太简单,感觉像命令行。自定义菜单,给我们提供了很大的灵活性,更符合用户的操作习惯。在一个小小的微信对话页面,可以实现更多的功能。菜单直观明了,不仅能提供事件响应,还支持URL跳转,如果需要的功能比较复杂,我们大可以使用URL跳转,跳转至我们的网页即可。
注意:自定义菜单,只有服务号才有此功能
如何注册,见第一章:
效果如下,
接着我们详细介绍,如何实现自定义菜单?
二、详细步骤:
1、首先获取access_token&
access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。正常情况下access_token有效期为7200秒,重复获取将导致上次获取的access_token失效。
公众号可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在开发模式中获得(需要已经成为开发者,且帐号没有异常状态)。注意调用所有微信接口时均需使用https协议。
接口调用请求说明
http请求方式: GET
参数是否必须说明
grant_type
获取access_token填写client_credential
第三方用户唯一凭证
第三方用户唯一凭证密钥,既appsecret
正常情况下,微信会返回下述JSON数据包给公众号:
{"access_token":"ACCESS_TOKEN","expires_in":7200}
access_token
获取到的凭证
expires_in
凭证有效时间,单位:秒
错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误):
{"errcode":40013,"errmsg":"invalid appid"}&
2、创建自定义菜单
自定义菜单能够帮助公众号丰富界面,让用户更好更快地理解公众号的功能。开启自定义菜单后,公众号界面如图所示:
目前自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以&...&代替。请注意,创建自定义菜单后,由于微信客户端缓存,需要24小时微信客户端才会展现出来。建议测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。
目前自定义菜单接口可实现两种类型按钮,如下:
用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event 的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;
用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的url值 (即网页链接),达到打开网页的目的,建议与网页授权获取用户基本信息接口结合,获得用户的登入个人信息。
接口调用请求说明
http请求方式:POST(请使用https协议)&
"button":[
"type":"click",
"name":"今日歌曲",
"key":"V1001_TODAY_MUSIC"
"type":"click",
"name":"歌手简介",
"key":"V1001_TODAY_SINGER"
"name":"菜单",
"sub_button":[
"type":"view",
"name":"搜索",
"type":"view",
"name":"视频",
"type":"click",
"name":"赞一下我们",
"key":"V1001_GOOD"
参数是否必须说明
一级菜单数组,个数应为1~3个
sub_button
二级菜单数组,个数应为1~5个
菜单的响应动作类型,目前有click、view两种类型
菜单标题,不超过16个字节,子菜单不超过40个字节
click类型必须
菜单KEY值,用于消息接口推送,不超过128字节
view类型必须
网页链接,用户点击菜单可打开链接,不超过256字节
正确时的返回JSON数据包如下:
{"errcode":0,"errmsg":"ok"}
错误时的返回JSON数据包如下(示例为无效菜单名长度):
{"errcode":40018,"errmsg":"invalid button name size"}
3、查询菜单
使用接口创建自定义菜单后,开发者还可使用接口查询自定义菜单的结构。
http请求方式:GET
对应创建接口,正确的Json返回结果:
{"menu":{"button":[{"type":"click","name":"今日歌曲","key":"V1001_TODAY_MUSIC","sub_button":[]},{"type":"click","name":"歌手简介","key":"V1001_TODAY_SINGER","sub_button":[]},{"name":"菜单","sub_button":[{"type":"view","name":"搜索","url":"","sub_button":[]},{"type":"view","name":"视频","url":"","sub_button":[]},{"type":"click","name":"赞一下我们","key":"V1001_GOOD","sub_button":[]}]}]}}
4、删除菜单
使用接口创建自定义菜单后,开发者还可使用接口删除当前使用的自定义菜单。
http请求方式:GET
对应创建接口,正确的Json返回结果:
{"errcode":0,"errmsg":"ok"}
5、事件处理
用户点击自定义菜单后,如果菜单按钮设置为click类型,则微信会把此次点击事件推送给开发者,注意view类型(跳转到URL)的菜单点击不会上报。
推送XML数据包示例:
&ToUserName&&![CDATA[toUser]]&&/ToUserName&
&FromUserName&&![CDATA[FromUser]]&&/FromUserName&
&CreateTime&&/CreateTime&
&MsgType&&![CDATA[event]]&&/MsgType&
&Event&&![CDATA[CLICK]]&&/Event&
&EventKey&&![CDATA[EVENTKEY]]&&/EventKey&
参数说明:
ToUserName
开发者微信号
FromUserName
发送方帐号(一个OpenID)
CreateTime
消息创建时间 (整型)
消息类型,event
事件类型,CLICK
事件KEY值,与自定义菜单接口中KEY值对应
三、实例讲解
还接着上一篇文章讲。
我们将在上一篇文章基础上,添加自定义菜单功能。
1、获取access_token
首先需要得到AppId和AppSecret
当你成为开发者后,自然能够在,开发者模式,便可看到这两个值,可以重置。
然后调用按照二.1中所示,进行操作。
注意:access_token有过期时间,如果过期,需要重新获取。
代码如下:
private static DateTime GetAccessToken_T
/// &summary&
/// 过期时间为7200秒
/// &/summary&
private static int Expires_Period = 7200;
/// &summary&
/// &/summary&
private static string mAccessT
/// &summary&
/// &/summary&
public static string AccessToken
//如果为空,或者过期,需要重新获取
if (string.IsNullOrEmpty(mAccessToken) || HasExpired())
mAccessToken = GetAccessToken(AppID, AppSecret);
return mAccessT
/// &summary&
/// &/summary&
/// &param name="appId"&&/param&
/// &param name="appSecret"&&/param&
/// &returns&&/returns&
private static string GetAccessToken(string appId, string appSecret)
string url = string.Format("https://api./cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appId, appSecret);
string result = HttpUtility.GetData(url);
XDocument doc = XmlUtility.ParseJson(result, "root");
XElement root = doc.R
if (root != null)
XElement access_token = root.Element("access_token");
if (access_token != null)
GetAccessToken_Time = DateTime.N
if (root.Element("expires_in")!=null)
Expires_Period = int.Parse(root.Element("expires_in").Value);
return access_token.V
GetAccessToken_Time = DateTime.MinV
return null;
/// &summary&
/// 判断Access_token是否过期
/// &/summary&
/// &returns&bool&/returns&
private static bool HasExpired()
if (GetAccessToken_Time != null)
//过期时间,允许有一定的误差,一分钟。获取时间消耗
if (DateTime.Now & GetAccessToken_Time.AddSeconds(Expires_Period).AddSeconds(-60))
return true;
return false;
2、设置菜单
菜单需根据需要,按照实际要求进行设定。
这里我们提供天气查询功能,将常用的城市列出来,点击即可查询。
然后还提供了友情链接,这里提供了view类型的菜单,直接可以跳转至URL页面,为跳转做个好的演示。
具体菜单如下:
"button": [
"name": "链接",
"sub_button": [
"type": "view",
"name": "搜索",
"url": "/"
"type": "view",
"name": "视频",
"url": "/"
"type": "click",
"name": "赞一下我们",
"key": "BTN_GOOD"
"name": "查询天气",
"sub_button": [
"type": "click",
"name": "武汉",
"key": "BTN_TQ_WUHAN"
"type": "click",
"name": "上海",
"key": "BTN_TQ_SHANGHAI"
"type": "click",
"name": "北京",
"key": "BTN_TQ_BEIJING"
"type": "click",
"name": "帮助",
"key": "BTN_HELP"
3、管理菜单
因为菜单的变更没有那么频繁,因此通过txt文件来设置菜单,并通过管理界面来管理菜单。
主要的管理功能:
1)从文件加载菜单
2)创建菜单。即将菜单通知微信服务端,并更新至微信客户端
3)查询菜单。获取当前系统的菜单。
4)删除菜单。从微信服务器删除菜单,也可以删除后再创建。&
实现代码如下:
public class MenuManager
/// &summary&
/// 菜单文件路径
/// &/summary&
private static readonly string Menu_Data_Path = System.AppDomain.CurrentDomain.BaseDirectory + "/Data/menu.txt";
/// &summary&
/// 获取菜单
/// &/summary&
public static string GetMenu()
string url = string.Format("https://api./cgi-bin/menu/get?access_token={0}", Context.AccessToken);
return HttpUtility.GetData(url);
/// &summary&
/// 创建菜单
/// &/summary&
public static void CreateMenu(string menu)
string url = string.Format("https://api./cgi-bin/menu/create?access_token={0}", Context.AccessToken);
//string menu = FileUtility.Read(Menu_Data_Path);
HttpUtility.SendHttpRequest(url, menu);
/// &summary&
/// 删除菜单
/// &/summary&
public static void DeleteMenu()
string url = string.Format("https://api./cgi-bin/menu/delete?access_token={0}", Context.AccessToken);
HttpUtility.GetData(url);
/// &summary&
/// 加载菜单
/// &/summary&
/// &returns&&/returns&
public static string LoadMenu()
return FileUtility.Read(Menu_Data_Path);
4、基本方法
上面的代码,其实我们对一些公共功能做了封装。如进行get请求、POST提交等操作,读取文件等。
这里我们提供进行get、Post提交的方法案例代码,如果使用,建议优化。
using System.IO;
using System.N
using System.T
using System.W
namespace Yank.WeiXin.Robot.Utility
/// &summary&
/// Http帮助类
/// &/summary&
class HttpUtility
/// &summary&
/// 发送请求
/// &/summary&
/// &param name="url"&Url地址&/param&
/// &param name="data"&数据&/param&
public static string SendHttpRequest(string url, string data)
return SendPostHttpRequest(url,"application/x-www-form-urlencoded",data);
/// &summary&
/// &/summary&
/// &param name="url"&&/param&
/// &returns&&/returns&
public static string GetData(string url)
return SendGetHttpRequest(url,"application/x-www-form-urlencoded");
/// &summary&
/// 发送请求
/// &/summary&
/// &param name="url"&Url地址&/param&
/// &param name="method"&方法(post或get)&/param&
/// &param name="method"&数据类型&/param&
/// &param name="requestData"&数据&/param&
public static string SendPostHttpRequest(string url,string contentType,string requestData)
WebRequest request = (WebRequest)HttpWebRequest.Create(url);
request.Method = "POST";
byte[] postBytes = null;
request.ContentType = contentT
postBytes = Encoding.UTF8.GetBytes(requestData);
request.ContentLength = postBytes.L
using (Stream outstream = request.GetRequestStream())
outstream.Write(postBytes, 0, postBytes.Length);
string result = string.E
using (WebResponse response = request.GetResponse())
if (response != null)
using (Stream stream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
result = reader.ReadToEnd();
/// &summary&
/// 发送请求
/// &/summary&
/// &param name="url"&Url地址&/param&
/// &param name="method"&方法(post或get)&/param&
/// &param name="method"&数据类型&/param&
/// &param name="requestData"&数据&/param&
public static string SendGetHttpRequest(string url, string contentType)
WebRequest request = (WebRequest)HttpWebRequest.Create(url);
request.Method = "GET";
request.ContentType = contentT
string result = string.E
using (WebResponse response = request.GetResponse())
if (response != null)
using (Stream stream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
result = reader.ReadToEnd();
using System.Xml.L
using Newtonsoft.J
namespace Yank.WeiXin.Robot.Utility
class XmlUtility
/// &summary&
/// &/summary&
/// &param name="json"&&/param&
/// &param name="rootName"&&/param&
/// &returns&&/returns&
public static XDocument ParseJson(string json,string rootName)
return JsonConvert.DeserializeXNode(json, rootName);
5、事件处理
设置了菜单,这下需要处理事件了。跟我们之前设计ASPX或者WinForm一样,都要绑定按钮的事件。这里只是通过XML消息将请求传递过来。
通过&2、设置菜单"中具体的菜单内容,我们便已经知道需要进行哪些事件处理了。对于按钮类型为view的,无须处理,它会自动跳转至指定url.
需要处理的点击事件:
2)查询某城市的天气,北京、上海、武汉
这个还要沿用上章中的事件处理器EventHandler来扩展处理。
具体的实现代码吧:
using System.Collections.G
using System.L
using System.T
using Yank.WeiXin.Robot.M
namespace Yank.WeiXin.Robot.Handlers
class EventHandler : IHandler
/// &summary&
/// 请求的xml
/// &/summary&
private string RequestXml { get; set; }
/// &summary&
/// 构造函数
/// &/summary&
/// &param name="requestXml"&&/param&
public EventHandler(string requestXml)
this.RequestXml = requestX
/// &summary&
/// 处理请求
/// &/summary&
/// &returns&&/returns&
public string HandleRequest()
string response = string.E
EventMessage em = EventMessage.LoadFromXml(RequestXml);
if (em != null)
switch (em.Event.ToLower())
case ("subscribe"):
response = SubscribeEventHandler(em);
case "click":
response = ClickEventHandler(em);
/// &summary&
/// &/summary&
/// &param name="em"&&/param&
/// &returns&&/returns&
private string SubscribeEventHandler(EventMessage em)
//回复欢迎消息
TextMessage tm = new TextMessage();
tm.ToUserName = em.FromUserN
tm.FromUserName = em.ToUserN
tm.CreateTime = Common.GetNowTime();
tm.Content = "欢迎您关注***,我是大哥大,有事就问我,呵呵!\n\n";
return tm.GenerateContent();
/// &summary&
/// 处理点击事件
/// &/summary&
/// &param name="em"&&/param&
/// &returns&&/returns&
private string ClickEventHandler(EventMessage em)
string result = string.E
if (em != null && em.EventKey != null)
switch (em.EventKey.ToUpper())
case "BTN_GOOD":
result = btnGoodClick(em);
case "BTN_TQ_BEIJING":
result = searchWeather("beijing", em);
case "BTN_TQ_SHANGHAI":
result = searchWeather("shanghai", em);
case "BTN_TQ_WUHAN":
result = searchWeather("wuhai", em);
case "BTN_HELP":
result = btnHelpClick(em);
/// &summary&
/// 赞一下
/// &/summary&
/// &param name="em"&&/param&
/// &returns&&/returns&
private string btnGoodClick(EventMessage em)
//回复欢迎消息
TextMessage tm = new TextMessage();
tm.ToUserName = em.FromUserN
tm.FromUserName = em.ToUserN
tm.CreateTime = Common.GetNowTime();
tm.Content = @"谢谢您的支持!";
return tm.GenerateContent();
/// &summary&
/// &/summary&
/// &param name="em"&&/param&
/// &returns&&/returns&
private string btnHelpClick(EventMessage em)
//回复欢迎消息
TextMessage tm = new TextMessage();
tm.ToUserName = em.FromUserN
tm.FromUserName = em.ToUserN
tm.CreateTime = Common.GetNowTime();
tm.Content = @"查询天气,输入tq 城市名称\拼音\首字母";
return tm.GenerateContent();
/// &summary&
/// 查询天气
/// &/summary&
/// &param name="cityName"&&/param&
/// &param name="em"&&/param&
/// &returns&&/returns&
private string searchWeather(string cityName, EventMessage em)
TextMessage tm = new TextMessage();
tm.Content = WeatherHelper.GetWeather(cityName);
//进行发送者、接收者转换
tm.ToUserName = em.FromUserN
tm.FromUserName = em.ToUserN
tm.CreateTime = Common.GetNowTime();
return tm.GenerateContent();
终于大工告成,最后来看下效果图吧
请尊重作者版权,如需转载,请标明出处。
&下一章计划:
微信公众平台开发教程(六)获取个性二维码

我要回帖

更多关于 appleid密码组成 的文章

 

随机推荐