C# 淘宝商品微信返利助手开发-(八)微信号对接
系列教程四目录:返利助手开发(2)淘宝分享的内容如何只取淘口令
系列教程五目录:返利助手开发(3)淘口令如何通过API转换为链接
系列教程六目录:返利助手开发(4)如果通过淘口令解析的出来的地址获得返利信息
系列教程七目录:返利助手开发(5)如何将优惠券地址转为淘口令
微信公众号分为订阅号和公众号
经过博主测试如果没有资料申请公众号的人可以自行申请订阅号代替
订阅号一样可以使用接口自动回复,只是订阅号没有红包发送,获取用户信息,公众号菜单等功能的权限
微信开发的我们首先得得获取的到微信公众号的APPID和APPSecrest
还需要将服务器配置启用服务器地址就是你你对接接受微信消息并处理的接口地址
Token就是你自定义的密码,微信在访问你接口的时候你要返回这里配置的token微信验证成功后才会运行访问
EncodingAESKey微信加密密钥开启后自动生成
然后在程序中开发,由于为了便捷我这里使用了盛派微信的dll流程如下:
微信公众号自动回去不仅仅需要APPID和APPsecret
还需要以下参数
“Token”: “自己设置一个自定义的密码”,
“EncodingAESKey”: “微信中获取”,
“AppId”: “微信中获取”,
“Appsecrest”: “微信中获取”
配置完成后我们进行开发
首先是微信验证的,因为只有微信验证成功了才会将消息推送给我们
代码如下:
public static readonly string Token = SiteConfig.GetSite("Token");//与微信公众账号后台的Token设置保持一致,区分大小写。
public static readonly string EncodingAESKey = SiteConfig.GetSite("EncodingAESKey");//与微信公众账号后台的EncodingAESKey设置保持一致,区分大小写。
public static readonly string AppId = SiteConfig.GetSite("AppId");//与微信公众账号后台的AppId设置保持一致,区分大小写。
private ILog log = LogManager.GetLogger(Startup.repository.Name, typeof(WeixinController));
/// <summary>
/// 微信后台验证地址(使用Get),微信后台的“接口配置信息”的Url填写如:http://sdk.weixin.senparc.com/weixin
/// </summary>
[HttpGet]
public object Get(string signature, string timestamp, string nonce, string echostr)
{
bool istrue = CheckSignature(signature, timestamp, nonce);
if (istrue)
{
return echostr; //返回随机字符串则表示验证通过
}
else
{
log.Info("如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。");
return Content("如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。"); //返回随机字符串则表示验证不通过
}
}
#region
/// <summary>
/// 验证微信签名
/// </summary>
/// <returns></returns>
/// * 将token、timestamp、nonce三个参数进行字典序排序
/// * 将三个参数字符串拼接成一个字符串进行sha1加密
/// * 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。
private bool CheckSignature(string signature, string timestamp, string nonce)
{
string access_token = Token;
string[] ArrTmp = { access_token, timestamp, nonce };
Array.Sort(ArrTmp); //字典排序
string tmpStr = string.Join("", ArrTmp);
tmpStr = MD5Util.SHA1(tmpStr);
if (tmpStr.ToLower() == signature)
{
return true;
}
else
{
return false;
}
}
#endregion
微信验证写完之后就是处理微信消息的接口了:
如下所示:
/// <summary>
/// 用户发送消息后,微信平台自动Post一个请求到这里,并等待响应XML
/// PS:此方法为常规switch判断方法,从v0.3.3版本起,此Demo不再更新
/// </summary>
[HttpPost]
public object Post(string signature, string timestamp, string nonce, string echostr)
{
if (!CheckSignature(signature, timestamp, nonce))
{
return Content("参数错误!");
}
XDocument requestDoc = null;
try
{
var syncIOFeature = HttpContext.Features.Get<IHttpBodyControlFeature>();
if (syncIOFeature != null)
{
syncIOFeature.AllowSynchronousIO = true;
}
requestDoc = XDocument.Load(Request.Body);
var requestMessage = RequestMessageFactory.GetRequestEntity(new DefaultMpMessageContext(), requestDoc);
requestDoc.Save(ServerUtility.ContentRootMapPath("~/App_Data/" + SystemTime.Now.Ticks + "_Request_" + requestMessage.FromUserName + ".txt"));//测试时可开启,帮助跟踪数据
ResponseMessageBase responseMessage = null;
switch (requestMessage.MsgType)
{
case RequestMsgType.Text://文字
{
var strongRequestMessage = requestMessage as RequestMessageText;
Dictionary<string, string> dic = new Dictionary<string, string>();
string resultmessage = "";
resultmessage = strongRequestMessage.Content;
if (resultmessage.Length <= 12)
{
var strongresponseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(requestMessage);
strongresponseMessage.Content = string.Format("你发送的消息是{0}", strongRequestMessage.Content);
responseMessage = strongresponseMessage;
}
else (resultmessage.Length >= 12)
{
try
{
//返利信息处理查询代码
}
catch (Exception e)
{
log.Info("Message"+e.Message);
log.Info("InnerException" + e.InnerException.Message);
var strongresponseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(requestMessage);
strongresponseMessage.Content = string.Format("此商品暂无优惠", strongRequestMessage.Content);
responseMessage = strongresponseMessage;
}
}
//TODO:交给Service处理具体信息,参考/Service/EventSercice.cs 及 /Service/LocationSercice.cs
break;
}
case RequestMsgType.Location://位置
{
var strongRequestMessage = requestMessage as RequestMessageText;
var strongresponseMessage =
ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(requestMessage);
strongresponseMessage.Content =
string.Format(
"您刚才发送了位置信息,暂不支持位置信息",
strongRequestMessage.Content);
responseMessage = strongresponseMessage;
break;
}
case RequestMsgType.Image://图片
{
//TODO:交给Service处理具体信息
var strongRequestMessage = requestMessage as RequestMessageImage;
var strongresponseMessage =
ResponseMessageBase.CreateFromRequestMessage<ResponseMessageNews>(requestMessage);
strongresponseMessage.Articles.Add(new Article()
{
Title = "您刚才发送了图片信息",
Description = "您刚才发送了图片信息",
PicUrl = strongRequestMessage.PicUrl,
Url = "http://www.baidu.com"
});
responseMessage = strongresponseMessage;
break;
}
case RequestMsgType.Voice://语音
{
//TODO:交给Service处理具体信息
var strongRequestMessage = requestMessage as RequestMessageVoice;
var strongresponseMessage =
ResponseMessageBase.CreateFromRequestMessage<ResponseMessageMusic>(requestMessage);
strongresponseMessage.Music.MusicUrl = "http://sdk.weixin.senparc.com/Content/music1.mp3";
responseMessage = strongresponseMessage;
break;
}
case RequestMsgType.Event://事件
{
var strongRequestMessage = requestMessage as RequestMessageEvent;
var strongresponseMessage =
ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(requestMessage);
log.Info(JsonConvert.SerializeObject(strongRequestMessage));
switch (strongRequestMessage.EventName)
{
//关注
case "subscribe":
strongresponseMessage.Content =
string.Format("感谢你关注我的微信号");
responseMessage = strongresponseMessage;
break;
//取消关注
case "unsubscribe":
strongresponseMessage.Content =
string.Format("如果你有那些建议,请及时返回,我争取做得更好");
responseMessage = strongresponseMessage;
break;
//默认事件
default:
break;
}
break;
}
default:
throw new ArgumentOutOfRangeException();
}
var responseDoc = Senparc.NeuChar.Helpers.EntityHelper.ConvertEntityToXml(responseMessage);
responseDoc.Save(ServerUtility.ContentRootMapPath("~/App_Data/" + SystemTime.Now.Ticks + "_Response_" + responseMessage.ToUserName + ".txt"));//测试时可开启,帮助跟踪数据
return Content(responseDoc.ToString());
//如果不需要记录responseDoc,只需要:
//return Content(responseMessage.ConvertEntityToXmlString());
}
catch (Exception ex)
{
log.Info("Message:" + ex.Message);
log.Info("InnerException:" + ex.InnerException.Message);
return Content("");
}
}
我们可以看到微信回复的事件里面包含,文字信息,语音信息,图片信息,位置信息和事件信息
其中事件信息又分为,关注事件,取消关注事件,如果是有自定义菜单的用户可能还有菜单点击事件
我们通过判断不同类型都消息类型对不同类型的信息进行分析处理
到这里之后只需要发布到服务器配置好之后微信公众号就能按照你编写的代码自动回复了
博主这里无聊对接了1个测qq凶吉的接口喜欢的朋友可以通过
回复
QQ:QQ号
来测凶吉