參考文檔:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432
一、安裝Senparc.Weixin NuGet包。
二、添加引用
using Senparc.CO2NET.Extensions; using Senparc.Weixin.MP.Entities.Request;
三、微信公眾號-開發-基本配置
Global.asax全局配置 Application_Start
//微信配置開始
var isGLobalDebug = true;//設置全局 Debug 狀態
var senparcSetting = SenparcSetting.BuildFromWebConfig(isGLobalDebug);
var register = RegisterService.Start(senparcSetting).UseSenparcGlobal();//CO2NET全局注冊,必須!
var isWeixinDebug = true;//設置微信 Debug 狀態
var senparcWeixinSetting = SenparcWeixinSetting.BuildFromWebConfig(isWeixinDebug);
register.UseSenparcWeixin(senparcWeixinSetting, senparcSetting);////微信全局注冊,必須!
//注冊公眾號
AccessTokenContainer.Register(
System.Configuration.ConfigurationManager.AppSettings["WeixinAppId"],
System.Configuration.ConfigurationManager.AppSettings["WeixinAppSecret"],
"公眾號");
//注冊小程序(完美兼容)
AccessTokenContainer.Register(
System.Configuration.ConfigurationManager.AppSettings["WxOpenAppId"],
System.Configuration.ConfigurationManager.AppSettings["WxOpenAppSecret"],
"小程序");
//微信配置結束
/// <summary>
/// 微信后台驗證地址(使用Get),微信后台的“接口配置信息”的Url填寫如:http://sdk.weixin.senparc.com/weixin
/// </summary>
[HttpGet]
[ActionName("Index")]
public ActionResult Get(PostModel postModel, string echostr)
{
if (CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
{
return Content(echostr); //返回隨機字符串則表示驗證通過
}
else
{
return Content("failed:" + postModel.Signature + "," + MP.CheckSignature.GetSignature(postModel.Timestamp, postModel.Nonce, Token) + "。" +
"如果你在瀏覽器中看到這句話,說明此地址可以被作為微信公眾賬號后台的Url,請注意保持Token一致。");
}
}
四、獲取公眾號相關信息
public static readonly string Token = WebConfigurationManager.AppSettings["WeixinToken"];//與微信公眾賬號后台的Token設置保持一致,區分大小寫。 public static readonly string EncodingAESKey = WebConfigurationManager.AppSettings["WeixinEncodingAESKey"];//與微信公眾賬號后台的EncodingAESKey設置保持一致,區分大小寫。 public static readonly string AppId = WebConfigurationManager.AppSettings["WeixinAppId"];//與微信公眾賬號后台的AppId設置保持一致,區分大小寫。 public static readonly string WeixinAppSecret = WebConfigurationManager.AppSettings["WeixinAppSecret"];
五、獲取token
public string GetAccessToken()
{
return Senparc.Weixin.MP.Containers.AccessTokenContainer.GetAccessToken(AppId);
}
六、自定義創建菜單
利用json更新菜單
[HttpPost]
public string CreateMenuFromJson(string token, string fullJson)
{
//TODO:根據"conditionalmenu"判斷自定義菜單
var apiName = "使用JSON更新";
try
{
GetMenuResultFull resultFull = Newtonsoft.Json.JsonConvert.DeserializeObject<GetMenuResultFull>(fullJson);
//重新整理按鈕信息
WxJsonResult result = null;
IButtonGroupBase buttonGroup = null;
buttonGroup = CommonAPIs.CommonApi.GetMenuFromJsonResult(resultFull, new ButtonGroup()).menu;
result = CommonAPIs.CommonApi.CreateMenu(token, buttonGroup);
var json = new
{
Success = result.errmsg == "ok",
Message = "菜單更新成功。" + apiName
};
//return Json(json);
return "菜單更新成功。" + apiName;
}
catch (Exception ex)
{
var json = new { Success = false, Message = string.Format("更新失敗:{0}。{1}", ex.Message, apiName) };
//return Json(json);
return string.Format("更新失敗:{0}。{1}", ex.Message, apiName);
}
}
json格式實例(一級菜單最多三個,二級菜單最多五個)
{
"menu": {
"button": [
{
"name": "一級菜單",
"sub_button": [
{
"type": "view",
"name": "二級菜單",
"url": ""
}
]
}
]
}
}
讀取json
public string GetMenuJson()
{
StreamReader sr = new StreamReader(System.Web.HttpRuntime.AppDomainAppPath + "\\menu.json", Encoding.Default);
string line;
string jsonobj = "";
while ((line = sr.ReadLine()) != null)
{
jsonobj = jsonobj + line.ToString();
}
return jsonobj;
}
創建菜單
public ActionResult CreateMenu()
{
string MenuJson = GetMenuJson();
string token = GetAccessToken();
return Content(CreateMenuFromJson(token, MenuJson));
}
七、調用授權頁面獲取用戶微信code
urlpath:回調url,此url對應域名需要配置在微信公眾號-接口權限-網頁服務-網頁授權-網頁授權獲取用戶基本信息
public void GetWeixinCode(string urlpath)
{
string state = Guid.NewGuid().ToString("N");
string url = string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope=snsapi_userinfo&state=" + state + "#wechat_redirect", AppId, urlpath);
Response.Redirect(url);
}
八、根據code獲取用戶openid
post訪問地址
public static string WebRequestPostOrGet(string sUrl, string sParam)
{
byte[] bt = System.Text.Encoding.UTF8.GetBytes(sParam);
Uri uriurl = new Uri(sUrl);
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(uriurl);
req.Method = "Post";
req.Timeout = 120 * 1000;
req.ContentType = "application/x-www-form-urlencoded;";
req.ContentLength = bt.Length;
using (Stream reqStream = req.GetRequestStream())
{
reqStream.Write(bt, 0, bt.Length);
reqStream.Flush();
}
try
{
using (WebResponse res = req.GetResponse())
{
Stream resStream = res.GetResponseStream();
StreamReader resStreamReader = new StreamReader(resStream, System.Text.Encoding.UTF8);
string resLine;
System.Text.StringBuilder resStringBuilder = new System.Text.StringBuilder();
while ((resLine = resStreamReader.ReadLine()) != null)
{
resStringBuilder.Append(resLine + System.Environment.NewLine);
}
resStream.Close();
resStreamReader.Close();
return resStringBuilder.ToString();
}
}
catch (Exception ex)
{
return ex.Message;
}
}
根據code獲取openid
/// <summary> /// 根據code獲取用戶openid /// </summary> /// <param name="Code"></param> /// <param name="access_token"></param> /// <returns></returns> public string GetOpenidByCode(string Code, out string access_token) { string url = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", AppId, WeixinAppSecret, Code); string ReText = WebRequestPostOrGet(url, "");//post/get方法獲取信息 Newtonsoft.Json.Linq.JObject DicText = (Newtonsoft.Json.Linq.JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(ReText); access_token = ""; if (DicText.ContainsKey("access_token")) access_token = DicText["access_token"].ToString(); if (!DicText.ContainsKey("openid")) return ""; return DicText["openid"].ToString(); }
九、根據openid獲取用戶信息
WXModel:
| 參數 | 描述 |
|---|---|
| openid | 用戶的唯一標識 |
| nickname | 用戶昵稱 |
| sex | 用戶的性別,值為1時是男性,值為2時是女性,值為0時是未知 |
| province | 用戶個人資料填寫的省份 |
| city | 普通用戶個人資料填寫的城市 |
| country | 國家,如中國為CN |
| headimgurl | 用戶頭像,最后一個數值代表正方形頭像大小(有0、46、64、96、132數值可選,0代表640*640正方形頭像),用戶沒有頭像時該項為空。若用戶更換頭像,原有頭像URL將失效。 |
| privilege | 用戶特權信息,json 數組,如微信沃卡用戶為(chinaunicom) |
| unionid | 只有在用戶將公眾號綁定到微信開放平台帳號后,才會出現該字段。 |
public class WXModel
{
public string openid { get; set; }
public string nickname { get; set; }
public int sex { get; set; }
public string province { get; set; }
public string city { get; set; }
public string country { get; set; }
public string headimgurl { get; set; }
}
獲取用戶信息
public WXModel GetUserInfoByCode(string code)
{
string access_token = "";
string openid = GetOpenidByCode(code, out access_token);
string userinfo = WebRequestPostOrGet("https://api.weixin.qq.com/sns/userinfo?access_token=" + access_token + "&openid=" + openid + "&lang=zh_CN", "");
WXModel model = Newtonsoft.Json.JsonConvert.DeserializeObject<WXModel>(userinfo);
return model;
}
十、微網站公用獲取用戶信息方法
public WXModel GetUser(string urlpath) { WXModel model = null; var code = Request.Params["code"]; urlpath = urlpath.UrlEncode(); if (code == null || code == "") { GetWeixinCode(urlpath); } else { model = GetUserInfoByCode(code); } return model; }
十一、需要獲取用戶的地方
string urlpath = Request.Url.AbsoluteUri; tb_user user = GetUser(urlpath);
注:以上代碼屬個人整理,用於交流學習,非原創。如涉及侵權,請聯系我,我立即處理。(QQ/微信:742010299 昵稱:同心同德)
