night-king / weixinsdk Goto Github PK
View Code? Open in Web Editor NEW微信SDK,一个轻量级的,极致简约的微信公众平台(服务号、订阅号)SDK.net版本,也支持dotnet core,作者QQ:2586662969,官方网站:
Home Page: http://weixinsdk.net
微信SDK,一个轻量级的,极致简约的微信公众平台(服务号、订阅号)SDK.net版本,也支持dotnet core,作者QQ:2586662969,官方网站:
Home Page: http://weixinsdk.net
BasicAPI.UploadMedia
weixin已经调整了,这里还没改呢。
public static string UploadMedia(string access_token, string type, string file)
{
//var url = string.Format("http://api.weixin.qq.com/cgi-bin/media/upload?access_token={0}&type={1}&filename={2}", access_token, type, Path.GetFileName(file));
//var client = new HttpClient();
//var result = client.PostAsync(url, new StreamContent(new FileStream(file, FileMode.Open, FileAccess.Read)));
//if (!result.Result.IsSuccessStatusCode) return string.Empty;
//var media = DynamicJson.Parse(result.Result.Content.ReadAsStringAsync().Result);
//return media.media_id;
//----------- Change By StephenWang 2015-01-28 微信改为需要Form提交,才能上传
string wxurl = "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=" + access_token + "&type=" + type;
System.Net.WebClient myWebClient = new System.Net.WebClient();
myWebClient.Credentials = System.Net.CredentialCache.DefaultCredentials;
byte[] responseArray = myWebClient.UploadFile(wxurl, "POST", file);
var result = System.Text.Encoding.Default.GetString(responseArray, 0, responseArray.Length);
var media = DynamicJson.Parse(result);
result = media.media_id;
return result;
}
请问这个支持小程序吗
在网上找了很多方法都没有解决
Card.CreateCardAPI.UploadLogo
var url = string.Format("http://api.weixin.qq.com/cgi-bin/uploadimg?access_token={0}", access_token);
// 这其中的 URL
// HTTP请求方式: POST/FROM
URL:https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN
// 参见: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1451025056
2.3.1 上传图片接口
util中的sha1方法应该是:
public static string Sha1(string orgStr, Encoding encode)
{
SHA1 sha1 = new SHA1CryptoServiceProvider();
byte[] bytes_in = encode.GetBytes(orgStr);
byte[] bytes_out = sha1.ComputeHash(bytes_in);
sha1.Dispose();
string result = BitConverter.ToString(bytes_out);
result = result.Replace("-", "");
return result;
}
using System.Dynamic;
using System.Xml.Linq;
using System.Xml;
using Codeplex.Data;
using Tencent;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
这行是多余的吧?
-------------------------- ReplayActiveMessageAPI.cs---------------------------------
客服接口的JSON内的数据值都需要加上引号;
/*--------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Http;
using Codeplex.Data;
using Deepleo.Weixin.SDK.Entities;
namespace Deepleo.Weixin.SDK
{
///
/// 发送(主动)客服消息
/// </summary>
public class ReplayActiveMessageAPI
{
/// <summary>
/// 发送文本消息
/// </summary>
/// <param name="access_token">调用接口凭证</param>
/// <param name="touser">普通用户openid</param>
/// <param name="content">文本消息内容</param>
/// <param name="kf_account">完整客服账号,格式为:账号前缀@公众号微信号</param>
/// <returns></returns>
public static bool RepayText(string access_token, string touser, string content, string kf_account = null)
{
var builder = new StringBuilder();
builder.Append("{")
.Append('"' + "touser" + '"' + ":").Append('"').Append(touser).Append('"').Append(",")
.Append('"' + "msgtype" + '"' + ":").Append('"').Append("text").Append('"').Append(",")
.Append('"' + "text" + '"' + ":")
.Append("{")
.Append('"' + "content" + '"' + ":").Append('"').Append(content).Append('"')
.Append("}");
if (!string.IsNullOrEmpty(kf_account))
{
builder.Append(",");
builder.Append('"' + "customservice" + '"' + ":")
.Append("{")
.Append('"' + "kfaccount" + '"' + ":").Append('"').Append(kf_account).Append('"')
.Append("}");
}
builder.Append("}");
var client = new HttpClient();
return client.PostAsync(string.Format("https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={0}", access_token), new StringContent(builder.ToString())).Result.IsSuccessStatusCode;
}
/// <summary>
/// 发送图片消息
/// </summary>
/// <param name="access_token">调用接口凭证</param>
/// <param name="touser">普通用户openid</param>
/// <param name="media_id">发送的图片的媒体ID</param>
/// <param name="kf_account">完整客服账号,格式为:账号前缀@公众号微信号</param>
/// <returns></returns>
public static bool RepayImage(string access_token, string touser, string media_id, string kf_account = null)
{
var builder = new StringBuilder();
builder.Append("{")
.Append('"' + "touser" + '"' + ":").Append('"').Append(touser).Append('"').Append(",")
.Append('"' + "msgtype" + '"' + ":").Append('"').Append("image").Append('"').Append(",")
.Append('"' + "image" + '"' + ":")
.Append("{")
.Append('"' + "media_id" + '"' + ":").Append('"').Append(media_id).Append('"')
.Append("}");
if (!string.IsNullOrEmpty(kf_account))
{
builder.Append(",");
builder.Append('"' + "customservice" + '"' + ":")
.Append("{")
.Append('"' + "kfaccount" + '"' + ":").Append('"').Append(kf_account).Append('"')
.Append("}");
}
builder.Append("}");
var client = new HttpClient();
return client.PostAsync(string.Format("https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={0}", access_token), new StringContent(builder.ToString())).Result.IsSuccessStatusCode;
}
/// <summary>
/// 发送语音消息
/// </summary>
/// <param name="access_token">调用接口凭证</param>
/// <param name="touser">普通用户openid</param>
/// <param name="media_id">发送的语音的媒体ID</param>
/// <param name="kf_account">完整客服账号,格式为:账号前缀@公众号微信号</param>
/// <returns></returns>
public static bool RepayVoice(string access_token, string touser, string media_id, string kf_account = null)
{
var builder = new StringBuilder();
builder.Append("{")
.Append('"' + "touser" + '"' + ":").Append('"').Append(touser).Append('"').Append(",")
.Append('"' + "msgtype" + '"' + ":").Append('"').Append("voice").Append('"').Append(",")
.Append('"' + "voice" + '"' + ":")
.Append("{")
.Append('"' + "media_id" + '"' + ":").Append('"').Append(media_id).Append('"')
.Append("}");
if (!string.IsNullOrEmpty(kf_account))
{
builder.Append(",");
builder.Append('"' + "customservice" + '"' + ":")
.Append("{")
.Append('"' + "kfaccount" + '"' + ":").Append('"').Append(kf_account).Append('"')
.Append("}");
}
builder.Append("}");
var client = new HttpClient();
return client.PostAsync(string.Format("https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={0}", access_token), new StringContent(builder.ToString())).Result.IsSuccessStatusCode;
}
/// <summary>
/// 发送视频消息
/// </summary>
/// <param name="access_token">调用接口凭证</param>
/// <param name="touser">普通用户openid</param>
/// <param name="media_id">发送的视频的媒体ID</param>
/// <param name="thumb_media_id">缩略图的媒体ID</param>
/// <param name="title">视频消息的标题</param>
/// <param name="description">视频消息的描述</param>
/// <param name="kf_account">完整客服账号,格式为:账号前缀@公众号微信号</param>
/// <returns></returns>
public static bool RepayVedio(string access_token, string touser, string media_id, string thumb_media_id, string title, string description, string kf_account = null)
{
var builder = new StringBuilder();
builder.Append("{")
.Append('"' + "touser" + '"' + ":").Append('"').Append(touser).Append('"').Append(",")
.Append('"' + "msgtype" + '"' + ":").Append('"').Append("video").Append('"').Append(",")
.Append('"' + "video" + '"' + ":")
.Append("{")
.Append('"' + "media_id" + '"' + ":").Append('"').Append(media_id).Append('"').Append(",")
.Append('"' + "thumb_media_id" + '"' + ":").Append('"').Append(thumb_media_id).Append('"').Append(",")
.Append('"' + "title" + '"' + ":").Append('"').Append(title).Append('"').Append(",")
.Append('"' + "description" + '"' + ":").Append('"').Append(description).Append('"')
.Append("}");
if (!string.IsNullOrEmpty(kf_account))
{
builder.Append(",");
builder.Append('"' + "customservice" + '"' + ":")
.Append("{")
.Append('"' + "kfaccount" + '"' + ":").Append('"').Append(kf_account).Append('"')
.Append("}");
}
builder.Append("}");
var client = new HttpClient();
return client.PostAsync(string.Format("https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={0}", access_token), new StringContent(builder.ToString())).Result.IsSuccessStatusCode;
}
/// <summary>
/// 发送音乐消息
/// </summary>
/// <param name="access_token">调用接口凭证</param>
/// <param name="touser">普通用户openid</param>
/// <param name="musicurl">音乐链接</param>
/// <param name="hqmusicurl">高品质音乐链接,wifi环境优先使用该链接播放音乐</param>
/// <param name="thumb_media_id">缩略图的媒体ID</param>
/// <param name="title">音乐标题</param>
/// <param name="description">音乐描述</param>
/// <param name="kf_account">完整客服账号,格式为:账号前缀@公众号微信号</param>
/// <returns></returns>
public static bool RepayMusic(string access_token, string touser, string musicurl, string hqmusicurl, string thumb_media_id, string title, string description, string kf_account = null)
{
var builder = new StringBuilder();
builder.Append("{")
.Append('"' + "touser" + '"' + ":").Append('"').Append(touser).Append('"').Append(",")
.Append('"' + "msgtype" + '"' + ":").Append('"').Append("music").Append('"').Append(",")
.Append('"' + "music" + '"' + ":")
.Append("{")
.Append('"' + "title" + '"' + ":").Append('"').Append(title).Append('"').Append(",")
.Append('"' + "description" + '"' + ":").Append('"').Append(description).Append('"').Append(",")
.Append('"' + "musicurl" + '"' + ":").Append('"').Append(musicurl).Append('"').Append(",")
.Append('"' + "hqmusicurl" + '"' + ":").Append('"').Append(hqmusicurl).Append('"').Append(",")
.Append('"' + "thumb_media_id" + '"' + ":").Append('"').Append(thumb_media_id).Append('"').Append(",")
.Append("}");
if (!string.IsNullOrEmpty(kf_account))
{
builder.Append(",");
builder.Append('"' + "customservice" + '"' + ":")
.Append("{")
.Append('"' + "kfaccount" + '"' + ":").Append('"').Append(kf_account).Append('"')
.Append("}");
}
builder.Append("}");
var client = new HttpClient();
return client.PostAsync(string.Format("https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={0}", access_token), new StringContent(builder.ToString())).Result.IsSuccessStatusCode;
}
/// <summary>
/// 回复单图文消息
/// </summary>
/// <param name="access_token">调用接口凭证</param>
/// <param name="touser">普通用户openid</param>
/// <param name="news"></param>
/// <param name="kf_account">完整客服账号,格式为:账号前缀@公众号微信号</param>
/// <returns></returns>
public static bool RepayNews(string access_token, string touser, WeixinNews news, string kf_account = null)
{
var builder = new StringBuilder();
builder.Append("{")
.Append('"' + "touser" + '"' + ":").Append('"').Append(touser).Append('"').Append(",")
.Append('"' + "msgtype" + '"' + ":").Append('"').Append("news").Append('"').Append(",")
.Append('"' + "news" + '"' + ":")
.Append("{")
.Append('"' + "articles" + '"' + ":")
.Append("[")
.Append("{")
.Append('"' + "title" + '"' + ":").Append('"').Append(news.title).Append('"').Append(",")
.Append('"' + "description" + '"' + ":").Append('"').Append(news.description).Append('"').Append(",")
.Append('"' + "url" + '"' + ":").Append('"').Append(news.url).Append('"').Append(",")
.Append('"' + "picurl" + '"' + ":").Append('"').Append(news.picurl).Append('"')
.Append("}")
.Append("]")
.Append("}");
if (!string.IsNullOrEmpty(kf_account))
{
builder.Append(",");
builder.Append('"' + "customservice" + '"' + ":")
.Append("{")
.Append('"' + "kfaccount" + '"' + ":").Append('"').Append(kf_account).Append('"')
.Append("}");
}
builder.Append("}");
var client = new HttpClient();
return client.PostAsync(string.Format("https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={0}", access_token), new StringContent(builder.ToString())).Result.IsSuccessStatusCode;
}
/// <summary>
/// 回复多图文消息
/// </summary>
/// <param name="access_token">调用接口凭证</param>
/// <param name="touser">普通用户openid</param>
/// <param name="news"></param>
/// <param name="kf_account">完整客服账号,格式为:账号前缀@公众号微信号</param>
/// <returns></returns>
public static bool RepayNews(string access_token, string touser, List<WeixinNews> news, string kf_account = null)
{
var builder = new StringBuilder();
builder.Append("{")
.Append('"' + "touser" + '"' + ":").Append('"').Append(touser).Append('"').Append(",")
.Append('"' + "msgtype" + '"' + ":").Append('"').Append("news").Append('"').Append(",")
.Append('"' + "news" + '"' + ":")
.Append("{").Append('"' + "articles" + '"' + ":").Append("[");
for (int i = 0; i < news.Count; i++)
{
var n = news[i];
builder.Append("{")
.Append('"' + "title" + '"' + ":").Append('"').Append(n.title).Append('"').Append(",")
.Append('"' + "description" + '"' + ":").Append('"').Append(n.description).Append('"').Append(",")
.Append('"' + "url" + '"' + ":").Append('"').Append(n.url).Append('"').Append(",")
.Append('"' + "picurl" + '"' + ":").Append('"').Append(n.picurl).Append('"')
.Append("}");
if (i != news.Count - 1) builder.Append(",");
}
builder.Append("]")
.Append("}");
if (!string.IsNullOrEmpty(kf_account))
{
builder.Append(",");
builder.Append('"' + "customservice" + '"' + ":")
.Append("{")
.Append('"' + "kfaccount" + '"' + ":").Append('"').Append(kf_account).Append('"')
.Append("}");
}
builder.Append("}");
var client = new HttpClient();
return client.PostAsync(string.Format("https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={0}", access_token), new StringContent(builder.ToString())).Result.IsSuccessStatusCode;
}
}
}
///
/// 发送模板消息
/// 在模版消息发送任务完成后,微信服务器会将是否送达成功作为通知,发送到开发者中心中填写的服务器配置地址中。
/// 参见WeixinExecutor.cs TEMPLATESENDJOBFINISH Event
/// </summary>
/// <param name="access_token"></param>
/// <param name="content">模板消息体,由于模板众多,且结构不一,请开发者自行按照模板自行构建模板消息体,模板消息体为json字符串,请登录微信公众号后台查看</param>
/// <returns> { "errcode":0,"errmsg":"ok", "msgid":200228332}
/// </returns>
public static dynamic SendTemplateMessage(string access_token, dynamic content)
{
var url = string.Format("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={0}", access_token);
var client = new HttpClient();
var result = client.PostAsync(url, new StringContent(DynamicJson.Serialize(content))).Result;
return DynamicJson.Parse(result.Content.ReadAsStringAsync().Result);
}
DynamicJson.Serialize
这个的作用是什么呢? 传了json串后。就出错了。。。返回。47001 data format error
我把这个去掉,就正常了。
是否需要证书
请求需要双向证书。 详见证书使用
调用退款的接口时,需要使用证书,我好象没发现,这里面有证书的调用。
case "location"://上报地理位置事件
#region 上报地理位置事件
var lat = message.Body.Latitude.Value.ToString();
var lng = message.Body.Longitude.Value.ToString();
var pcn = message.Body.Precision.Value.ToString();
//TODO:在此处将经纬度记录在数据库,这里用log4net记录日志
LogWriter.Default.WriteInfo(string.Format("openid:{0} ,location,lat:{1},lng:{21},pcn:{3}", openId, lat, lng, pcn));
#endregion
lng:{21} ......2啊
公众号计划2017/12/30停止http的接口,本项目有没有升级的计划
公告
关于公众平台接口不再支持HTTP方式调用的公告
为保证数据传输安全,提高业务安全性,公众平台将不再支持HTTP方式调用。避免影响正常使用中含有HTTP方式调用的服务,请开发者尽快调整,将现有通过HTTP方式调用的切换成HTTPS调用,平台将于2017年12月30日停止对HTTP方式调用的支持。接口调用方式切换成HTTPS调用指导建议:
1.后台程序调用api.weixin.qq.com的接口,采用HTTPS方式,连接端口443,修改方法请自行查询各种编程语言对HTTPS的支持。
2.HTML页面对api.weixin.qq.com的URL访问,如果是HTTP方式,请直接指定HTTPS方式。
3.javascript等编程语言对api.weixin.qq.com的URL访问也请从HTTP方式改为HTTPS方式。
微信团队
2017年09月21日
程序里还有几个地方在使用 DateTime.Now.ToBinary() 生成时间戳,
生成的都是负数,虽说现在腾讯没校验,防止万一,有时间改一下吧。
看到JSAPI里有这样的函数:
///
/// 创建时间戳
/// </summary>
/// <returns></returns>
public static long CreatenTimestamp()
{
return (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
}
1、定义一模板消息类:
public class TemplateMessageModel
{
//....
public Dictionary<string, TemplateMessageDataModel> data { get; set; }
//....
}
public class TemplateMessageDataModel
{
/// <summary>
/// 数据项目值
/// </summary>
public string value { get; set; }
/// <summary>
/// 数据项颜色
/// 16进制颜色代码(缺省为:#173177)
/// </summary>
public string color { get; set; }
public TemplateMessageDataModel(string value, string color = "#173177")
{
this.value = value;
this.color = color;
}
}
2、实例化后,添加数据
DynamicJson.Serialize(TemplateMessageModelInstance)得到结果是这样:
{
"touser": "",
"template_id": "",
"url": "http://www.baidu.com",
"topcolor": "#FF0000",
"data": [
{
"Key": "first",
"Value": {
"value": "审核结果通知",
"color": "#173177"
}
},
{
"Key": "keyword1",
"Value": {
"value": "手机号码",
"color": "#173177"
}
},
{
"Key": "keyword2",
"Value": {
"value": "帐户信息",
"color": "#173177"
}
},
{
"Key": "keyword3",
"Value": {
"value": "审核状态",
"color": "#173177"
}
},
{
"Key": "keyword4",
"Value": {
"value": "2015/12/16 19:00:09",
"color": "#173177"
}
},
{
"Key": "remark",
"Value": {
"value": "备注",
"color": "#173177"
}
}
]
}
注:data是个数组
而用Newtonsoft.Json序列化是这样的:
{
"touser": "",
"template_id": "",
"url": "http://www.baidu.com",
"topcolor": "#FF0000",
"data": {
"first": {
"value": "审核结果通知",
"color": "#173177"
},
"keyword1": {
"value": "手机号码",
"color": "#173177"
},
"keyword2": {
"value": "帐户信息",
"color": "#173177"
},
"keyword3": {
"value": "审核状态",
"color": "#173177"
},
"keyword4": {
"value": "2015/12/16 19:00:09",
"color": "#173177"
},
"remark": {
"value": "备注",
"color": "#173177"
}
}
}
应该算一个问题吧????
deom中的pay 125行
paySign: prepay_id
有问题,请老大修改一下。
WXPayController71行
这个返回的sign = content.sign.Value,是不是应该加密一下。
如下:
//appId, timeStamp, nonceStr, package, signType。
Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("appId", WeixinConfig.AppID);
dic.Add("timeStamp", timestamp);
dic.Add("nonceStr", nonceStr);
dic.Add("package", "prepay_id=" + content.prepay_id.Value);
dic.Add("signType", "MD5");
string sign2 = WxPayAPI.Sign(dic, payAPIKey);
payapikey 是在微信支付里设置的api密匙
我用的sign2 , 商户签名错误搞定。
仅供参考。
http://demo.weixinsdk.net/jssdk
由于目标计算机积极拒绝,无法连接。 127.0.0.1:5566
WeixinExecutor.cs中
case WeixinMessageType.Event:
string eventType = message.Body.Event.Value.ToLower();
string eventKey = message.Body.EventKey.Value;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
在某些事件消息中,没有EventKey这个数据时,动态解析xml时会出错。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.