您的位置:首页 > 移动开发 > 微信开发

7 串讲微信接口--素材、用户分组、私密信息、地理位置

2017-05-25 20:40 633 查看
  这一节将简单串讲一下常见的微信接口,仍然是以官方开发文档为基准:https://mp.weixin.qq.com/wiki

一 素材管理

  进入官方文档,我们可以在左侧菜单中看到素材管理:



  根据上图,我们可以整理一下学习思路:



  1、临时素材

  临时素材即临时性的多媒体素材,它有以下注意事项:

    a.临时素材media_id可复用;

    b.媒体文件在微信后台保存时间为3天,3天后media_id失效;

    c.上传临时素材的格式与大小限制:

素材种类大小格式长度
图片(image)2MPNG/JPEG/JPG/GIF
语音(voice)2MAMR/MP360s
视频(video)10MMP4
缩略图(thumb)64KBJPEG
    d.需使用https调用本接口。

  接口调用请求说明:

    http请求方式:POST/FORM,使用https

    https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE

    调用示例(使用curl命令,用FORM表单方式上传一个多媒体文件):

    curl -F media=@test.jpg "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE"

  新增临时素材代码示例:

  这里的代码还是接之前的课程进行添加和修改的哦~,打开wechat.js文件,先添加临时素材post的地址:

//增加url配置项
var prefix = 'https://api.weixin.qq.com/cgi-bin/';
var api = {
accessToken: prefix + 'token?grant_type=client_credential',
upload:prefix + 'media/upload?access_token=ACCESS_TOKEN&type=TYPE'
};


  还是在wechat.js文件中,在weChat()原型链上新增uploadMaterial方法,用于新增素材,这里用的是本地文件,所以记得先在wechat.js中引入fs模块:

var fs = require('fs');


  然后,新增uploadMaterial方法:

//在weChat的原型链上增加uploadMaterial方法 用来新增临时素材
weChat.prototype.uploadMaterial = function(type, filepath) {
var that = this;
//构造表单对象
var form = {
//使用fs模块的createReadStream创建文件读取流读取本地文件
media: fs.createReadStream(filepath)
};
return new Promise(function(resolve, reject) {
that
.fetchAccessToken()
.then(function(data) {
var url = api.upload + 'access_token=' + data.access_token + '&type=' + type;
//使用request发起请求
request({
method: 'POST',
url: url,
formData: form,
json: true
})
.then(function(response) {
var _data = response.body;
if (_data) {
resolve(_data);
} else {
throw new Error('Upload Material fail');
};

})
.catch(function(err) {
reject(err);
});
});
});
};


  上面用了fetchAccessToken()方法,但是在wechat.js中,没有这个方法,翻看之前的章节可以看到,我们把获取票据的方法写在了weChat()构造函数里,这样不利于维护,所以要把getAccessToken()方法放入fetchAccessToken()方法中,让获取票据的方法作为接口独立出来,然后再在构造函数里面调用,下面是处理后的代码:

//利用构造函数生成实例 完成票据存储逻辑
function weChat(opts) {
var that = this;
this.appID = opts.appID;
this.appSecret = opts.appSecret;
this.getAccessToken = opts.getAccessToken;
this.saveAccessToken = opts.saveAccessToken;
this.fetchAccessToken();
};

//在weChat的原型链上增加fecthAccessToken方法 让获取票据的方法作为接口独立出来
weChat.prototype.fetchAccessToken = function(data) {
var that = this;
//先对access_token进行判断 如果this.ccess_token && this.expires_in存在且在有效期内
if(this.access_token && this.expires_in){
if(this.isValidAccessToken(this)){
return Promise.resolve(this);
};
};
//获取票据的方法
this.getAccessToken()
.then(function(data) {
//从静态文件获取票据,JSON化数据,如果有异常,则尝试更新票据
try {
data = JSON.parse(data);
} catch (e) {
return that.updateAccessToken();
}
//判断票据是否在有效期内,如果合法,向下传递票据,如果不合法,更新票据
if (that.isValidAccessToken(data)) {
return Promise.resolve(data);
} else {
return that.updateAccessToken();
}
})
//将拿到的票据信息和有效期信息存储起来
.then(function(data) {
//console.log(data);打印AccessTokenData
that.access_token = data.access_token;
that.expires_in = data.expires_in;

that.saveAccessToken(data);
return Promise.resolve(data);
});
};


  新增临时素材的方法已经添加好了,现在我们来测试一下,打开weixin.js文件,先引入两个外部文件并初始化weChat()放入wechatApi变量中:

