OWX使用說(shuō)明
項(xiàng)目設(shè)置
應(yīng)用設(shè)置
通過(guò)UCS添加具體項(xiàng)目添加項(xiàng)目信息
Name(應(yīng)用名稱)
ApplicationPath(消息回調(diào)地址,OWX拋過(guò)來(lái)的消息接收的地址如:http://localhost/XXXX/rest/wxmessage/handle)
ApplicationCallBack(登入回調(diào)地址,OWX登入后需要具體項(xiàng)目登入地址如:http://dev.nbeport.com/XXXX/home/LoginCallBack)
WeixinAppId(微信ID)
WeixinAppSecret(微信密鑰)
WeixinClientSecret(響應(yīng)微信的Token驗(yàn)證信息)
具體項(xiàng)目微信設(shè)置
微信回調(diào)地址統(tǒng)一以http://dev.nbeport.com/owx/rest/message/{applicationId 具體在上面應(yīng)用中設(shè)定的ID}
Token需與上面設(shè)置的WeixinAppSecret一致
設(shè)置JS接口安全域名,授權(quán)回調(diào)頁(yè)面域名

實(shí)例
在OWX中設(shè)置首頁(yè)登入模版
//權(quán)限過(guò)濾器 套用V2模版 不需做修改
[WeixinAuthorizeV2]
//定義要設(shè)置的應(yīng)用首頁(yè)
public ActionResult Index_V2(string id)
{
var url = Request.QueryString["returnUrl"];
//如果有回調(diào)URL則進(jìn)行回調(diào),沒有回調(diào)則默認(rèn)進(jìn)入對(duì)應(yīng)應(yīng)用首頁(yè) 這里的URL為GOX短連接唯一ID
if (!String.IsNullOrEmpty(url))
{
string shortCode = url;
var rs = GoxClient.GetShortUrl(shortCode);
return Content(string.Format("<script>window.location.href='" + rs.LongUrl + "'; </script>"));
}
ViewData["ApplicationId"] = Session["applicationId"] == null ? "default" : Session["applicationId"].ToString();
ViewData["Openid"] = Session["openId"] == null ? "default" : Session["openId"].ToString();
return View();
}

實(shí)例
注:后期將通過(guò)UCS菜單進(jìn)行控制
具體應(yīng)用中的設(shè)置
這里以XXXX應(yīng)用為例子
- HomeController設(shè)置
//HomeController
public class HomeController : Controller
{
public HomeController()
{
}
//獲取Authentication
private IAuthenticationManager authentication
{
get
{
return HttpContext.GetOwinContext().Authentication;
}
}
//獲取應(yīng)用認(rèn)證ID
private string GetOauthType
{
get
{
return System.Configuration.ConfigurationManager.AppSettings["oauth:authType"];
}
}
[WeixinAuthorize]
public ActionResult Index()
{
//獲取用戶信息并放入VIWDATA
var result = authentication.AuthenticateAsync(GetOauthType).Result;
ViewData["UserId"] = result.Identity.Claims.Where(x => x.Type == ClaimTypes.NameIdentifier).FirstOrDefault().Value;
ViewData["OpenId"] = result.Identity.Claims.Where(x => x.Type == ClaimTypes.Name).FirstOrDefault().Value;
ViewData["ApplicationId"] = Purple.ConfigHelper.GetConfigString("oauth:clientId");
return View();
}
/// <summary>
/// 授權(quán)回調(diào)函數(shù),跟上面應(yīng)用中設(shè)立的參數(shù)要一致
/// </summary>
/// <param name="userId">用戶ID</param>
/// <param name="openId">微信ID</param>
/// <param name="returnUrl">回調(diào)短連接ID</param>
public ActionResult LoginCallBack(string userId,string openId,string returnUrl)
{
//有信息才會(huì)登入不然返回owx進(jìn)行再授權(quán)
if(!String.IsNullOrEmpty(userId))
{
//sigin
this.authentication.SignOut(GetOauthType);
var claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.NameIdentifier, userId));
claims.Add(new Claim(ClaimTypes.Name, openId));
var id = new ClaimsIdentity(claims, GetOauthType);
this.authentication.SignIn(id);
}
return Redirect(Purple.ConfigHelper.GetConfigString("address:owx") + "/weixin/Index_V2?id=" + Purple.ConfigHelper.GetConfigString("oauth:clientId")+"&ReturnUrl="+returnUrl);
}
}
- 登入授權(quán)過(guò)濾器
///<summary>
/// 認(rèn)證信息
/// </summary>
public class WeixinAuthorize : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
return base.AuthorizeCore(httpContext);
}
//驗(yàn)證不通過(guò)直接跳到OWX進(jìn)行授權(quán)
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
var url = filterContext.HttpContext.Request.Params["id"];
filterContext.HttpContext.Response.Redirect(Purple.ConfigHelper.GetConfigString("address:owx") + "/WxAccountV2/UnifyLogin?id=" + Purple.ConfigHelper.GetConfigString("oauth:clientId") + "&returnUrl=" + url);
}
}
- 設(shè)置參數(shù)必須加入下列項(xiàng)目
<add key="address:owx" value="http://XXXXX/owx" />
<add key="address:oauthwx" value="http://XXXX/cas/rest/AccountWx" />
消息處理設(shè)置
在前面應(yīng)用中已經(jīng)將消息處理接口設(shè)置,在具體應(yīng)用中只要設(shè)置具體回調(diào)接口
- 消息處理接口
//定義回調(diào)方法
public HttpResponseMessage MessageHandle(WxMessageReceive model)
{
//要返回的XML
string RETURNXML = "";
//初始化信息
TextMessage initModel = new TextMessage()
{
ToUserName = model.FromUserName,
FromUserName = model.ToUserName,
CreateTime = HwxHelper.ConvertDateTimeInt(DateTime.Now),
MsgType = "text",
Content = "敬請(qǐng)期待!"
};
RETURNXML = HwxHelper.GetPostXml<TextMessage>(initModel);
var response = Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(RETURNXML, Encoding.UTF8);
return response;
}
- Purple.top.Hwx.Model提供所有關(guān)于微信被動(dòng)消息的模型
使用時(shí)需先安裝Purple.top.Hwx nuget包
1. WxMessageReceive--接受模型
public class WxMessageReceive
{
#region 基礎(chǔ)信息
/// <summary>
/// 開發(fā)者微信號(hào)
/// </summary>
public string ToUserName { get; set; }
/// <summary>
/// 發(fā)送方帳號(hào)
/// </summary>
public string FromUserName { get; set; }
/// <summary>
/// 消息創(chuàng)建時(shí)間
/// </summary>
public int CreateTime { get; set; }
/// <summary>
/// 消息類型
/// </summary>
public string MsgType { get; set; }
/// <summary>
/// 消息ID 用于非EVENT消息
/// </summary>
public long MsgId { get; set; }
/// <summary>
/// 圖片消息媒體id,可以調(diào)用多媒體文件下載接口拉取數(shù)據(jù)
/// </summary>
public string MediaId { get; set; }
#endregion
#region 文本消息
/// <summary>
/// 文本消息內(nèi)容
/// </summary>
public string Content { get; set; }
#endregion
#region 圖片消息
/// <summary>
/// 圖片鏈接
/// </summary>
public string PicUrl { get; set; }
#endregion
#region 語(yǔ)音消息
/// <summary>
/// 語(yǔ)音格式
/// </summary>
public string Format { get; set; }
#endregion
#region 視頻/小視頻 消息
/// <summary>
/// 視頻消息縮略圖的媒體id,可以調(diào)用多媒體文件下載接口拉取數(shù)據(jù)
/// </summary>
public string ThumbMediaId { get; set; }
#endregion
#region 地理位置消息
/// <summary>
/// 地理位置維度
/// </summary>
public decimal Location_X { get; set; }
/// <summary>
/// 地理位置經(jīng)度
/// </summary>
public decimal Location_Y { get; set; }
/// <summary>
/// 地圖縮放大小
/// </summary>
public int Scale { get; set; }
/// <summary>
/// 地理位置信息
/// </summary>
public string Label { get; set; }
#endregion
#region 鏈接消息
/// <summary>
/// 消息標(biāo)題
/// </summary>
public string Title { get; set; }
/// <summary>
/// 消息描述
/// </summary>
public string Description { get; set; }
/// <summary>
/// 消息鏈接
/// </summary>
public string Url { get; set; }
#endregion
#region event
/// <summary>
/// 事件類型
/// </summary>
public string Event { get; set; }
/// <summary>
/// 事件Key值
/// </summary>
public string EventKey { get; set; }
#region 掃描帶參數(shù)二維碼事件
/// <summary>
/// 二維碼的ticket,可用來(lái)?yè)Q取二維碼圖片
/// </summary>
public string Ticket { get; set; }
#endregion
#region 上報(bào)地理位置事件
/// <summary>
/// 地理位置緯度
/// </summary>
public decimal Latitude { get; set; }
/// <summary>
/// 地理位置經(jīng)度
/// </summary>
public decimal Longitude { get; set; }
/// <summary>
/// 地理位置精度
/// </summary>
public decimal Precision { get; set; }
#endregion
#endregion
}
2. TextMessage--文本消息
public partial class TextMessage
{
/// <summary>
/// 接收方帳號(hào)
/// </summary>
public partial class TextMessage
{
[XmlIgnore]
public string ToUserName { get; set; }
/// <summary>
/// 開發(fā)者微信號(hào)
/// </summary>
[XmlIgnore]
public string FromUserName { get; set; }
/// <summary>
/// 消息創(chuàng)建時(shí)間
/// </summary>
[XmlIgnore]
public int CreateTime { get; set; }
/// <summary>
/// 消息類型
/// </summary>
[XmlIgnore]
public string MsgType { get; set; }
/// <summary>
/// 回復(fù)的內(nèi)容
/// </summary>
[XmlIgnore]
public string Content { get; set; }
}
3. ImgMessage--圖片消息
public partial class ImgMessage
{
/// <summary>
/// 接收方帳號(hào)
/// </summary>
[XmlIgnore]
public string ToUserName { get; set; }
/// <summary>
/// 開發(fā)者微信號(hào)
/// </summary>
[XmlIgnore]
public string FromUserName { get; set; }
/// <summary>
/// 消息創(chuàng)建時(shí)間
/// </summary>
[XmlIgnore]
public int CreateTime { get; set; }
/// <summary>
/// 消息類型
/// </summary>
[XmlIgnore]
public string MsgType { get; set; }
/// <summary>
/// 圖片信息
/// </summary>
[XmlElement("Image")]
public Image Image { get; set; }
}
/// <summary>
/// 圖片信息
/// </summary>
public partial class Image
{
/// <summary>
/// 素材ID
/// </summary>
[XmlIgnore]
public string MediaId { get; set; }
}
4. VoiceMessage--聲音消息
public partial class VoiceMessage
{
/// <summary>
/// 接收方帳號(hào)
/// </summary>
[XmlIgnore]
public string ToUserName { get; set; }
/// <summary>
/// 開發(fā)者微信號(hào)
/// </summary>
[XmlIgnore]
public string FromUserName { get; set; }
/// <summary>
/// 消息創(chuàng)建時(shí)間
/// </summary>
[XmlIgnore]
public int CreateTime { get; set; }
/// <summary>
/// 消息類型
/// </summary>
[XmlIgnore]
public string MsgType { get; set; }
}
5. VideoMessage--視頻消息
public partial class VideoMessage
{
/// <summary>
/// 接收方帳號(hào)
/// </summary>
[XmlIgnore]
public string ToUserName { get; set; }
/// <summary>
/// 開發(fā)者微信號(hào)
/// </summary>
[XmlIgnore]
public string FromUserName { get; set; }
/// <summary>
/// 消息創(chuàng)建時(shí)間
/// </summary>
[XmlIgnore]
public int CreateTime { get; set; }
/// <summary>
/// 消息類型
/// </summary>
[XmlIgnore]
public string MsgType { get; set; }
}
public partial class Video
{
/// <summary>
/// 素材ID
/// </summary>
[XmlIgnore]
public string MediaId { get; set; }
/// <summary>
/// 標(biāo)題
/// </summary>
[XmlIgnore]
public string Title { get; set; }
/// <summary>
/// 描述
/// </summary>
[XmlIgnore]
public string Description { get; set; }
}
6. MusicMessage--音樂(lè)消息
public partial class MusicMessage
{
/// <summary>
/// 接收方帳號(hào)
/// </summary>
[XmlIgnore]
public string ToUserName { get; set; }
/// <summary>
/// 開發(fā)者微信號(hào)
/// </summary>
[XmlIgnore]
public string FromUserName { get; set; }
/// <summary>
/// 消息創(chuàng)建時(shí)間
/// </summary>
[XmlIgnore]
public int CreateTime { get; set; }
/// <summary>
/// 消息類型
/// </summary>
[XmlIgnore]
public string MsgType { get; set; }
}
/// <summary>
/// 音樂(lè)消息
/// </summary>
public partial class Music
{
/// <summary>
/// 標(biāo)題
/// </summary>
[XmlIgnore]
public string Title { get; set; }
/// <summary>
/// 描述
/// </summary>
[XmlIgnore]
public string Description { get; set; }
/// <summary>
/// 音樂(lè)鏈接
/// </summary>
[XmlIgnore]
public string MusicUrl { get; set; }
/// <summary>
/// 高品質(zhì)音樂(lè)鏈接
/// </summary>
[XmlIgnore]
public string HQMusicUrl { get; set; }
/// <summary>
/// 縮略圖媒體ID
/// </summary>
[XmlIgnore]
public string ThumbMediaId { get; set; }
}
7. ArticleMessage--圖文消息
public partial class ArticleMessage
{
/// <summary>
/// 接收方帳號(hào)
/// </summary>
[XmlIgnore]
public string ToUserName { get; set; }
/// <summary>
/// 開發(fā)者微信號(hào)
/// </summary>
[XmlIgnore]
public string FromUserName { get; set; }
/// <summary>
/// 消息創(chuàng)建時(shí)間
/// </summary>
[XmlIgnore]
public int CreateTime { get; set; }
/// <summary>
/// 消息類型
/// </summary>
[XmlIgnore]
public string MsgType { get; set; }
/// <summary>
/// 圖文消息條數(shù)
/// </summary>
[XmlIgnore]
public int ArticleCount { get; set; }
}
/// <summary>
/// 文章消息
/// </summary>
public partial class Article
{
/// <summary>
/// 標(biāo)題
/// </summary>
[XmlIgnore]
public string Title { get; set; }
/// <summary>
/// 描述
/// </summary>
[XmlIgnore]
public string Description { get; set; }
/// <summary>
/// 圖片鏈接,支持JPG、PNG格式,較好的效果為大圖360*200,小圖200*200
/// </summary>
[XmlIgnore]
public string PicUrl { get; set; }
/// <summary>
/// 點(diǎn)擊圖文消息跳轉(zhuǎn)鏈接
/// </summary>
[XmlIgnore]
public string Url { get; set; }
}
-
Purple.top.Hwx.Helper提供將所有上述模型轉(zhuǎn)換成XML文檔
HwxHelper.GetPostXml()將上述模型轉(zhuǎn)換成微信接收的模型
-
主動(dòng)消息發(fā)送
method:httppost /rest/message/{applicationId}/sendtemplate postJsonModel:
/// <summary>
/// 模版發(fā)送模型
/// </summary>
public class TempalteSendModel
{
//對(duì)應(yīng)的用戶ID
public string touser { get; set; }
//模版ID
public string template_id { get; set; }
//模版消息點(diǎn)擊URL
public string url { get; set; }
//要發(fā)送的數(shù)據(jù)模型
public object data { get; set; }
}
二維碼掃碼設(shè)置
未完待續(xù)
圖片上傳
未完待續(xù)