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控制台

整个流程: