今天项目第一次验收,夜晚吃过晚饭后,想把项目中用到的关于微信配置总结一下,虽然网上关于这方面的资料很多很多,还有官方API,但是总感觉缺点什么,就像期初做这个项目时,各方面找了很久的资料,说说配置吧!

1.你必须有一个微信可以访问的网站,然后有一个公众账户。

2.成为开发者。

上面这个URL填写你的网站的链接,微信服务器会放这个URL推送一些验证信息,具体验证信息,你可以查看官方API,写的很详细,因为我用的是MVC,所以我写了一个类,让控制器继承这个类,源码贴下,大家一看就明白。还有这个URL有很大用处,以后微信会往这个URL推送很多消息,比如用户的地理位置等,这里地理位置是微信推送给我们的,大家不要像我一样,理解错了,到时候会走很多弯路。

 using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using System.Xml; namespace SCKY.WebApp.Controllers
{
public class BaseController:Controller
{
//public Model.UCML_User LoginUser { get; set; }
const string Token = "123qweasd";
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
string postStr = "";
Valid();
if (Request.HttpMethod.ToLower() == "post")//当普通微信用户向公众账号发消息时,微信服务器将POST该消息到填写的URL上
{
postStr = PostInput();
if (string.IsNullOrEmpty(postStr) == false)
{
//WriteLog(postStr,Server);//计入日记
//ResponseMsg(postStr);
}
//else
//{
// using (FileStream fs = new FileStream("~/File/2.txt", FileMode.Create, FileAccess.Write, FileShare.Write))
// {
// string msg = postStr;
// byte[] bytes = System.Text.Encoding.Default.GetBytes(msg);
// fs.Write(bytes, 0, bytes.Length);
// }
//}
}
}
private void Valid()
{
string echoStr = Request.QueryString["echoStr"].ToString();
if (CheckSignature())
{
if (!string.IsNullOrEmpty(echoStr))
{
Response.Write(echoStr);
Response.End();
}
}
} /// <summary>
/// 验证微信签名
/// </summary>
/// <returns></returns>
private bool CheckSignature()
{
string signature = Request.QueryString["signature"].ToString();
string timestamp = Request.QueryString["timestamp"].ToString();
string nonce = Request.QueryString["nonce"].ToString();
string[] ArrTmp = { Token, timestamp, nonce };
Array.Sort(ArrTmp);//字典排序
string tmpStr = string.Join("", ArrTmp);
tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");//对该字符串进行sha1加密
tmpStr = tmpStr.ToLower();//对字符串中的字母部分进行小写转换,非字母字符不作处理
//WriteLog(tmpStr, Server);//计入日志
if (tmpStr == signature)//开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。开发者通过检验signature对请求进行校验,若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,否则接入失败
{
return true;
}
else
return false;
} /// <summary>
/// 获取post返回来的数据
/// </summary>
/// <returns></returns>
private string PostInput()
{
Stream s = System.Web.HttpContext.Current.Request.InputStream;
byte[] b = new byte[s.Length];
s.Read(b, , (int)s.Length);
return Encoding.UTF8.GetString(b);
}
/// <summary>
///返回微信信息结果
/// </summary>
/// <param name="weixinXML"></param>
//private void ResponseMsg(string weixinXML)
//{
// try
// {
// XmlDocument doc = new XmlDocument();
// doc.LoadXml(weixinXML);//读取XML字符串
// XmlElement rootElement = doc.DocumentElement; // XmlNode MsgType = rootElement.SelectSingleNode("MsgType");//获取字符串中的消息类型 // string resxml = "";
// if (MsgType.InnerText == "text")//如果消息类型为文本消息
// {
// var model = new
// {
// ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText,
// FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText,
// CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText,
// MsgType = MsgType.InnerText,
// Content = rootElement.SelectSingleNode("Content").InnerText,
// MsgId = rootElement.SelectSingleNode("MsgId").InnerText
// };
// resxml += "<xml><ToUserName><![CDATA[" + model.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + model.ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime>";
// if (!string.IsNullOrEmpty(model.Content))//如果接收到消息
// {
// if (model.Content.Contains(" 你好") || model.Content.Contains(" 好") || model.Content.Contains("hi") || model.Content.Contains("hello"))// 你好
// {
// resxml += "<MsgType><![CDATA[text]]></MsgType><Content><![CDATA[你好,有事请留言,偶会及时回复你的。]]></Content><FuncFlag>0</FuncFlag></xml>";
// } // } // else//没有接收到消息
// {
// resxml += "<MsgType><![CDATA[text]]></MsgType><Content><![CDATA[亲,感谢您对我的关注,有事请留言。]]></Content><FuncFlag>0</FuncFlag></xml>";
// } // Response.Write(resxml);
// }
// if (MsgType.InnerText == "image")//如果消息类型为图片消息
// {
// var model = new
// {
// ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText,
// FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText,
// CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText,
// MsgType = MsgType.InnerText,
// PicUrl = rootElement.SelectSingleNode("PicUrl").InnerText,
// MsgId = rootElement.SelectSingleNode("MsgId").InnerText
// };
// resxml += "<xml><ToUserName><![CDATA[" + model.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + model.ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[news]]></MsgType><ArticleCount>1</ArticleCount><Articles><item><Title><![CDATA[欢迎您的光临!]]></Title><Description><![CDATA[非常感谢您的关注!]]></Description><PicUrl><![CDATA[http://...jpg]]></PicUrl><Url><![CDATA[http://www.baidu.com/]]></Url></item></Articles><FuncFlag>0</FuncFlag></xml>";
// Response.Write(resxml);
// }
// else//如果是其余的消息类型
// {
// var model = new
// {
// ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText,
// FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText,
// CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText,
// };
// resxml += "<xml><ToUserName><![CDATA[" + model.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + model.ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[亲,感谢您对我的关注,有事请留言,我会及时回复你的哦。]]></Content><FuncFlag>0</FuncFlag></xml>";
// Response.Write(resxml);
// }
// }
// catch (Exception ex)
// {
// throw ex;
// }
// Response.End();
//}
/// <summary>
/// datetime转换成unixtime
/// </summary>
/// <param name="time"></param>
/// <returns></returns>
private int ConvertDateTimeInt(System.DateTime time)
{
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(, , ));
return (int)(time - startTime).TotalSeconds;
}
/// <summary>
/// 写日志(用于跟踪),可以将想打印出的内容计入一个文本文件里面,便于测试
/// </summary>
//public static void WriteLog(string strMemo, HttpServerUtility server)
//{
// string filename = server.MapPath("/logs/log.txt");//在网站项目中建立一个文件夹命名logs(然后在文件夹中随便建立一个web页面文件,避免网站在发布到服务器之后看不到预定文件)
// if (!Directory.Exists(server.MapPath("//logs//")))
// Directory.CreateDirectory("//logs//");
// StreamWriter sr = null;
// try
// {
// if (!File.Exists(filename))
// {
// sr = File.CreateText(filename);
// }
// else
// {
// sr = File.AppendText(filename);
// }
// sr.WriteLine(strMemo);
// }
// catch
// {
// }
// finally
// {
// if (sr != null)
// sr.Close();
// }
//}
}
}

