小新支付系统 使用Java开发,RPC服务使用Dubbo,可分布式部署。前期业务量小或对系统可用性要求不是很高,可单点部署,后期随着业务量增长,再通过横向扩展进行分布式部署。
云服务器
推荐购买阿里云服务器(或腾讯云、华为云),建议不低于以下配置:
操作系统 | CPU | 内存 | 带宽 | 硬盘 | 开放端口 |
---|---|---|---|---|---|
Linux CentOS 7.X | 4核 | 8G | 5M(或弹性) | 40G | 80、443、22 |
安装软件
系统服务端使用Java开发,部署时需要提前安装好以下软件:
软件 | 版本 | 说明 |
---|---|---|
JDK | 1.8 | Java运行依赖环境 |
ActiveMQ | 5.15.8 | 消息中间件 |
Redis | 3.2.8 | 缓存使用 |
Zookeeper | 3.4.6 | 服务注册中心 |
MySQL | 5.7.X | 数据库,推荐使用阿里云RDS数据库 |
Nginx | 1.14.1 | 负载均衡、反向代理 |
以上软件除jdk和mysql外,其他软件可安装更高级版本。
初始化数据
连接Mysql,创建数据库:xxpaydb,创建用户:xxpay,并为该用户赋权限。
执行sql目录下的inti.sql、code.sql、code_ysf.sql文件,完成表结构创建及初始化数据。
配置文件
编译前需配置文件profiles/commons-{env}-filter.properties
{env}说明:
dev :开发环境, 一般用于本地启动项目时的配置信息;
test:测试环境, 一般用于测试环境中的配置信息;
prod:生产环境, 一般用于生产正式环境下的配置信息;
env配置在 pom.xml文件下 profiles -> profile 节点, 默认设置的dev为默认节点
。
在使用maven编译时,通过命令 $ mvn package -Ptest
进行切换。
配置文件内容全量如下,按照注释内容修改为自己真实环境的配置即可。
### dubbo服务的zookeeper地址
zookeeper.url=zookeeper://127.0.0.1:2181
### activemq地址
activemq.url=failover:(tcp://127.0.0.1:61616?wireFormat.maxInactivityDuration=0)
### 数据库连接配置 主 / 从 (密码已加密, 加密函数详见 DBPasswordUtil.class)
master.datasource.url=jdbc:mysql://192.168.0.118:3306/xxpay4newdb?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8
master.datasource.username=j1090pKt56TbS/OCkEzH4I2wA==
master.datasource.password=j1090pKt56TbS/OCkEzH4I2wA==
slave.datasource.url=jdbc:mysql://192.168.0.118:3306/xxpay4newdb?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8
slave.datasource.username=j1090pKt56TbS/OCkEzH4I2wA==
slave.datasource.password=j1090pKt56TbS/OCkEzH4I2wA==
### redis服务配置
redis.ip=127.0.0.1
redis.port=6379
redis.pass=xxpayvip
### 运营系统地址
mgr.site.url=http://mgr.f.xxpay.org
### 代理商系统地址
agent.site.url=http://agent.f.xxpay.org
### 商户系统地址
mch.site.url=http://mch.f.xxpay.org
### 服务商系统地址
isv.site.url=http://isv.f.xxpay.org
### 会员系统地址
mbr.site.url=http://mbr.f.xxpay.org
### 支付网关地址
pay.site.url=http://pay.f.xxpay.org
### 对账系统地址
reconciliation.site.url=http://task.f.xxpay.org
### 多个项目统一获取微信openId地址, 默认为当前服务商系统的get-weixin-code.html, 请在微信侧配置该域名权限即可
wx.auth2code.url=@isv.site.url@/get-weixin-code.html
## 上传文件主文件夹
upload.root.dir=/home/xxpay/upload
### 账单跟路径
bill.root.path=/home/xxpay/bill/
### 接口demo 文件路径
download.demo.path=/home/xxpay/demo.zip
### 服务商证书路径(不可匿名访问)
upload.isv.cert.root.dir=@upload.root.dir@/isv/cert
## 商户上传文件路径(静态资源, 可匿名访问)
upload.mch.static.dir=@upload.root.dir@/mch/static
## 商户静态资源图片预览URL(对应上述地址路径)
upload.mch.static.view.url=@mch.site.url@/imgs/
## app更新包的存储目录
upload.app.update.dir=@upload.root.dir@/update
## 小程序体验版二维码存储路径
mini.experience.qrcode.dir=@upload.root.dir@/miniExperience/qrcode/
### 支付补单任务开关
task.reissue.pay.switch=true
### 支付补单任务IP
task.reissue.pay.ip=127.0.0.1
### 转账补单任务开关
task.reissue.trans.switch=true
### 转账补单任务IP
task.reissue.trans.ip=127.0.0.1
### 代付补单任务开关
task.reissue.agentpay.switch=true
### 代付补单任务IP
task.reissue.agentpay.ip=127.0.0.1
## logger日志文件root path
logger.root.path=./logs
编译部署
项目使用maven编译构建,可通过本地开发工具(建议Idea)或Jenkins完成项目的编译打包,打包后会在target目录下生成一个.tar.gz结尾的文件(如 xxpay-isv-bin.tar.gz),将文件上传至服务器,然后执行bin目录下的启动脚本即可。以下为最佳实践,仅供参考。
在服务器创建用户xxpay,然后在/home/xxpay下创建service目录。将编译后的:
xxpay-manage-bin.tar.gz
xxpay-isv-bin.tar.gz
xxpay-agent-bin.tar.gz
xxpay-merchant-bin.tar.gz
xxpay-member-bin.tar.gz
xxpay-pay-bin.tar.gz
xxpay-task-bin.tar.gz
上传至service目录下,解压后分别执行项目下的启动脚本,如xxpay-manage的启动命令:cd /home/xxpay/xxpay-manage/bin
sh ./app.sh start
其他模块参考启动即可,启动后项目可通过IP+端口形式访问(云服务器需开通端口号才可以访问)。
域名配置
项目需要域名访问,需要将域名做解析到服务器公网IP,一般需解析如下域名(如域名为: xxpay.vip):
mgr.xxpay.vip,isv.xxpay.vip,agent.xxpay.vip,mch.xxpay.vip,mbr.xxpay.vip,pay.xxpay.vip,task.xxpay.vip
在Nginx中做好域名绑定,如果https访问,可申请域名ssl证书,在nginx中配置即可。
以pay项目为例,下面是nginx的配置,包括ssl配置,仅供参考
upstream xxpay_pay {
server 127.0.0.1:8201 weight=1 max_fails=2 fail_timeout=30s;
}
server {
listen 80;
server_name pay.xxpay.vip;
location / {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://xxpay_pay;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 443 ssl http2;
server_name pay.sifangzhifu.com;
ssl_certificate /www/server/panel/vhost/ssl/xxpay.vip/pay.xxpay.vip.pem; #指定服务器证书路径
ssl_certificate_key /www/server/panel/vhost/ssl/xxpay.vip/pay.xxpay.vip.key; #指定私钥证书路径
ssl_session_timeout 30m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #指定SSL服务器端支持的协议版本
ssl_ciphers HIGH:!aNULL:!MD5; #指定加密算法
ssl_prefer_server_ciphers on; #在使用SSLv3和TLS协议时指定服务器的加密算法要优先于客户端的加密算法
location / {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_pass http://xxpay_pay;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}