golang的gin框架开发微信小程序后端,使用到微信支付功能。微信支付的回调调试一般都在服务器进行,但是折腾了一下,于是就有了以下记录。
具备的条件:
1.有一个all in one小主机,上面安装了pve虚拟机,虚拟机里安装了openwrt(路由器),ubuntu用来安装数据库、redis、nginx(用来部署ssl证书,反向代理到开发机的小程序后端)
2.路由器拨号能获取ipv4或ipv6公网ip
3.有一个域名,能申请ssl证书
4.路由器可以设置端口转发
记录开始:
1.设置域名解析
网上查找教程《保姆教程 OpenWrt 配置 Cloudflare DDNS》
a.openwrt 中的ddns要有Cloudflare.com-v4,没有的话请参照教程,或自己编译固件
b.去cf申请API key ,参照上面的教程
c.openwrt路由中的DDNS配置,也可配置ipv6的。
重点:如果使用的是api token,注意:用户名必须是:Bearer
2.申请ssl证书,并将域名解析配置到cf
去域名的控制台申请ssl免费证书,一般为一年有效期.我的域名是在阿里买的,dns解析配置到了cf,参考cloudflare解析域名+CDN(以阿里云为例)+宝塔 - CodeAntenna
3.nginx反向代理
all in one小主机内的ubuntu安装nginx,反向代理到开发机的8010端口
安装nginx
sudo apt update
sudo apt install nginx
新建站点配置文件
nano /etc/nginx/conf.d/pc.conf
文件内容
#设定实际的服务器列表
upstream pc_server{
server 192.168.2.212:8010; #开发机地:端口
}
server {
listen 443 ssl;
server_name 123456.123456.xyz; #你能配置解析的域名
# ssl证书配置
ssl_certificate /etc/nginx/cert/123456.123456.xyz.pem;
ssl_certificate_key /etc/nginx/cert/123456.123456.xyz.key;
gzip off;
# ssl验证相关配置
ssl_session_timeout 5m; #缓存有效期
ssl_session_cache shared:SSL:10m; #置存储session参数的缓存的类型和大小
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #加密算法
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #安全链接可选的加密协议
ssl_prefer_server_ciphers on; #使用服务器端的首选算法
#编码格式
charset utf-8;
#代理配置
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#对应最上边的pc_server
proxy_pass http://pc_server;
}
}
配置文件中123456.123456.xyz.pem和123456.123456.xyz.key是我在阿里申请的ssl证书
192.168.2.212:8010是我的开发机地址和小程序后端端口
测试配置
nginx -t
重载配置
nginx -s reload
这样配置就用ubuntu的443端口反向代理了192.168.2.212开发机的8010端口
4.openwrt路由器端口转发:网络->防火墙->端口转发
内部ip是ubuntu的ip地址,如果外部端口443被运营商封了,可以设置其他端口,但是远程访问时就需带端口访问
如,设置为8010,则微信支付回调地址为 https://123456.123456.xyz:8010/回调路径
浏览器外网访问效果:
goland控制台
整个流程: