对于使用https访问的网站来讲,刚刚部署好证书会发现给账户存款支付成功后会账户不显示金额的问题。
整个流程是这样的,首先用户访问网站在线充值页面进行存款充值,这时候用户为第一方,访问的网站在线充值为第二方。当用户在充值过程中网页会跳转到二维码支付或别的支付网关,当用户支付成功后,当前支付页面会发送数据信息给支付宝银行等支付企业服务器,我们把支付宝或者银行称之为第三方。这里面会出现这种情况,有的企业会做自己的支付产品来集成支付宝微信银行卡等支付网关,当用户支付成功网页数据发送给支付宝等第三方的时候,第三方不会直接返回页面,第三方会把数据打包返回给集成了支付宝等支付网关的企业产品,这种企业产品我们称之为第四方。当第四方收到数据之后会返回到网页到当前用户账户里。整体的流程就是这样。
但是这其中出现的问题是第四方返回数据给第二方的时候,中间出现了问题,其根本问题在于第四方的支付网关在给第二方返回数据时没有将地址进行证书加密,也就是没有用到https,第二方网页进行了https加密处理会把传回来的http信息或者数据拦截掉或者直接收不到导致支付成功后用户账户余额没有更新。
请注意,默认情况下是看不到第四方我们只需要把第四方返回给第二方的数据链接访问的时候变成http即可,我们可以测试先充值一次,付款成功后进去nginx站点的访问日志进行寻找,一般情况支付会用POST 后面是网址路径作为链接来传输。
解决办法:
当我们的网站使用了V2SSL申请的证书或者TrustOcean的证书,并且使用了Centos 系统 Nginx来搭建网站的情况下,我们需要更改Nginx的站点配置文件,一般情况下Nginx的站点配置文件都会默认网址强制跳转https,我们只需修改强制跳转规则。
正常的强制跳转规则为:
if ($server_port !~ 443){
rewrite ^(/.*)$ https://$host$1 permanent;
}
我们需要更改为:
set $flag '0';#引用一个参数为0
if ($request_uri ~ '/MemberCenter/ZhiHuiFu/notify') { #如果访问这个地址的路径为 /MemberCenter/ZhiHuiFu/notify
set $flag '${flag}1'; #那么flag参数为01
#return 200 "TrustOcean"; #测试规则是否正确 这条规则不能于上一条一起用
}
if ($server_port !~ 443){ #如果访问服务器端口不是443端口
set $flag '${flag}2'; #那么flag参数为02
}
if ($flag ~ '02'){ #如果flag参数等于02
rewrite ^(/.*)$ https://$host$1 permanent; #访问网址会直接强制https
}