1 进入地址 https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html
点击“开始开发” 、“接口测试号申请” 开始进行开发
2.token说明没2小时过期一次,可以存缓存等
https请求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
3.配置说明
URL
本机测试:内网穿透 NATAPP(自搜教程,注意本机端口是否开放) 填写 内网穿透完的网址/controller/Index
如果有正式域名和服务期,注意必须是80或443端口
Token需要和程序员内的TOKEN保持一致
上代码(引用版本 Senparc.WeiXin.Mp_15.0.6.1 Senparc.WeiXin.Mp.MVCExtensiion_4.1.1)
using Microsoft.AspNetCore.Mvc;
using Senparc.Weixin.MP;
using Senparc.Weixin.MP.Entities.Request;
using Senparc.Weixin.MP.MvcExtension;
using System.IO;
using weixin.Handler;
using weixin.Utils;
public class WeiXinController : Controller
{
[HttpGet]
[ActionName("Index")]
public ActionResult Get(PostModel postModel, string echostr)
{
if (CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, WXModel.Token))
{
return Content(echostr); //返回随机字符串则表示验证通过
}
else
{
return Content("failed:" + postModel.Signature + "," + Senparc.Weixin.MP.CheckSignature.GetSignature(postModel.Timestamp, postModel.Nonce, WXModel.Token) + "。" +
"如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。");
}
}
/// <summary>
/// 用户发送消息后,微信平台自动Post一个请求到这里,并等待响应XML。
/// PS:此方法为简化方法,效果与OldPost一致。
/// v0.8之后的版本可以结合Senparc.Weixin.MP.MvcExtension扩展包,使用WeixinResult,见MiniPost方法。
/// </summary>
[HttpPost]
[ActionName("Index")]
public ActionResult Post(PostModel postModel)
{
if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, WXModel.Token))
{
return Content("参数错误!");
}
postModel.Token = WXModel.Token;//根据自己后台的设置保持一致
postModel.EncodingAESKey = WXModel.EncodingAESKey;//根据自己后台的设置保持一致
postModel.AppId = WXModel.appId;//根据自己后台的设置保持一致
//自定义MessageHandler,对微信请求的详细判断操作都在这里面。
//获取request的响应
var memoryStream = new MemoryStream();
Request.Body.CopyTo(memoryStream);
var messageHandler = new CustomMessageHandler(memoryStream, postModel);//接收消息
messageHandler.Execute();//执行微信处理过程
if (messageHandler.ResponseDocument == null) {
return Content("");//返回结果
}
return Content(messageHandler.ResponseDocument.ToString());//返回结果
}
}
二:配置菜单
注意APPID和appsecret必须正确。随便一个地方调用创建菜单的方法,即可创建
参考 https://developers.weixin.qq.com/doc/offiaccount/Custom_Menus/Creating_Custom-Defined_Menu.html
public static string MenuCreate(string MenuJson,string token)
{
string setMenuUrl = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token={0}";
setMenuUrl = string.Format(setMenuUrl, token);
string respText = HttpUtility.SendPostHttpRequest(setMenuUrl, "post", MenuJson);//SendGetHttpRequest(, );
// gatewayStatusEntity dictResult = JsonHelper.JSONToObject<gatewayStatusEntity>(Encoding.UTF8.GetString(e1.ApplicationMessage.Payload));
Dictionary<string, object> respDic = JsonHelper.JSONToObject<Dictionary<string, object>>(respText);
return respDic["errcode"].ToString();//返回0发布成功
}
public static string SendPostHttpRequest(string uri, string contentType, string requestData)
{
WebRequest request = WebRequest.Create(uri);
request.ContentType = "application/x-www-form-urlencoded";
request.Method = "POST";
//将字符串数据转化为字节串,这也是POST请求与GET请求区别的地方
byte[] buffer = Encoding.UTF8.GetBytes(requestData);
//用于将数据写入Internet资源
Stream stream = request.GetRequestStream();
stream.Write(buffer, 0, buffer.Length);
request.ContentLength = buffer.Length;
WebResponse response = request.GetResponse();
//从网络资源中返回数据流
stream = response.GetResponseStream();
StreamReader sr = new StreamReader(stream, Encoding.UTF8);
//将数据流转换文字符串
string result = sr.ReadToEnd();
//关闭流数据
stream.Close();
sr.Close();
return result;
}
3.处理接收到的信息
微信发送消息默认走填写的验证地址的post方法
using Senparc.Weixin.MP.Entities;
using Senparc.Weixin.MP.Entities.Request;
using Senparc.Weixin.MP.MessageHandlers;
using Senparc.Weixin.Context;
using Bootstrap.DataAccess.Sytem;
using Bootstrap.DataAccess.System;
using System.Text;
using weixin.Utils;
namespace weixin.Handler
{
public partial class CustomMessageHandler : MessageHandler<MessageContext<IRequestMessageBase, IResponseMessageBase>>
{
public CustomMessageHandler(Stream inputStream, PostModel postModel) : base(inputStream, postModel)
{
}
public CustomMessageHandler(RequestMessageBase requestMessage) : base(requestMessage)
{
}
public override IResponseMessageBase OnEventRequest(IRequestMessageEventBase requestMessage)
{
return base.OnEventRequest(requestMessage);
}
public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage)
{
var responseMessage = this.CreateResponseMessage<ResponseMessageText>();
string openid = requestMessage.FromUserName;
//查询openID是否在平台中存在
//获取公司
StringBuilder sb = new StringBuilder("欢迎关注微信平台!请登录!");
sb.Append("<a href =\""+ WXModel.Domain + "?openId="+ openid + "\">登录</a>");
responseMessage.Content = sb.ToString();
return responseMessage;
}
public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
{
var responseMessage = base.CreateResponseMessage<ResponseMessageText>();
if (!"1".Equals(requestMessage.Content))
{
responseMessage.Content = "本平台不识别此信息";
}
else
{
string openid = requestMessage.FromUserName;
string loginurl = "<a href =\"" + WXModel.Domain + "?openId=" + openid + "\">登录</a>";
responseMessage.Content = "欢迎关注微信平台!" + loginurl;
}
return responseMessage;
}
}
}
4发送模板消息
测试号页面,模板消息接口 新增测试模板 新增模板
{{first.DATA}} 内容1:{{keyword1.DATA}} |
所有的变量都是{{.Data}}的格式,上面的实例代表变量first keyword1
发送消息代码
public ActionResult SendMsg(string 接收消息用户的openid)
{
///发送模版消息
string url = string.Format("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={0}", AccessTokenHelp.AccessToken);
string postData = "{ \"touser\":\"" + openId + "\"," +
"\"template_id\":\"模板ID\"," +
"\"url\":\"www.baidu.com\"," +
"\"data\":{" +
"\"first\":{" +
"\"value\":\"亲,宝贝已经启程了,好想快点来到你身边!\"," +
"\"color\":\"#173177\"}," +
"\"keyword1\":{" +
"\"value\":\"201408189987\"," +
"\"color\":\"#173177\"" +
"},\"keyword2\":{" +
"\"value\":\"圆通快递\"," +
"\"color\":\"#173177\"}," +
"\"keyword3\":{" +
"\"value\":\"6522238281\"," +
"\"color\":\"#173177\"}," +
"\"keyword4\":{" +
"\"value\":\"6522238281\"," +
"\"color\":\"#173177\"}," +
"\"keyword5\":{" +
"\"value\":\"6522238281\"," +
"\"color\":\"#173177\"}" +
"} }";
string respText = HttpUtility.SendPostHttpRequest(url, "", postData);
return View();
}
以上就是最近开发微信的收获
1.开发过程中遇到的问题
穿透失败,原因本地的端口权限不足
菜单配置失败,APPID错误
发送模板消息变量无法带入,原因没有严格按照格式