asp.net C# 实现微信接口权限开发类

时间:2023-06-05 22:57:50
当前微信接口类已实现以下接口,代码上如果不够简洁的,请自行处理。
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>