微信企业号开发过程中,每次都要上传提交,然后提取日志信息去检查错误,看起来是多么繁琐,有时候还觉得很愚蠢,索性就写一个模拟微信接口的本地调试程序吧。
首先完成模拟回调,主要用于验证接口
分析微信数据包
回调验证微信get方法提交,提取出来的URL全地址为:
http://www.xxxx.com/xx/xx/QYWX.ashx?msg_signature=xxxxxx×tamp=xxxx&nonce=77969147&echostr=xxx
分析地址,我们只要模拟这个地址,把参数传给我们本地,就可以实现本地调试,附上微信回调验证说明
验证URL有效性
当你提交以上信息时,企业号将发送GET请求到填写的URL上,GET请求携带四个参数,企业在获取时需要做urldecode处理,否则会验证不成功。
参数 | 描述 | 是否必带 |
---|---|---|
msg_signature | 微信加密签名,msg_signature结合了企业填写的token、请求中的timestamp、nonce参数、加密的消息体 | 是 |
timestamp | 时间戳 | 是 |
nonce | 随机数 | 是 |
echostr | 加密的随机字符串,以msg_encrypt格式提供。需要解密并返回echostr明文,解密后有random、msg_len、msg、$CorpID四个字段,其中msg即为echostr明文 | 首次校验时必带 |
企业通过参数msg_signature对请求进行校验,如果确认此次GET请求来自企业号,那么企业应用对echostr参数解密并原样返回echostr明文(不能加引号),则接入验证生效,回调模式才能开启。
注意到这句话:msg_signature 微信加密签名,msg_signature结合了企业填写的token、请求中的timestamp、nonce参数、加密的消息体
我本想找一个msg_signature加密的算法,奈何能力有限,放弃之,最终这篇文章以失败告终,
最后呢。我的做法是,提取微信回调验证的全部URL,自己做了一个这样的winform窗体,然后把地址host那部分改成本地local+端口号,凑合着用了:
界面如下:
说明,1.为微信企业号需要设置的,2.3.是从微信回调信息里面提取出来的参数,已有所有操作打算就用这些参数了,因为没找到msg_signate的加密方法,所以只能提取原参数的,
URL中不用填写参数,点击本地回调以后,会自动生成完整的回调验证URL
本节主要代码:
/// <summary> /// 微信首次回调验证 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_CallBackValidate_Click(object sender, EventArgs e) { string URL = GenerateValidationURL(); txt_ValidURL.Text = URL; if (String.IsNullOrEmpty(URL)) return; txt_ValidBackData.Text = CommonTools.GetWebData(URL); } #region 生成回调URL相关函数 /// <summary> /// 生成验证回调的URL /// </summary> /// <returns></returns> private string GenerateValidationURL() { string URL = GenerateURL(); if (String.IsNullOrEmpty(URL)) return ""; if (ValidateTextEmpty(txt_echostr, "请填写echostr(微信回调获取到的)") == true) return ""; URL += String.Format("&echostr={0}", txt_echostr.Text); return URL; } /// <summary> /// 生成发消息用的回调函数 /// </summary> /// <returns></returns> private string GenerateURL() { if (!ValidateBeforGenerateURL()) return ""; string urlFormat = "{0}?msg_signature={1}×tamp={2}&nonce={3}"; string URL = String.Format(urlFormat, txt_URL.Text, txt_msg_signature.Text, txt_timestamp.Text, txt_nonce.Text); return URL; } /// <summary> /// 生成回调带参数URL前验证 /// </summary> /// <returns></returns> bool ValidateBeforGenerateURL() { if (ValidateTextEmpty(txt_URL, "请填写URL(不带参数)") == true) return false; if (ValidateTextEmpty(txt_msg_signature, "请填写msg_signature(微信回调获取到的)") == true) return false; if (ValidateTextEmpty(txt_timestamp, "请填写timestamp(微信回调获取到的)") == true) return false; if (ValidateTextEmpty(txt_nonce, "请填写nonce(微信回调获取到的)") == true) return false; return true; } /// <summary> /// 判断textbox是否为空,如果为空返回true,并弹出消息框 /// </summary> /// <param name="txt"></param> /// <param name="EmptyMsg"></param> /// <returns></returns> private bool ValidateTextEmpty(TextBox txt,string EmptyMsg) { if (String.IsNullOrEmpty(txt.Text)) { MessageBox.Show(EmptyMsg); txt_URL.Focus(); return true; } return false; } #endregion
然后输入从获取到的微信回调地址(改为本地host),在本地就尅实现调试啦!!!
注,最好补充下INI配置文件,以保存各参数,这样软件下次打开的时候不用重新写参数了
本节到此结束
日志列表: