当前微信接口类已实现以下接口,代码上如果不够简洁的,请自行处理。
1.获取access_token
2.获取用户基本信息
3.生成带参数二维码
4.新增永久素材
5.新增临时素材
6.发送微信模版
7.网页授权获取用户基本信息
8.分享朋友圈
关于需要使用poststr字符串可以在asp.net 页面进行poststr配置

//获取素材列表
var jsonitem = new
{
type = "image",
offset = 0,
count = 999
};
JavaScriptSerializer js = new JavaScriptSerializer();
string poststr = js.Serialize(jsonitem);

using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Web; namespace DomainModel.Model
{
public class WeChatSMS
{
     //该类有用到数据库表WeChatAccessTokens保存和Log日志,这两个表可以根据自己喜好自行创建
/// <summary>
/// AppID(应用ID)
/// </summary>
public static string APPID = "APPID";
/// <summary>
/// AppSecret(应用密钥)
/// </summary>
private static string SECRET = "SECRET"; #region 微信模板ID
/// <summary>
/// 兑换码领取成功通知
/// </summary>
public static string Template = "zjXZufqN-9RguRy5T9QQ9N1ueSEkkcbPiRlzWe0XUmI";
/// <summary>
/// 校验码通知
/// </summary>
public static string ConcertTemplate = "tIuE4GJIKO3wAoyt-GawmTi03tdOqlg9CHw0IwcZVsk";
/// <summary>
/// 领取成功通知
/// </summary>
public static string GetTemplate = "mpADikrfOojgF7S-_zhTxgqB7F4hy_6qwAYd8f-g_sU";
#endregion /// <summary>
/// 获取时间戳
/// </summary>
/// <returns></returns>
public static string GetTimeStamp()
{
TimeSpan ts = DateTime.UtcNow - new DateTime(, , , , , , );
return Convert.ToInt64(ts.TotalSeconds).ToString();
} #region access_token
/// <summary>
/// 获取access_token
/// </summary>
/// <returns></returns>
public static string GetAccess_Token()
{
using (DB db = DBFactory.CreateDB())
{
var list = db.WeChatAccessTokens.Where(s => s.APPID == WeChatSMS.APPID && s.ParamName == "access_token").ToList();
if (list.Count == )
{
if (list[].UpdateDate.AddHours() > DateTime.Now)
{
return list[].AccessToken;
}
}
} return SetAccess_Token();
} /// <summary>
/// 获取access_token
/// </summary>
private static string TOKENURL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}"; /// <summary>
/// 更新access_token
/// </summary>
/// <returns></returns>
public static string SetAccess_Token()
{
string url = string.Format(WeChatSMS.TOKENURL,WeChatSMS.APPID, WeChatSMS.SECRET);
string json = HttpPost(url, "GET", "");
string pattern = "^{\"access_token\":\"(?<access_token>.+?)\"";
Regex regex = new Regex(pattern);
var match = regex.Match(json);
string AccessToken = "";
if (match.Success)
{
AccessToken = match.Result("${access_token}");
using (DB db = DBFactory.CreateDB())
{
var list = db.WeChatAccessTokens.Where(s => s.APPID == WeChatSMS.APPID && s.ParamName == "access_token").ToList();
if (list.Count == )
{
list[].AccessToken = AccessToken;
list[].UpdateDate = DateTime.Now;
}
else
{
WeChatAccessToken item = new WeChatAccessToken();
item.APPID = WeChatSMS.APPID;
item.ParamName = "access_token";
item.AccessToken = AccessToken;
item.UpdateDate = DateTime.Now;
db.WeChatAccessTokens.InsertOnSubmit(item);
}
db.SubmitChanges();
}
}
return AccessToken;
}
#endregion #region jsapi_ticket /// <summary>
/// 获取jsapi_ticket
/// </summary>
private static string JSAPI_TICKET = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi";
/// <summary>
/// 获取jsapi_ticket
/// </summary>
/// <returns></returns>
public static string GetJsapi_Ticket()
{
using (DB db = DBFactory.CreateDB())
{
var list = db.WeChatAccessTokens.Where(s => s.APPID == WeChatSMS.APPID && s.ParamName == "jsapi_ticket").ToList();
if (list.Count == )
{
if (list[].UpdateDate.AddHours() > DateTime.Now)
{
return list[].AccessToken;
}
}
} return SetJsapi_Ticket();
} /// <summary>
/// 更新jsapi_ticket
/// </summary>
/// <returns></returns>
public static string SetJsapi_Ticket()
{
string JsapiTicket = ""; string json = GetJson(JSAPI_TICKET, "GET", "", "分享微信信息异常记录"); string pattern = "\"ticket\":\"(?<ticket>.+?)\",";
Regex regex = new Regex(pattern);
var match = regex.Match(json);
if (match.Success)
{
JsapiTicket = match.Result("${ticket}");
using (DB db = DBFactory.CreateDB())
{
var list = db.WeChatAccessTokens.Where(s => s.APPID == WeChatSMS.APPID && s.ParamName == "jsapi_ticket").ToList();
if (list.Count == )
{
list[].AccessToken = JsapiTicket;
list[].UpdateDate = DateTime.Now;
}
else
{
WeChatAccessToken item = new WeChatAccessToken();
item.APPID = WeChatSMS.APPID;
item.ParamName = "jsapi_ticket";
item.AccessToken = JsapiTicket;
item.UpdateDate = DateTime.Now;
db.WeChatAccessTokens.InsertOnSubmit(item);
}
db.SubmitChanges();
}
}
return JsapiTicket;
}
#endregion #region 素材管理 public static string uploadTemporaryUrl = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token={0}&type={1}";
/// <summary>
/// 新增临时素材
/// </summary>
/// <param name="type">上传文件类型</param>
/// <param name="filePath">文件的绝对路径</param>
/// <returns></returns>
public static string UploadTemporaryFile(string type, string filePath)
{
return UploadData(uploadTemporaryUrl, "POST", type, filePath, "新增临时素材");
} public static string uploadPerpetualUrl = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token={0}&type={1}";
/// <summary>
/// 新增永久素材
/// </summary>
/// <param name="type">上传文件类型</param>
/// <param name="filePath">文件的绝对路径</param>
/// <returns></returns>
public static string UploadPerpetualFile(string type, string filePath)
{
return UploadData(uploadPerpetualUrl, "POST", type, filePath, "新增永久素材");
} /// <summary>
/// 上传永久通用
/// </summary>
/// <param name="url"></param>
/// <param name="method"></param>
/// <param name="type"></param>
/// <param name="filePath"></param>
/// <param name="category"></param>
/// <returns></returns>
public static string UploadData(string url, string method, string type, string localPath, string category)
{
string resultJson = "";
while (true)
{
string json = UploadVideo.GetUploadVideoResult(url, GetAccess_Token(), type, localPath, "", "");
string pattern = "^{\"errcode\":(?<errcode>.+?),";
Regex regex = new Regex(pattern);
var match = regex.Match(json);
if (match.Success)
{
string errcode = match.Result("${errcode}");
if (errcode == "-1")
{
//-1系统繁忙,此时请开发者稍候再试\
break;
}
else if (errcode == "")
{
//42001access_token超时,请检查access_token的有效期,请参考基础支持-获取access_token中,对access_token的详细机制说明
SetAccess_Token();
}
else if (errcode == "")
{
//40001获取access_token时AppSecret错误,或者access_token无效。请开发者认真比对AppSecret的正确性,或查看是否正在为恰当的公众号调用接口
SetAccess_Token();
}
else
{
LogControls.InsertLogs(json, category);
break;
}
}
else
{
pattern = "\"media_id\":\"(?<media_id>.+?)\",";
regex = new Regex(pattern);
match = regex.Match(json);
if (match.Success)
{
resultJson = json;
break;
}
}
} return resultJson;
} public static string uploadImageUrl = "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token={0}";
/// <summary>
/// 新增图文中的图片素材
/// </summary>
/// <param name="url"></param>
/// <param name="filePath"></param>
/// <param name="category"></param>
/// <returns></returns>
public static string UploadImage(string filePath)
{
string resultJson = "";
using (WebClient client = new WebClient())
{
while (true)
{
byte[] b = client.UploadFile(string.Format(uploadImageUrl, GetAccess_Token()), filePath);//调用接口上传文件
string json = Encoding.Default.GetString(b);//获取返回值
string pattern = "^{\"errcode\":(?<errcode>.+?),";
Regex regex = new Regex(pattern);
var match = regex.Match(json);
if (match.Success)
{
string errcode = match.Result("${errcode}");
if (errcode == "-1")
{
//-1系统繁忙,此时请开发者稍候再试\
break;
}
else if (errcode == "")
{
//42001access_token超时,请检查access_token的有效期,请参考基础支持-获取access_token中,对access_token的详细机制说明
SetAccess_Token();
}
else if (errcode == "")
{
//40001获取access_token时AppSecret错误,或者access_token无效。请开发者认真比对AppSecret的正确性,或查看是否正在为恰当的公众号调用接口
SetAccess_Token();
}
else
{
LogControls.InsertLogs(json, "新增图文中的图片素材");
break;
}
}
else
{
if (json.Contains("url"))
{
resultJson = json.Replace("\\","");
break;
}
}
}
}
return resultJson;
} /// <summary>
/// 获取素材列表
/// </summary>
public static string BatchgetMaterialUrl = "https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token={0}";
/// <summary>
/// 获取素材列表
/// </summary>
/// <returns></returns>
public static string GetBatchget_Material(string postDataStr)
{
return GetJson(BatchgetMaterialUrl, "POST", postDataStr, "获取素材列表信息异常");
}
#endregion #region 带参数二维码
public const string CreateTicketUrl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={0}";
/// <summary>
/// 创建二维码ticket
/// </summary>
public static string GetCreateTicket(string postDataStr)
{
return GetJson(CreateTicketUrl, "POST", postDataStr, "创建二维码ticket异常");
} public const string GetTicketUrl = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket={0}";
/// <summary>
/// 通过ticket换取二维码图片路径
/// </summary>
/// <param name="ticket"></param>
/// <returns></returns>
public static string GetTicketImage(string ticket,string path,string filename)
{
try
{
string uriStr = string.Format(GetTicketUrl, ticket.Replace("\\", ""));
HttpWebRequest requestScore = (HttpWebRequest)WebRequest.Create(uriStr);
requestScore.Method = "GET";
requestScore.ContentType = "image/jpg;charset=UTF-8";
HttpWebResponse response = (HttpWebResponse)requestScore.GetResponse();
Stream myResponseStream = response.GetResponseStream();
Image img = Image.FromStream(myResponseStream);
string imagePath = HttpContext.Current.Server.MapPath(path + filename);
string dpath = HttpContext.Current.Server.MapPath(path);
if (!Directory.Exists(dpath))
{
Directory.CreateDirectory(dpath);
}
img.Save(imagePath);
myResponseStream.Close();
return path + filename;
}
catch (Exception ex)
{
LogControls.InsertLogs(ex.ToString() + "\r\n" + ticket, "微信二维码图片异常");
return "";
}
} #endregion #region 发送模板通用 /// <summary>
/// 接口调用请求说明
/// </summary>
private static string TEMPLATESEND = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="; /// <summary>
/// 微信发送模板信息
/// </summary>
/// <param name="postDataStr"></param>
/// <returns></returns>
public static void SendTemplate(string postDataStr)
{
string Url = TEMPLATESEND + GetAccess_Token();
SendIteration(Url, "POST", postDataStr);
}
/// <summary>
/// 迭代发送
/// 42001:access_token超时,请检查access_token的有效期,请参考基础支持-获取access_token中,对access_token的详细机制说明
/// </summary>
/// <param name="Url"></param>
/// <param name="Method"></param>
/// <param name="postDataStr"></param>
/// <returns></returns>
private static void SendIteration(string Url, string Method, string postDataStr)
{
var json = HttpPost(Url, Method, postDataStr);
string pattern = "^{\"errcode\":(?<errcode>.+?),\"";
Regex regex = new Regex(pattern);
var match = regex.Match(json);
string errcode = "";
if (match.Success)
{
errcode = match.Result("${errcode}");
if (errcode == "")
{
//42001access_token超时,请检查access_token的有效期,请参考基础支持-获取access_token中,对access_token的详细机制说明
Url = TEMPLATESEND + SetAccess_Token();
SendIteration(Url, Method, postDataStr);
}
else if (errcode == "")
{
//40001获取access_token时AppSecret错误,或者access_token无效。请开发者认真比对AppSecret的正确性,或查看是否正在为恰当的公众号调用接口
Url = TEMPLATESEND + SetAccess_Token();
SendIteration(Url, Method, postDataStr);
}
else if (errcode == "")
{
//43004需要接收者关注
}
else if (errcode != "")
{
LogControls.InsertLogs(json, "体彩微信信息异常记录");
}
}
}
#endregion #region 获取用户基本信息 /// <summary>
/// 获取用户基本资料
/// </summary>
public static string UserinfoUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token="; /// <summary>
/// 获取用户基本信息
/// </summary>
/// <param name="postDataStr"></param>
public static string GetUserInfo(string OPENID)
{
string Url = UserinfoUrl + GetAccess_Token() + "&openid=" + OPENID + "&lang=zh_CN";
string json = HttpPost(Url, "GET", ""); Regex rg = new Regex( "^{\"errcode\":(?<errcode>.+?),\""); Match match = rg.Match(json); if (match.Success)
{
while (true)
{
string errcode = match.Result("${errcode}");
if (errcode == "")
{
//42001access_token超时,请检查access_token的有效期,请参考基础支持-获取access_token中,对access_token的详细机制说明
WeChatSMS.SetAccess_Token();
GetUserInfo(OPENID);
}
else if (errcode == "")
{
//40001获取access_token时AppSecret错误,或者access_token无效。请开发者认真比对AppSecret的正确性,或查看是否正在为恰当的公众号调用接口
WeChatSMS.SetAccess_Token();
GetUserInfo(OPENID);
}
else
{
LogControls.InsertLogs(json, "分享获取用户信息异常");
json = "";
break;
}
LogControls.InsertLogs(json, "分享获取用户信息异常--循环");
}
} return json;
}
#endregion #region 网页授权获取用户基本信息
public static string WebAccreditUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope={2}&state={3}#wechat_redirect";
/// <summary>
/// 网页授权获取用户基本信息链接(redirect_uri/?code=CODE&state=STATE)
/// </summary>
/// <param name="url">授权后重定向的回调链接地址,请使用urlencode对链接进行处理</param>
/// <param name="scope">应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)</param>
/// <param name="state">重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节</param>
/// <returns></returns>
public static string GetWebAccreditUrl(string redirect_uri, string scope, string state)
{
return string.Format(WebAccreditUrl, APPID, redirect_uri, scope, state);
}
/// <summary>
/// 通过code换取网页授权access_token
/// </summary>
public static string WebAccess_tokenUrl = " https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code"; /// <summary>
/// 通过code换取网页授权access_token
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
public static string GetWebAccess_token(string code)
{
string url = string.Format(WebAccess_tokenUrl, APPID, SECRET, code);
return GetJsonByCode(url, "GET", "", "通过code换取网页授权access_token异常");
} /// <summary>
/// 刷新access_token
/// </summary>
public static string WebRefreshTokenUrl = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid={0}&grant_type=refresh_token&refresh_token={1}";
/// <summary>
/// 刷新access_token,refresh_token有效期为30天,当refresh_token失效之后,需要用户重新授权。
/// </summary>
public static string RefreshToken(string refresh_token)
{
string url = string.Format(WebRefreshTokenUrl, APPID, refresh_token);
return GetJsonByCode(url, "GET", "", "刷新access_token异常");
}
/// <summary>
/// 拉取用户信息(需scope为 snsapi_userinfo)
/// </summary>
public static string WebUserinfo = "https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang=zh_CN";
/// <summary>
/// 拉取用户信息(需scope为 snsapi_userinfo)
/// </summary>
/// <param name="access_token"></param>
/// <returns></returns>
public static string GetWebUserInfo(string access_token)
{
string url = string.Format(WebUserinfo, access_token, APPID);
return GetJsonByCode(url, "GET", "", "拉取用户信息(需scope为 snsapi_userinfo)异常");
}
/// <summary>
/// 检验授权凭证(access_token)是否有效
/// </summary>
public static string WebAccess_TokenIsValidUrl = "https://api.weixin.qq.com/sns/auth?access_token={0}&openid={1}";
/// <summary>
/// 检验授权凭证(access_token)是否有效
/// </summary>
/// <param name="access_token"></param>
/// <param name="openID"></param>
/// <returns></returns>
public static string ValidAccess_Token(string access_token, string openID)
{
string url = string.Format(WebAccess_TokenIsValidUrl, access_token, openID);
return GetJsonByCode(url, "GET", "", "检验授权凭证(access_token)是否有效异常");
} #endregion /// <summary>
/// 通用接口请求
/// </summary>
/// <param name="Url"></param>
/// <param name="Method">POST或者GET</param>
/// <param name="postDataStr"></param>
/// <returns></returns>
public static string HttpPost(string Url, string Method, string postDataStr)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.Method = Method;
request.ContentType = "application/x-www-form-urlencoded";
if (string.IsNullOrWhiteSpace(postDataStr) == false)
{
byte[] dataArray = Encoding.UTF8.GetBytes(postDataStr);
request.ContentLength = dataArray.Length;
Stream dataStream = request.GetRequestStream();
dataStream.Write(dataArray, , dataArray.Length);
dataStream.Close();
}
try
{
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
String res = reader.ReadToEnd();
reader.Close();
return res;
}
catch (Exception e)
{
return e.Message + e.ToString();
}
} /// <summary>
/// 获取微信返回json语句
/// </summary>
/// <param name="objUrl"></param>
/// <param name="Method"></param>
/// <param name="postDataStr"></param>
/// <param name="category"></param>
/// <returns></returns>
public static string GetJson(string objUrl, string Method, string postDataStr, string category)
{
string resultJson = "";
while (true)
{
string url = string.Format(objUrl, GetAccess_Token());
string json = HttpPost(url, Method, postDataStr);
string pattern = "^{\"errcode\":(?<errcode>.+?),";
Regex regex = new Regex(pattern);
var match = regex.Match(json);
if (match.Success)
{
string errcode = match.Result("${errcode}");
if (errcode == "-1")
{
//-1系统繁忙,此时请开发者稍候再试\
break;
}
else if (errcode == "")
{
//42001access_token超时,请检查access_token的有效期,请参考基础支持-获取access_token中,对access_token的详细机制说明
SetAccess_Token();
}
else if (errcode == "")
{
//40001获取access_token时AppSecret错误,或者access_token无效。请开发者认真比对AppSecret的正确性,或查看是否正在为恰当的公众号调用接口
SetAccess_Token();
}
else if (errcode == "")
{
resultJson = json;
break;
}
else
{
LogControls.InsertLogs(json, category);
break;
}
}
else
{
resultJson = json;
break;
}
}
return resultJson;
} /// <summary>
/// 获取微信返回json语句
/// </summary>
/// <param name="url"></param>
/// <param name="Method"></param>
/// <param name="postDataStr"></param>
/// <param name="category"></param>
/// <returns></returns>
public static string GetJsonByCode(string url, string Method, string postDataStr, string category)
{
string resultJson = "";
while (true)
{
string json = HttpPost(url, Method, postDataStr);
string pattern = "^{\"errcode\":(?<errcode>.+?),";
Regex regex = new Regex(pattern);
var match = regex.Match(json);
if (match.Success)
{
string errcode = match.Result("${errcode}");
if (errcode == "-1")
{
//-1系统繁忙,此时请开发者稍候再试\
break;
}
else if (errcode == "")
{
resultJson = json;
break;
}
else if (errcode == "")
{
//40029不合法的oauth_code Code无效错误
resultJson = json;
break;
}
else if (errcode == "")
{
//40003不合法的OpenID,请开发者确认OpenID(该用户)是否已关注公众号,或是否是其他公众号的OpenID
resultJson = json;
break;
}
else
{
LogControls.InsertLogs(json, category);
break;
}
}
else
{
resultJson = json;
break;
}
}
return resultJson;
}
} /// <summary>
/// 微信文件上传通用类
/// </summary>
public static class UploadVideo
{
/// <summary>
/// 填充表单信息的Stream
/// </summary>
/// <param name="formData"></param>
/// <param name="stream"></param>
public static void FillFormDataStream(this Dictionary<string, string> formData, Stream stream)
{
string dataString = GetQueryString(formData);
var formDataBytes = formData == null ? new byte[] : Encoding.UTF8.GetBytes(dataString);
stream.Write(formDataBytes, , formDataBytes.Length);
stream.Seek(, SeekOrigin.Begin);//设置指针读取位置
} public static string GetUploadVideoResult(string urlTemplate, string accessToken, string type, string filePath, string title, string introduction)
{
//"https://api.weixin.qq.com/cgi-bin/material/add_material?access_token={0}&type={1}"
var url = string.Format(urlTemplate, accessToken, type);
var fileDictionary = new Dictionary<string, string>();
fileDictionary["media"] = filePath;
if (title != "")
{
fileDictionary["description"] = string.Format("{{\"title\":\"{0}\", \"introduction\":\"{1}\"}}", title, introduction);
} string returnText = string.Empty;
Dictionary<string, string> postDataDictionary = null;
using (MemoryStream ms = new MemoryStream())
{
postDataDictionary.FillFormDataStream(ms); //填充formData
returnText = HttpPost(url, null, ms, fileDictionary, null, null, );
}
return returnText;
} /// <summary>
/// 组装QueryString的方法
/// 参数之间用&连接,首位没有符号,如:a=1&b=2&c=3
/// </summary>
/// <param name="formData"></param>
/// <returns></returns>
public static string GetQueryString(this Dictionary<string, string> formData)
{
if (formData == null || formData.Count == )
{
return "";
} StringBuilder sb = new StringBuilder(); var i = ;
foreach (var kv in formData)
{
i++;
sb.AppendFormat("{0}={1}", kv.Key, kv.Value);
if (i < formData.Count)
{
sb.Append("&");
}
} return sb.ToString();
} /// <summary>
/// 根据完整文件路径获取FileStream
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public static FileStream GetFileStream(string fileName)
{
FileStream fileStream = null;
if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName))
{
fileStream = new FileStream(fileName, FileMode.Open);
}
return fileStream;
} /// <summary>
/// 使用Post方法获取字符串结果
/// </summary>
/// <param name="url"></param>
/// <param name="cookieContainer"></param>
/// <param name="postStream"></param>
/// <param name="fileDictionary">需要上传的文件,Key:对应要上传的Name,Value:本地文件名</param>
/// <param name="timeOut">超时</param>
/// <returns></returns>
public static string HttpPost(string url, CookieContainer cookieContainer = null, Stream postStream = null, Dictionary<string, string> fileDictionary = null, string refererUrl = null, Encoding encoding = null, int timeOut = )
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.Timeout = timeOut; #region 处理Form表单文件上传
var formUploadFile = fileDictionary != null && fileDictionary.Count > ;//是否用Form上传文件
if (formUploadFile)
{
//通过表单上传文件
postStream = postStream ?? new MemoryStream(); string boundary = "----" + DateTime.Now.Ticks.ToString("x");
//byte[] boundarybytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
string fileFormdataTemplate = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: application/octet-stream\r\n\r\n";
string dataFormdataTemplate = "\r\n--" + boundary +
"\r\nContent-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
foreach (var file in fileDictionary)
{
try
{
var fileName = file.Value; //准备文件流
using (var fileStream = GetFileStream(fileName))
{
string formdata = null;
if (fileStream != null)
{
//存在文件
formdata = string.Format(fileFormdataTemplate, file.Key, /*fileName*/ Path.GetFileName(fileName));
}
else
{
//不存在文件或只是注释
formdata = string.Format(dataFormdataTemplate, file.Key, file.Value);
} //统一处理
var formdataBytes = Encoding.UTF8.GetBytes(postStream.Length == ? formdata.Substring(, formdata.Length - ) : formdata);//第一行不需要换行
postStream.Write(formdataBytes, , formdataBytes.Length); //写入文件
if (fileStream != null)
{
byte[] buffer = new byte[];
int bytesRead = ;
while ((bytesRead = fileStream.Read(buffer, , buffer.Length)) != )
{
postStream.Write(buffer, , bytesRead);
}
}
}
}
catch (Exception ex)
{
throw ex;
}
}
//结尾
var footer = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
postStream.Write(footer, , footer.Length); request.ContentType = string.Format("multipart/form-data; boundary={0}", boundary);
}
else
{
request.ContentType = "application/x-www-form-urlencoded";
}
#endregion request.ContentLength = postStream != null ? postStream.Length : ;
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
request.KeepAlive = true; if (!string.IsNullOrEmpty(refererUrl))
{
request.Referer = refererUrl;
}
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36"; if (cookieContainer != null)
{
request.CookieContainer = cookieContainer;
} #region 输入二进制流
if (postStream != null)
{
postStream.Position = ; //直接写入流
Stream requestStream = request.GetRequestStream(); byte[] buffer = new byte[];
int bytesRead = ;
while ((bytesRead = postStream.Read(buffer, , buffer.Length)) != )
{
requestStream.Write(buffer, , bytesRead);
} //debug
postStream.Seek(, SeekOrigin.Begin);
StreamReader sr = new StreamReader(postStream);
var postStr = sr.ReadToEnd();
postStream.Close();//关闭文件访问 }
#endregion HttpWebResponse response = (HttpWebResponse)request.GetResponse(); if (cookieContainer != null)
{
response.Cookies = cookieContainer.GetCookies(response.ResponseUri);
} using (Stream responseStream = response.GetResponseStream())
{
using (StreamReader myStreamReader = new StreamReader(responseStream, encoding ?? Encoding.GetEncoding("utf-8")))
{
string retString = myStreamReader.ReadToEnd();
return retString;
}
}
}
}
}
分享朋友圈用到了一般应用程序
public class wxconfig
{
public string appId { get; set; }
public string timestamp { get; set; }
public string nonceStr { get; set; }
public string jsapiticke { get; set; }
public string url { get; set; }
public string signature
{
get
{
string temp = Cryptography.SHA1_Hash("jsapi_ticket=" + jsapiticke + "&noncestr="
+ nonceStr + "&timestamp=" + timestamp + "&url=" + url).ToLower();
return temp; } }
} /// <summary>
/// Getjsapi 的摘要说明
/// </summary>
public class Getjsapi : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
wxconfig item = new wxconfig();
item.jsapiticke = WeChatSMS.GetJsapi_Ticket();
item.url = context.Request.Params["urlparam"];
item.appId = WeChatSMS.APPID;
item.timestamp = WeChatSMS.GetTimeStamp();
item.nonceStr = ("GGVi4C3VM0P37wVU");
JavaScriptSerializer js = new JavaScriptSerializer();
string json = js.Serialize(item);
context.Response.Write(json);
} public bool IsReusable
{
get
{
return false;
}
}
} 页面配置代码 <script>
$.ajax({
type: "POST",
url: "/ashx/Getjsapi.ashx",
data: { urlparam: "http://www.chaoyundong.com/mobile/share/sharetest.aspx" },
cache: false,
async: false, //是否ajax同步
success: function (data) {
var item = JSON.parse(data);
//console.log(item);
wx.config({
debug: false,
appId: item.appId,
timestamp: item.timestamp,
nonceStr: item.nonceStr,
signature: item.signature,
jsApiList: [
'checkJsApi',
'onMenuShareTimeline',
'onMenuShareAppMessage'
]
});
wx.ready(function () {
//分享到朋友圈
wx.onMenuShareTimeline({
title: '测试哈哈哈', // 分享标题
link: 'http://movie.douban.com/subject/25785114/', // 分享链接
imgUrl: 'http://demo.open.weixin.qq.com/jssdk/images/p2166127561.jpg', // 分享图标
success: function (res) {
//console.log(res);
alert('');
},
cancel: function () {
alert('');
// 用户取消分享后执行的回调函数
}
});
//分享到朋友
wx.onMenuShareAppMessage({
title: '测试哈哈哈', // 分享标题
link: 'http://movie.douban.com/subject/25785114/', // 分享链接
imgUrl: 'http://demo.open.weixin.qq.com/jssdk/images/p2166127561.jpg', // 分享图标
success: function (res) {
//console.log(res);
alert('');
},
cancel: function () {
alert('');
// 用户取消分享后执行的回调函数
}
});
});
}
});
</script>

