1.基础支持API

/*--------------------------------------------------------------------------
* BasicAPI.cs
*Auth:deepleo
* Date:2013.12.31
* Email:2586662969@qq.com
*--------------------------------------------------------------------------*/ using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Http;
using Codeplex.Data;
using System.IO; namespace Deepleo.Weixin.SDK
{
/// <summary>
/// 对应微信API的 "基础支持"
/// </summary>
public class BasicAPI
{
/// <summary>
/// 检查签名是否正确:
/// http://mp.weixin.qq.com/wiki/index.php?title=%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97
/// </summary>
/// <param name="signature"></param>
/// <param name="timestamp"></param>
/// <param name="nonce"></param>
/// <param name="token">AccessToken</param>
/// <returns>
/// true: check signature success
/// false: check failed, 非微信官方调用!
/// </returns>
public static bool CheckSignature(string signature, string timestamp, string nonce, string token, out string ent)
{
var arr = new[] { token, timestamp, nonce }.OrderBy(z => z).ToArray();
var arrString = string.Join("", arr);
var sha1 = System.Security.Cryptography.SHA1.Create();
var sha1Arr = sha1.ComputeHash(Encoding.UTF8.GetBytes(arrString));
StringBuilder enText = new StringBuilder();
foreach (var b in sha1Arr)
{
enText.AppendFormat("{0:x2}", b);
}
ent = enText.ToString();
return signature == enText.ToString();
} /// <summary>
/// 获取AccessToken
/// http://mp.weixin.qq.com/wiki/index.php?title=%E8%8E%B7%E5%8F%96access_token
/// </summary>
/// <param name="grant_type"></param>
/// <param name="appid"></param>
/// <param name="secrect"></param>
/// <returns>access_toke</returns>
public static dynamic GetAccessToken( string appid, string secrect)
{
var url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type={0}&appid={1}&secret={2}", "client_credential", appid, secrect);
var client = new HttpClient();
var result = client.GetAsync(url).Result;
if (!result.IsSuccessStatusCode) return string.Empty;
var token = DynamicJson.Parse(result.Content.ReadAsStringAsync().Result);
return token;
} /// <summary>
/// 上传多媒体文件
/// http://mp.weixin.qq.com/wiki/index.php?title=%E4%B8%8A%E4%BC%A0%E4%B8%8B%E8%BD%BD%E5%A4%9A%E5%AA%92%E4%BD%93%E6%96%87%E4%BB%B6
/// 1.上传的媒体文件限制:
///图片(image) : 1MB,支持JPG格式
///语音(voice):1MB,播放长度不超过60s,支持MP4格式
///视频(video):10MB,支持MP4格式
///缩略图(thumb):64KB,支持JPG格式
///2.媒体文件在后台保存时间为3天,即3天后media_id失效
/// </summary>
/// <param name="token"></param>
/// <param name="type"></param>
/// <param name="file"></param>
/// <returns>media_id</returns>
public static string UploadMedia(string token, string type, string file)
{
var url = string.Format("http://api.weixin.qq.com/cgi-bin/media/upload?access_token={0}&type={1}&filename={2}", token, type, Path.GetFileName(file));
var client = new HttpClient();
var result = client.PostAsync(url, new StreamContent(new FileStream(file, FileMode.Open, FileAccess.Read)));
if (!result.Result.IsSuccessStatusCode) return string.Empty;
var media = DynamicJson.Parse(result.Result.Content.ReadAsStringAsync().Result);
return media.media_id;
} }
}

2.接收消息