//引入外部文件
var config = require('./model/config');
var weChat = require('./model/wechat');
//初始化weChat 并传入配置信息
var wechatApi = new weChat(config.wechat);


  然后,添加测试内容,这里是一个本地图片素材:

//回复策略--新增临时素材测试
else if(content === '5'){
var data = yield wechatApi.uploadMaterial('image', __dirname + '/images/1.jpeg');
reply ={
type: 'image',
mediaId: data.media_id
};
}


  我在测试这部分的时候,遇到的两个问题,一个是本地图片的路径问题,nodejs的__dirname指的是当前文件所在目录的完整目录结构,所以在读取本地图片的时候,大家可以根据自己的需要来调整图片位置,另一个问题是reply中的mediaId,需要跟模板文件中对应,不要写错了:



  测试成功,在公众号输入5,则会回复代码中指定的本地图片。

  下面我们在测试一下增加临时素材--视频素材,在weixin.js文件中,继续添加回复策略6:

//回复策略--新增临时素材测试--视频素材
else if(content === '6'){
var data = yield wechatApi.uploadMaterial('video', __dirname + '/materials/1.mp4');
reply ={
type: 'video',
title: '成都',
description: '成都--赵雷',
mediaId: data.media_id
};
}


  测试的结果,输入6,回复一段视频内容。

  注意测试的时候,可能会返回「该公众号暂时无法提供服务,请稍候再试」,可能是视频文件大了,我开始的时候用了一个3.5M的,也没带起来,后来用了一个600多KB的,算是可以看到测试效果了。还有就是在设置回复策略的时候,reply里的内容,要根据官网文档中,不同类型区别设置哈。

  我们再回复一段音乐试试~:

//回复策略--新增临时素材测试--音频素材
else if(content === '7'){
var data = yield wechatApi.uploadMaterial('image', __dirname + '/materials/2.jpeg');
reply ={
type: 'music',
title: '半壶纱',
description: '歌手: 刘珂矣',
musicUrl: 'http://www.tingge123.com/mp3/2016-02-03/1454447473.mp3',
thumbMediaId: data.media_id
};
}


  测试结果没有问题哦,手机上可以播放~

  看看我们以上测试的截图:







  获取临时素材:https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID

  获取临时素材代码示例:在获取永久素材代码示例的部分哦,往下面找喽~

  2、永久素材

  对于常用的素材,开发者可通过本接口上传到微信服务器,永久使用。新增的永久素材也可以在公众平台官网素材管理模块中查询管理。

  注意事项:

      a.永久图片素材新增后,将带有URL返回给开发者,开发者可以在腾讯系域名内使用(腾讯系域名外将被屏蔽掉);

      b.数量上限:图文消息素材、图片素材上限为5000,其他类型为1000;

      c.素材格式与大小:

素材种类大小格式长度
图片(image)2MBMP/PNG/JPEG/JPG/GIF
语音(voice)2MAMR/MP3/WMA/WAV60s
视频(video)10MMP4
缩略图(thumb)64KBJPG
      d.图文消息的具体内容中,微信后台将过滤外部的图片链接,图片URL需通过『上传图文消息内的图片获取URL』接口上传图片获取;

      e.『上传图文消息内的图片获取URL』接口所上传的图片,不占用5000个的数量限制,但仅支持JPG/PNG格式,大小要小于1M;

      f.图文消息支持正文中插入自己账号和其他公众号已群发文章链接的能力;

      g.调用该接口需https协议。

  新增永久素材接口调用请求说明:

    新增永久图文素材:https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=ACCESS_TOKEN

    上传图文消息内的图片获取URL:https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN

    新增其他类型永久素材:https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN&type=TYPE

  新增永久素材代码示例:

  咱们接着之前临时素材的代码接着写,打开wechat.js文件,因为之前URL的API没有区分临时素材和永久素材,我们先来调整一下:

