用户
 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,登录网站

2017-6-12 10:15:05 小西瓜原创达人 小程序测评小组 楼主 10823
本帖最后由 小西瓜 于 2017-6-13 14:18 编辑

背景:由于微信提供的很多API并不适合在前端代码中请求,如SECRET等敏感信息,都是由后台向(微信)服务器发送的。所以需要nodejs的服务器向微信的服务器发起数据请求。


用 http.request() 的DEMO代码
[JavaScript] 纯文本查看 复制代码
var http = require('http');
const querystring = require('querystring');
const postData = querystring.stringify({
  'msg' : 'Hello World!'
});

const options = {
  hostname: 'api.weixin.qq.com',
  // port: 3000,
  path: '/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN',
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Content-Length': Buffer.byteLength(postData)
  }
};


const req = http.request(options, (res) => {
  console.log(`状态码: ${res.statusCode}`);
  console.log(`响应头: ${JSON.stringify(res.headers)}`);
  res.setEncoding('utf8');
  res.on('data', (chunk) => {
    console.log(`响应主体: ${chunk}`);
  });
  res.on('end', () => {
    console.log('响应中已无数据。');
  });
});

req.on('error', (e) => {
  console.error(`请求遇到问题: ${e.message}`);
});

// 写入数据到请求主体
req.write(postData);
req.end();


注意:
1.  Node.js getaddrinfo ENOTFOUND 问题。解决:hostname 不需要带 http , 只需要 api.weixin.qq.com 就行了
2.  需要 req.write(‘something’); req.end(); 否则 request 函数不执行...

关于更多node的http服务器与客户端,详情可参考文档
如有不对的地方,恳请指出。





评分

参与人数 1浮云 +10 收起 理由
天下雪 + 10 赞一个!

查看全部评分

钟情于风中凌乱
nodejs这样写了之后,在小程序中怎么访问请求啊
每个人的一生都会遇到一个人,她(他)打破你的原则,改变你的习惯,成为你的例外!
报了这样的错是怎么回事?,请求的url错误?这是照着你写的出现的,是不是你写的有些地方需要改一下
每个人的一生都会遇到一个人,她(他)打破你的原则,改变你的习惯,成为你的例外!
xiaozhu8023u 发表于 2017-6-12 14:48
报了这样的错是怎么回事?,请求的url错误?这是照着你写的出现的,是不是你写的有些地方需要改一下
...

请求遇到问题: connect ETIMEDOUT 203.205.147.177:80
每个人的一生都会遇到一个人,她(他)打破你的原则,改变你的习惯,成为你的例外!
xiaozhu8023u 发表于 2017-6-12 14:48
报了这样的错是怎么回事?,请求的url错误?这是照着你写的出现的,是不是你写的有些地方需要改一下
...

你好,代码中请求的URL确实是有问题的,如果能够打印消息 {"errcode":40001,"errmsg":"invalid credential, access_token is invalid or not latest hint: [pR2260256e626]"},证明请求是成功的,但是请求的数据是有误的。

[Bash shell] 纯文本查看 复制代码
node test_request.js
状态码: 200
响应头: {"connection":"close","content-type":"application/json; charset=UTF-8","
content-length":"108"}
响应主体: {"errcode":40001,"errmsg":"invalid credential, access_token is invalid
 or not latest hint: [pR2260256e626]"}
响应中已无数据。


1. 至于你提到的 请求遇到问题: connect ETIMEDOUT 203.205.147.177:80
请问是完全执行我上面的代码出现的报错吗?

2. 小程序中访问请求,是另外一个方式。该篇是写,做为后台向微信发起请求。如需要小程序发起请求,可以参考express路由实现服务器接收和响应数据
钟情于风中凌乱
小西瓜 发表于 2017-6-12 17:48
你好,代码中请求的URL确实是有问题的,如果能够打印消息 {"errcode":40001,"errmsg":"invalid credentia ...

完全是按你的代码测试的,一个字符都没变、
console.log(`状态码: ${res.statusCode}`);
console.log(`响应头: ${JSON.stringify(res.headers)}`);
这两个都没打印,直接就打印的报错 console.error(`请求遇到问题: ${e.message}`);
很明显是没请求http成功。而且每次都报这个错误,在网上查了一下说是请求根本没发送,
有说是网站设置代理受限制问题,不知道什么原因。
每个人的一生都会遇到一个人,她(他)打破你的原则,改变你的习惯,成为你的例外!
xiaozhu8023u 发表于 2017-6-13 10:07
完全是按你的代码测试的,一个字符都没变、
console.log(`状态码: ${res.statusCode}`);
console.log(`响 ...

会不会是nodejs环境问题?
钟情于风中凌乱
小西瓜 发表于 2017-6-12 17:48
你好,代码中请求的URL确实是有问题的,如果能够打印消息 {"errcode":40001,"errmsg":"invalid credentia ...

已经可以了,找到原因了,是因为我公司用的局域网访问外网要使用代理,之前我用的本地服务器,现在我使用阿里云服务器就没问题,如果请求openid应该怎么弄,我试着修改了一些好像获取不到,你看一下有没有错
[AppleScript] 纯文本查看 复制代码
var param ={
 	appid: 'wwwwwwwwwwwww',
  secret: '111111111111111111',
  js_code: '2222222222222222',
 }
const options = {
  hostname: 'api.weixin.qq.com',
  port: 80,
 path: '/sns/jscode2session?appid='+param.appid+'&secret='+param.secret+'&js_code='+param.js_code+'&grant_type=authorization_code',
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Content-Length': Buffer.byteLength(postData)
  }
};

得到的是这样的数据,拿不到openid,得到43003好像是微信认证失败,我的appid和秘钥和code都没错啊,在小程序上都可以拿到,不知道怎么会这样。
[AppleScript] 纯文本查看 复制代码
C:\Users>node wxopenid.js
状态码: 200
响应头: {"connection":"close","content-type":"text/plain","date":"Tue, 13 Jun 20
17 06:08:39 GMT","content-length":"77"}
响应主体: {"errcode":43003,"errmsg":"require https, hints: [ req_id: GpTlDA0119s
107 ]"}
响应中已无数据。
每个人的一生都会遇到一个人,她(他)打破你的原则,改变你的习惯,成为你的例外!
xiaozhu8023u 发表于 2017-6-13 14:25
已经可以了,找到原因了,是因为我公司用的局域网访问外网要使用代理,之前我用的本地服务器,现在我使用 ...

把 http 改为 https
var https = require('https');
用https.request 请求再试试看。
钟情于风中凌乱
小西瓜 发表于 2017-6-14 08:18
把 http 改为 https
var https = require('https');
用https.request 请求再试试看。

已解决,谢谢解答。第一次把http换成https的时候也是报了错的,错误码是40029,invalid code.
我查了一下才知道原来code每次获取都会不一样,我使用的是昨天获取过的code,可能后来又获取一次导致这个无效了,重新获取添加上试了之后就可以成功获取openid和session_key了。再次感谢!
每个人的一生都会遇到一个人,她(他)打破你的原则,改变你的习惯,成为你的例外!
2017-6-16 17:56:45 猜猜 架构狮
11#
我就是看看
发新帖
您需要登录后才可以回帖 登录 | 立即注册