/*--------------------------------------------------------------------------
* AcceptMessageAPI.cs
*Auth:deepleo
* Date:2013.12.31
* Email:2586662969@qq.com
*--------------------------------------------------------------------------*/ using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Dynamic;
using System.Xml.Linq;
using System.Xml;
using Codeplex.Data; namespace Deepleo.Weixin.SDK
{
/// <summary>
/// 对应微信API的 "接收消息"
/// </summary>
public class AcceptMessageAPI
{
/// <summary>
/// 解析微信服务器推送的消息
/// http://mp.weixin.qq.com/wiki/index.php?title=%E6%8E%A5%E6%94%B6%E6%99%AE%E9%80%9A%E6%B6%88%E6%81%AF
/// http://mp.weixin.qq.com/wiki/index.php?title=%E6%8E%A5%E6%94%B6%E4%BA%8B%E4%BB%B6%E6%8E%A8%E9%80%81
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public static WeixinMessage Parse(string message)
{
var msg = new WeixinMessage();
msg.Body = new DynamicXml(message);
string msgType = msg.Body.MsgType.Value;
switch (msgType)
{
case "text":
msg.Type = WeixinMessageType.Text;
break;
case "image":
msg.Type = WeixinMessageType.Image;
break;
case "voice":
msg.Type = WeixinMessageType.Voice;
break;
case "video":
msg.Type = WeixinMessageType.Video;
break;
case "location":
msg.Type = WeixinMessageType.Location;
break;
case "link":
msg.Type = WeixinMessageType.Link;
break;
case "event":
msg.Type = WeixinMessageType.Event;
break;
default: throw new Exception("does not support this message type:" + msgType);
}
return msg;
} }
}

3.发送消息

/*--------------------------------------------------------------------------
* SendMessageAPI.cs
*Auth:deepleo
* Date:2013.12.31
* Email:2586662969@qq.com
*--------------------------------------------------------------------------*/ using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Codeplex.Data;
using System.Net;
using System.Net.Http; namespace Deepleo.Weixin.SDK
{
/// <summary>
/// 对应微信API的 "发送消息”
/// </summary>
public class SendMessageAPI
{
/// <summary>
/// 被动回复消息
/// </summary>
/// <param name="message">微信服务器推送的消息</param>
/// <param name="executor">用户自定义的消息执行者</param>
/// <returns></returns>
public static string Relay(WeixinMessage message, IWeixinExecutor executor)
{
return executor.Execute(message);
} /// <summary>
/// 主动发送客服消息
/// http://mp.weixin.qq.com/wiki/index.php?title=%E5%8F%91%E9%80%81%E5%AE%A2%E6%9C%8D%E6%B6%88%E6%81%AF
/// 当用户主动发消息给公众号的时候
/// 开发者在一段时间内(目前为24小时)可以调用客服消息接口,在24小时内不限制发送次数。
/// </summary>
/// <param name="token"></param>
/// <param name="msg">json格式的消息,具体格式请参考微信官方API</param>
/// <returns></returns>
public static bool Send(string token, string msg)
{
var client = new HttpClient();
var task = client.PostAsync(string.Format("https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={0}", token), new StringContent(msg)).Result;
return task.IsSuccessStatusCode;
}
}
}

4.用户管理

