前言:
由于微信公众号正式号,一直在被使用,所以在研发的时候,本机测试环境,就显得非常重要。
而且在自己闲暇之余,可以自己尝试更深程度的微信公众号的研发工作。
1、首先,必要的网站
http://sdk.weixin.senparc.com/ 盛派SDK下载地址(官网有WeChatSampleBuilder不过博主没有使用过,vs可以用NuGet下载,本人使用的是全部源码,并没有使用最新版本(ps、最新版本太过于庞大))。
https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 微信测试公众号(第一次扫码,微信确定后,会卡顿很久,等待即可)
https://mp.weixin.qq.com/debug 微信公众平台接口调试工具(AccessToken 获取)
http://www.cnblogs.com/szw/archive/2013/05/14/weixin-course-index.html 盛派帮助教程(ps.下载了好几个demo,结合着看,个人感觉有点乱,)。
2、建设基于盛派SDK的公众号个人网站
------这一步有兴趣的同许多可以使用,盛派官网WeChatSampleBuilder试试,也可以使用NuGet。
------不详细展开,直接进入主题。
3、微信注册号的申请绑定已经推送消息获取(针对没有微信公众号的同学)
首先进入微信测试公众号网站 https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
a、点击登录,用微信扫码登录即可、
b、进入之后,记录appID 以及 appsecret。
这一步第一次登录会有卡顿,需要等待几分钟(一开始我还以为是微信这个测试账号有bug。。。等待即可。。)
记录 appID 以及 appsecret,添加到自己的项目中。
c、创建一个全新的aspx页面,准备接受微信的请求。
首先新建一个空的apsx页面。在Page_Load上写上如下代码,这一步 仅仅 是为了与 正确响应微信发送的Token验证。
当然,这一步必须包括将自己的项目挂在IIS外网可以访问才可以!!
注意:引用一系列的dll,Token可以随意设置。
public static readonly string Token = "Wechart";//与微信公众账号后台的Token设置保持一致,区分大小写。
protected void Page_Load(object sender, EventArgs e)
{
string signature = Request["signature"];
string timestamp = Request["timestamp"];
string nonce = Request["nonce"];
string echostr = Request["echostr"];
Log.WriteLog("开始");
if (Request.HttpMethod == "GET")
{
Log.WriteLog("GET");
//get method - 仅在微信后台填写URL验证时触发
if (CheckSignature.Check(signature, timestamp, nonce, Token))
{
HttpContext.Current.Response.Write(echostr); //返回随机字符串则表示验证通过
}
else
{
Log.WriteLog("路由");
WriteContent("failed:" + signature + "," + CheckSignature.GetSignature(timestamp, nonce, Token) + "。" +
// "如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。");
}
Response.End();
}
else
{
//待之后处理微信发过来的请求。
//之后再补充剩余代码。
}
}
注意:Token必须与自己aspx页面上相同。
ps.很多人都是在公司内网,这里推荐可以使用 花生壳 natapp。这边我使用的是natapp做外网挂接。
此处写natapp生成的网页即可。
//提交成功及测试通过。至此,已经可以获取微信推送的消息。
d、接着必须要处理微信推送过来的信息。微信推送的消息都以POST推送。
需要获取post中的InputStream,转成xml,并返回给微信,在此微信会进行三次消息推送,直到你有返回为止。
在上述代码的else中添加,如下代码:
Log.WriteLog("POST");
//post method - 当有用户想公众账号发送消息时触发
if (!CheckSignature.Check(signature, timestamp, nonce, Token))
{
HttpContext.Current.Response.Write("参数错误!");
return;
}
Log.WriteLog("访问:数据流");
//自定义MessageHandler,对微信请求的详细判断操作都在这里面。
var messageHandler = new CustomMessageHandler(Request.InputStream);
try
{
Log.WriteLog("微信处理");
//var result = RequestMessageFactory.GetRequestEntity(stream);
//messageHandler.OnEvent_ScanRequest(messageHandler.RequestMessage as RequestMessageEvent_Scan);
Log.WriteLog("处理开始"+ messageHandler.RequestDocument.ToString());
//执行微信处理过程
messageHandler.Execute();
Log.WriteLog("处理结束"+ messageHandler.ResponseDocument.ToString());
HttpContext.Current.Response.Write(messageHandler.ResponseDocument.ToString());
Log.WriteLog("结束");
}
catch (Exception ex)
{
Log.WriteLog(ex.ToString());
}
finally
{
Response.End();
}
此处最为关键的,CustomMessageHandler类,是基于原来盛派封装好的类做了继承,来重写操作。以达到自行处理微信请求的目的,这边只写出了 微信扫码带参二维码的方法。
public partial class CustomMessageHandler : MessageHandler<MessageContext<IRequestMessageBase, IResponseMessageBase>>
{
public CustomMessageHandler(Stream inputStream, PostModel postModel = null, int maxRecordCount = 0)
: base(inputStream, postModel, maxRecordCount)
{
}
//override重写各种微信post获取方法即可。
/// <summary>
/// 通过二维码扫描关注扫描事件
/// </summary>
/// <param name="requestMessage"></param>
/// <returns></returns>
public override IResponseMessageBase OnEvent_ScanRequest(RequestMessageEvent_Scan requestMessage)
{
//通过扫描关注
var responseMessage = CreateResponseMessage<ResponseMessageText>();
responseMessage.Content = string.Format("扫码成功");
return responseMessage;
}
}
4、微信推送消息
向微信推送消息,比如模板消息等,这里只介绍一个生成带参二维码。
这里说明一个重要情况:
内网 或者 无线网络,然后通过,natapp 来验证的时候,。调用此接口 会出现 微信 IP 白名单的错误。
原因是AccessToken 获取的时候,你的IP并不在服务器的白名单内。
这边推荐一个方法,在 https://mp.weixin.qq.com/debug 根据你之前测试号的appid 以及 secret 提前获取好AccessToken ,在此处写死,即可跳过验证。
也可以在此处增加ip白名单,但是外网穿透好像不行,暂时没找到好的方法。。有好办法欢迎提出。。。感谢
public string WeChartQRCode(string name, string uid)
{
var AccessToken = AccessTokenContainer.TryGetAccessToken(AppConfig.WeChatAppId, AppConfig.WeChatAppSecret);
string filename = $"{name}.jpg";
string path = AppDomain.CurrentDomain.BaseDirectory + "wxqrcode/" + filename;
var qrResult = QrCodeApi.Create(AccessToken, 100, 1, QrCode_ActionName.QR_LIMIT_STR_SCENE, uid);
var qrCodeUrl = QrCodeApi.GetShowQrCodeUrl(qrResult.ticket);
if (qrCodeUrl != "")
{
Log.WriteLog(qrCodeUrl);
DownFile(qrCodeUrl, path);
}
else
{
Log.WriteLog("url为空");
path = "url获取失败。";
}
return path;
}
//下载到文件
public static void DownFile(string url, string target)
{
try
{
WebClient _client = new WebClient();
byte[] data = _client.DownloadData(url);
File.WriteAllBytes(target, data);
}
catch (Exception ex)
{
throw new Exception("下载文件(" + target + ")失败:" + ex.Message + "|" + ex.StackTrace);
}
}
总结
至此,已经完全搭建好了一个与微信联通的测试项目。
而且可以在本机测试调试。非常的方便。
有讲解不到位,或者不了解的,可以留言交流。
不对的地方欢迎指出修改。。