//增加url配置项
var prefix = 'https://api.weixin.qq.com/cgi-bin/';
var api = {
accessToken: prefix + 'token?grant_type=client_credential',
temporary:{
upload: prefix + 'media/upload?'
},
permanent:{
upload: prefix + 'material/add_material?',
uploadNews: prefix + 'material/add_news?',
uploadNewsPic: prefix + 'media/uploadimg?'
}
};


  然后来修改新增素材的方法uploadMaterial(),相对与之前新增临时素材时,给新增素材方法添加一个permanent参数,用来操作永久素材:

//在weChat的原型链上增加uploadMaterial方法 用来新增素材
weChat.prototype.uploadMaterial = function(type, material, permanent) {
var that = this;
//创建空对象
var form = {};
//默认新增临时素材
var uploadUrl = api.temporary.upload;
//对permanent参数进行判断 如果传入permanent参数 则新增永久素材
if(permanent){
uploadUrl = api.permanent.upload;
//让form兼容所有的上传类型
_.extend(form, permanent);
}
//判断上传类型 指定对应的uploadUrl material如果是图文的时候传进来的是一个数组 如果是图片或视频的话 传进来的是一个路径
if(type === 'pic'){
uploadUrl = api.permanent.uploadNewsPic;
};
if(type === 'news'){
uploadUrl = api.permanent.uploadNews;
form = material;
}else{
form.media = fs.createReadStream(material);
};
return new Promise(function(resolve, reject) {
that
.fetchAccessToken()
.then(function(data) {
var url = uploadUrl + 'access_token=' + data.access_token;
//进行判断 如果不是永久素材 则上传临时素材
if(!permanent){
url += '&type=' + type;
}else{
form.access_token = data.access_token;
}
//定义上传的参数
var options = {
method: 'POST',
url: url,
json: true
};
//素材类型不同 上传方式不同
if(type === 'news'){
options.body = form;
}else{
options.formData = form;
}
//使用request发起请求
request({
method: 'POST',
url: url,
formData: form,
json: true
})
.then(function(response) {
var _data = response.body;
if (_data) {
resolve(_data);
} else {
throw new Error('Upload Material fail');
};

})
.catch(function(err) {
reject(err);
});
});
});
};


  _.extend(form, permanent)需要使用lodash库,要安装并引入哦~

var _ = require('lodash');


  即便我们实现了永久素材的接口,新增永久素材的逻辑也不是每次都能跑通的,因为未经认证的订阅号并不支持永久素材上传,而用来测试的公众帐号上传也并不总是能成功,如果没跑通,也并不用纠结,可以继续向下进行。

  现在,我们可以测试一下新增永久素材,打开weixin.js文件,添加测试信息:

//回复策略--新增永久素材测试--图片素材
else if (content === '8') {
var data = yield wechatApi.uploadMaterial('image', __dirname + '/materials/2.jpeg', { type: 'image' });
reply = {
type: 'image',
mediaId: data.media_id
};
}
//回复策略--新增永久素材测试--视频素材
else if (content === '9') {
var data = yield wechatApi.uploadMaterial('video', __dirname + '/materials/1.mp4', { type: 'video', description: '{"title":"test title","introduction":"test introduction"}' });
console.log(data);
reply = {
type: 'video',
title: '成都',
description: '成都--赵雷',
mediaId: data.media_id
};
}


  我这里测试成功了哦~



  获取素材--获取临时素材和永久素材  

  获取永久素材调用接口:https://api.weixin.qq.com/cgi-bin/material/get_material?access_token=ACCESS_TOKEN

  获取素材代码示例:

  打开wechat.js文件,先给URL配置项添加获取素材(临时/永久)的api配置项:

