- 微信支付挖的坑
- nginx反向代理问题
- nginx配置https证书问题
微信支付坑,小心点前面坑在看你
小冷在开发中用到了微信支付,这里说一下微信支付的其中一种方式,这里小冷使用的是jsapi微信v3支付,
首先说一下这个流程
- 微信授权登录获取到code–>
- 使用code换到openid—>
- 下单携带openid—>
- 拼接下单的数据并拼接验签token—->
- 携带文档参数调取微信的预下单接口—>
- 成功后微信会返回前端一些参数还有要吧你的订单信息也返回—->
- 前端携带这些参数调微信的一个接口唤起微信支付界面——>
- 支付成功后—->后端提供一个回调接口让微信调你,修改你的订单状态—>
- 整个流程结束
这里重点说几个东西
- 获取code
这里一定要注意回调地址一定要和公众号上配置的那几个地址一致,这块坑很多,还有白名单,如果不一致换取openid会失败,会告诉你地址配置不一致。
- 首先是验签token,这个一定要多看几次微信的开发文档,他那块文档其实挺乱的反正小冷看的很懵逼,这块主要是将私钥和密钥
的数据解析出来然后再通过base64加密拼接成一个token。
- 回调后端地址在下面的参数中已经写了大家看那块就可以notifyOrderUrl
微信在拼接获取code接口时候,其中有个回调前端页面的地址,那个地址你可以直接配置能访问你的前端域名即可,切记要加http或者https。
查资料说v3比较安全,开发微信支付接口的时候使用的私钥和密钥两个文件。
文件结尾后缀是cert.pem和key.pem两个文件
这两个文件主要是在生成微信验签token时候解析文件拼接token的
所以这两个文件一定要是你商户号配置生成的密钥和私钥,我这里先把支付需要的参数贴出来,这些参数都是在配微信公众号和商户号给的。
# 微信jsapi支付v3 appid 支付商户关联的 小程序ID或公众号ID(登陆微信公众平台–>开发–>基本配置–>开发者ID(AppID))
v3:
appId: ???
# 对应apiclient_key.pem所在路径(商户平台->账户中心->证书->下载后一共3个:主要为apiclient_key.pem 这个)
# 将该文件开发时放在项目目录,上线放在项目根目录单独放不要一起打包
# 这个是你私钥和密钥的地址
keyPath: ???
certPath:???
#微信支付商户号(登陆商户平台–>账户中心–>商户信息–>微信支付商户号)
mchId: ???
#V3秘钥(商户平台->账户中心->V3秘钥->设置32位)
v3Key: ???
#证书序列号(这个是根据key文件和其他商户参数调微信支付接口返回具体代码有,先调用一次进行写入保存)
mchSerialNo: ???
#下单成功微信通知URL即微信回调URL,只支持https域名,这里指你后端的一个接口,你这个接口是微信可访问的公开的接口,
# 用于微信在支付成功后通知你修改你的订单状态
notifyOrderUrl: ???
#退款URL如上一步自行配置
notifyRefoundUrl: ???
#退款回调URL 如上一步自行配置
returnUrl: ???
#小程序或公众号秘钥,(登陆微信公众平台–>开发–>基本配置–>secret)
secret: ???
以上参数都可以在公众号和商户号中获得,这里说一下商户号和公众号获取时候一定要多看几次微信的操作文档,小心操作错误。
其实这里还有一个就是微信分为直连支付和服务商支付,区别是微信支付收取的利息不一样,服务商少一点,在下单时候服务商的参数会比直连商户的参数多出几个,具体情况查看微信服务商下单接口文档。
以上是微信支付的需要注意的,坑很多小心踩。
下面说一下前后分离项目nginx配置反向代理和https安全协议的一些坑
nginx是将前端页面通过域名将ip+端口映射出去的,这里http协议映射可以监听80端口。
啥意思就是,你在nginx.conf文件中在server中配置一个域名ip+端口,你访问网站就直接通过你的域名访问了,内网穿透其实也是这种意思。
但是要使用https的时候配置映射监听端口只能监听443端口,同时还得配置你的ssl证书,这样你访问地址时候就会变成https访问,好处是安全,就是单纯的为了安全。
下面小冷把基本映射配置贴在下面注意查收:
# 前端项目http配置
server {
listen 80;
server_name www.baidu.com #你的前端端项目域名;
rewrite ^(.*)$ https://$host$1;
location / {
index index.html;
root /local/... #你前端打包好的项目文件夹;
try_files $uri $uri/ /index.html;
}
}
# 前端项目https配置
server {
listen 443 ssl;
server_name www.baidu.com;
ssl_certificate /local/... #后缀名称叫.pem的密钥文件地址;
ssl_certificate_key /local/... #后缀名称叫.key的私钥文件地址;
ssl_session_timeout 5m;
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;
location / {
root /local/...; #你前端打包好的项目文件夹
try_files $uri $uri/ /index.html;
}
}
# 后端http配置
server {
listen 80;
server_name www.baidu.com #你的后端项目域名;
rewrite ^(.*)$ https://$host$1;
location / {
proxy_pass #你的服务器地址+端口;
}
}
# 后端https配置
server {
listen 443 ssl;
server_name www.baidu.com #你的后端项目域名;
ssl_certificate /local/... #后缀名称叫.pem的密钥文件地址;
ssl_certificate_key /local/... #后缀名称叫.key的私钥文件地址;
ssl_session_timeout 5m;
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;
location / {
proxy_pass #你的服务器地址+端口;
}
}
亲测有效。如果你没有效果应该是配置不对。
对这里还需要注意的一个问题就是小冷上一篇文章说的跨域问题!!!今天就总结这些希望对有需要的同志有所帮助!查看其他文章请关注小冷公众号秦川以北
原创文章,作者:Carrie001128,如若转载,请注明出处:https://blog.ytso.com/269122.html