电动回复,自动复苏种种新闻

作者: 韦德国际1946国际网址  发布:2019-06-17

上一篇小说:nodejs微信公众号支付(1)接入微信公众号,本篇作品将要此基础上落到实处简单的苏醒功用。

上一篇小说:nodejs微信公众号支付——3.封装新闻响应模块,完结了对消息接口的模块化处理,方便前期的应用,本篇小说将介绍微信公众号回复各类音信的作用完毕,包涵文件、图片、语音、录制、音乐、图像和文字等。

那边就啰嗦什么了, 直接上代码

接通微信公众号是支付的首先步,万事开端难,走好第一步,后边的路就更加宽泛。

1. 过渡代码的优化

:感到最近localtunnel很不稳固,测试起来相比较费心,有标准的和煦搞个云服务器吧,小编相比偷懒,几接续运用localtunnel了。

/**

1.群众平台测试帐号的行使

从前大家大致惨酷的兑现了微信公众号的连接,接入的代码直接写在了app.js文本之中,从品种开垦的角度来说,不便于日后代码的保卫安全,所以将这一部分代码独立出来,根据koa的品格,写成叁个中间件。

1. 消沉回复用户音讯

* wechat php test

电动回复,自动复苏种种新闻。登录微信公众平台,由于广大开荒人士并不曾证实的的微信公众号,所以比较折中的格局是选用公众平台测试帐号来测试功用,其优势是能力所能达到测试微信公众号的多方面作用,不受认证门槛的限量。

在根目录下新建wechat文件夹,新建generator.js文件,

当用户发送音讯给公众号时(或有些特定的用户操作引发的事件推送时),会时有发生一个POST请求,开垦者能够在响应包(Get)中回到特定XML结构,来对该音讯实行响应(现协助恢复生机文本、图片、图像和文字、语音、录制、音乐)。发送被动响应新闻是对微信服务器发过来新闻的一遍苏醒。

*/

图片 1

var sha1 = require('sha1');

module.exports = function(opts){
  return function *(next){
    var token = opts.token;
    var signature = this.query.signature;
    var nonce = this.query.nonce;
    var timestamp = this.query.timestamp;
    var echostr = this.query.echostr;
    var str = [token,timestamp,nonce].sort().join('');
    var sha = sha1(str);
    this.body = (sha === signature) ? echostr   '' : 'failed';
  };
}

开荒进度中一经蒙受该公众号暂时无法提供服务,请稍后再试的意况,一般是由多个原因导致的:

//define your token

进去测试账号管理分界面:

此时app.js的故事情节产生:

  1. 开采者在5秒内未回复任何内容
  2. 开垦者回复的多少充足,非xml格式,比如JSON数据

define("TOKEN","weixin");

大家供给安排接口的音信,URLToken是微信公众平台和当地开采服务建设构造连接的大桥。

'use strict'

var Koa = require('koa');
var wechat = require('./wechat/generator');

var config = {
  wechat:{
    appID:'...',
    appSecret:'...',
    token:'...'
  }
};

var app = new Koa();
app.use(wechat(config.wechat));
app.listen(8080);
console.log('Listening 8080...')

具体的新闻规则可参照他事他说加以调查微信平台开辟者文书档案:消极回复用户音信

$wechatObj=newwechatCallbackapiTest();

图片 2

2. 获取access_token

2. 回涨音讯的兑现

$wechatObj->responseMsg();

微信配置好后,扫面下方的测试号二维码,即能够在手提式有线电话机上测试开采的效益。

access_token是付出顺序与wexin公众平台相互的一把钥匙,调用绝超越58%接口都亟需运用access_token

咱俩前边的关心活动苏醒是在weixin.js里头达成的,其余的音信回复也写在那么些文件之中:

classwechatCallbackapiTest

图片 3

access_token的特点:

if(message.MsgType === 'event'){
  if(message.Event === 'subscribe'){
    if(message.EventKey) {
      console.log('扫描二维码关注:'  message.EventKey  ' '  message.ticket);
    }
    this.body = '终于等到你,还好我没放弃';
  }else if(message.Event === 'unsubscribe'){
    this.body = '';
    console.log(message.FromUserName   ' 悄悄地走了...');
  }else if(message.Event === 'LOCATION'){
    this.body = '您上报的地理位置是:'  message.Latitude   ','   message.Longitude;
  }else if(message.Event === 'CLICK'){
    this.body = '您点击了菜单:'  message.EventKey;
  }else if(message.Event === 'SCAN'){
    this.body = '关注后扫描二维码:'  message.Ticket;
  }
}
else if(message.MsgType === 'text'){
  var content = message.Content;
  var reply = '你说的话:“'   content   '”,我听不懂呀';
  if(content === '1'){
    reply = '金刚:骷髅岛';
  }
  else if(content === '2'){
    reply = {
      type:'image',
      mediaId:'http://tu.23juqing.com/d/file/html/gndy/dyzz/2017-04-09/da9c7a64ab7df196d08b4b327ef248f2.jpg'
    }
  }
  else if(content === '3'){
    reply = [{
      title:'金刚.骷髅岛',
      description:'南太平洋上的神秘岛屿——骷髅岛。史上最大金刚与邪恶骷髅蜥蜴的较量。',
      picUrl:'http://tu.23juqing.com/d/file/html/gndy/dyzz/2017-04-09/da9c7a64ab7df196d08b4b327ef248f2.jpg',
      url:'http://www.piaohua.com/html/dongzuo/2017/0409/31921.html' //可下载观看喔
    }];
  }

  // ... 其他回复类型

  this.body = reply;
}

