チュートリアルシリーズのシリーズ2:リベートアシスタントの開いているドキュメントとアカウントアプリケーションのアドレス
一連のチュートリアルの3つのディレクトリ:リベートアシスタントの開発(1)APIの紹介
一連のチュートリアルの4つのディレクトリ:リベートアシスタントの開発(2)Taobaoが共有するコンテンツのTaobaoパスワードを取得する方法
一連のチュートリアルの5つのディレクトリ:リベートアシスタントの開発(3)APIを介してパスワードをリンクに変換する方法
チュートリアルシリーズのシリーズ6:リベートアシスタントの開発(4)淘宝網のパスワードで解決されたアドレスからリベート情報を取得する場合
一連のチュートリアルの7つのディレクトリ:リベートアシスタントの開発(5)クーポンアドレスをAmoyパスワードに変換する方法
一連のチュートリアル9ディレクトリ:パスワードをコピーするためのVueページを作成する
WeChatパブリック
アカウントは、サブスクリプション番号とパブリック番号に分かれています。ブロガーテストの後、パブリック番号を申請するための情報がない場合、ユーザーはサブスクリプション番号の代わりにサブスクリプション番号を申請できます
。インターフェイスを使用して自動的に返信できますが、サブスクリプション番号は赤い封筒で送信されず、ユーザー情報、パブリック番号を取得しますメニューなどの機能の権限
まず、WeChatが開発したWeChatパブリックアカウントのAPPIDとAPPSecrestを取得する必要があります
サーバー構成も有効にする必要があります。サーバーアドレスは、WeChatメッセージを受信して処理するためにドッキングするインターフェースアドレスです。
トークンはカスタムパスワードです。WeChatがインターフェースにアクセスする場合、ここで構成されたトークンを返す必要があります。WeChat検証は、アクセスが成功した後にのみ実行されます
EncodingAESKey WeChat暗号化キーは、開いた後に自動的に生成されます
次に、プログラムを開発しました。これは、Shengpai WeChatのdllプロセスを次のように使用したためです。
マイクロチャンネル公衆番号が自動的にAPPIDとAPPsecretが必要ないだけで戻って
も、次のパラメータが必要です
、「自分のセットのカスタム・パスワードを」:「トークン」を
「EncodingAESKey」:「マイクロ文字のアクセス」、
「AppIDを」:「マイクロ文字のアクセスを」、
" Appsecrest ":" Get on WeChat "
構成が完了したら、
最初のWeChat検証を開発します。WeChat検証のみが成功すると、メッセージがプッシュさ
れます。コードは次のとおりです。
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
WeChat検証が記述された後、WeChatメッセージを処理するためのインターフェースは
次のとおりです。
/// <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("");
}
}
WeChat返信イベントにテキスト情報、音声情報、画像情報、位置情報、イベント情報が含まれていることがわかります
イベント情報は、フォローイベント、フォロー解除イベントに分かれており、カスタムメニューを持つユーザーは、メニュークリックイベントも持つことができます。
さまざまな種類のメッセージを判断して、さまざまな種類の情報を分析して処理します
ここに到着したら、サーバーに投稿して設定するだけです。WeChatパブリックアカウントは、記述したコードに従って自動的に返信します。