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

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

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

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

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

    你说的是这个配置嘛?这里有配置 https 的,没用;
    而这里保留只 https 而 notify_url 改成 http 一样可以通知成功,不知道啥情况
    airyland
        3
    airyland  
       2018-07-01 07:22:27 +08:00 via iPhone
    用 lets encrypt 证书的地址做为回调很久了,并没有遇到问题。
    phpcxy
        4
    phpcxy  
       2018-07-01 07:23:51 +08:00 via Android
    我也是用 Let ' s Encrypt,也是改为 http 才能收到通知。我怀疑是自己 nginx 配置问题,不过那个项目已经凉了,最后也没搞啦。
    vacker
        5
    vacker  
       2018-07-01 08:34:58 +08:00 via Android
    我也是用的 HTTPS 啊,证书也是 let ’ s encrypt 一年多了现在正常使用,稳如狗。肯定是你什么地方配置没对。
    34C
        6
    34C  
    OP
       2018-07-01 09:31:49 +08:00 via iPhone
    @airyland @vacker 能不能分享一下 SSL 配置?
    vacker
        7
    vacker  
       2018-07-01 10:37:50 +08:00   ❤️ 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;
    }
    ss098
        8
    ss098  
       2018-07-01 10:40:22 +08:00
    之前似乎看过一篇帖子,微信好像把 TLS 版本限制为比较新的版本( TLS 1.2 / TLS 1.3 ),不支持较旧的版本,但找了一下找不到了。
    ss098
        9
    ss098  
       2018-07-01 10:42:36 +08:00
    搞错了,和这个案例的场景不太一样。

    /t/458701
    mydns
        10
    mydns  
       2018-07-01 11:02:24 +08:00
    支持

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

    return 301 https://$host$request_uri;
    hlwjia
        15
    hlwjia  
       2018-07-01 15:34:39 +08:00 via iPhone
    把你的配置贴出来呀

    那么多人用了那么久的都没问题
    hlwjia
        17
    hlwjia  
       2018-07-01 15:49:13 +08:00
    @34C 有一个可能,是不是小程序,是不是虚拟支付?
    34C
        18
    34C  
    OP
       2018-07-01 15:54:49 +08:00
    @hlwjia

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

    给你们俩 100 个赞!果然是 SNI 的原因!!
    34C
        35
    34C  
    OP
       2018-07-01 22:30:35 +08:00
    @pubby 问题解决了,因为 SNI 配置的缘故
    raptor
        36
    raptor  
       2018-07-01 23:40:36 +08:00
    我只想说一句:Windows 就是善于制造其它平台不存在的问题……
    34C
        37
    34C  
    OP
       2018-07-01 23:49:06 +08:00 via iPhone
    @raptor 别的平台也会有 SNI 的问题,只是 Windows 的配置各种神翻译神描述…
    yimo666
        38
    yimo666  
       2018-12-19 19:11:30 +08:00
    windows server 2012 R2 上,同 SNI 问题,建立一个默认的 SSL 站点即可(新建站点,协议 https 端口 443,选一张证书)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5732 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 02:56 · PVG 10:56 · LAX 18:56 · JFK 21:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.