/*--------------------------------------------------------------------------
* UserAdminAPI.cs
*Auth:deepleo
* Date:2013.12.31
* Email:2586662969@qq.com
*--------------------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Http;
using Codeplex.Data; namespace Deepleo.Weixin.SDK
{
/// <summary>
/// 对应微信API的 "用户管理"
/// 注意:
/// 1.以下API未实现 :
/// "分组管理接口",“网页授权获取用户基本信息”
/// 2.获取用户"地理位置"API 见AcceptMessageAPI实现,
/// “地理位置”获取方式有两种:一种是仅在进入会话时上报一次,一种是进入会话后每隔5秒上报一次,公众号可以在公众平台网站中设置。
/// </summary>
public class UserAdminAPI
{
/// <summary>
/// 获取用户基本信息
/// </summary>
/// <param name="token"></param>
/// <param name="openId"></param>
/// <returns></returns>
public static dynamic GetInfo(string token, string openId)
{
var client = new HttpClient();
var result = client.GetAsync(string.Format("https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&openid={1}", token, openId)).Result;
if (!result.IsSuccessStatusCode) return null;
return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result);
} /// <summary>
/// 获取订阅者信息
/// </summary>
/// <param name="token"></param>
/// <returns></returns>
public static dynamic GetSubscribes(string token)
{
var client = new HttpClient();
var result = client.GetAsync(string.Format("https://api.weixin.qq.com/cgi-bin/user/get?access_token={0}", token)).Result;
if (!result.IsSuccessStatusCode) return null;
return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result);
} /// <summary>
/// 获取订阅者信息
/// </summary>
/// <param name="token"></param>
/// <param name="nextOpenId"></param>
/// <returns></returns>
public static dynamic GetSubscribes(string token, string nextOpenId)
{
var client = new HttpClient();
var result = client.GetAsync(string.Format("https://api.weixin.qq.com/cgi-bin/user/get?access_token={0}&next_openid={1}", token, nextOpenId)).Result;
if (!result.IsSuccessStatusCode) return null;
return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result);
}
}
}

5.自定义菜单

/*--------------------------------------------------------------------------
* CustomMenu.cs
*Auth:deepleo
* Date:2013.12.31
* Email:2586662969@qq.com
*--------------------------------------------------------------------------*/ using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Http;
using Codeplex.Data; namespace Deepleo.Weixin.SDK
{
/// <summary>
/// 对应微信API的 "自定义菜单”
/// 注意:自定义菜单事件推送接口见:AcceptMessageAPI
/// </summary>
public class CustomMenuAPI
{
/// <summary>
/// 自定义菜单创建接口
/// </summary>
/// <param name="token"></param>
/// <param name="content"></param>
/// <returns></returns>
public static bool Create(string token, string content)
{
var client = new HttpClient();
var result = client.PostAsync(string.Format("https://api.weixin.qq.com/cgi-bin/menu/create?access_token={0}", token), new StringContent(content)).Result;
return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result).errcode == ;
} /// <summary>
/// 自定义菜单查询接口
/// </summary>
/// <param name="token"></param>
/// <returns></returns>
public static dynamic Query(string token)
{
var client = new HttpClient();
var result = client.GetAsync(string.Format("https://api.weixin.qq.com/cgi-bin/menu/get?access_token={0}", token)).Result;
if (!result.IsSuccessStatusCode) return null;
return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result);
} /// <summary>
/// 自定义菜单删除接口
/// </summary>
/// <param name="token"></param>
/// <returns></returns>
public static bool Delete(string token)
{
var client = new HttpClient();
var result = client.GetAsync(string.Format("https://api.weixin.qq.com/cgi-bin/menu/delete?access_token={0}", token)).Result;
if (!result.IsSuccessStatusCode) return false;
return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result).errmsg == "ok";
} }
}

详细:https://github.com/night-king/weixinSDK

关于DynamicJson和Dynamicxml请参考:上一篇文章:http://www.cnblogs.com/deepleo/p/weixinSDK.html

QQ互助交流群:173564082

