.Net程序员关于微信公众平台测试账户配置 项目总结

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

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

2.成为开发者。

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

  1 using System;
  2 using System.Collections.Generic;
  3 using System.IO;
  4 using System.Linq;
  5 using System.Text;
  6 using System.Web;
  7 using System.Web.Mvc;
  8 using System.Web.Security;
  9 using System.Xml;
 10
 11 namespace SCKY.WebApp.Controllers
 12 {
 13     public class BaseController:Controller
 14     {
 15         //public Model.UCML_User LoginUser { get; set; }
 16         const string Token = "123qweasd";
 17         protected override void OnActionExecuting(ActionExecutingContext filterContext)
 18         {
 19             string postStr = "";
 20             Valid();
 21             if (Request.HttpMethod.ToLower() == "post")//当普通微信用户向公众账号发消息时,微信服务器将POST该消息到填写的URL上
 22             {
 23                 postStr = PostInput();
 24                 if (string.IsNullOrEmpty(postStr) == false)
 25                 {
 26                     //WriteLog(postStr,Server);//计入日记
 27                     //ResponseMsg(postStr);
 28                 }
 29                 //else
 30                 //{
 31                 //    using (FileStream fs = new FileStream("~/File/2.txt", FileMode.Create, FileAccess.Write, FileShare.Write))
 32                 //    {
 33                 //        string msg = postStr;
 34                 //        byte[] bytes = System.Text.Encoding.Default.GetBytes(msg);
 35                 //        fs.Write(bytes, 0, bytes.Length);
 36                 //    }
 37                 //}
 38             }
 39         }
 40         private void Valid()
 41         {
 42             string echoStr = Request.QueryString["echoStr"].ToString();
 43             if (CheckSignature())
 44             {
 45                 if (!string.IsNullOrEmpty(echoStr))
 46                 {
 47                     Response.Write(echoStr);
 48                     Response.End();
 49                 }
 50             }
 51         }
 52
 53         /// <summary>
 54         /// 验证微信签名
 55         /// </summary>
 56         /// <returns></returns>
 57         private bool CheckSignature()
 58         {
 59             string signature = Request.QueryString["signature"].ToString();
 60             string timestamp = Request.QueryString["timestamp"].ToString();
 61             string nonce = Request.QueryString["nonce"].ToString();
 62             string[] ArrTmp = { Token, timestamp, nonce };
 63             Array.Sort(ArrTmp);//字典排序
 64             string tmpStr = string.Join("", ArrTmp);
 65             tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");//对该字符串进行sha1加密
 66             tmpStr = tmpStr.ToLower();//对字符串中的字母部分进行小写转换,非字母字符不作处理
 67             //WriteLog(tmpStr, Server);//计入日志
 68             if (tmpStr == signature)//开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。开发者通过检验signature对请求进行校验,若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,否则接入失败
 69             {
 70                 return true;
 71             }
 72             else
 73                 return false;
 74         }
 75
 76         /// <summary>
 77         /// 获取post返回来的数据
 78         /// </summary>
 79         /// <returns></returns>
 80         private string PostInput()
 81         {
 82             Stream s = System.Web.HttpContext.Current.Request.InputStream;
 83             byte[] b = new byte[s.Length];
 84             s.Read(b, 0, (int)s.Length);
 85             return Encoding.UTF8.GetString(b);
 86         }
 87         /// <summary>
 88         ///返回微信信息结果
 89         /// </summary>
 90         /// <param name="weixinXML"></param>
 91         //private void ResponseMsg(string weixinXML)
 92         //{
 93         //    try
 94         //    {
 95         //        XmlDocument doc = new XmlDocument();
 96         //        doc.LoadXml(weixinXML);//读取XML字符串
 97         //        XmlElement rootElement = doc.DocumentElement;
 98
 99         //        XmlNode MsgType = rootElement.SelectSingleNode("MsgType");//获取字符串中的消息类型
100
101         //        string resxml = "";
102         //        if (MsgType.InnerText == "text")//如果消息类型为文本消息
103         //        {
104         //            var model = new
105         //            {
106         //                ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText,
107         //                FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText,
108         //                CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText,
109         //                MsgType = MsgType.InnerText,
110         //                Content = rootElement.SelectSingleNode("Content").InnerText,
111         //                MsgId = rootElement.SelectSingleNode("MsgId").InnerText
112         //            };
113         //            resxml += "<xml><ToUserName><![CDATA[" + model.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + model.ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime>";
114         //            if (!string.IsNullOrEmpty(model.Content))//如果接收到消息
115         //            {
116         //                if (model.Content.Contains(" 你好") || model.Content.Contains(" 好") || model.Content.Contains("hi") || model.Content.Contains("hello"))// 你好
117         //                {
118         //                    resxml += "<MsgType><![CDATA[text]]></MsgType><Content><![CDATA[你好,有事请留言,偶会及时回复你的。]]></Content><FuncFlag>0</FuncFlag></xml>";
119         //                }
120
121         //            }
122
123         //            else//没有接收到消息
124         //            {
125         //                resxml += "<MsgType><![CDATA[text]]></MsgType><Content><![CDATA[亲,感谢您对我的关注,有事请留言。]]></Content><FuncFlag>0</FuncFlag></xml>";
126         //            }
127
128         //            Response.Write(resxml);
129         //        }
130         //        if (MsgType.InnerText == "image")//如果消息类型为图片消息
131         //        {
132         //            var model = new
133         //            {
134         //                ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText,
135         //                FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText,
136         //                CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText,
137         //                MsgType = MsgType.InnerText,
138         //                PicUrl = rootElement.SelectSingleNode("PicUrl").InnerText,
139         //                MsgId = rootElement.SelectSingleNode("MsgId").InnerText
140         //            };
141         //            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>";
142         //            Response.Write(resxml);
143         //        }
144         //        else//如果是其余的消息类型
145         //        {
146         //            var model = new
147         //            {
148         //                ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText,
149         //                FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText,
150         //                CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText,
151         //            };
152         //            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>";
153         //            Response.Write(resxml);
154         //        }
155         //    }
156         //    catch (Exception ex)
157         //    {
158         //        throw ex;
159         //    }
160         //    Response.End();
161         //}
162         /// <summary>
163         /// datetime转换成unixtime
164         /// </summary>
165         /// <param name="time"></param>
166         /// <returns></returns>
167         private int ConvertDateTimeInt(System.DateTime time)
168         {
169             System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
170             return (int)(time - startTime).TotalSeconds;
171         }
172         /// <summary>
173         /// 写日志(用于跟踪),可以将想打印出的内容计入一个文本文件里面,便于测试
174         /// </summary>
175         //public static void WriteLog(string strMemo, HttpServerUtility server)
176         //{
177         //    string filename = server.MapPath("/logs/log.txt");//在网站项目中建立一个文件夹命名logs(然后在文件夹中随便建立一个web页面文件,避免网站在发布到服务器之后看不到预定文件)
178         //    if (!Directory.Exists(server.MapPath("//logs//")))
179         //        Directory.CreateDirectory("//logs//");
180         //    StreamWriter sr = null;
181         //    try
182         //    {
183         //        if (!File.Exists(filename))
184         //        {
185         //            sr = File.CreateText(filename);
186         //        }
187         //        else
188         //        {
189         //            sr = File.AppendText(filename);
190         //        }
191         //        sr.WriteLine(strMemo);
192         //    }
193         //    catch
194         //    {
195         //    }
196         //    finally
197         //    {
198         //        if (sr != null)
199         //            sr.Close();
200         //    }
201         //}
202     }
203 }

