首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
华为云
V2EX  ›  问与答

微信支付的支付通知 notify_url 不支持 https 吗?难以置信

  •  2
     
  •   34C · 141 天前 · 4185 次点击
    这是一个创建于 141 天前的主题,其中的信息可能已经有所发展或是发生改变。
    支付成功,但服务端一直收不到支付通知。
    在 CSDN 论坛上看到有人说改成 http 就好,没想到真的成功了。
    难道都 2018 年了这个关键通知竟然不支持 https ?
    还是说不支持使用 Let's Encrypt 的 https ?
    第 1 条附言  ·  140 天前
    在经过 #30 和 #32 楼的点拨之后,确定是了 SNI 配置的关系。
    希望所有遇到同样问题,搜到本帖的朋友,检查一下 SNI 配置,微信内部的库估计是很老的,嗯。
    第 2 条附言  ·  140 天前
    再追加一下:

    因为我使用的是 Windows Server 2012 R2 + IIS 8.5 的环境,而且是中文版,所以关于 SNI 的配置,我说不清到底是关闭还是打开,我的做法是在绑定 https 域名的面板把 “需要服务器名称指示” 的勾去掉,应该是关闭了 SNI 的意思。
    第 3 条附言  ·  140 天前
    最后再追加一条解决方案:
    刚刚又把 “需要服务器名称指示” 这个勾打上了,然后给 IIS 的默认站点(没有配置域名的站点)添加了 https 的默认响应,同样是没域名,证书随便选一张。
    这样虽然直接访问 https://ipaddres 会出错,但对于不支持 SNI 的请求(比如微信)也能正确响应了。
    37 回复  |  直到 2018-07-01 23:49:06 +08:00
        1
    uqf0663   141 天前
    可以的,微信支付后台产品设置那里你得选 https
        2
    34C   141 天前
    @uqf0663

    产品中心 - 开发配置 - 支付配置 - 公众号支付 - 支付授权目录

    你说的是这个配置嘛?这里有配置 https 的,没用;
    而这里保留只 https 而 notify_url 改成 http 一样可以通知成功,不知道啥情况
        3
    airyland   140 天前 via iPhone
    用 lets encrypt 证书的地址做为回调很久了,并没有遇到问题。
        4
    phpcxy   140 天前 via Android
    我也是用 Let ' s Encrypt,也是改为 http 才能收到通知。我怀疑是自己 nginx 配置问题,不过那个项目已经凉了,最后也没搞啦。
        5
    vacker   140 天前 via Android
    我也是用的 HTTPS 啊,证书也是 let ’ s encrypt 一年多了现在正常使用,稳如狗。肯定是你什么地方配置没对。
        6
    34C   140 天前 via iPhone
    @airyland @vacker 能不能分享一下 SSL 配置?
        7
    vacker   140 天前   ♥ 1
    @34C

    server
    {
    listen 80;
    listen 443 ssl http2;
    server_name www.xxx.com;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/www.xxx.com;

    #SSL-START SSL 相关配置,请勿删除或修改下一行带注释的 404 规则
    #error_page 404/404.html;
    #HTTP_TO_HTTPS_START
    if ($server_port !~ 443){
    rewrite ^(/.*)$ https://$host$1 permanent;
    }
    #HTTP_TO_HTTPS_END
    ssl_certificate /etc/letsencrypt/live/www.xxx.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.xxx.com/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    error_page 497 https://$host$request_uri;


    #SSL-END

    #ERROR-PAGE-START 错误页配置,可以注释、删除或修改
    error_page 404 /404.html;
    error_page 502 /502.html;
    #ERROR-PAGE-END

    #PHP-INFO-START PHP 引用配置,可以注释或修改

    include enable-php-71.conf;
    #PHP-INFO-END

    #REWRITE-START URL 重写规则引用,修改后将导致面板设置的伪静态规则失效
    include /www/server/panel/vhost/rewrite/www.xxx.com.conf;
    #REWRITE-END

    #禁止访问的文件或目录
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
    {
    return 404;
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
    expires 30d;
    access_log off;
    }
    location ~ .*\.(js|css)?$
    {
    expires 12h;
    access_log off;
    }
    access_log /www/wwwlogs/www.xxx.com.log;
    }
        8
    ss098   140 天前
    之前似乎看过一篇帖子,微信好像把 TLS 版本限制为比较新的版本( TLS 1.2 / TLS 1.3 ),不支持较旧的版本,但找了一下找不到了。
        9
    ss098   140 天前
    搞错了,和这个案例的场景不太一样。

    /t/458701
        10
    mydns   140 天前
    支持

    扫码回调链接
    操作
    https://www.
        11
    34C   140 天前
    @vacker 在 myssl 检测了一下,评级为 B,把 RC4 和 DH 都禁用了,评级升到 A 了,仍然收不到微信的通知…
        12
    34C   140 天前
    @mydns 不是这个设置,页面的支付什么的都正常,就是收不到 JSAPI 支付通知…
        13
    34C   140 天前
    @ss098 我现在是 TLS 1.0 / 1.1 / 1.2 都支持,SSL 2 / 3 都关闭了,还是不行,楼上那位可以的也有开 TLS 1.0 唉
        14
    ysc3839   140 天前 via Android
    跳转 https 那里不应该用 rewrite 吧?
    应该用 return 301

    return 301 https://$host$request_uri;
        15
    hlwjia   140 天前 via iPhone
    把你的配置贴出来呀

    那么多人用了那么久的都没问题
        17
    hlwjia   140 天前
    @34C 有一个可能,是不是小程序,是不是虚拟支付?
        18
    34C   140 天前
    @hlwjia

    不是,我没做小程序支付,做的是公众号内 JSAPI 的支付,整个支付流程都走通了,就是支付通知收不到,
    什么都不动,把 notify url 改成 http 的就能收到,改回 https 又不行,
    换个别的 url 只要是 https 也不行,
    服务器日志压根没收到任何请求,
    而且同个域名的 https 有别的接口给公众号做自动回复,每天几千次请求都正常,唯独收不到支付通知,
    蛋疼得要命
        19
    xi_lin   140 天前
    https 肯定支持
    https://www.geocerts.com/ssl_checker
    看看是不是证书链的问题
        20
    vacker   140 天前
    @34C 我的站检测结果是 A,我是 Linux,试试是否和你 window 环境有关
        21
    hlwjia   140 天前
    这个地址自己能访问吗?
        22
    34C   140 天前 via iPhone
    @hlwjia 可以的,包括用 postman 测试 post 一大段 xml 数据也没问题
        23
    34C   140 天前 via iPhone
    @xi_lin 测了一下全部 OK,其实我还试过换 ssl 证书但也都不行…
        24
    34C   140 天前 via iPhone
    @vacker 这就很蛋疼了,浏览器访问正常、其它给微信访问的接口也正常、证书检测也正常了,就是通知收不到…
        25
    Vhc001   140 天前
    @vacker #7 我能艾特站长举报你传播色情网站吗?
        26
    1iuh   140 天前
    服务器在哪?不在国内的话,可能会有问题,但是不是微信的问题。
        27
    w0nglend   140 天前 via Android
    @ss098 小程序好像是必须 1.2。1.3 还是草案
        28
    34C   140 天前 via iPhone
    @1iuh 在国内,阿里云
        29
    vacker   140 天前
    @Vhc001 我反正是打不开😂
        30
    cameo   140 天前   ♥ 2
    看一下你的服务器是不是启用了 SNI,并且没有 fallback 策略。你会看到支付成功后,立刻有一个握手失败的请求进来,那就是微信的通知请求。猜测原因是微信使用的网络库太老,没有做 SNI 的支持。强烈建议遇到这个问题的同学都提下工单,请求微信修复这一问题。
        31
    Infernalzero   140 天前
    微信是这样的,只能给它的请求特殊处理,不重定向
    支付宝就没这等破事
        32
    3dwelcome   140 天前 via Android   ♥ 2
    微信对 https 加密算法有严格要求,我把加密算法退化到最基本的 rsa cbc 就可以,上 dh 有时都会挂。特烦,别的站就没这个破问题,为此真是独此一家,特殊对待。
        33
    pubby   140 天前 via Android
    15 年开始接入微信支付,一直使用 https 回调,从没遇到这种情况
        34
    34C   140 天前
    @cameo
    @3dwelcome

    给你们俩 100 个赞!果然是 SNI 的原因!!
        35
    34C   140 天前
    @pubby 问题解决了,因为 SNI 配置的缘故
        36
    raptor   140 天前
    我只想说一句:Windows 就是善于制造其它平台不存在的问题……
        37
    34C   140 天前 via iPhone
    @raptor 别的平台也会有 SNI 的问题,只是 Windows 的配置各种神翻译神描述…
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   752 人在线   最高记录 3821   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 19ms · UTC 18:35 · PVG 02:35 · LAX 10:35 · JFK 13:35
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1