Code Monkey home page Code Monkey logo

weixinsdk's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

weixinsdk's Issues

BasicAPI.UploadMedia有问题

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;
}

jssdk签名错误

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;
}

客服接口BUG

-------------------------- 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

break;

lng:{21} ......2啊

Util.cs有点问题

刚才运行了一下,发生如下错误,我暂时先改回我原来的函数。你有时间看看是怎么回事。
util_bug

消息类型:WebException
消息内容:操作超时
引发异常的方法:System.IO.Stream GetRequestStream(System.Net.TransportContext ByRef)
引发异常源:System 在 System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
在 System.Net.HttpWebRequest.GetRequestStream()

我一般都是在生产环境中做试验。呵呵

公众号计划2017/12/30停止http的接口,本项目有没有升级的计划

公众号计划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;
    }

DynamicJson序列化问题

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 , 商户签名错误搞定。
仅供参考。

动态解析XML出错。

WeixinExecutor.cs中
case WeixinMessageType.Event:
string eventType = message.Body.Event.Value.ToLower();
string eventKey = message.Body.EventKey.Value;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
在某些事件消息中,没有EventKey这个数据时,动态解析xml时会出错。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.