{

2.认证公众号

  1. 有效期为2钟头(7200s),过期自动失效,须求再行获得;
  2. 假定更新了access_token,之前的access_token自动失效;

测试效果如图:

public functionvalid()

图片 4

缓和方案:

图片 5

{

一图胜千言。接入公众号时,微信公众平台必要表达开拓者的地位,向开垦者填写的U福特ExplorerL发送一个GET请求,请求中带有4个参数:signatureechostrtimestampnonce,收到该请求,我们必要做的事情:

  1. 系统每隔2钟头活动去获取一下access_token的值,确保access_token始终是实惠的;
  2. 为了有利于频仍调用,将access_token存款和储蓄在唯一的八个地点(数据库、文件等),全体子系统都能访问。

3.说明:

$echoStr=$_GET["echostr"];

  1. tokentimestampnonce四个参数进行字典排序;
  2. 将八个字符串拼接成二个字符串举行sha1加密;
  3. 将加密后的字符串与signature拓展比较,假若一样,表示那么些请求来自微信,我们直接原样重回echostr的从头到尾的经过,接入验证成功。

先后中动用构造函数的艺术,在更改实例,实现早先化职业的的进度中,读取存款和储蓄在config/wechat.txt文本中的票据,判定是还是不是为空且是或不是过期,选拔性的再次获得数字还要保留在原来的文章件里面,关于获取access_token的官方文书档案介绍可见:获取access_token。

开采输入数字2并从未恢复生机相应的图纸,是或不是很意外?大家查阅一下文书档案:

//valid signature , option

3.搭建支付服务器

function Wechat(opts){   //构造函数,用以生成实例,完成初始化工作,读写票据
  var that = this;
  this.appID = opts.appID;
  this.appSecret = opts.appSecret;
  this.getAccessToken = opts.getAccessToken;
  this.saveAccessToken = opts.saveAccessToken;

  this.getAccessToken().then(function(data){
    try{
      data = JSON.parse(data);
    }catch(e){
      return that.updateAccessToken();
    }
    if(that.isvalidAccessToken(data)){
      Promise.resolve(data);
    }else{
      return that.updateAccessToken();
    }
  }).then(function(data){
    that.access_token = data.access_token;
    that.expires_in = data.expires_in;
    that.saveAccessToken(JSON.stringify(data));
  });
}

图片 6

if($this->checkSignature()){

搭建开辟服务器的秘技有许多,如购买云服务器、使用花生壳、ngrok、localtunnel等。这里为了简单起见选取localtunnel。先全局方式安装localtunnel,

我们在moudle.exports中实例化四个Wechat

文书档案中验证了MediaId属性是透过素材管理接口上传多媒体文件,获得的id,而不是我们一贯给的网络海教室片的url链接。在图像和文字音讯中,是能够一贯运用url链接的。所以我们下一步的劳作正是完结素材管理的接口。

echo$echoStr;

npm install -g lt
var wechat = new Wechat(opts);

上述正是本文的全体内容,希望对大家的读书抱有扶助,也盼望我们多多帮忙脚本之家。

exit;

启动lt

这么保障了历次程序运营都会取得对access_token的卓有成效举办考查,并且每个一段时间会自行获取二个新的access_token。

你大概感兴趣的稿子:

  • NodeJS达成微信公众号关怀后活动回复功用
  • 详解nodejs微信公众号支付——6.自定蒿子杆单
  • 详解nodejs微信公众号支付——5.素材管理接口
  • 详解nodejs微信公众号支付——3.封装新闻响应模块
  • 详解nodejs微信公众号支付——2.机关恢复生机
  • 详解nodejs微信公众号支付——1.接入微信公众号
  • nodejs微信公众号支付开辟
  • 利用NodeJs 开垦微信公众号(三)微信事件交互实例
  • 运用Nodejs开垦微信公众号后台服务实例
  • 详解NodeJs开辟微信公众号

}

lt --port 8080  //对外暴露8080端口,可端口号可自己随便设定

3. 管理微信新闻的步调

}

4.编纂代码

甭管事件推送照旧音讯推送,微信服务器都以以post的方法发送请求,推送的数据类型不是json而是xml,管理推送新闻一般分为多少个步骤:

public functionresponseMsg()

好了,未来初始编写app.js的代码:

  1. 拍卖POST类型的调整逻辑,接收xml数据包;
  2. 剖析数据包,获取数据包的新闻类型或数据类型;
  3. 拼装自定义的新闻;
  4. 包装成xml格式;
  5. 在5分钟内再次回到音信。

{

'use strict'

var Koa = require('koa');
var sha1 = require('sha1');

var config = {
  wechat:{
    appID:'...', //填写你自己的appID
    appSecret:'...', //填写你自己的appSecret
    token:'...' //填写你自己的token
  }
};

var app = new Koa();

app.use(function *(next){
  var token = config.wechat.token;
  var signature = this.query.signature;
  var nonce = this.query.nonce;
  var timestamp = this.query.timestamp;
  var echostr = this.query.echostr;
  var str = [token,timestamp,nonce].sort().join(''); //按字典排序,拼接字符串
  var sha = sha1(str); //加密
  this.body = (sha === signature)? echostr   '' : 'failed'; //比较并返回结果
});
app.listen(8080);

3.1 接收xml数据

//get post data, May be due to the different environments

5.配备测试公众号新闻

本文由韦德国际1946发布于韦德国际1946国际网址,转载请注明出处:电动回复,自动复苏种种新闻

关键词: 1946bv1946

上一篇:0脚手架的webpack,配置文件分析
下一篇:没有了