如何用 asp .net mvc 做一个微信获取好友列表接口接口 获取用户信息

.net mvc 微信开发笔记(七)------微信公共账号加入小黄鸡
微信账号做的差不多了,总觉得少了点什么,于是兴起加入了小黄鸡,不仅好玩,还能给公共账号增加流量。
黄鸡的介绍:
其实是棒子做的一个聊天机器人,之前再人人微博上火了一把,是中国人对黄鸡和人人/新浪的api进行了整合。黄鸡是要收费的,但是有免费版本,只有七天试用期,每天100条的回复限制
接入过程:
首先进入小黄鸡的官网/
点右上角的SignUp
这个页面大家要注意,下边的验证码可能需要F.Q才能看到
申请完之后,在登陆
登陆之后,是这样一个页面,当然之前我添加过一个应用,第一次进的时候是空的,需要新建一个
点View Details,获得黄鸡接口的key
有了Key,我们就可以调用黄鸡接口了,查看官方的开发文档
数据交互很简单:
先带着key,要发送的文字,语言发送给api接口
然后黄鸡服务器会返回一个Json数据。
request是状态,response是黄鸡回复的内容。
好吧开始写代码了:
我们先把黄鸡的接口地址定义成一个全局变量。
public static string yellowchicken = &http://sandbox./request.p?你的key&lc=ch&ft=1.0&text=&;
定义一个model,用来接收返回的Json
public class YellowChicken
public string response { }
public int id { }
public int result { }
public string msg { }
但是上边的数据并不都是我们想要的,我们只需要返回一个文字和状态就好了,于是新建一个模型
public class ChickenBack {
public string response { }
public int result { }
写一个httpget的方法,用来发送数据
public static string HttpGet(string url)
HttpWebRequest req = HttpWebRequest.Create(url) as HttpWebR
if (req == null)
throw new ArgumentException();
req.Method = &GET&;
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
if (res.StatusCode != HttpStatusCode.OK)
throw new WebException(&code& + res.StatusCode);
using (var stream = res.GetResponseStream())
using (var reader = new System.IO.StreamReader(stream, Encoding.UTF8))
var result = reader.ReadToEnd();
reader.Close();
stream.Close();
//res.Close();
新建一个DoChicken类
public class DoChicken
public ChickenBack sendchicken(string text)
//**是指封装上边get方法的类,Final是指封装yellowchicken(黄鸡api入口)的类
string chickenback= **.HttpGet(FinalStr.yellowchicken+text);
//先将接受的数据反序列化,再提出里边必要的信息赋值给chickenback。
string back = new JavaScriptSerializer().Deserialize&YellowChicken&(chickenback).response.ToString();
int result = new JavaScriptSerializer().Deserialize&YellowChicken&(chickenback).
return new ChickenBack { response = back, result = result };
好了,现在chicken对象已经存储了我们需要的信息,我们只需要发送给用户就好了
如何发送,请查看
.net m 微信开发笔记(四)------STREAM,POST/GET,XML解析,获取用户普通消息
/weixin/777.
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。汇聚2000万达人的兴趣社区下载即送20张免费照片冲印
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(3455)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_084069',
blogTitle:'ASP.NET MVC 的最佳实践',
blogAbstract:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}评论-1142&
trackbacks-16
& & 因为正在计划做一个微信机器人,需要用ASP.NET,找了一下只有PHP的SDK,没有C#的,于是动手写了一个,已经全面支持微信6.x所有接口,包括多客服、卡券、微信支付等。
& & 微信公众平台地址:
& & Senparc.Weixin.MP官网地址:
& & 所有源代码(SDK+示例):&(新版本已发布,可以在github中查看最新的代码和教程)
& & 微信技术交流社区:
& & 目前已经支持微信6.x所有API(主要是自定义菜单),并且我为大家准备了两个非常好用的在线工具(都已在源代码中开源):
在线菜单编辑工具:&可视化编辑微信菜单
在线模拟请求测试工具:&已经支持并发及异步测试功能
技术交流QQ群:
2群: (已满)
3群: (已满)
4群: (已满)
5群: (已满)
6群: (已满)
& & 用微信扫描下面二维码,添加测试账号为好友(添加后发送文本、位置、图片信息,测试反馈效果):
& & 注意:开始开发之前需要到上面申请一个公众账号,并开启&关键词自动回复 =&&公众平台消息接口&,根据提示设置token等信息。
& &&Senparc.Weixin.MP所有项目文件如下:
(项目已更新,具体文件请到查看或同步最新代码)
& &&Senparc.Weixin.MP几个关键类介绍如下:
Entities/Request*.cs 用于接收微信平台自动发送到服务器的实体(发送过来的是XML),包括文本、位置、图片三类
Entities/Response*.cs 用于反馈给发送人的信息实体(最终会转成XML),包括文本、新闻(图文)两类
Helpers/EntityHelper.cs 用于实体和XML之间的转换(由于其中有许多需要特殊处理的字段和类型,这里不能简单用XML序列化)
Helpers/MsgTypeHelper.cs 用于获取消息类型
CheckSignature.cs 验证请求合法性类
Enums.cs 各种枚举
RequestMessageFactory.cs 用于自动生成不同Request类型的实体,并作必要的数据填充
& &&Senparc.Weixin.MP几个关键类及重要方法(按一般使用过程排序,注意很多地方已经升级到更简洁的方法,请参考最新的代码:)
生成验证字符串:Senparc.Weixin.MP.CheckSignature.GetSignature(string timestamp, string nonce, string token = null),返回根据微信平台提供的数据,SHA1加密后的验证字符串(注意token必须跟公众平台的设置一直)
验证请求:Senparc.Weixin.MP.CheckSignature.Check(string signature, string timestamp, string nonce, string token = null),验证请求是否合法
获取请求实体:var requestMessage = Senparc.Weixin.MP.RequestMessageFactory.GetRequestEntity(XDocument doc); 根据不同请求的类型,自动生成可用于操作的实体(doc只需要用XDocument.Parse(xmlString)就能生成),requestMessage.MsgType就是请求枚举类型。
进行判断及各类操作。
根据需要,创建响应类型的实体,如:var responseMessage = ResponseMessageBase.CreateFromRequestMessage(requestMessage, ResponseMsgType.Text) as ResponseMessageT 即可返回文本类型信息。注:v0.6版本以后,此方法可以简写为:var responseMessage = CreateResponseMessage&ResponseMessageText&();
由于目前微信只接受XML的返回数据,所以在返回之前还需要做一次转换:XDocument responseDoc = Senparc.Weixin.MP.Helpers.EntityHelper.ConvertEntityToXml(responseMessage); var xmlString =&responseDoc.ToString();
至此整个微信公众账号的自动响应过程结束。
& & 所有Senparc.Weixin.MP源代码及示例代码已开源(示例是ASP.NET MVC 4,.NET 4.0,为了提高兼容性,Senparc.Weixin.MP源代码使用.NET 3.5):
& & (包含三个文件夹:Senparc.Weixin.MP、Senparc.Weixin.MP.BuildOutPut、Senparc.Weixin.MP.Sample,分别对应Senparc.Weixin.MP.dll源代码项目、Senparc.Weixin.MP.dll输出目录、Web示例,Web示例建议放到公网测试,让公众平台自动发送)
& & 目前SDK还在测试中,欢迎大家提出宝贵意见!
& & 关于直接使用Senparc.Weixin.MP.Sample部署到服务器上进行测试的朋友,有几点需要注意一下:
进入微信公众账号后台后,依次进入&高级功能&&&开发模式&& 成为开发者&,编辑接口配置信息,其中Url中需要填写默认端口(80)的Url,如/weixin (注意后面的/weixin一定要加,这是用于验证的一个Controller地址)
为了确保安全,在上述接口配置信息中的Token最好输入一个复杂一些的字符串,并且在Senparc.Weixin.MP.Sample/Controllers/WeixinController.cs中修改Token使之匹配,如:
关于Senparc.Weixin.MP.Test单元测试项目:所有Senparc.Weixin.MP核心代码都已通过单元测试。没有外网部署条件的朋友也可以使用Senparc.Weixin.MP.Test项目提供的单元测试进行测试,这些测试同样适用于微信还没有正式发布、无法实际测试的功能,如消息推送:
截图对应测试版本:v0.3.1
升级记录:
微信开发教程(Senparc.Weixin.MP SDK):&
阅读(...) 评论()&DevExpress控件使用交流,DevExpress中国社区
当前位置:
& 如何在ASP.NET MVC应用程序中使用XPO?
如何在ASP.NET MVC应用程序中使用XPO?
作者:zhuhm&&&来源:本站原创&&&浏览:Loading...次&&&发布时间:&&&评论:
当我的视图执行POST操作时,XPO 会在数据库中创建一个新的记录,而不是更新编辑记录。这是漏洞吗?如何解决这个问题?在ASP.NET MVC应用程序中使用XPO的最好的方法是什么?eXpress Persistent Objects framework与APS .NET MVC应用程序集成的最大困难在于这些框架都有自己的方法来创建模型实例。ASP .NET MVC需要模型来提供无参数构造函数。这个无参数构造函数一次只能创建一个新的模型实例。XPO考虑到了通过公用构造函数创建的每个对象,并在这个对象相关的数据库中插入新的记录。因此,需要阻止ASP .NET MVC引擎创建新的实例和手动解决这项任务。下面我们将对解决这个问题所使用的两种可能的方法进行说明。方法1创建一个继承DefaultModelBinder(或DevExpressEditorsBinder,使用DevExpress ASP.NET组件时)的自定义模型绑定器。这个绑定器用于POST方法参数时,可用来创建新的模型。虽然这很不错,但事情并不会如此简单。会话怎么样?为避免将加载的持久对象与不同会话混合,最好是在控制器类中创建会话,并将它传给自定义绑定器。控制器实例可作为参数发送到ModelBinder.CreateModel中。我们所需要做的事情就是声明接口可用于获取会话实例,也可用于识别自定义控制器。[C#]
public interface IXpoController {
Session XpoSession { }
Public Interface IXpoController
ReadOnly Property XpoSession() As Session
End Interface
而且,控制器:[C#]
public class BaseXpoController : Controller, IXpoController
public BaseXpoController() {
XpoSession = CreateSession();
}Session fXpoS
public Session XpoSession {
get { return fXpoS }
private set { fXpoSession = }
}protected virtual Session CreateSession() {
return XpoHelper.GetNewSession();
Public Class BaseXpoController
Inherits Controller
Implements IXpoController
Public Sub New()
XpoSession = CreateSession()
End SubPrivate fXpoSession As Session
Public Property XpoSession() As Session
Return fXpoSession
Private Set(ByVal value As Session)
fXpoSession = value
End PropertyProtected Overridable Function CreateSession() As Session
Return XpoHelper.GetNewSession()
End Function
End Class控制器使用“在ASP .NET(网络)应用程序知识库中如何使用XPO”这一文章中所描述的XpoHelper类来创建会话实例。.现在可以创建自定义模型绑定器。只需要重写一种方法:创建模。请查看下列代码。这个方法可获得实例,然后从第一个参数(ControllerContext实例)开始实现IXpoController接口。若这个方法失败,它可以抛出一个异常。一旦我们拥有会话实例,剩余的事情就是技术细节。使用Session.GetClassInfo方法,从最后参数(modelType)中获得元数据、主要属性值,并通过Session.GetObjectByKey方法加载持久对象。若数据库中无相应记录,通过XPClassInfo.CreateNewObject方法创建新的持久对象。[C#]
public class XpoModelBinder :DevExpressEditorsBinder {
protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) {
IXpoController xpoController = controllerContext.Controller as IXpoC
if (xpoController == null) throw new InvalidOperationException(&The controller does not support IXpoController interface&);
XPClassInfo classInfo = xpoController.XpoSession.GetClassInfo(modelType);
ValueProviderResult result = bindingContext.ValueProvider.GetValue(classInfo.KeyProperty.Name);
return result == null ? classInfo.CreateNewObject(xpoController.XpoSession) :
xpoController.XpoSession.GetObjectByKey(classInfo, result.ConvertTo(classInfo.KeyProperty.MemberType));
Public Class XpoModelBinder
Inherits DevExpressEditorsBinder
Protected Overrides Function CreateModel(ByVal controllerContext As
ControllerContext, ByVal bindingContext As ModelBindingContext, ByVal
modelType As Type) As Object
Dim xpoController As IXpoController = TryCast(controllerContext.Controller, IXpoController)
If xpoController Is Nothing Then
Throw New InvalidOperationException(&The controller does not support IXpoController interface&)
Dim classInfo As XPClassInfo = xpoController.XpoSession.GetClassInfo(modelType)
Dim result As ValueProviderResult = bindingContext.ValueProvider.GetValue(classInfo.KeyProperty.Name)
Return If(result Is Nothing,
classInfo.CreateNewObject(xpoController.XpoSession),
xpoController.XpoSession.GetObjectByKey(classInfo,
result.ConvertTo(classInfo.KeyProperty.MemberType)))
End Function
就是这样了。现在自定义模型绑定器可用于下列应用程序中:[C#]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([ModelBinder(typeof(XpoModelBinder))]T newEntity) {
return SaveModel(newEntity);
&AcceptVerbs(HttpVerbs.Post)& _
Public Function Create(&ModelBinder(GetType(XpoModelBinder))& ByVal newEntity As T) As ActionResult
Return SaveModel(newEntity)
End Function方法2上一种方法的劣势在于并不能妥善处理上述所有状况。例如,。我们给你提供一个完全不同的方法:不要直接将持久对象与视图绑定,使用中间ViewModel类。这个例子中,ViewModel只是一个简单的DTO类。逻辑可在控制器中集中。这个方法更有利。其中,数据可与持久对象实现非耦合,开发商也可对持久对象和会话实现完全控制,这是因为ViewModels下,ASP .NET MCV引擎可运行。同时,通过对XPO使用LINQ,可减少SQL服务器加载的信息量,也可明确指定需要加载的属性。以前,因为使用的是匿名类型的试图,这个方法只适用于只读视图。现在,因ViewModel属性可通过LINQ查询结果值进行填充,所以不需要加载全部的持久类对象。
IEnumerable&CustomerViewModel& GetCustomers() {
return (from c in XpoSession.Query&Customer&().ToList()
select new CustomerViewModel() { ID = c.Oid, Name = c.Name }).ToList();
Private Function GetCustomers() As IEnumerable(Of CustomerViewModel)
Return ( _
From c In XpoSession.Query(Of Customer)().ToList() _
Select New CustomerViewModel() With {.ID = c.Oid, .Name = c.Name}).ToList()
End Function
BaseViewModel类非常简单:[C#]&
using DevExpress.Xpublic abstract class BaseViewModel&T& {
int id = -1;
public int ID {
set { id = }
}public abstract void GetData(T model);
Imports DevExpress.XpoPublic MustInherit Class BaseViewModel(Of T)
Private id_Renamed As Integer = -1
Public Property ID() As Integer
Return id_Renamed
Set(ByVal value As Integer)
id_Renamed = value
End PropertyPublic MustOverride Sub GetData(ByVal model As T)
End ClassBaseViewModel被定义为类属类。通过这种方法,可以声明将使用类属参数的抽象成员。在子孙类中,类属参数将替换为在编译时允许开发商进入模型属性的实际类型。下列简单的ViewModel类继承自BaseViewModel,并以客户持久类为依据:[C#]
public class CustomerViewModel : BaseViewModel&Customer& {
public string Name { }public override void GetData(Customer model) {
model.Name = N
Public Class CustomerViewModel
Inherits BaseViewModel(Of Customer)
Private privateName As String
Public Property Name() As String
Return privateName
Set(ByVal value As String)
privateName = value
End PropertyPublic Overrides Sub GetData(ByVal model As Customer)
model.Name = Name
End Class控制器可使用GetData方法更新持久对象属性。以下是控制器基类以及类属类的实现。[C#]
using System.Web.M
using DevExpress.X
using DevExpress.Xpo.DB.Enamespace DevExpressMvcApplication.Controllers {
public abstract class BaseXpoController&T& :Controller where T:XPObject {
UnitOfWork fSpublic BaseXpoController() : base() {
fSession = CreateSession();
}protected UnitOfWork XpoSession {
get { return fS }
}protected virtual UnitOfWork CreateSession() {
return XpoHelper.GetNewUnitOfWork();
}bool Save(BaseViewModel&T& viewModel, bool delete) {
T model = XpoSession.GetObjectByKey&T&(viewModel.ID);
if (model == null && !delete)
model = (T)XpoSession.GetClassInfo&T&().CreateNewObject(XpoSession);
if (!delete)
viewModel.GetData(model);
else if (model != null)
XpoSession.Delete(model);
mitChanges();
} catch (LockingException) { }
}protected bool Save(BaseViewModel&T& viewModel) {
return Save(viewModel, false);
}protected bool Delete(BaseViewModel&T& viewModel) {
return Save(viewModel, true);
Imports System.Web.Mvc
Imports DevExpress.Xpo
Imports DevExpress.Xpo.DB.ExceptionsNamespace DevExpressMvcApplication.Controllers
Public MustInherit Class BaseXpoController(Of T As XPObject)
Inherits Controller
Private fSession As UnitOfWorkPublic Sub New()
MyBase.New()
fSession = CreateSession()
End SubProtected ReadOnly Property XpoSession() As UnitOfWork
Return fSession
End PropertyProtected Overridable Function CreateSession() As UnitOfWork
Return XpoHelper.GetNewUnitOfWork()
End FunctionPrivate Function Save(ByVal viewModel As BaseViewModel(Of T), ByVal delete As Boolean) As Boolean
Dim model As T = XpoSession.GetObjectByKey(Of T)(viewModel.ID)
If model Is Nothing AndAlso (Not delete) Then
model = CType(XpoSession.GetClassInfo(Of T)().CreateNewObject(XpoSession), T)
If (Not delete) Then
viewModel.GetData(model)
ElseIf model IsNot Nothing Then
XpoSession.Delete(model)
mitChanges()
Return True
Catch e1 As LockingException
Return False
End FunctionProtected Function Save(ByVal viewModel As BaseViewModel(Of T)) As Boolean
Return Save(viewModel, False)
End FunctionProtected Function Delete(ByVal viewModel As BaseViewModel(Of T)) As Boolean
Return Save(viewModel, True)
End Function
End Namespace
这个类可压缩保存和删除方法,从而避免代码的复制。这些方法可产生子孙类:[C#]
using System.L
using System.Web.M
using DevExpress.X
using DevExpress.Web.M
using System.Collections.Gnamespace DevExpressMvcApplication.Controllers
public class CustomersController : BaseXpoController&Customer&
public ActionResult Index()
return View(GetCustomers());
}public ActionResult IndexPartial() {
return PartialView(&IndexPartial&, GetCustomers());
}[HttpPost]
public ActionResult EditCustomer([ModelBinder(typeof(DevExpressEditorsBinder))] CustomerViewModel customer) {
Save(customer);
return PartialView(&IndexPartial&, GetCustomers());
}[HttpPost]
public ActionResult DeleteCustomer([ModelBinder(typeof(DevExpressEditorsBinder))] CustomerViewModel customer) {
Delete(customer);
return PartialView(&IndexPartial&, GetCustomers());
}IEnumerable&CustomerViewModel& GetCustomers() {
return (from c in XpoSession.Query&Customer&().ToList()
select new CustomerViewModel() { ID = c.Oid, Name = c.Name }).ToList();
Imports System
Imports System.Linq
Imports System.Web.Mvc
Imports DevExpress.Xpo
Imports DevExpress.Web.Mvc
Imports System.Collections.GenericNamespace DevExpressMvcApplication.Controllers
Public Class CustomersController
Inherits BaseXpoController(Of Customer)
Public Function Index() As ActionResult
Return View(GetCustomers())
End FunctionPublic Function IndexPartial() As ActionResult
Return PartialView(&IndexPartial&, GetCustomers())
End Function&HttpPost& _
Public Function
EditCustomer(&ModelBinder(GetType(DevExpressEditorsBinder))& ByVal
customer As CustomerViewModel) As ActionResult
Save(customer)
Return PartialView(&IndexPartial&, GetCustomers())
End Function&HttpPost& _
Public Function
DeleteCustomer(&ModelBinder(GetType(DevExpressEditorsBinder))&
ByVal customer As CustomerViewModel) As ActionResult
Delete(customer)
Return PartialView(&IndexPartial&, GetCustomers())
End FunctionPrivate Function GetCustomers() As IEnumerable(Of CustomerViewModel)
Return ( _
From c In XpoSession.Query(Of Customer)().ToList() _
Select New CustomerViewModel() With {.ID = c.Oid, .Name = c.Name}).ToList()
End Function
End Namespace
保存和删除方法可返回布尔值来表明操作是否成功。若最终用户对另一最终用户已更新的记录进行更新,则这些方法可返回错误返回值,从而允许程序员将上述冲突通知最终用户。同时,这个XPO控制器使用UnitOfWork代替会话。但我们不建议在ASP .NET应用程序中使用UnitOfWork,这不仅仅是因为没有必要,同时也会不方便。在ASP.NET CMVC应用程序中,没有必要避免对UnitOfWork的使用。
本站文章除注明转载外,均为本站原创或翻译
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果
转载请注明:文章转载自:DevExpress控件中文网 []
本文地址:
相关产品:
请谈谈你的看法 请使用IE或者Firefox浏览器,暂不支持Chrome!
为DevExpress界面控件的中国地区唯一正式授权经销商,正版控件销售公司,授权代理商,经销商及合作伙伴。
电话:400-700-1020
&&&&&&&&023-mvc 实现微信公众号主动推送消息
[问题点数:40分,结帖人hbgdluck]
mvc 实现微信公众号主动推送消息
[问题点数:40分,结帖人hbgdluck]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。}

我要回帖

更多关于 asp微信支付接口 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信