




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】微信开发之如何实现被动回复和上传下载文件
/upload/information/20201208/260/9851.jpg/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET将appid和secret替换成你自己的。{"access_token":"eEd6dhp0s24JfWwDyGBbrvJxnhqHTSYZ8MKdQ7MuCGBKxAjHv-tEIwhFZzn102lGvIWxnjZZreT6C1NCT9fpS7NREOkEX42yojVnqKVaicg","expires_in":7200}我们只需解析这个json,即可获取到我们所需的access_token.代码如下:AccessToken实体类:public
class
AccessToken
{
public
string
token
{
get;
set;
}
public
DateTime
expirestime
{
get;
set;
}
}///
<summary>
///
获取access
token
///
</summary>
///
<param
name="appid">第三方用户唯一凭证</param>
///
<param
name="secret">第三方用户唯一凭证密钥,即appsecret</param>
///
<returns>AccessToken对象,expirestime是过期时间</returns>
public
static
AccessToken
GetAccessToken(string
appid,
string
secret)
{
try
{
string
url
=
string.Format("/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}",
appid,
secret);
string
retdata
=
Utils.HttpGet(url);
if
(retdata.Contains("access_token"))
{
JObject
obj
=
(JObject)JsonConvert.DeserializeObject(retdata);
string
token
=
obj.Value<string>("access_token");
int
expirestime
=
obj.Value<int>("expires_in");
return
new
AccessToken
{
token
=
token,
expirestime
=
DateTime.Now.AddSeconds(expirestime)
};
}
else
{
WriteBug(retdata);//写错误日志
}
return
null;
}
catch
(Exception
e)
{
WriteBug(e.ToString());//写错误日志
return
null;
}
}/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE语音(voice):2M,播放长度不超过60s,支持AMR\MP3格式视频(video):10MB,支持MP4格式缩略图(thumb):64KB,支持JPG格式媒体文件在后台保存时间为3天,即3天后media_id失效。public
enum
MediaType
{
///
<summary>
///
图片(image):
1M,支持JPG格式
///
</summary>
image,
///
<summary>
///
语音(voice):2M,播放长度不超过60s,支持AMR\MP3格式
///
</summary>
voice,
///
<summary>
///
视频(video):10MB,支持MP4格式
///
</summary>
video,
///
<summary>
///
缩略图(thumb):64KB,支持JPG格式
///
</summary>
thumb
}public
class
UpLoadInfo
{
///
<summary>
///
媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb,主要用于视频与音乐格式的缩略图)
///
</summary>
public
string
type
{
get;
set;
}
///
<summary>
///
媒体文件上传后,获取时的唯一标识
///
</summary>
public
string
media_id
{
get;
set;
}
///
<summary>
///
媒体文件上传时间戳
///
</summary>
public
string
created_at
{
get;
set;
}
}///
<summary>
///
微信上传多媒体文件
///
</summary>
///
<param
name="filepath">文件绝对路径</param>
public
static
ReceiveModel.UpLoadInfo
WxUpLoad(string
filepath,
string
token,
MediaType
mt)
{
using
(WebClient
client
=
new
WebClient())
{
byte[]
b
=
client.UploadFile(string.Format("/cgi-bin/media/upload?access_token={0}&type={1}",
token,
mt.ToString()),
filepath);//调用接口上传文件
string
retdata
=
Encoding.Default.GetString(b);//获取返回值
if
(retdata.Contains("media_id"))//判断返回值是否包含media_id,包含则说明上传成功,然后将返回的json字符串转换成json
{
return
JsonConvert.DeserializeObject<UpLoadInfo>(retdata);
}
else
{//否则,写错误日志
WriteBug(retdata);//写错误日志
return
null;
}
}
}注意:一旦遇到以下情况,微信都会在公众号会话中,向用户下发系统提示“该公众号暂时无法提供服务,请稍后再试”:1、开发者在5秒内未回复任何内容
2、开发者回复了异常数据,比如JSON数据等<xml><ToUserName><![CDATA[接收方帐号(收到的OpenID)]]></ToUserName><FromUserName><![CDATA[开发者微信号]]></FromUserName><CreateTime>消息创建时间
(整型)</CreateTime><MsgType><![CDATA[image]]></MsgType><Content><![CDATA[回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示)]]></Content></xml><xml><ToUserName><![CDATA[接收方帐号(收到的OpenID)]]></ToUserName><FromUserName><![CDATA[开发者微信号]]></FromUserName><CreateTime>消息创建时间
(整型)</CreateTime><MsgType><![CDATA[image]]></MsgType><Image><MediaId><![CDATA[通过上传多媒体文件,得到的id。]]></MediaId></Image></xml><xml><ToUserName><![CDATA[接收方帐号(收到的OpenID)]]></ToUserName><FromUserName><![CDATA[开发者微信号]]></FromUserName><CreateTime>消息创建时间
(整型)</CreateTime><MsgType><![CDATA[voice]]></MsgType><Voice><MediaId><![CDATA[通过上传多媒体文件,得到的id。]]></MediaId></Voice></xml><xml><ToUserName><![CDATA[接收方帐号(收到的OpenID)]]></ToUserName><FromUserName><![CDATA[开发者微信号]]></FromUserName><CreateTime>消息创建时间
(整型)</CreateTime><MsgType><![CDATA[video]]></MsgType><Video><MediaId><![CDATA[通过上传多媒体文件,得到的id。]]></MediaId><Title><![CDATA[视频消息的标题]]></Title>
<Description><![CDATA[视频消息的描述]]></Description>
</Video></xml><xml><ToUserName><![CDATA[接收方帐号(收到的OpenID)]]></ToUserName><FromUserName><![CDATA[开发者微信号]]></FromUserName><CreateTime>消息创建时间
(整型)</CreateTime><MsgType><![CDATA[music]]></MsgType><Music><ThumbMediaId><![CDATA[缩略图的媒体id,通过上传多媒体文件,得到的id。]]></ThumbMediaId><Title><![CDATA[视频消息的标题]]></Title>
<Description><![CDATA[视频消息的描述]]></Description>
<MusicURL><![CDATA[音乐链接]]></MusicURL>
<HQMusicUrl><![CDATA[高质量音乐链接,WIFI环境优先使用该链接播放音乐]]></HQMusicUrl>
</Music></xml><xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>12345678</CreateTime><MsgType><![CDATA[news]]></MsgType><ArticleCount>2</ArticleCount><Articles><item><Title><![CDATA[title1]]></Title>
<Description><![CDATA[description1]]></Description><PicUrl><![CDATA[picurl]]></PicUrl><Url><![CDATA[url]]></Url></item><item><Title><![CDATA[title]]></Title><Description><![CDATA[description]]></Description><PicUrl><![CDATA[picurl]]></PicUrl><Url><![CDATA[url]]></Url></item></Articles></xml>///
<summary>
///
消息体基类
///
</summary>
public
abstract
class
BaseMessage
{
///
<summary>
///
开发者微信号
///
</summary>
public
string
ToUserName
{
get;
set;
}
///
<summary>
///
发送方帐号(一个OpenID)
///
</summary>
public
string
FromUserName
{
get;
set;
}
///
<summary>
///
消息创建时间
(整型)
///
</summary>
public
string
CreateTime
{
get;
set;
}
///
<summary>
///
消息类型
///
</summary>
public
MsgType
MsgType
{
get;
set;
}
public
virtual
void
ResponseNull()
{
Utils.ResponseWrite("");
}
public
virtual
void
ResText(EnterParam
param,
string
content)
{
StringBuilder
resxml
=
new
StringBuilder(string.Format("<xml><ToUserName><![CDATA[{0}]]></ToUserName><FromUserName><![CDATA[{1}]]></FromUserName><CreateTime>{2}</CreateTime>",
FromUserName,
ToUserName,
Utils.ConvertDateTimeInt(DateTime.Now)));
resxml.AppendFormat("<MsgType><![CDATA[text]]></MsgType><Content><![CDATA[{0}]]></Content><FuncFlag>0</FuncFlag></xml>",
content);
Response(param,
resxml.ToString());
}
///
<summary>
///
回复消息(音乐)
///
</summary>
public
void
ResMusic(EnterParam
param,
Music
mu)
{
StringBuilder
resxml
=
new
StringBuilder(string.Format("<xml><ToUserName><![CDATA[{0}]]></ToUserName><FromUserName><![CDATA[{1}]]></FromUserName><CreateTime>{2}</CreateTime>",FromUserName,ToUserName,
Utils.ConvertDateTimeInt(DateTime.Now)));
resxml.Append("
<MsgType><![CDATA[music]]></MsgType>");
resxml.AppendFormat("<Music><Title><![CDATA[{0}]]></Title><Description><![CDATA[{1}]]></Description>",
mu.Title,
mu.Description);
resxml.AppendFormat("<MusicUrl><![CDATA[http://{0}{1}]]></MusicUrl><HQMusicUrl><![CDATA[http://{2}{3}]]></HQMusicUrl></Music><FuncFlag>0</FuncFlag></xml>",
VqiRequest.GetCurrentFullHost(),
mu.MusicUrl,
VqiRequest.GetCurrentFullHost(),
mu.HQMusicUrl);
Response(param,
resxml.ToString());
}
public
void
ResVideo(EnterParam
param,
Video
v)
{
StringBuilder
resxml
=
new
StringBuilder(string.Format("<xml><ToUserName><![CDATA[{0}]]></ToUserName><FromUserName><![CDATA[{1}]]></FromUserName><CreateTime>{2}</CreateTime>",FromUserName,ToUserName,
Utils.ConvertDateTimeInt(DateTime.Now)));
resxml.Append("
<MsgType><![CDATA[video]]></MsgType>");
resxml.AppendFormat("<Video><MediaId><![CDATA[{0}]]></MediaId>",
v.media_id);
resxml.AppendFormat("<Title><![CDATA[{0}]]></Title>",
v.title);
resxml.AppendFormat("<Description><![CDATA[{0}]]></Description></Video></xml>",
v.description);
Response(param,
resxml.ToString());
}
///
<summary>
///
回复消息(图片)
///
</summary>
public
void
ResPicture(EnterParam
param,
Picture
pic,
string
domain)
{
StringBuilder
resxml
=
new
StringBuilder(string.Format("<xml><ToUserName><![CDATA[{0}]]></ToUserName><FromUserName><![CDATA[{1}]]></FromUserName><CreateTime>{2}</CreateTime>",FromUserName,ToUserName,
Utils.ConvertDateTimeInt(DateTime.Now)));
resxml.Append("
<MsgType><![CDATA[image]]></MsgType>");
resxml.AppendFormat("<PicUrl><![CDATA[{0}]]></PicUrl></xml>",
domain
+
pic.PictureUrl);
Response(param,
resxml.ToString());
}
///
<summary>
///
回复消息(图文列表)
///
</summary>
///
<param
name="param"></param>
///
<param
name="art"></param>
public
void
ResArticles(EnterParam
param,
List<Articles>
art)
{
StringBuilder
resxml
=
new
StringBuilder(string.Format("<xml><ToUserName><![CDATA[{0}]]></ToUserName><FromUserName><![CDATA[{1}]]></FromUserName><CreateTime>{2}</CreateTime>",FromUserName,ToUserName,
Utils.ConvertDateTimeInt(DateTime.Now)));
resxml.AppendFormat("<MsgType><![CDATA[news]]></MsgType><ArticleCount>{0}</ArticleCount><Articles>",
art.Count);
for
(int
i
=
0;
i
<
art.Count;
i++)
{
resxml.AppendFormat("<item><Title><![CDATA[{0}]]></Title>
<Description><![CDATA[{1}]]></Description>",
art[i].Title,
art[i].Description);
resxml.AppendFormat("<PicUrl><![CDATA[{0}]]></PicUrl><Url><![CDATA[{1}]]></Url></item>",
art[i].PicUrl.Contains("http://")
?
art[i].PicUrl
:
"http://"
+
VqiRequest.GetCurrentFullHost()
+
art[i].PicUrl,
art[i].Url.Contains("http://")
?
art[i].Url
:
"http://"
+
VqiRequest.GetCurrentFullHost()
+
art[i].Url);
}
resxml.Append("</Articles><FuncFlag>0</FuncFlag></xml>");
Response(param,
resxml.ToString());
}
///
<summary>
///
多客服转发
///
</summary>
///
<param
name="param"></param>
public
void
ResDKF(EnterParam
param)
{
StringBuilder
resxml
=
new
StringBuilder();
resxml.AppendFormat("<xml><ToUserName><![CDATA[{0}]]></ToUserName>",FromUserName);
resxml.AppendFormat("<FromUserName><![CDATA[{0}]]></FromUserName><CreateTime>{1}</CreateTime>",ToUserName,CreateTime);
resxml.AppendFormat("<MsgType><![CDATA[transfer_customer_service]]></MsgType></xml>");
Response(param,
resxml.ToString());
}
///
<summary>
///
多客服转发如果指定的客服没有接入能力(不在线、没有开启自动接入或者自动接入已满),该用户会一直等待指定客服有接入能力后才会被接入,而不会被其他客服接待。建议在指定客服时,先查询客服的接入能力指定到有能力接入的客服,保证客户能够及时得到服务。
///
</summary>
///
<param
name="param">用户发送的消息体</param>
///
<param
name="KfAccount">多客服账号</param>
public
void
ResDKF(EnterParam
param,
string
KfAccount)
{
StringBuilder
resxml
=
new
StringBuilder();
resxml.AppendFormat("<xml><ToUserName><![CDATA[{0}]]></ToUserName>",FromUserName);
resxml.AppendFormat("<FromUserName><![CDATA[{0}]]></FromUserName><CreateTime>{1}</CreateTime>",ToUserName,CreateTime);
resxml.AppendFormat("<MsgType><![CDATA[transfer_customer_service]]></MsgType><TransInfo><KfAccount>{0}</KfAccount></TransInfo></xml>",
KfAccount);
Response(param,
resxml.ToString());
}
private
void
Response(EnterParam
param,
string
data)
{
if
(param.IsAes)
{
var
wxcpt
=
new
MsgCrypt(param.token,
param.EncodingAESKey,
param.appid);
wxcpt.EncryptMsg(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 光电子开关项目投资可行性研究分析报告(2024-2030版)
- 2024年中国铜精矿行业调查报告
- 2025年中国聚氯乙烯异型材行业市场发展前景及发展趋势与投资战略研究报告
- 2022-2027年中国胡椒行业市场调研及未来发展趋势预测报告
- 吊兜项目投资可行性研究分析报告(2024-2030版)
- 2025年中国蟾蜍养殖行业市场调研分析及投资战略规划报告
- 中国锌矿石及锌冶炼行业市场发展前景及发展趋势与投资战略研究报告(2024-2030)
- 2025年中国保湿嫩颜乳行业市场发展前景及发展趋势与投资战略研究报告
- 2023-2028年中国数据处理活动行业市场发展现状及投资潜力预测报告
- 2025-2030年中国香薰油项目投资可行性研究分析报告
- FZT 73001-2016 袜子行业标准
- 管沟开挖回填专项施工方案
- 《集成光学课程简介》课件
- 新HSK一至六级词汇表
- 项目招商引资的供应商风险评估
- 2024年能源法律培训资料
- 企业反腐败与商业道德法律规范培训
- 2024年浙江广电集团招聘笔试参考题库含答案解析
- 提高压疮预防措施的落实率
- 抖音运营个人IP定位与打造
- 整形外科眉眼部手术技术操作规范2023版
评论
0/150
提交评论