利用.net4.0的dynamic特性制造的超级简单的微信SDK的更多相关文章

  1. Net 4.0 之 Dynamic 动态类型

    Net 4.0 之 Dynamic 动态类型 本文主要旨在与网友分享.Net4.0的Dynamic 对Duck Type 的支持.     一..net4.0主要新特性 .Net4.0在.Net3.5 ...

  2. C#基本语法 - .Net 4.0 之 Dynamic 动态类型

      一..net4.0主要新特性 .Net4.0在.Net3.5基础上新增的主要特性有:可选参数.命名参数和Dynamic.具体请阅生鱼片的这篇博文.这里我们着重讲解C#4.0的Dynamic特性,对 ...

  3. ASP.NET4.0新特性

    原文:ASP.NET4.0新特性 在以前试用VS2010的时候已经关注到它在Web开发支持上的一些变化了,为此我还专门做了一个ppt,当初是计划在4月12日那天讲的,结果因为莫名其妙的原因导致没有语音 ...

  4. .Net4.0 任务(Task)[转]

    .Net4.0 任务(Task) 任务(Task)是一个管理并行工作单元的轻量级对象.它通过使用CLR的线程池来避免启动专用线程,可以更有效率的利用线程池.System.Threading.Tasks ...

  5. “RazorEngine.Templating.TemplateCompilationException”类型的异常在 RazorEngine.NET4.0.dll 中发生,但未在用户代码中进行处理

    错误信息: "RazorEngine.Templating.TemplateCompilationException"类型的异常在 RazorEngine.NET4.0.dll 中 ...

  6. C# Dynamic特性

    C# 4.0 dynamic:声明动态对象 dynamic关键字用于声明一个动态对象,然后通过该动态对象去调用方法或读写属性.这是C#4.0 添加的特性.官方解释:dynamic类型是帮助我们绕过编译 ...

  7. .NET4.0下使用Net2.0类库或程序集

    最近在项目上一直使用.net4.0 framework,使用ffmepeg下的一个dll时,提示只能在2.0下运行,解决方法如下: app.config中添加一个配置节:startup <?xm ...

  8. 使用dynamic特性处理XML文档

    处理XML文档是我们经常需要进行的一项工作,尤其是在进行网络服务相关编程时,比如更新RSS等.在.NET 3.5中引入了Linq To XML,使得XML文档的读写已经大大简化,而.NET 4.0中最 ...

  9. matlab2016b和c# .net4.0混合编程

    参考:https://www.cnblogs.com/eniac12/p/4390845.html 主要想用c#写软件界面,利用matlab绘图,或者用里面的遗传算法. 我的环境是:Win10 64位 ...

随机推荐

  1. 1155 Heap Paths (30 分)(堆+dfs遍历)

    比较简单的一题 遍历左右的时候注意一下 #include<bits/stdc++.h> using namespace std; ; ]; ; vector<int>t; ve ...

  2. PAT——乙级1028

    这道题花了我半个多小时,对呀乙级算是挺多时间的了. 1028 人口普查 (20 point(s)) 某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个 ...

  3. Python-有名匿名函数、列表推导式

    介绍: 匿名函数:    匿名函数用lambda关键词能创建小型匿名函数.这种函数得名于省略了用def声明函数的标准步骤,节省开辟空间. 列表推导式: 有名函数 #1.有名函数(初始) def squ ...

  4. Kd-Tree&Ransac笔记

    关于sift资源总结: http://blog.csdn.net/masibuaa/article/details/9191309 两个比较好的资源: https://my.oschina.net/k ...

  5. 【转】在Unity中读写文件数据:LitJSON快速教程

    作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 介绍 JSON是一个简单的,但功能强大的序列 ...

  6. 【Luogu】P3288方伯伯运椰子(消圈定理)

    题目链接 分数规划题,详见luogu题解 #include<cstdio> #include<cstring> #include<cctype> #include& ...

  7. SSWR 跟 进一法除法

      1.对于浮点数SSWR float x = 3.456; //保留到小数点后两位 ) + 0.5) / 100.0; //output b = 3.46; 2.对于整数SSWR float x ; ...

  8. tcp slowstart (TCP 慢启动)

    tcp slowstart (TCP 慢启动) 慢启动定义 慢启动,是传输控制协议使用的一种拥塞控制机制.慢启动也叫做指数增长期.慢启动是指每次TCP接收窗口收到确认时都会增长.增加的大小就是已确认段 ...

  9. Lettcode Kth Largest Element in an Array

    Lettcode Kth Largest Element in an Array 题意:在无序数组中,寻找第k大的数字,注意这里考虑是重复的. 一直只会简单的O(nlogn)的做法,听说这题有O(n) ...

  10. 基于WEB的机器人远程控制

    1.前进后退左转右转控制: 2.视频传输,为了保证视频的流畅性,选择相机支持格式中图像最小,帧率最低的:并对视频进行处理,将15帧处理成5帧,从而降低传输数据量: 3.地图显示及导航控制: 地图在三维 ...