VopSdk一个高逼格微信公众号开发SDK:自动化生产(装逼模式开启)
针对第一版,我们搞了第二版本,老规矩先定个目标。
一 我们的目标
a、移除PayExcute,统一执行入口,目前只保留一个入口Excute
b、序列化特性统一,目前只用设置xml特性即可(反序列化时xml和json都可以直接用)
c、支持文件上传,目前只有多客服管理上传头像接口用到过
d、使用T4模板自动生产所有Request、Response、以及所有测试Test(装逼利器T4模板)
二 目标实现
a、移除PayExcute,统一执行入口,目前只保留一个入口Excute
public T Execute<T>(IVopRequest<T> request) where T : IVopResponse
{
return Execute<T>(request, null);
} public T Execute<T>(IVopRequest<T> request, string accessToken) where T : IVopResponse
{
//设置请求参数值
request.SetCharset(charset);
request.SetAppId(appId);
request.SetAppScret(appScret);
request.SetMchId(mchId);
request.SetMchScret(mchScret);
request.SetSignType(signType);
if (!string.IsNullOrEmpty(accessToken))
request.SetAccessToken(accessToken); //初始参数
string body;
string url;
url = request.GetApiUrl(); //设置参数
VopDictionary txtParams = request.GetParamter();
txtParams = AddBizModel(txtParams, request.GetBizModel()); //清洗url参数
txtParams = FlashUrlParamter(txtParams, ref url); //添加签名
if (request.GetNeedSign())
txtParams.Add("sign", VopUtils.GetSign(txtParams, request.GetMchScret())); //最后请求参数
string data = null;
IDictionary<string, FileItem> filedata = null;
if (request is VopMobilePublicUploadRequest<T>)
{
filedata = GetRequestFileParams(txtParams);
}
else
{
data = GetRequestParams(txtParams, request.GetFormat());
} if ("POST".Equals(request.GetApiMethod(), StringComparison.OrdinalIgnoreCase))
{
if (request is VopMobilePublicUploadRequest<T>)
{
body = webUtils.DoPost(url, filedata, this.charset);
}
else
{
if (!request.GetNeedCert())
body = webUtils.DoPost(url, data, this.charset);
else
body = webUtils.DoPost(url, data, this.charset, VopUtils.GetCert(request.GetCertPath(), request.GetCertPassword()));
}
}
else
{
if (!request.GetNeedCert())
body = webUtils.DoGet(url, data, this.charset);
else
body = webUtils.DoGet(url, data, this.charset, VopUtils.GetCert(request.GetCertPath(), request.GetCertPassword()));
} T rsp = null;
if ("json".Equals(request.GetFormat(), StringComparison.OrdinalIgnoreCase))
{
rsp = JsonHelper.Deserialize<T>(body);
}
else
{
rsp = XmlHelper.Deserialize<T>(body);
}
if (rsp != null)
rsp.Body = body;
return rsp;
}
b、序列化特性统一
所有Response标记只用xml的特性标记,如 VopMobilePublicAccessTokenResponse 这个最后我们其实序列化成json的,但是也是用的xml的来标记的。
[XmlRoot("xml")]
public class VopMobilePublicAccessTokenResponse : VopMobilePublicResponse
{
[XmlElement("access_token")]
public string AccessToken { get; set; }
[XmlElement("expires_in")]
public int ExpiresIn { get; set; }
}
c、支持文件上传
文件上传的接口Request需要继承 VopMobilePublicUploadRequest ,在执行时,判断如果继承了,就会执行
if (request is VopMobilePublicUploadRequest<T>)
{
body = webUtils.DoPost(url, filedata, this.charset);
}
public string DoPost(string url, IDictionary<string, FileItem> fileParams, string charset)
{
string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线 HttpWebRequest req = GetWebRequest(url, "POST");
req.ContentType = "multipart/form-data;charset=" + charset + ";boundary=" + boundary; Stream reqStream = req.GetRequestStream();
byte[] itemBoundaryBytes = Encoding.GetEncoding(charset).GetBytes("\r\n--" + boundary + "\r\n");
byte[] endBoundaryBytes = Encoding.GetEncoding(charset).GetBytes("\r\n--" + boundary + "--\r\n"); // 组装文件请求参数
string fileTemplate = "Content-Disposition:form-data;name=\"{0}\";filename=\"{1}\"\r\nContent-Type:{2}\r\n\r\n";
IEnumerator<KeyValuePair<string, FileItem>> fileEnum = fileParams.GetEnumerator();
while (fileEnum.MoveNext())
{
string key = fileEnum.Current.Key;
FileItem fileItem = fileEnum.Current.Value;
string fileEntry = string.Format(fileTemplate, key, fileItem.GetFileName(), fileItem.GetMimeType());
byte[] itemBytes = Encoding.GetEncoding(charset).GetBytes(fileEntry);
reqStream.Write(itemBoundaryBytes, , itemBoundaryBytes.Length);
reqStream.Write(itemBytes, , itemBytes.Length); byte[] fileBytes = fileItem.GetContent();
reqStream.Write(fileBytes, , fileBytes.Length);
} reqStream.Write(endBoundaryBytes, , endBoundaryBytes.Length);
reqStream.Close(); HttpWebResponse rsp = (HttpWebResponse)req.GetResponse();
Encoding encoding = Encoding.GetEncoding(rsp.CharacterSet);
return GetResponseAsString(rsp, encoding);
}
d、使用T4模板自动生产所有Request、Response、以及所有测试Test(装逼利器T4模板)
废话不多说,直接上其中一个模板 VopMobilePublicRequest.tt
<#@ template debug="true" hostSpecific="true" #>
<#@ output extension=".cs" #>
<#@ Assembly Name="System.Core" #>
<#@ Assembly Name="System.Windows.Forms" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Diagnostics" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ include file="$(ProjectDir)VopConfig.ttinclude" #>
<#@ include file="$(ProjectDir)Manager.ttinclude" #>
<# var manager = Manager.Create(Host, GenerationEnvironment); #>
<# var list = TempService.Instance.GetListModel("Vop.config"); #>
<# foreach (var item in list){var model = item; manager.StartNewFile(model.Name + "Request.cs" );#>
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由T4模板自动生成
// 生成时间 <#=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")#>
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失
// 作者QQ:63351550 微信:VopSdk
// </auto-generated>
//------------------------------------------------------------------------------ using System;
using System.Collections.Generic;
using Vop.Api.Response; namespace Vop.Api.Request
{
public class <#= model.Name #>Request : VopMobilePublicRequest<VopMobilePublicAccessTokenResponse>, IVopRequest<VopMobilePublicAccessTokenResponse>
{
public override string GetApiUrl()
{
this.apiUrl = "<#= model.Url #>";
return PreApiUrl(this.apiUrl);
} public override string GetApiMethod()
{
this.apiMethod = "<#= model.Method #>";
return this.apiMethod;
}
}
} <# manager.EndBlock();}#>
<# manager.Process(true); #>
为了装个逼,我也是费了不少力气的,首先得准备好各个接口名字、接口地址、接口调用方式,后期还得整理接口出参。
目前整理微信公众号、微信支付所有接口,不行你看
Vop.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<apis>
<!--微信网页开发-->
<api>
<name>VopMobilePublicOAuthAuthorize</name>
<url><![CDATA[https://open.weixin.qq.com/connect/oauth2/authorize?appid={appid}&redirect_uri={redirect_uri}&response_type=code&scope={scope}&state={state}#wechat_redirect]]></url>
<method>GET</method>
<desc>第一步:用户同意授权,获取code</desc>
<doc>https://mp.weixin.qq.com/wiki/4/9ac2e7b1f1d22e9e57260f6553822520.html</doc>
</api>
<api>
<name>VopMobilePublicOAuthAccessToken</name>
<url><![CDATA[https://api.weixin.qq.com/sns/oauth2/access_token?appid={appid}&secret={secret}&code={code}&grant_type=authorization_code]]></url>
<method>GET</method>
<desc>第二步:通过code换取网页授权access_token</desc>
<doc>https://mp.weixin.qq.com/wiki/4/9ac2e7b1f1d22e9e57260f6553822520.html</doc>
</api>
<api>
<name>VopMobilePublicOAuthRefreshToken</name>
<url><![CDATA[https://api.weixin.qq.com/sns/oauth2/refresh_token?appid={appid}&grant_type=refresh_token&refresh_token={refresh_token}]]></url>
<method>GET</method>
<desc>第三步:刷新access_token(如果需要)</desc>
<doc>https://mp.weixin.qq.com/wiki/4/9ac2e7b1f1d22e9e57260f6553822520.html</doc>
</api>
<api>
<name>VopMobilePublicOAuthUserInfo</name>
<url><![CDATA[https://api.weixin.qq.com/sns/userinfo?access_token={access_token}&openid={openid}&lang={lang}]]></url>
<method>GET</method>
<desc>第四步:拉取用户信息(需scope为 snsapi_userinfo)</desc>
<doc>https://mp.weixin.qq.com/wiki/4/9ac2e7b1f1d22e9e57260f6553822520.html</doc>
</api>
<api>
<name>VopMobilePublicOAuthAccessTokenCheck</name>
<url><![CDATA[https://api.weixin.qq.com/sns/auth?access_token={access_token}&openid={openid}]]></url>
<method>GET</method>
<desc>附:检验授权凭证(access_token)是否有效</desc>
<doc>https://mp.weixin.qq.com/wiki/4/9ac2e7b1f1d22e9e57260f6553822520.html</doc>
</api>
<!--开始开发-->
<!--<api>
<name>VopMobilePublicAccessToken</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appid}&secret={secret}]]></url>
<method>GET</method>
<desc>获取access_token</desc>
<doc>https://mp.weixin.qq.com/wiki/14/9f9c82c1af308e3b14ba9b973f99a8ba.html</doc>
</api>-->
<api>
<name>VopMobilePublicServerIp</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token={access_token}]]></url>
<method>GET</method>
<desc>获取微信服务器IP地址</desc>
<doc>https://mp.weixin.qq.com/wiki/4/41ef0843d6e108cf6b5649480207561c.html</doc>
</api>
<!--自定义菜单-->
<api>
<name>VopMobilePublicMenuAdd</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/menu/create?access_token={access_token}]]></url>
<method>POST</method>
<desc>自定义菜单创建接口</desc>
<doc>https://mp.weixin.qq.com/wiki/10/0234e39a2025342c17a7d23595c6b40a.html</doc>
</api>
<api>
<name>VopMobilePublicMenuGet</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/menu/get?access_token={access_token}]]></url>
<method>GET</method>
<desc>自定义菜单查询接口</desc>
<doc>https://mp.weixin.qq.com/wiki/5/f287d1a5b78a35a8884326312ac3e4ed.html</doc>
</api>
<api>
<name>VopMobilePublicMenuDel</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/menu/delete?access_token={access_token}]]></url>
<method>GET</method>
<desc>自定义菜单删除接口</desc>
<doc>https://mp.weixin.qq.com/wiki/3/de21624f2d0d3dafde085dafaa226743.html</doc>
</api>
<api>
<name>VopMobilePublicMenuConditionalAdd</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/menu/addconditional?access_token={access_token}]]></url>
<method>POST</method>
<desc>创建个性化菜单</desc>
<doc>https://mp.weixin.qq.com/wiki/0/c48ccd12b69ae023159b4bfaa7c39c20.html</doc>
</api>
<api>
<name>VopMobilePublicMenuConditionalDel</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/menu/delconditional?access_token={access_token}]]></url>
<method>POST</method>
<desc>删除个性化菜单</desc>
<doc>https://mp.weixin.qq.com/wiki/0/c48ccd12b69ae023159b4bfaa7c39c20.html</doc>
</api>
<api>
<name>VopMobilePublicMenuConditionalGet</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/menu/trymatch?access_token={access_token}]]></url>
<method>POST</method>
<desc>测试个性化菜单匹配结果</desc>
<doc>https://mp.weixin.qq.com/wiki/0/c48ccd12b69ae023159b4bfaa7c39c20.html</doc>
</api>
<api>
<name>VopMobilePublicMenuConfigGet</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/get_current_selfmenu_info?access_token={access_token}]]></url>
<method>POST</method>
<desc>获取自定义菜单配置接口</desc>
<doc>https://mp.weixin.qq.com/wiki/14/293d0cb8de95e916d1216a33fcb81fd6.html</doc>
</api>
<!--消息管理-->
<api>
<name>VopMobilePublicKfaccountAdd</name>
<url><![CDATA[https://api.weixin.qq.com/customservice/kfaccount/add?access_token={access_token}]]></url>
<method>POST</method>
<desc>添加客服帐号</desc>
<doc>https://mp.weixin.qq.com/wiki/11/c88c270ae8935291626538f9c64bd123.html</doc>
</api>
<api>
<name>VopMobilePublicKfaccountEdt</name>
<url><![CDATA[https://api.weixin.qq.com/customservice/kfaccount/update?access_token={access_token}]]></url>
<method>POST</method>
<desc>修改客服帐号</desc>
<doc>https://mp.weixin.qq.com/wiki/11/c88c270ae8935291626538f9c64bd123.html</doc>
</api>
<api>
<name>VopMobilePublicKfaccountDel</name>
<url><![CDATA[https://api.weixin.qq.com/customservice/kfaccount/del?access_token={access_token}]]></url>
<method>GET</method>
<desc>删除客服帐号</desc>
<doc>https://mp.weixin.qq.com/wiki/11/c88c270ae8935291626538f9c64bd123.html</doc>
</api>
<!--<api>
<name>VopMobilePublicKfaccountUploadHeadImg</name>
<url><![CDATA[http://api.weixin.qq.com/customservice/kfaccount/uploadheadimg?access_token={access_token}&kf_account={kf_account}]]></url>
<method>POST</method>
<desc>设置客服帐号的头像</desc>
<doc>https://mp.weixin.qq.com/wiki/11/c88c270ae8935291626538f9c64bd123.html</doc>
</api>-->
<api>
<name>VopMobilePublicKfaccountGet</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/customservice/getkflist?access_token={access_token}]]></url>
<method>GET</method>
<desc>获取所有客服账号</desc>
<doc>https://mp.weixin.qq.com/wiki/11/c88c270ae8935291626538f9c64bd123.html</doc>
</api>
<api>
<name>VopMobilePublicCustomMessageSend</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={access_token}]]></url>
<method>POST</method>
<desc>客服接口-发消息</desc>
<doc>https://mp.weixin.qq.com/wiki/11/c88c270ae8935291626538f9c64bd123.html</doc>
</api>
<api>
<name>VopMobilePublicTemplateIndustrySet</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/template/api_set_industry?access_token={access_token}]]></url>
<method>POST</method>
<desc>设置所属行业</desc>
<doc>https://mp.weixin.qq.com/wiki/5/6dde9eaa909f83354e0094dc3ad99e05.html</doc>
</api>
<api>
<name>VopMobilePublicTemplateIndustryGet</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/template/get_industry?access_token={access_token}]]></url>
<method>GET</method>
<desc>获取设置的行业信息</desc>
<doc>https://mp.weixin.qq.com/wiki/5/6dde9eaa909f83354e0094dc3ad99e05.html</doc>
</api>
<api>
<name>VopMobilePublicTemplatePrivateAdd</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/template/api_add_template?access_token={access_token}]]></url>
<method>POST</method>
<desc>获得模板ID</desc>
<doc>https://mp.weixin.qq.com/wiki/5/6dde9eaa909f83354e0094dc3ad99e05.html</doc>
</api>
<api>
<name>VopMobilePublicTemplatePrivateGet</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token={access_token}]]></url>
<method>GET</method>
<desc>获取模板列表</desc>
<doc>https://mp.weixin.qq.com/wiki/5/6dde9eaa909f83354e0094dc3ad99e05.html</doc>
</api>
<api>
<name>VopMobilePublicTemplatePrivateDel</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/template/del_private_template?access_token={access_token}]]></url>
<method>GET</method>
<desc>删除模板</desc>
<doc>https://mp.weixin.qq.com/wiki/5/6dde9eaa909f83354e0094dc3ad99e05.html</doc>
</api>
<api>
<name>VopMobilePublicTemplateMessageSend</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={access_token}]]></url>
<method>POST</method>
<desc>发送模板消息</desc>
<doc>https://mp.weixin.qq.com/wiki/5/6dde9eaa909f83354e0094dc3ad99e05.html</doc>
</api>
<!--用户管理-->
<api>
<name>VopMobilePublicGroupsAdd</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/groups/create?access_token={access_token}]]></url>
<method>POST</method>
<desc>创建分组</desc>
<doc>https://mp.weixin.qq.com/wiki/8/d6d33cf60bce2a2e4fb10a21be9591b8.html</doc>
</api>
<api>
<name>VopMobilePublicGroupsGet</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/groups/get?access_token={access_token}]]></url>
<method>GET</method>
<desc>查询所有分组</desc>
<doc>https://mp.weixin.qq.com/wiki/8/d6d33cf60bce2a2e4fb10a21be9591b8.html</doc>
</api>
<api>
<name>VopMobilePublicGroupsUserGet</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/groups/getid?access_token={access_token}]]></url>
<method>POST</method>
<desc>查询用户所在分组</desc>
<doc>https://mp.weixin.qq.com/wiki/8/d6d33cf60bce2a2e4fb10a21be9591b8.html</doc>
</api>
<api>
<name>VopMobilePublicGroupsEdt</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/groups/update?access_token={access_token}]]></url>
<method>POST</method>
<desc>修改分组名</desc>
<doc>https://mp.weixin.qq.com/wiki/8/d6d33cf60bce2a2e4fb10a21be9591b8.html</doc>
</api>
<api>
<name>VopMobilePublicGroupsUserEdt</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/groups/members/update?access_token={access_token}]]></url>
<method>POST</method>
<desc>移动用户分组</desc>
<doc>https://mp.weixin.qq.com/wiki/8/d6d33cf60bce2a2e4fb10a21be9591b8.html</doc>
</api>
<api>
<name>VopMobilePublicGroupsUserBatchEdt</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/groups/members/batchupdate?access_token={access_token}]]></url>
<method>POST</method>
<desc>批量移动用户分组</desc>
<doc>https://mp.weixin.qq.com/wiki/8/d6d33cf60bce2a2e4fb10a21be9591b8.html</doc>
</api>
<api>
<name>VopMobilePublicGroupsDel</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/groups/delete?access_token={access_token}]]></url>
<method>POST</method>
<desc>删除分组</desc>
<doc>https://mp.weixin.qq.com/wiki/8/d6d33cf60bce2a2e4fb10a21be9591b8.html</doc>
</api>
<api>
<name>VopMobilePublicUserEdt</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/user/info/updateremark?access_token={access_token}]]></url>
<method>GET</method>
<desc>设置备注名</desc>
<doc>https://mp.weixin.qq.com/wiki/16/528098c4a6a87b05120a7665c8db0460.html</doc>
</api>
<api>
<name>VopMobilePublicUserGet</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/user/info?access_token={access_token}&openid={openid}&lang={lang}]]></url>
<method>POST</method>
<desc>获取用户基本信息(包括UnionID机制)</desc>
<doc>https://mp.weixin.qq.com/wiki/1/8a5ce6257f1d3b2afb20f83e72b72ce9.html</doc>
</api>
<api>
<name>VopMobilePublicUserBatchGet</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token={access_token}]]></url>
<method>POST</method>
<desc>批量获取用户基本信息</desc>
<doc>https://mp.weixin.qq.com/wiki/1/8a5ce6257f1d3b2afb20f83e72b72ce9.html</doc>
</api>
<api>
<name>VopMobilePublicUserListGet</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/user/get?access_token={access_token}&next_openid={next_openid}]]></url>
<method>GET</method>
<desc>获取用户列表</desc>
<doc>https://mp.weixin.qq.com/wiki/12/54773ff6da7b8bdc95b7d2667d84b1d4.html</doc>
</api>
<!--账号管理-->
<api>
<name>VopMobilePublicQrcode</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={access_token}]]></url>
<method>POST</method>
<desc>创建二维码ticket</desc>
<doc>https://mp.weixin.qq.com/wiki/18/167e7d94df85d8389df6c94a7a8f78ba.html</doc>
</api>
<api>
<name>VopMobilePublicShortUrl</name>
<url><![CDATA[https://api.weixin.qq.com/cgi-bin/shorturl?access_token={access_token}]]></url>
<method>POST</method>
<desc>长链接转短链接接口</desc>
<doc>https://mp.weixin.qq.com/wiki/6/856aaeb492026466277ea39233dc23ee.html</doc>
</api>
<!--数据统计-->
<api>
<name>VopMobilePublicDataCubeUserSummary</name>
<url><![CDATA[https://api.weixin.qq.com/datacube/getusersummary?access_token={access_token}]]></url>
<method>POST</method>
<desc>获取用户增减数据</desc>
<doc>https://mp.weixin.qq.com/wiki/15/88726a421bfc54654a3095821c3ca3bb.html</doc>
</api>
<api>
<name>VopMobilePublicDataCubeUserCumulate</name>
<url><![CDATA[https://api.weixin.qq.com/datacube/getusercumulate?access_token={access_token}]]></url>
<method>POST</method>
<desc>获取累计用户数据</desc>
<doc>https://mp.weixin.qq.com/wiki/15/88726a421bfc54654a3095821c3ca3bb.html</doc>
</api>
<api>
<name>VopMobilePublicDataCubeArticleSummary</name>
<url><![CDATA[https://api.weixin.qq.com/datacube/getarticlesummary?access_token={access_token}]]></url>
<method>POST</method>
<desc>获取图文群发每日数据</desc>
<doc>https://mp.weixin.qq.com/wiki/9/d347c6ddb6f86ab11ec3b41c2729c8d9.html</doc>
</api>
<api>
<name>VopMobilePublicDataCubeArticleTotal</name>
<url><![CDATA[https://api.weixin.qq.com/datacube/getarticletotal?access_token={access_token}]]></url>
<method>POST</method>
<desc>获取图文群发总数据</desc>
<doc>https://mp.weixin.qq.com/wiki/9/d347c6ddb6f86ab11ec3b41c2729c8d9.html</doc>
</api>
<api>
<name>VopMobilePublicDataCubeUserRead</name>
<url><![CDATA[https://api.weixin.qq.com/datacube/getuserread?access_token={access_token}]]></url>
<method>POST</method>
<desc>获取图文统计数据</desc>
<doc>https://mp.weixin.qq.com/wiki/9/d347c6ddb6f86ab11ec3b41c2729c8d9.html</doc>
</api>
<api>
<name>VopMobilePublicDataCubeUserReadHour</name>
<url><![CDATA[https://api.weixin.qq.com/datacube/getuserreadhour?access_token={access_token}]]></url>
<method>POST</method>
<desc>获取图文统计分时数据</desc>
<doc>https://mp.weixin.qq.com/wiki/9/d347c6ddb6f86ab11ec3b41c2729c8d9.html</doc>
</api>
<api>
<name>VopMobilePublicDataCubeUserShare</name>
<url><![CDATA[https://api.weixin.qq.com/datacube/getusershare?access_token={access_token}]]></url>
<method>POST</method>
<desc>获取图文分享转发数据</desc>
<doc>https://mp.weixin.qq.com/wiki/9/d347c6ddb6f86ab11ec3b41c2729c8d9.html</doc>
</api>
<api>
<name>VopMobilePublicDataCubeUserShareHour</name>
<url><![CDATA[https://api.weixin.qq.com/datacube/getusersharehour?access_token={access_token}]]></url>
<method>POST</method>
<desc>获取图文分享转发分时数据</desc>
<doc>https://mp.weixin.qq.com/wiki/9/d347c6ddb6f86ab11ec3b41c2729c8d9.html</doc>
</api>
<api>
<name>VopMobilePublicDataCubeUpStreamMsg</name>
<url><![CDATA[https://api.weixin.qq.com/datacube/getupstreammsg?access_token={access_token}]]></url>
<method>POST</method>
<desc>获取消息发送概况数据</desc>
<doc>https://mp.weixin.qq.com/wiki/10/b29e8ca8bf1b0dce033ccb70273f90fa.html</doc>
</api>
<api>
<name>VopMobilePublicDataCubeUpStreamMsgHour</name>
<url><![CDATA[https://api.weixin.qq.com/datacube/getupstreammsghour?access_token={access_token}]]></url>
<method>POST</method>
<desc>获取消息分送分时数据</desc>
<doc>https://mp.weixin.qq.com/wiki/10/b29e8ca8bf1b0dce033ccb70273f90fa.html</doc>
</api>
<api>
<name>VopMobilePublicDataCubeUpStreamMsgWeek</name>
<url><![CDATA[https://api.weixin.qq.com/datacube/getupstreammsgweek?access_token={access_token}]]></url>
<method>POST</method>
<desc>获取消息发送周数据</desc>
<doc>https://mp.weixin.qq.com/wiki/10/b29e8ca8bf1b0dce033ccb70273f90fa.html</doc>
</api>
<api>
<name>VopMobilePublicDataCubeUpStreamMsgMonth</name>
<url><![CDATA[https://api.weixin.qq.com/datacube/getupstreammsgmonth?access_token={access_token}]]></url>
<method>POST</method>
<desc>获取消息发送月数据</desc>
<doc>https://mp.weixin.qq.com/wiki/10/b29e8ca8bf1b0dce033ccb70273f90fa.html</doc>
</api>
<api>
<name>VopMobilePublicDataCubeUpStreamMsgDist</name>
<url><![CDATA[https://api.weixin.qq.com/datacube/getupstreammsgdist?access_token={access_token}]]></url>
<method>POST</method>
<desc>获取消息发送分布数据</desc>
<doc>https://mp.weixin.qq.com/wiki/10/b29e8ca8bf1b0dce033ccb70273f90fa.html</doc>
</api>
<api>
<name>VopMobilePublicDataCubeUpStreamMsgDistWeek</name>
<url><![CDATA[https://api.weixin.qq.com/datacube/getupstreammsgdistweek?access_token={access_token}]]></url>
<method>POST</method>
<desc>获取消息发送分布周数据</desc>
<doc>https://mp.weixin.qq.com/wiki/10/b29e8ca8bf1b0dce033ccb70273f90fa.html</doc>
</api>
<api>
<name>VopMobilePublicDataCubeUpStreamMsgDistMonth</name>
<url><![CDATA[https://api.weixin.qq.com/datacube/getupstreammsgdistmonth?access_token={access_token}]]></url>
<method>POST</method>
<desc>获取消息发送分布月数据</desc>
<doc>https://mp.weixin.qq.com/wiki/10/b29e8ca8bf1b0dce033ccb70273f90fa.html</doc>
</api>
<api>
<name>VopMobilePublicDataCubeInterfaceSummary</name>
<url><![CDATA[https://api.weixin.qq.com/datacube/getinterfacesummary?access_token={access_token}]]></url>
<method>POST</method>
<desc>获取消息发送分布月数据</desc>
<doc>https://mp.weixin.qq.com/wiki/17/252a976f20bd3062af3f03a45f30cff9.html</doc>
</api>
<api>
<name>VopMobilePublicDataCubeInterfaceSummaryHour</name>
<url><![CDATA[https://api.weixin.qq.com/datacube/getinterfacesummaryhour?access_token={access_token}]]></url>
<method>POST</method>
<desc>获取接口分析分时数据</desc>
<doc>https://mp.weixin.qq.com/wiki/17/252a976f20bd3062af3f03a45f30cff9.html</doc>
</api>
</apis>
</configuration>
VopTrade.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<apis>
<!--微信支付-->
<api>
<name>VopTradeUnifiedOrder</name>
<url><![CDATA[https://api.mch.weixin.qq.com/pay/unifiedorder]]></url>
<method>POST</method>
<desc>统一下单</desc>
<doc>https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1</doc>
</api>
<api>
<name>VopTradeOrderQuery</name>
<url><![CDATA[https://api.mch.weixin.qq.com/pay/orderquery]]></url>
<method>POST</method>
<desc>查询订单</desc>
<doc>https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2</doc>
</api>
<api>
<name>VopTradeCloseOrder</name>
<url><![CDATA[https://api.mch.weixin.qq.com/pay/closeorder]]></url>
<method>POST</method>
<desc>关闭订单</desc>
<doc>https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_3</doc>
</api>
<api>
<name>VopTradeRefund</name>
<url><![CDATA[https://api.mch.weixin.qq.com/secapi/pay/refund]]></url>
<method>POST</method>
<desc>申请退款</desc>
<doc>https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4</doc>
</api>
<api>
<name>VopTradeRefundQuery</name>
<url><![CDATA[https://api.mch.weixin.qq.com/pay/refundquery]]></url>
<method>POST</method>
<desc>查询退款</desc>
<doc>https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_5</doc>
</api>
<api>
<name>VopTradeDownloadBill</name>
<url><![CDATA[https://api.mch.weixin.qq.com/pay/downloadbill]]></url>
<method>POST</method>
<desc>下载对账单</desc>
<doc>https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_6</doc>
</api>
</apis>
</configuration>
有了这两个配置文件,T4模板引擎就可以开工了,只需读取配置文件,一个一个cs给我生产就行了啊,哈哈哈哈
只需保存下T4模板就可生产所有cs文件了,不信你看
原文地址:http://www.cnblogs.com/deeround/p/6847671.html
源码下载:
VopSdk一个高逼格微信公众号开发SDK:自动化生产(装逼模式开启)的更多相关文章
- VopSdk一个高逼格微信公众号开发SDK(源码下载)
看之前回复很多说明大家很有热情&文章被误删掉了,不想让有的朋友错失这个高逼格的东西,现在重新发布,这次就直接放出源码,文章最末下载地址. 看之前回复很多说明大家很有热情&文章被误删掉了 ...
- VopSdk一个高逼格微信公众号开发SDK
一.我们的目标 分离基础参数和业务参数. 具有高重用和扩展性. 轻量级. 二.实现目标 (一)分离基础参数和业务参数 仔细分析所有接口,抽离出每个模块接口的公共参数. A.针对微信公众号所有接口分析( ...
- 线程安全使用(四) [.NET] 简单接入微信公众号开发:实现自动回复 [C#]C#中字符串的操作 自行实现比dotcore/dotnet更方便更高性能的对象二进制序列化 自已动手做高性能消息队列 自行实现高性能MVC WebAPI 面试题随笔 字符串反转
线程安全使用(四) 这是时隔多年第四篇,主要是因为身在东软受内网限制,好多文章就只好发到东软内部网站,懒的发到外面,现在一点点把在东软写的文章给转移出来. 这里主要讲解下CancellationT ...
- 微信公众号开发系列教程一(调试环境部署续:vs远程调试)
http://www.cnblogs.com/zskbll/p/4080328.html 目录 C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试 ...
- C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件)
微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...
- 微信公众号开发C#系列-2、微信公众平台接入指南
概述 微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流程是这样的,用户发送消息到微信服务器,微信服务器将接收到的消息post到用户接入时填写的url中,在url处理程序中,首先 ...
- 微信公众号开发系统入门教程(公众号注册、开发环境搭建、access_token管理、Demo实现、natapp外网穿透)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/a1786223749/article/ ...
- 微信公众号开发(一)--验证服务器地址的Java实现
现在主流上都用php写微信公众号后台,其实作为后端语言之一的java也可以实现. 这篇文章将对验证服务器地址这一步做出实现. 参考资料:1.慕课网-<初识java微信公众号开发>,2.微信 ...
- C#微信公众号开发系列教程三(消息体签名及加解密)
http://www.cnblogs.com/zskbll/p/4139039.html C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C ...
随机推荐
- CentOS 下安装 Node npm pm2
1.node安装 参考:http://blog.csdn.net/haidaochen/article/details/7257655 下载,你需要在https://nodejs.org/en/dow ...
- MongoDB 学习笔记(原创)
MongoDB 学习笔记 mongodb 数据库 nosql 一.数据库的基本概念及操作 SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table ...
- 开源 & 在线免费使用:升讯威 周报系统
这个周报系统大约写于2015年,缘起当时所带的开发团队需要逐步建立或完善一些项目管理方法. 在调研了网上的诸多项目管理或周报/日报管理系统之后,并没有找到符合当时情况的系统,这里最大的问题不是网上既有 ...
- WebServiceWSDLWeb
WSDL 文档仅仅是一个简单的 XML 文档. 它包含一系列描述某个 web service 的定义. WSDL 文档是利用这些主要的元素来描述某个 web service 的: 元素 定义 < ...
- 关于CO中的processRequest和processFormRequest的区别
在OAF开发中会有许多的CO,而一般情况下CO中的有两个基本的方法那就是processRequest和processFormRequest,processRequest是页面执行初始化的时候执行的方法 ...
- Wireless Intranet Captive Portal
Wireless Intranet Captive Portal 配置AAA服务Radius认证 radius-server key 0 radius radius-server authentica ...
- IOS设备型号(原创)
以下是我收集的ios目前为止移动设备型号,ipad air不知道,本人没有这款设备,求指导的给个回复,在这谢谢了 ///** //////////////////// 设备类型 字符串 /// ...
- 鼠标滚动:mousewheel事件在Firefox采用DOMMouseScroll事件的统一处理
这是一个小事件,但当下的WEB应用交互非常丰富,判断鼠标的滚动来执行相应的操作是比较常见的.我用Chrome/IE/Firefox/Opera 4种浏览器做测试,发现只有firefox的处理方法有很大 ...
- BS结构中,web如何将数据进行DES加密并写道IC卡中
在IC卡应用系统中,一般都要对IC卡数据进行DES加密,以保证数据的安全.友我科技RFID读写器云服务2.0充分考虑了这个需求,只需要软件工程师简单的配置即可实现数据的加解密并且写到数据块中.如下图所 ...
- Robotframe work学习之初(二)
一.F5帮助 Robot Framework 并没有像其它框架一样提供一份完整的 API 文档,所以,我们没办法通过官方 API文档进行习.RIDE 提供了 F5 快捷键来打开帮助文档. search ...