asp.net C# 实现微信接口权限开发类的更多相关文章

  1. 【JEECG技术文档】JEECG 接口权限开发及配置使用说明

    1.功能介绍   通过接口配置实现,对接口的访问权限控制和数据权限控制,接口时REST接口,接口权限认证机制使用Json web token (JWT) 接口权限调用流程: (1)通过接口用户的用户名 ...

  2. C#微信公众号开发-MVC模式公共类封装

    第一部分:基础配置 第一步:注册微信公众账号 如果开发测试阶段可以打开测试链接地址,注册测试公众号.测试账号除了不能与正式账号通信外其他什么高级接口的都可以实现. 测试号管理地址:http://mp. ...

  3. 用c#开发微信 (19) 公众平台接口权限列表说明 - 订阅号、服务号认证后的区别

    最新发现有些原来认证服务号的权限对认证的订阅号开放了,这里是官方的文档说明<公众平台接口权限列表说明>,明显比这里说得详细.准确多了<微信公众平台服务号.订阅号的相关说明>.另 ...

  4. C#.NET微信公众账号接口开发系列文章整理--微信接口开发目录,方便需要的博友查询

    前言: 涉及微信接口开发比较早也做的挺多的,有时间的时候整理了开发过程中一些思路案例,供刚学习微信开发的朋友参考.其实微信接口开发还是比较简单的,但是由于调试比较麻烦,加上微信偶尔也会给开发者挖坑,并 ...

  5. ASP.NET MVC4 微信公众号开发之网页授权(一):搭建基础环境

    首先你得注册并认证一个个人或企业的微信公众号===服务号从而确保获得以下接口权限: 然后打开公众号设置里的功能设置里找到业务域名和网页授权域名分别填上你的域名(注:已备案的域名),如下图所示: 到这里 ...

  6. [转]微信公众平台(测试接口)开发前的准备工作(转载自walkingmanc的专栏)

    本文转自:http://blog.csdn.net/jiangweicpu/article/details/21228949 http://blog.csdn.net/walkingmanc/arti ...

  7. C#开发微信门户及应用(1)--开始使用微信接口

    微信应用如火如荼,很多公司都希望搭上信息快车,这个是一个商机,也是一个技术的方向,因此,有空研究下.学习下微信的相关开发,也就成为日常计划的重要事情之一了.本系列文章希望从一个循序渐进的角度上,全面介 ...

  8. 微信公众平台开发(一)——接入指南(asp.net)

    第一步:申请消息接口 在公众平台网站的高级功能 – 开发模式页,点击“成为开发者”按钮,填写URL和Token,其中URL是开发者用来接收微信服务器数据的接口URL.Token可由开发者任意填写,用作 ...

  9. 转 C#开发微信门户及应用(1)--开始使用微信接口

    微信应用如火如荼,很多公司都希望搭上信息快车,这个是一个商机,也是一个技术的方向,因此,有空研究下.学习下微信的相关开发,也就成为日常计划的重要事情之一了.本系列文章希望从一个循序渐进的角度上,全面介 ...