//增加url配置项
var prefix = 'https://api.weixin.qq.com/cgi-bin/';
var api = {
accessToken: prefix + 'token?grant_type=client_credential',
temporary:{
upload: prefix + 'media/upload?',
fetch: prefix + 'media/get?'
},
permanent:{
upload: prefix + 'material/add_material?',
uploadNews: prefix + 'material/add_news?',
uploadNewsPic: prefix + 'media/uploadimg?',
fetch: prefix + 'material/get_material?'
}
};


  还是在wechat.js文件中,在weChat的原型链上增加fetchMaterial方法,用来获取素材:

//在weChat的原型链上增加fetchMaterial方法 用来获取素材
weChat.prototype.fetchMaterial = function(mediaId, type, permanent) {
var that = this;//默认获取临时素材
var fetchUrl = api.temporary.fetch;
//对permanent参数进行判断 如果传入permanent参数 则获取永久素材
if(permanent){
fetchUrl = api.permanent.fetch;
};
return new Promise(function(resolve, reject) {
that
.fetchAccessToken()
.then(function(data) {
var url = fetchUrl + 'access_token=' + data.access_token + '&media_id=' + mediaId;
//进行判断 如果不是永久素材和视频 替换http协议
if(!permanent && type === 'video'){
url = url.replace('https://','http://');
};
//返回url
resolve(url);
});
});
};


  删除永久素材:https://api.weixin.qq.com/cgi-bin/material/del_material?access_token=ACCESS_TOKEN

  删除永久素材代码示例:

  打开wechat.js文件,先给URL配置项添加删除永久素材的api配置项:

permanent:{
upload: prefix + 'material/add_material?',
uploadNews: prefix + 'material/add_news?',
uploadNewsPic: prefix + 'media/uploadimg?',
fetch: prefix + 'material/get_material?',
del: prefix + 'material/del_material?'
}


  还是在wechat.js文件中,在weChat的原型链上增加deleteMaterial方法,用来删除永久素材:  

//在weChat的原型链上增加deleteMaterial方法 用来删除永久素材
weChat.prototype.deleteMaterial = function(mediaId) {
var that = this;
//创建form对象
var form = {
media_id: mediaId;
};
return new Promise(function(resolve, reject) {
that
.fetchAccessToken()
.then(function(data) {
var url = api.permanent.del + 'access_token=' + data.access_token + '&media_id=' + mediaId;
//使用request发起请求
request({
method: 'POST',
url: url,
body: form,
json: true
})
.then(function(response) {
var _data = response.body;
if (_data) {
resolve(_data);
} else {
throw new Error('Delete Material fail');
};

})
.catch(function(err) {
reject(err);
});
});
});
};


  修改永久图片素材:ttps://api.weixin.qq.com/cgi-bin/material/update_news?access_token=ACCESS_TOKEN

  修改永久图片素材代码示例:

  打开wechat.js文件,先给URL配置项添加修改永久素材的api配置项:

permanent: {
upload: prefix + 'material/add_material?',
uploadNews: prefix + 'material/add_news?',
uploadNewsPic: prefix + 'media/uploadimg?',
fetch: prefix + 'material/get_material?',
del: prefix + 'material/del_material?',
update: prefix + 'material/update_news?'
}


  在wechat.js文件中,在weChat的原型链上增加updateMaterial方法,用来修改永久素材:

//在weChat的原型链上增加updateMaterial方法 用来修改永久素材
weChat.prototype.updateMaterial = function(mediaId, news) {
var that = this;
//创建form对象
var form = {
media_id: mediaId;
};
//让form继承传进来的news
_.extend(form, news);
return new Promise(function(resolve, reject) {
that
.fetchAccessToken()
.then(function(data) {
var url = api.permanent.update + 'access_token=' + data.access_token + '&media_id=' + mediaId;
//使用request发起请求
request({
method: 'POST',
url: url,
body: form,
json: true
})
.then(function(response) {
var _data = response.body;
if (_data) {
resolve(_data);
} else {
throw new Error('Delete Material fail');
};

})
.catch(function(err) {
reject(err);
});
});
});
};


  

三 用户分组

四 获取用户私密信息

五 地理位置
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: