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

微信支付 notify_url 回调重复通知

  •  
  •   ccsulzf0627 · 2020-09-09 22:02:56 +08:00 · 2710 次点击
    这是一个创建于 1567 天前的主题,其中的信息可能已经有所发展或是发生改变。

    notify_url 的代码处理逻辑不能做登录态校验。
    商户系统收到支付结果通知,需要在 5 秒内返回应答报文,否则微信支付认为通知失败,后续会重复发送通知。。
    同样的通知可能会多次发送给商户系统,商户系统必须能够正确处理重复的通知。如果已处理过,直接给微信支付返回成功。
    商户侧对微信支付回调 IP 有防火墙策略限制的,需要对以下 IP 段开通白名单:。

    101.226.103.0/25 、140.207.54.0/25 、103.7.30.0/25 (需要添加新网段 203.205.219.128/25 )、183.3.234.0/25 、58.251.80.0/25 。 。

    现状: 我可以收到通知内容。
    但是我返回 <xml><return_code></return_code><return_msg></return_msg></xml>
    微信没反应一样,还是继续给我通知

    有遇到过这样的问题嘛?讨论一下

    13 条回复    2020-09-10 13:42:13 +08:00
    ming
        1
    ming  
       2020-09-09 22:15:51 +08:00   ❤️ 1
    微信让你回:
    <xml>
    <return_code><![CDATA[SUCCESS]]></return_code>
    <return_msg><![CDATA[OK]]></return_msg>
    </xml>
    ccsulzf0627
        2
    ccsulzf0627  
    OP
       2020-09-09 22:34:00 +08:00
    @ming 老哥,我上面描述错误了,是像你这么写的,res.setHeader('Content-Type','text/xml'); 我在 Postman 中测试也是返回的 XML 格式,就是不行,一直重复通知
    Seanfuck
        3
    Seanfuck  
       2020-09-09 22:42:27 +08:00
    我遇到未支付的订单过几个月会发个支付成功的通知,实际上没有支付,不知道怎么回事,为了清掉这条记录?
    ccsulzf0627
        4
    ccsulzf0627  
    OP
       2020-09-09 22:49:01 +08:00
    @Seanfuck 老哥,你在哪里监听支付回调的?
    ccsulzf0627
        5
    ccsulzf0627  
    OP
       2020-09-09 23:04:28 +08:00
    已解决:
    const result = `<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>`;
    res.writeHead(200, {'Content-Type': 'text/xml'});
    res.end(result)
    aaronlam
        6
    aaronlam  
       2020-09-10 00:00:37 +08:00
    @ccsulzf0627 最后问题的原因,还是因为一楼说的 xml 的内容不对吗?
    dusu
        7
    dusu  
       2020-09-10 00:58:08 +08:00 via iPhone
    可能微信回调坑!楼主可以检查一下,微信走的 http 回调,竟然不支持返回 content-encoding: gzip/br,曾经为了这个问题折腾了好几天,最后单独让 nginx 为这个接口原文返回。

    大写的服。

    只能说贵微信,真是神一样的团队。
    also24
        8
    also24  
       2020-09-10 01:15:07 +08:00
    @dusu #7
    支持什么压缩方式,不应该在请求的 Accept-Encoding 里就给出了么?
    还是说微信在回调请求的时候,直接发送了自己实际不支持的编码方式?

    https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Accept-Encoding
    kop1989
        9
    kop1989  
       2020-09-10 06:39:45 +08:00 via iPhone
    5 秒内返回的问题,确认收到支付回调,完成验真,写入缓存之后就可以返回 success 了。没必要和业务完全强关联
    yuzo555
        10
    yuzo555  
       2020-09-10 06:53:39 +08:00
    @dusu 你的服务端应该要根据客户端的 Accept-Encoding 来处理输出方式,而不是你在代码里面压缩输出然后手动设置 Content-Encoding,这是危险的操作。
    ccsulzf0627
        11
    ccsulzf0627  
    OP
       2020-09-10 08:44:30 +08:00
    @kop1989 我是在小程序中,要点击完成才能触发回调 success 函数,我要有个支付成功的动作才行,所以用 notify_url 来完成
    kop1989
        12
    kop1989  
       2020-09-10 09:03:52 +08:00
    @ccsulzf0627 #11 也就是说你返回回调 success 是由界面 ui 的 button 触发的?这个逻辑完全做歪了吧。
    ccsulzf0627
        13
    ccsulzf0627  
    OP
       2020-09-10 13:42:13 +08:00
    @kop1989 小程序自己给了个方法,你先看看文档
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5703 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 06:25 · PVG 14:25 · LAX 22:25 · JFK 01:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.