随机推荐

  1. 201521123005《Java程序设计》第十三周学习总结

    1. 本周学习总结 1.网络基本概念 2.网络常用命令 ipconfig 查看网络配置信息,如ip地址 ping 测试网络是否连通 telnet 远程登录 ftp 登陆ftp Fport (xp下)查 ...

  2. 201521123117 《Java程序设计》第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自 ...

  3. Calico 的默认连通性 - 每天5分钟玩转 Docker 容器技术(69)

    前面我们完成了 Calico 网络的部署并运行了容器,今天将讨论 Calico 的连通性. 测试一下 bbox1 与 bbox2 的连通性: ping 成功,数据包流向如下图所示. ① 根据 bbox ...

  4. Shiro第五篇【授权过滤、注解、JSP标签方式、与ehcache整合】

    授权过滤器测试 我们的授权过滤器使用的是permissionsAuthorizationFilter来进行拦截.我们可以在application-shiro中配置filter规则 <!--商品查 ...

  5. [06] Java的数据类型

    1.基本数据类型 1.1 基本数据类型 byte.chart.short.int.long.float.double.boolean 共8种数据类型为基本数据类型: 数据类型     位数     取 ...

  6. bind9的一些配置

    /etc/bind/named.conf.options:options { listen-on port 53 { any; }; // 监听在主机的53端口上.any代表监听所有的主机 direc ...

  7. C++临时对象以及针对其进行的优化

    C++临时对象以及针对其进行的优化 C++中真正的临时对象是看不见的,它们不出现在你的源代码中. 那么什么时候回产生临时对象呢?主要是三个时刻: 产生临时对象的三个时刻: 用构造函数作为隐式类型转换函 ...

  8. vim/network/ssh

    一.编辑器--vim vi编辑器是Linux和Unix上最基本的文本编辑器,工作在字符模式下.由于不需要图形界面,vi是效率很高的文本编辑器.尽管在Linux上也有很多图形界面的编辑器可用,但vi在系 ...

  9. oracle pl/sql 分页

    一.无返回值的存储过程 古人云:欲速则不达,为了让大家伙比较容易接受分页过程编写,我还是从简单到复杂,循序渐进的给大家讲解.首先是掌握最简单的存储过程,无返回值的存储过程. 案例:现有一张表book, ...

  10. 我的Spring学习记录(三)

    学习了AOP之后就可以应用一下了,所以这次我们了解一下Spring的声明式事务. 事务在我们的很多方面都可以体现,就拿我们平时的买卖活动,或者是银行的转账来说,这些活动要么是成功,要么是失败,比如:张 ...