一
前往微信公众平台(https://mp.weixin.qq.com/)获取开发权限和开发账号,公众号分为好几种,小程序,订阅号,服务号,企业号,个人只能用订阅号,权限比较少(api接口权限);
二
想要自定义模块功能或者是回复信息啥的,就得有一个自己的后台来写接口,所以要配置自己的服务器
基本配置:服务器配置(首页-开发-基本配置-服务器配置)
进入修改配置,这里的服务器地址必须是外网(没有服务器的小伙伴如果这里分不清。。外网特征就是别人可以通过你的本机ip直接访问到,在简单点就是,你如果使用WiFi连接的网络那就肯定是内网或者说是局域网,查看方式,window键加R键,输入cmd回车,然后输入ipconfig 查看你当前的ip,然后百度本机ip,不一样的话就不是外网,解决办法是使用natapp进行内网穿透或者是用路由器进行端口映射,将服务器的某个端口映射出去,在最后会有详细步骤)而且是80端口,格式为ip/域名+wx(接口名 ,固定,但是前面可以加路由比如ip/home/wx)Token随便写个;
然后是后台不多说先上代码:
///
/// 配合微信服务器验证域名或者是ip的可用行或者是获取消息的推送--pxj
///
[AtSkipAuthorize]
public void wx()
{
//获取消息推送,或者是事件推送,类型是xml文件流
if (Request.RequestType == "POST")
{
}
else
{
#region 验证请求来源是否是微信
string signature = Request["signature"].ToString();
string timestamp = Request["timestamp"].ToString();
string nonce = Request["nonce"].ToString();
string echostr = Request["echostr"].ToString();
string token = "hellowb";
List list = new List() { token, timestamp, nonce };
list.Sort();
string data = string.Join("", list);
byte[] temp1 = Encoding.UTF8.GetBytes(data);
SHA1CryptoServiceProvider sha = new SHA1CryptoServiceProvider();
byte[] temp2 = sha.ComputeHash(temp1);
var hashCode = BitConverter.ToString(temp2);
hashCode = hashCode.Replace("-", "").ToLower();
if (hashCode == signature)
{
Response.Write(echostr);
Response.End();
}
LogHelper.WriteLog("signature:" + signature + " timestamp:" + timestamp + " nonce:" + nonce + " echostr:" + echostr);
#endregion
}
}
写好后台配置好服务器就可以在微信公众号网站也就是刚才的那个页面点击提交了,点击提交后微信的服务器会向你所配置的服务器80端口的这个接口发送GET请求,验证接口是否正确,如果提交成功,恭喜你可以进入下一个坑了;
三
当你在写微信公众号的页面的时候,你有时候会用到上传图片或者打开摄像机等要求,这时候要接入JS_SDK,配置签名等等,这个签名应该算是配置里最难受的一块了。。。
签名的获取有几个步骤,先是要通过appid和appSecret来获取access_token,然后用access_token来获取jsapi_ticket,代码如下
//获取access_token
string url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appId, appSecret);
var wc = new WebClient();
string access_tokenRet = wc.DownloadString(url);
string access_token = JsonHelper.JsonToObj(access_tokenRet).Access_Token;
accesstokenstatic = access_token;
//获取jsapi_ticket
string Jsapi_TicketUrl = string.Format("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi", access_token);
var jsapiRet = wc.DownloadString(Jsapi_TicketUrl);
string ticket = JsonHelper.JsonToObj(jsapiRet).ticket;
ticketstatic = ticket;
然后获取十位的时间戳和自己写的随机字符串和页面传来的url,将jsapi_ticket,url,timestamp(时间戳),nocestr(随机字符串随便写一个就行)sort方法排序,然后根据这几个的顺序进行赋值并用sha1加密如下
string signaturestring = "jsapi_ticket=" + ticket + "&noncestr=" + nocestr + "×tamp=" + timestamp + "&url=" + url2;
byte[] temp1 = Encoding.UTF8.GetBytes(signaturestring);
SHA1CryptoServiceProvider sha = new SHA1CryptoServiceProvider();
byte[] temp2 = sha.ComputeHash(temp1);
var hashCode = BitConverter.ToString(temp2);
hashCode = hashCode.Replace("-", "").ToLower();
如此一来全部的都有了,返回这些就行了,如果报错了说url不合法就要取配置以下域名,二级域名也能用;
四 ,带参二维码的扫描和事件的推送
当你的公众号涉及到分享二维码给其他人,每一张二维码上还得要有你的信息的时候,需要在公众号的二维码上添加上一个场景值,比如你的用户id,当客户或者是其他用户通过你分享的二维码进入公众号的时候,微信服务器会推送给你一个xml包,其中一个子节点上就存着那个场景值;
直接上代码--获取部分,
public void GetQrCode()
{
string accesstoken = accesstokenstatic;
if (string.IsNullOrEmpty(accesstoken))
{
//先主动取获取以下所需要的变量
getaccesstoken(null, null);
accesstoken = accesstokenstatic;
Timer();
}
//使用匿名对象作为post的参数然后再序列化
var datap = new
{
//二维码的有效期(10天)
expire_seconds = 864000,
//类型动态的二维码
action_name = "QR_SCENE",
//信息
action_info = new
{
scene = new {
//自定义参数数值型为scene_id ,字符为scene_str
scene_id = 15552300793
}
}
};
//使用流发送post带参请求
string url = string.Format("https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={0}",accesstoken);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/json";
byte[] data = Encoding.UTF8.GetBytes(JsonHelper.ModelToJson(datap));
request.ContentLength = data.Length;
using (Stream strea = request.GetRequestStream())
{
strea.Write(data,0,data.Length);
strea.Close();
}
HttpWebResponse respose = (HttpWebResponse)request.GetResponse();
Stream stream = respose.GetResponseStream();
string stringRespose = "";
using (StreamReader sr = new StreamReader(stream, Encoding.UTF8))
{
stringRespose = sr.ReadToEnd();
}
if (string.IsNullOrEmpty(stringRespose))
{
Response.Write("sorry");
}
else {
//此时已经获取到二维码所使用的ticket
string qrticket = JsonHelper.JsonToObj(stringRespose).ticket;
//二维码解析后的地址(可以自己转化为二维码)
string qrurl = JsonHelper.JsonToObj(stringRespose).url;
Response.Write("hhhhhh");
LogHelper.WriteLog("getsometing:" + stringRespose);
}
}
现在是获得了二维码的解析后的url,和获取二维码的ticket;有两种方式可以得到二维码,一种是直接将这个地址url返给前端,前端自己生成,二是后台获取到这个二维码后保存到服务器,前端自己去取;
获取微信的推送,如刚才所说,扫码的时候会发送一个xml包;
代码如下
public void wx()
{
//获取消息推送,或者是事件推送,类型是xml文件流
if (Request.RequestType == "POST")
{
#region 推送
//加载xml包,获取推送的内容
StreamReader sr = new StreamReader(Request.InputStream);
string xmlData = sr.ReadToEnd();
LogHelper.WriteLog(xmlData);
var doc = new XmlDocument();
doc.LoadXml(xmlData);
//获取xml包里的消息类型和事件类型,分类处理
var msgTypeNode = doc.SelectSingleNode("xml/MsgType");
var evenTypeNode = doc.SelectSingleNode("xml/Event");
string msgTypeString = msgTypeNode.InnerText;
if (evenTypeNode == null)
{
//此时为普通的消息推送
}
else
{
//此时为事件推送
string evenTypeString = evenTypeNode.InnerText;
//扫描带参的二维码的时候和关注和取关的推送
if (evenTypeString == "SCAN" || evenTypeString == "subscribe")
{
string SaoMaRenOpenId = doc.SelectSingleNode("xml/FromUserName").InnerText;
var BeiSaoRenCanShuNode = doc.SelectSingleNode("xml/EventKey");
if (BeiSaoRenCanShuNode != null)
{
string BeiSaoRenCanShuSting = BeiSaoRenCanShuNode.InnerText.Split('_')[1];
//已经获取扫码人和被扫人的个人id,下面就是存到数据库做关联就ok了,用到的时候取
}
}
//地理位置推送
if (evenTypeString == "LOCATION")
{
}
//点击自定义菜单拉去信息的时候的推送
if (evenTypeString == "CLICK")
{
}
}
#endregion
}
五,
natapp内网穿透:
https://natapp.cn/注册,登录,获取自己的隧道,下载客户端,解压,cmd进入客户端的文件夹,natapp.exe -authtoken = "你的autotoken",
如下则成功了