网上见到有人吐槽微信公众平台开发测试不方便,原因是公众平台测试号需要开发者设置一个地址用于调用,这个地址还必须是80端口,要知道,在天朝个人宽带是不允许开通80端口的,也就是说你必须将地址指向一台服务器,但又有谁试过在服务器上开发的呀,所以一般我想都是本地做好一个功能需要测试就发布到服务器,再拿起手机发条消息测试通不通,这样的效率可想而知呢,这也是好多开发者的槽点。
其实利用花生壳我们也可以直接在本地测试,或许你会问,花生壳不是不能开80端口吗?没错,但我们不需要80端口也可以办到,原理如下:
手机微信APP -> 微信平台-> 中转站(80端口)->花生壳(XXXX端口)-> YOUR PC
建一个中转网站(.net/php/java啥的随便你)部署在有80端口的服务器上,将微信传过来的数据以同样的方式(GET/POST)通过花生壳地址转到你的电脑。
当然,通过对路由的端口映射,不用花生壳也能使你的电脑也能暴露在外网,只是用花生壳会方便一点,不用每次换IP都去改配置,话说你这样折腾还不也是为了开发方便?
一、附上关键中转代码:
var settings = new System.Configuration.AppSettingsReader();
var devUrl = settings.GetValue("devUrl", typeof(string));
if (devUrl == null) throw new Exception("无此配置devUrl");
string url = string.Format("{0}{1}{2}", devUrl,
devUrl.ToString().Contains("?") ? "&" : "?",
Request.ServerVariables["QUERY_STRING"]);
if (Request.HttpMethod.ToUpper() == "POST")
{
Stream stream = Request.InputStream;
var data = new byte[stream.Length];
stream.Read(data, 0, data.Length);
var str = PostData(url, data); // post data;
stream.Close();
return Content(str);
}
else
{
string result = string.Empty;
using (WebClient client = new WebClient())
{
Stream stream = client.OpenRead(url);
StreamReader sr = new StreamReader(stream);
result = sr.ReadToEnd();
sr.Close();
}
return Content(result);
}
二、PostData方法代码:
private string PostData(string postUrl, byte[] data)
{
HttpWebRequest request;
HttpWebResponse response;
ASCIIEncoding encoding = new ASCIIEncoding();
request = WebRequest.Create(postUrl) as HttpWebRequest;
request.ProtocolVersion = HttpVersion.Version10;
request.AllowAutoRedirect = true;
request.ContentType = "text/xml";
request.ContentLength = data.Length;
request.Accept = "*/*";
request.UserAgent = "Mozilla/4.0";
request.KeepAlive = true;
request.Method = "POST";
using (Stream stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
string html = string.Empty;
try
{
//获取服务器返回的资源
using (response = request.GetResponse() as HttpWebResponse) //自动关闭和释放
{
using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("utf-8"))) //自动关闭和释放
{
html = reader.ReadToEnd();
}
}
}
catch (WebException wex)
{
WebResponse wr = wex.Response;
Stream st = wr.GetResponseStream();
using (StreamReader sr = new StreamReader(st, System.Text.Encoding.Default)) //自动关闭和释放
{
html = sr.ReadToEnd();
}
}
catch (Exception ex)
{
html = "发生异常\n\r" + ex.Message;
}
return html;
}