前提,企业有自己的企业微信
using System;
using System.Text;
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Core.SqlBuilder;
using Kingdee.BOS.Core.Metadata;
using System.ComponentModel;
using System.Net;
using System.IO;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using Kingdee.BOS.App.Data;
[Kingdee.BOS.Util.HotUpdate]
[Description("企业微信群发表单插件")]
public class QYWXQFEdit : AbstractBillPlugIn
{
string access_token = "";
public string ERPmsecret = "这里要填自己家企业微信的自建应用的secret";
public string secret = "";
public string h = "";
int errnum = 0;
/// <summary>
/// 初始化,对其他界面传来的参数进行处理,对控件某些属性进行处理
/// 这里不宜对数据DataModel进行处理
/// </summary>
/// <param name="e"></param>
///
public override void AfterBarItemClick(AfterBarItemClickEventArgs e)
{
base.AfterBarItemClick(e);
switch (e.BarItemKey.ToUpper())
{//我是做了个按钮,点击按钮,列表里有工号GH、内容NR,循环取,循环执行QunFa()一般400人十几秒发送完成,这里是为了给每个人推送内容不同,实际上直接看QunFa()和如何获取accesstoken;
case "S":
getAccessToken();
int n=this.View.Model.GetEntryRowCount("F_PJQF_WXQFMX");
for (int i = 0; i < n; i++)
{
string gh = this.View.Model.GetValue("F_PJQF_GH", i).ToString();
string nr = this.View.Model.GetValue("F_PJQF_NR", i).ToString();
QunFa(gh, nr);
}
this.View.ShowMessage("发送" + n.ToString() + "条," + "失败" + errnum.ToString() + "条.");
break;
}
}
public void QunFa(string gh,string nr)
{
//-------------------发送消息到企业微信begin
string touser = gh;//群发消息必须使用企业微信的工号--企业微信的唯一值
string toparty = "";
string totag = "";
string msgtype = "text";//发送文本样式的消息,具体参考企业微信api帮助;
string agentid = "1000113";//自建应用id
string text = "大家好!为了更好地保护地球,爱护环境,大家在去年7月份根据SDGs写下了自己的行动目标:\n----您的行动目标:-----\n" +
nr+
"\n----------------\n迄今已过去一年,现收集个人目标的达成,请根据这一年的实绩认真如实地填写下面地目标达成。"
+ "\n<a href=\\\"doc.weixin.qq.com/forms/AEwAvQcqAAgAH4AKAatAKwVbHjQpU8S2f\\\">请点击链接填写:S D Gs个人行动目标达成</a>"
+"\n已经填写的请忽略";
string safe = "";
string enable_id_trans = "";
string enable_duplicate_check = "";
string duplicate_check_interval = "";
string jsonInfo = "{\"touser\" : \"" + touser + "\"," +
"\"toparty\" : \"" + toparty + "\"," +
"\"totag\" : \"" + totag + "\"," +
"\"msgtype\" : \"" + msgtype + "\"," +
"\"agentid\" : " + agentid + "," +
"\"text\" : {" +
"\"content\" : \"" + text + "\"" +
"}," +
" \"safe\":" + safe + "," +
"\"enable_id_trans\": " + enable_id_trans + "," +
" \"enable_duplicate_check\": " + enable_duplicate_check + "," +
"\"duplicate_check_interval\": " + duplicate_check_interval + "}";//post请求参数。JSON格式,,其中的变量自己定义值
//var access_token = CacheHelper.GetObject<string>("access_token");//拿到缓存中的token
//这个if是缓存中的token时效过了之后需要重新获取的方法
//if (string.IsNullOrEmpty(access_token))
//{
// bookBorrowBusiness.GetTokenByEnterpriseWechat();
// access_token = CacheHelper.GetObject<string>("access_token");
//}
var url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + access_token;
UTF8Encoding encoding = new UTF8Encoding();//编码模式,防止中文乱码
byte[] data = encoding.GetBytes(jsonInfo);
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
myRequest.Method = "POST";
myRequest.ContentType = "application/json;charset=utf-8";
myRequest.ContentLength = data.Length;
Stream newStream = myRequest.GetRequestStream();
newStream.Write(data, 0, data.Length);
newStream.Close();
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.Default);
string content = reader.ReadToEnd();
reader.Close();
JObject jo = (JObject)JsonConvert.DeserializeObject(content);
int errcode = Convert.ToInt32(jo["errcode"].ToString());//如果发送成功,errcode返回0
errnum = errnum + errcode;
//--------------------发送消息到企业微信end
}
public void getAccessToken()
{
DateTime a = DateTime.Now.AddHours(-2);
string sql = string.Format(@"select f_pjqf_token1,f_pjqf_token11 from PJQF_T_WXtoken where f_pjqf_id=1 and f_pjqf_dt>'{0}' and F_PJQF_secret='{1}'", a, secret);
DynamicObjectCollection dt = DBUtils.ExecuteDynamicObject(this.Context, sql);
if (dt.Count > 0)
{
access_token = dt[0]["F_PJQF_token1"].ToString() + dt[0]["F_PJQF_token11"].ToString();
// this.View.ShowMessage("sqlget: " + access_token);
}
else
{
GetToken();
//这里之前不知道如何扩大字段数,所以用两个字段拼接的access token,这里肯定不能直接拿来用,下面的从数据库存取accestoken,企业微信是2小时失效,所以需要定期取
string t1 = access_token.Substring(0, access_token.Length / 2);
string t2 = access_token.Substring(access_token.Length / 2, access_token.Length / 2);
string sqlupdate = string.Format(@"update PJQF_T_WXtoken set f_pjqf_dt='{0}',f_pjqf_token1='{1}',f_pjqf_token11='{2}' where F_PJQF_secret='{3}' ", DateTime.Now.ToString(), t1, t2, secret);
DBUtils.Execute(this.Context, sqlupdate);
// this.View.Model.SetValue("F_t1", access_token);
}
}
public void GetToken()
{
//获取access_token 开始
string corpid = "ww23aae6ad045a60be";
string corpsecret = "";
corpsecret = ERPmsecret;
string urla = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + corpid + "&corpsecret=" + corpsecret;
HttpWebRequest myRequesta = (HttpWebRequest)WebRequest.Create(urla);
myRequesta.Method = "GET";
HttpWebResponse myResponsea = (HttpWebResponse)myRequesta.GetResponse();
StreamReader readera = new StreamReader(myResponsea.GetResponseStream(), Encoding.UTF8);
string access_token_info = readera.ReadToEnd();//这里拿到我们get请求返回的参数,我们需要拿到token
JObject joa = (JObject)JsonConvert.DeserializeObject(access_token_info);
access_token = joa["access_token"].ToString();//这里把拿到的字符串消息转成JSON并且拿到其中的access_token
readera.Close();
//获取access_token 结束
}
运行效果:
推荐阅读