看到源码那个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 == "2").FirstOrDefault();
            if (user != null)
            {
                Session["UserOID"] = user.UCML_UserOID;
                url = JudgeShipperPage(user, url);
                return Redirect(url);
            }
            else
            {
                return RedirectToAction("NotUser", "Test", new { rowl = "2" });
            }
        }

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

{
    "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程序员关于微信公众平台测试账户配置 项目总结,布布扣,bubuko.com

时间: 2024-10-06 06:48:57

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

微信公众平台测试群发消息公开阅读次数和点赞数

微信公众平台这几天在小范围测试公开阅读次数.点赞数,只有一个微信公众号才会显示,有三个地方新改变:文章标题下的作者信息前加了一个"by",换行显示日期.每篇文章的阅读次数和公众账号信息,同时,在文章末尾可对文章进行点赞,还有具体的点赞次数.如下图所示 在同一天,腾讯宣布旗下微博"不再做更新,只维持其基本运转",腾讯微博只维持基本运营,不再做新产品开发.这是微信正在微博化的节奏吗?还微信入侵腾讯微博?谁知道呢?!有微信和手Q就够了,甚至说有微信就可以了. 微信公众平台

微信公众平台测试帐号的注册与使用

近日开始研究微信公众平台,但是申请的个人帐号只能是订阅号,可用的接口比较少,一点都不爽,想要个菜单都得花钱.就在我寻寻觅觅的时候,我在开发文档里面发现了测试人员帐号,测试帐号拥有微信公众平台所有的接口,不管是订阅号还是服务号的接口,只是不能群发消息,不过这个对于开发人员来说没有任何影响. 注册测试帐号只需要一个手机号,并且拥有微信帐号即可,具体流程如下: 打开注册的网址:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 用

微信公众平台测试账号

微信公众平台测试账号 公众平台测试账号 微信公众平台测试帐号申请 基本流程: 访问微信公众平台测试账号接口申请https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 微信扫码登录,获取到一个测试账号. 调用接口获取access_token, 创建公众号菜单. 原文地址:https://www.cnblogs.com/mozq/p/12106459.html

微信公众平台-开发模式配置 URL Token

微信公众平台-开发模式配置需要拥有自己的服务器,配置页面有明文:"请填写接口配置信息,此信息需要你拥有自己的服务器资源."  这句话就是说有自己的服务器,独立ip,80端口开放的.并且这台服务器要能提供服务,就是说要能够被微信后台的服务器访问到.这需要服务器有一个外网IP.我们的Web Server监听外网IP的80端口之后就能收到微信后台的请求了. 可能很多读者希望能在自己的PC机上做接入的测试,但是笔者建议不要这么做,因为这可能会遇到很多的麻烦.如果你的确想这么做,请注意以下事情:

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

1.简介 微信公众平台是腾讯公司在微信的基础上新增的功能模块,通过这一平台,个人和企业都可以打造一个微信的公众号,并实现和特定群体的文字.图片.语音的全方位沟通.互动. 2.通讯机制 3.注册微信公众平台账号 注册地址:https://mp.weixin.qq.com 4.服务器端配置 4.1 示例代码设置 微信公众平台提供了一个php示例代码: http://mp.weixin.qq.com/mpres/htmledition/res/wx_sample.zip 下载下来,解压缩,打开编辑.

使用微信公众平台测试账号开发“网页授权获取用户基本信息”功能

众所周知,微信公众号分为订阅号.服务号和企业号.撇开企业号不谈,虽然只有服务号能够通过微信接口获得用户级别信息(特别是针对每个公众号唯一的openId),但我们可以仍可以在未认证的订阅号中通过平台测试号开发测试用户基本信息. 微信第三方登录的原理和流程不再赘述,下面说明一下测试号开发的过程. 首先打开测试页面,先登录任一类型的公众号(包括未认证的),在左侧菜单找到 开发-->开发者工具,进入“公众平台测试账号”,这里时需要刷微信认证的二维码(任一微信账户都可以,与登录微信公众平台的账号无关).

微信公众号测试账号配置失败竟然是因为一个字符

开发环境: 1.SAE新浪云平台 2.PHP环境 3.在微信申请了一个测试用的公众平台开发账号 4.从微信官方下载的一个php文档 5.token也是默认的weixin,(这个第一次可以不用改,但如果配置成功后再想配置,已经有了token名为weixin的了,这个时候要变化了,第一次配置可以不用变化) 6.注意,在SAE上传代码是压缩成zip形式的,SAE自动配置,如果用SVN上传的,目前来看是不行的. 7.代码配置后,不需要做任何改动,结果在测试平台输入http和token后,提示配置失败(这

ASP.NET微信公众平台1-参数配置

创建一个一般处理程序来实现微信服务器验证 文件名如(WXStudayHandler.ashx) 将文件上传到远程服务器上,开始进行微信公众平台验证 <%@ WebHandler Language="C#" Class="WXStudayHandler" %> using System; using System.Web; using System.IO; using System.Xml; public class WXStudayHandler : I

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

1.安装配置Python CentOS7 自带 Python2.7, 我用的是Python3.6.5,需要CentOS7安装配置Python3并和Python2共存的,请看以下教程: CentOS7安装配置Python3.6.5 2.安装web.py pip install web.py 可以换国内源下载,速度比较快 3.安装libxml2, libxslt, lxml python yum install libxml2 yum install libxslt yum install lxml