看到源码那个Token了吧,大家知道作用了吧。这个是成功后的界面,我用的测试账户,而不是正式的,正式的申请太麻烦,时间很长

到此你就成为开发者了,接下来最重要的是会话界面自定义菜单 这个不难。

我使用微信的  微信公众平台接口调试工具演示的,在会话界面自定义菜单之前你需要获得access_token

点击检查问题,你会获得access_token。

现在知道上面的access_token的用处了吧

根据官方创建菜单API就可以创建菜单了 这个其实是不难的。文档很详细。

下面介绍获得用户的openid  (这个和获得用户信息是一样的)

openid每个微信账户是唯一的,这个可以作为你项目中关联用户信息的外键

我的需求是每次用户点击菜单获得该微信账户的openid,然后关联用户信息,

直接贴代码 这里的appid是你成为开发者的时候微信分配的

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using System.Web.Script;
using System.Web.Script.Serialization;
using SCKY.WebApp.Models;
using SCKY.Model;
using SCKY.BLL;
using SCKY.Commons; namespace SCKY.WebApp.Controllers
{
public class TestController : Controller
{
//
// GET: /Test/
public ActionResult Index()
{
String code = Request["code"];//我们要的code
//code = "0048aa3c358df7ef9ef4f7df7ee3c57b";
string url = Request["state"];
var client = new WebClient();
string str = client.DownloadString("https://api.weixin.qq.com/sns/oauth2/access_token?appid="+appid+"&secret="+secret+"&code=" + code + "&grant_type=authorization_code");
//client.DownloadString(new Uri(str)); Oppid oppided = new Oppid();
JavaScriptSerializer jss = new JavaScriptSerializer();
oppided = jss.Deserialize<Oppid>(str); Session["Oppid"] = oppided.openid; UCML_UserManager userBll = new UCML_UserManager();
UCML_User user = userBll.LoadEntities(d => d.UserEmail == oppided.openid && d.TelNumber == "").FirstOrDefault();
if (user != null)
{
Session["UserOID"] = user.UCML_UserOID;
url = JudgeShipperPage(user, url);
return Redirect(url);
}
else
{
return RedirectToAction("NotUser", "Test", new { rowl = "" });
}
}

这样你就得修改你的自定义菜单的代码了,直接贴上

{
"button": [
{
"type": "view",
"name": "托运发布",
"url": "https://open.weixin.qq.com/connect/oauth2/authorize?appid=appid&redirect_uri=http://www.CeShi.com/Test/Index&response_type=code&scope=snsapi_base&state=http://www.CeShi.com/ReleaseNews/Indx#wechat_redirect"
},
{
"type": "view",
"name": "选择车队",
"url": "https://open.weixin.qq.com/connect/oauth2/authorize?appid=appid&redirect_uri=http://www.CeShi.com/Test/Index&response_type=code&scope=snsapi_base&state=http://www.CeShi.com/NewsManager/Index#wechat_redirect"
},
{
"type": "view",
"name": "任务监控",
"url": "https://open.weixin.qq.com/connect/oauth2/authorize?appid=appid&redirect_uri=http://www.CeShi.com/Test/Index&response_type=code&scope=snsapi_base&state=http://www.CeShi.com/ShipperMonitoringManager/Index#wechat_redirect"
}
]
}

上面涉及我的appid我都做了处理,读者注意了。

到此成为开发者,自定义菜单,获得openid就结束了,基本上是傻瓜流程了,不善于写博,请见谅

.Net程序员关于微信公众平台测试账户配置 项目总结的更多相关文章

  1. 微信公众平台测试帐号的注册与使用(自己的服务器<---->微信后台<---->测式公众号)

    打开注册的网址:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 用手机微信扫描网页左边的二维码,然后在手机上确认即可: 至此 ...

  2. 【微信Java开发 --2】接入微信公众平台开发,配置自己的服务器,验证过程

    接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑好我们就开始:1.填写好我们的URL和Token[此处是已经通过验证的] ...

  3. PHP微信公众平台开发1 配置接口

    1.简介 微信公众平台是腾讯公司在微信的基础上新增的功能模块,通过这一平台,个人和企业都可以打造一个微信的公众号,并实现和特定群体的文字.图片.语音的全方位沟通.互动. 2.通讯机制 3.注册微信公众 ...

  4. CentOS7+Python3.6利用web.py库进行微信公众平台服务器简易配置,token验证

    1.安装配置Python CentOS7 自带 Python2.7, 我用的是Python3.6.5,需要CentOS7安装配置Python3并和Python2共存的,请看以下教程: CentOS7安 ...

  5. nopCommerce 3.9 大波浪系列 之 微信公众平台登录插件

    一.简介 插件源码下载:点击下载 微信公众平台网站授权帮助地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp142114084 ...

  6. Java开发微信公众号(二)---开启开发者模式,接入微信公众平台开发

    接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑 资料准备: 1.一个可以访问的外网,即80的访问端口,因为微信公众号接 ...

  7. 微信公众号开发C#系列-2、微信公众平台接入指南

    概述 微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流程是这样的,用户发送消息到微信服务器,微信服务器将接收到的消息post到用户接入时填写的url中,在url处理程序中,首先 ...

  8. [转]微信公众平台(测试接口)开发前的准备工作(转载自walkingmanc的专栏)

    本文转自:http://blog.csdn.net/jiangweicpu/article/details/21228949 http://blog.csdn.net/walkingmanc/arti ...

  9. Senparc.Weixin.MP SDK 微信公众平台开发教程(二十一):在小程序中使用 WebSocket (.NET Core)

    本文将介绍如何在 .NET Core 环境下,借助 SignalR 在小程序内使用 WebSocket.关于 WebSocket 和 SignalR 的基础理论知识不在这里展开,已经有足够的参考资料, ...

随机推荐

  1. 怎么屏蔽F5键刷新功能

    window.document.onkeydown=function(){if(event.keyCode==116){//屏蔽F5键,改为只刷新本页面,防止一刷就刷整个窗口event.keyCode ...

  2. [BZOJ 1875] [SDOI 2009] HH去散步【矩阵乘法】

    题目链接:BZOJ - 1875 题目分析: 这道题如果去掉“不会立刻沿着刚刚走来的路走回”的限制,直接用邻接矩阵跑矩阵乘法就可以了.然而现在加了这个限制,建图的方式就要做一些改变.如果我们把每一条边 ...

  3. 给java中的System.getProperty添加新的key value对

    由于系统被格了,所以,现在的java项目配置不对,代码里面的配置类调用了一个System.getProperty("env")发现找不到该变量的值,以前一直能找到的. 其实就是以前 ...

  4. .net 开发框架

    .NET开发人员值得关注的七个开源项目 2010年07月02日09:33 it168网站原创 作者:黄永兵 编译 编辑:胡铭娅 我要评论(0) [IT168技术分析]微软近几年在.NET社区开源项目方 ...

  5. XFS文件系统功能解析

    XFS文件系统是作为一个日志文件系统开发,采用B-树平衡树算法来尽快地分配数据.主要的设计目的之一是支持大型文件和大型文件系统.当前,能够支持的最大文件大小是2艾字节,最大文件系统大小为8艾字节. X ...

  6. AlgorithmsI PA2: Randomized Queues and Deques Deque

    本次作业考察利用array 或者linked list 实现规定时间复杂度的queue 和stack, 不能使用java 自带的stack 和queue. 目的是让我们掌握自己设计的函数的复杂度. D ...

  7. Pearls DP

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6647   Accepted: 3241 Description In Pe ...

  8. bzoj3531

    不难想到树链剖分这题的难点是记录的是路径上宗教相同的点裸的想法是对每一种宗教都开一棵线段树,记录每个点的评级但显然这样会爆空间,仔细分析一下,这些线段树内很多点压根就没用到因此我们考虑对线段树动态开点 ...

  9. Poetize4 创世纪

    3037: 创世纪 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 123  Solved: 66[Submit][Status] Description ...

  10. (转载)在Linux下删除文件行末尾的^M符号方法

    (转载)http://www.xinfengit.com/200907/1433646.html 由于DOS下的编辑器和linux(linux教程 linux培训 )编辑器对文件行末的回车符处理不一致 ...