微信支付开发小结

这段时间在忙于微商城项目,在我负责的商城结算模块用到了微信公众号支付,所以便把过程中的一些实践和问题整理了下来!

1.微信支付环境准备

当然,这里的支付准备默认前提是你已经申请了微信公众平台等相关信息。

a.确保微信支付功能开通,可以前往对应的公众号平台查看;
Markdown

b.在公众号的微信支付页面设置支付授权目录;
Markdown

c.前往对应的商户平台设置支付密钥和授权目录,并下载相应的证书文件;
Markdown

Read More

记录下http的缓存策略

相信很多做过前端或者后台性能优化的童鞋对http缓存机制都有过了解,今天准备复习下这部分的知识。

首先开篇有两个问题抛出,即是,1.什么时候客户端需要使用缓存?2.使用缓存的规则是什么?

第一个问题,客户端请求一个文件,服务器返回的响应头会有两种方式可以判断,首先是cache-control属性值,它除了no-store之外,浏览器都会缓存文件数据,供下次使用。

Read More

踩中文的坑

如标题所示,这次笔记一个工作中遇到的小坑,虽说小却楞是花了我几大小时的时间。当时的背景是这样的,我需要在客户端这边发送一个http的POST请求,然后服务器根据请求执行相应的db操作。代码类似下面这样子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
var http = require('http');

var bookBody = {
"title": "黑客与画家",
"price":9.89
}

var bookBodyString = JSON.stringify(bookBody);
var options = {
host: 'localhost',
port:'3000',
path: '/books',
method: 'POST',
headers: {
'Accept': '/',
'Content-Type':'application/json',
'Content-Length': bookBodyString.length
}
};

var req = http.request(options, function(res) {
res.setEncoding('utf8');
res.on('data', function(data) {
console.log(data);
});

res.on('err',function(data){
console.log(data);
});
});


req.write(bookBodyString);
req.end();`

结果代码执行过后,对方的服务器给挂掉了,当然我这边也就没有响应到正确的数据,服务器报出了语法的错,类似‘无法解析的结尾’。当时我就在想,这部分的请求代码是我直接拷过来的(话说直接拷代码是非常‘危险’的动作),拷的这部分代码在之前是成功执行的,只是我这边稍微改了一下,难不成是因为这次改动的原因,然后我回滚代码,让它几乎保持了与拷贝之前一致性,接着再执行,晕~依然崩溃。仔细对比了代码,发现剩下不同的就只有新的代码里面消息体包含了中文。于是换成英文再执行,OK。那依这样看是不是就是该服务端的问题呢,即对方在接收数据时没有做正确的处理,或者没有做中文编码之类的处理。于是,我把这个问题反馈给了作者,这篇的6楼是我的反馈记录。大家可以看看。

那从上面的链接我们可以牢记一个点是,在请求的头部,content-length它表示的是所在消息体的字节数而不是字符个数,明白这个道理的话就释然了

PM2的学习记录

最近项目上线,准备上pm2,一个带有负载均衡功能的Node应用的进程管理器。抛弃forever了,哈哈。

主要特性:

  1. 内建负载均衡(使用Node cluster 集群模块)
  2. 后台运行
  3. 0秒停机重载,我理解大概意思是维护升级的时候不需要停机.
  4. 具有Ubuntu和CentOS 的启动脚本
  5. 停止不稳定的进程(避免无限循环
  6. 控制台检测
  7. 提供 HTTP API
  8. 远程控制和实时的接口API ( Nodejs 模块,允许和PM2进程管理器交互 )

下面是有用的命令:

npm install pm2 -g # 命令行安装 pm2
pm2 start app.js -i 4 #后台运行pm2,启动4个app.js
pm2 start app.js –name my-api # 命名进程
pm2 list # 显示所有进程状态
pm2 show 0 # 显示某个id的进程状态
pm2 monit # 监视所有进程
pm2 logs # 显示所有进程日志
pm2 stop all # 停止所有进程
pm2 restart all # 重启所有进程
pm2 reload all # 0秒停机重载进程 (用于 NETWORKED 进程)
pm2 stop 0 # 停止指定的进程
pm2 restart 0 # 重启指定的进程
pm2 startup # 产生 init 脚本 保持进程活着
pm2 web # 运行健壮的 computer API endpoint
pm2 delete 0 # 杀死指定的进程
pm2 delete all # 杀死全部进程

运行进程的不同方式:

Read More