读书人

.net 微信接口(怎么使用微信接口-做过

发布时间: 2013-09-12 22:07:00 作者: rapoo

.net 微信接口(如何使用微信接口--做过的请进)
想做一个程序通过微信发信息。
有人做过吗?是怎么实现的。
-------------------------------------------------------------------
我找的参考代码,有人知道实现不步骤吗?
<%@ WebHandler Language="C#" CodeBehind="MessageReceiveHandler.ashx.cs" Class="MessageReceiveHandler" %>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Web.UI.HtmlControls;
using System.IO;
using Tencent.WeiXin;
/// <summary>
/// MessageReceiveHandler 的摘要说明
/// </summary>
public class MessageReceiveHandler : IHttpHandler
{

private static readonly string Token = "Opzoon-ITservice";
public void ProcessRequest(HttpContext context)
{
if (context.Request.RequestType == "GET")
{
if (CheckSignature(context))
{
context.Response.Write(context.Request.QueryString["echostr"]);
}
return;
}
var messageBase=MessageBase.Parse(context.Request.InputStream, context.Request.ContentEncoding);
Tencent.WeiXin.TextReplyMessage text = new Tencent.WeiXin.TextReplyMessage();
text.Content = "我收到了";
switch (messageBase.Type)
{
case MessageType.Text:
text.Content += string.Format("文本消息“{0}”",((TextMessage)messageBase).Content);break;


case MessageType.Image:
text.Content += string.Format("图片消息“{0}”", ((ImageMessage)messageBase).PicUrl); break;
case MessageType.Link:
text.Content += string.Format("链接消息“{0}”", ((LinkMessage)messageBase).Url); break;
case MessageType.Location:
text.Content += string.Format("地图消息“X:{0}Y:{1}C{2}L{3}”", ((LocationMessage)messageBase).X,((LocationMessage)messageBase).Y,((LocationMessage)messageBase).Scale,((LocationMessage)messageBase).Label); break;
case MessageType.Event:
text.Content += string.Format("时间推送消息“{0}”", ((EventMessage)messageBase).EventType); break;
}
text.Init(messageBase);
text.Write(context.Response.Output);
//context.Response.Write(mess.ToString());
context.Response.ContentType = "text/xml";
context.Response.Flush();
}
protected virtual bool CheckSignature(HttpContext context)
{
List<string> list = new List<string>();
list.Add(context.Request.QueryString["timestamp"]);
list.Add(context.Request.QueryString["nonce"]);
list.Add(Token);
list = list.OrderBy(t => t).ToList();


var sha1 = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(list[0] + list[1] + list[2], "SHA1");
var signature = context.Request.QueryString["signature"];
//var signature = "testtesttest";
return signature.Equals(sha1, StringComparison.OrdinalIgnoreCase);
}
public bool IsReusable
{
get
{
return false;
}
}
}
不是有接收用户信息么


[解决办法]
楼主的代码是用来接收的,不是发送的。
如果想通过电脑发出信息到对方手机的微信上。那么需要知道微信的通信协议和地址。否则连待接收手机的地址都不能知道,实现不了发送。另外微信的协议是加密的。
需要知道这些

[解决办法]
不管是消息推送还是消息回复都应该是xml把,我也没做过
[解决办法]
关注中,希望这个帖子有个好的结果!!
[解决办法]
前几天做这个了,.net 微信接口(怎么使用微信接口-做过的请进)
整体流程是:
1.用户发消息给微信服务器》2.微信服务器收到用户消息》3.微信服务器把消息发给你》4.你解析消息》5.返回给微信服务器》6.微信服务器发消息给用户
[解决办法]

        /// <summary>
/// 处理文本消息
/// </summary>
/// <param name="xml"></param>
/// <returns></returns>
private static string DoTextMsg(XmlDocument xml)
{
//微信服务器发过来xml
//TODO 取出内容
string touser = xml.SelectSingleNode("xml/ToUserName").InnerText;
string fromuser = xml.SelectSingleNode("xml/FromUserName").InnerText;

//下面就是如何处理xml
xml.SelectSingleNode("xml/ToUserName").InnerText = fromuser;//设置接受消息的用户
xml.SelectSingleNode("xml/FromUserName").InnerText = touser;//消息来自谁
xml.SelectSingleNode("xml/Content").InnerText = "这是回复的内容";//这里是你回复的内容,字符串的怎么写都可以

return xml.OuterXml;//以字符串形式返回
}

[解决办法]
恭喜了啊!!!
[解决办法]
看看大家是怎么说的
[解决办法]


公众平台接口,都是以xml形式回复,接口挂外网80端口可用,自己封装下扩展下
public partial class WebForm1 : System.Web.UI.Page
{
const string Token = "*****";//与那边填写的token一致
protected void Page_Load(object sender, EventArgs e)
{
string postStr = "";
/// <summary>
/// 处理微信发来的请求
/// </summary>
/// <param name="xml"></param>
if (Request.HttpMethod.ToLower() == "post")
{
Stream s = System.Web.HttpContext.Current.Request.InputStream;
byte[] b = new byte[s.Length];
s.Read(b, 0, (int)s.Length);
postStr = Encoding.UTF8.GetString(b);

if (!string.IsNullOrEmpty(postStr))
{
//封装请求类
XmlDocument doc = new XmlDocument();
doc.LoadXml(postStr);
XmlElement rootElement = doc.DocumentElement;
XmlNode MsgType = rootElement.SelectSingleNode("MsgType");
RequestXML requestXML = new RequestXML();


requestXML.ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText;
requestXML.FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText;
requestXML.CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText;
requestXML.MsgType = MsgType.InnerText;
try
{
requestXML.Event = rootElement.SelectSingleNode("Event").InnerText;
}
catch
{

}


if (requestXML.MsgType == "text")
{
requestXML.Content = rootElement.SelectSingleNode("Content").InnerText;
}
else if (requestXML.MsgType == "location")
{
requestXML.Location_X = rootElement.SelectSingleNode("Location_X").InnerText;


requestXML.Location_Y = rootElement.SelectSingleNode("Location_Y").InnerText;
requestXML.Scale = rootElement.SelectSingleNode("Scale").InnerText;
requestXML.Label = rootElement.SelectSingleNode("Label").InnerText;
}
else if (requestXML.MsgType == "image")
{
requestXML.PicUrl = rootElement.SelectSingleNode("PicUrl").InnerText;
}
//else if (requestXML.MsgType == "Event")
//{
// // 事件类型
// String eventType = requestXML.Event;
// // 订阅
// if (eventType == "Subscribe")
// {

// //Response.Write(GetMainMenuMessage(toUserName, fromUserName, "谢谢您的关注!,"));

// }


// // 取消订阅
// else if (eventType =="Unsubscribe")
// {
// // TODO 取消订阅后用户再收不到公众号发送的消息,因此不需要回复消息
// }
// // 自定义菜单点击事件
// else if (eventType =="CLICK")
// {
// // TODO 自定义菜单权没有开放,暂不处理该类消息
// }
//}
else if (requestXML.MsgType =="Event")
{
// 事件类型
String eventType = requestXML.Event;
// 订阅
if (eventType == "Subscribe")
{



//Response.Write(GetMainMenuMessage(toUserName, fromUserName, "谢谢您的关注!,"));
requestXML.Content = rootElement.SelectSingleNode("Content").InnerText;
}
// 取消订阅
else if (eventType == "Unsubscribe")
{
// TODO 取消订阅后用户再收不到公众号发送的消息,因此不需要回复消息
}
// 自定义菜单点击事件
else if (eventType == "CLICK")
{
// TODO 自定义菜单权没有开放,暂不处理该类消息
}
}

//回复消息
ResponseMsg(requestXML);
}


}
else
{
Valid();
}
}

/// <summary>
/// 验证微信签名
/// </summary>
/// * 将token、timestamp、nonce三个参数进行字典序排序
/// * 将三个参数字符串拼接成一个字符串进行sha1加密
/// * 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。
/// <returns></returns>
private bool CheckSignature()
{
string signature = Request.QueryString["signature"];
string timestamp = Request.QueryString["timestamp"];
string nonce = Request.QueryString["nonce"];
string[] ArrTmp = { Token, timestamp, nonce };
Array.Sort(ArrTmp); //字典排序
string tmpStr = string.Join("", ArrTmp);
tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
tmpStr = tmpStr.ToLower();
if (tmpStr == signature)
{
return true;
}
else
{
return false;


}
}
public static bool CheckSignature(String signature, String timestamp, String nonce)
{
String[] arr = new String[] { Token, timestamp, nonce };
// 将token、timestamp、nonce三个参数进行字典序排序
Array.Sort<String>(arr);

StringBuilder content = new StringBuilder();
for (int i = 0; i < arr.Length; i++)
{
content.Append(arr[i]);
}

String tmpStr = SHA1_Encrypt(content.ToString());


// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
return tmpStr != null ? tmpStr.Equals(signature) : false;
}

/// <summary>
/// 使用缺省密钥给字符串加密
/// </summary>
/// <param name="Source_String"></param>
/// <returns></returns>
public static string SHA1_Encrypt(string Source_String)
{
byte[] StrRes = Encoding.Default.GetBytes(Source_String);
HashAlgorithm iSHA = new SHA1CryptoServiceProvider();
StrRes = iSHA.ComputeHash(StrRes);
StringBuilder EnText = new StringBuilder();


foreach (byte iByte in StrRes)
{
EnText.AppendFormat("{0:x2}", iByte);
}
return EnText.ToString();
}
private void Valid()
{
//// 微信加密签名
//string signature = Request.QueryString["signature"];
//// 时间戳
//string timestamp = Request.QueryString["timestamp"];
//// 随机数
//string nonce = Request.QueryString["nonce"];
//// 随机字符串
//string echostr = Request.QueryString["echostr"];
string echoStr = Request.QueryString["echoStr"];
if (CheckSignature())
{
if (!string.IsNullOrEmpty(echoStr))
{
Response.Write(echoStr);
Response.End();
}
}
}

/// <summary>
/// 回复消息(微信信息返回)
/// </summary>


/// <param name="weixinXML"></param>

[解决办法]
//微信请求类
public class RequestXML
{
private string toUserName;
/// <summary>
/// 消息接收方微信号,一般为公众平台账号微信号
/// </summary>
public string ToUserName
{
get { return toUserName; }
set { toUserName = value; }
}

private string fromUserName;
/// <summary>
/// 消息发送方微信号
/// </summary>
public string FromUserName
{
get { return fromUserName; }
set { fromUserName = value; }
}

private string createTime;
/// <summary>
/// 创建时间
/// </summary>
public string CreateTime
{
get { return createTime; }
set { createTime = value; }
}

private string msgType;
/// <summary>
/// 信息类型 地理位置:location,文本消息:text,消息类型:image
/// </summary>


public string MsgType
{
get { return msgType; }
set { msgType = value; }
}

private string content;
/// <summary>
/// 信息内容
/// </summary>
public string Content
{
get { return content; }
set { content = value; }
}

private string location_X;
/// <summary>
/// 地理位置纬度
/// </summary>
public string Location_X
{
get { return location_X; }
set { location_X = value; }
}

private string location_Y;
/// <summary>
/// 地理位置经度
/// </summary>
public string Location_Y
{
get { return location_Y; }
set { location_Y = value; }
}

private string scale;
/// <summary>
/// 地图缩放大小
/// </summary>


public string Scale
{
get { return scale; }
set { scale = value; }
}

private string label;
/// <summary>
/// 地理位置信息
/// </summary>
public string Label
{
get { return label; }
set { label = value; }
}

private string picUrl;
/// <summary>
/// 图片链接,开发者可以用HTTP GET获取
/// </summary>
public string PicUrl
{
get { return picUrl; }
set { picUrl = value; }
}

private string _event;

public string Event
{
get { return _event; }
set { _event = value; }
}
}
[解决办法]
路过啊。.net 微信接口(怎么使用微信接口-做过的请进)
[解决办法]
mark下,来学习下了。

读书人网 >asp.net

热点推荐