zoukankan      html  css  js  c++  java
  • 微信支付回调通知收不到(不通知)的常见问题以及解决办法

    微信支付官方给出的解决方案

    自己看吧,这个是最基本的问题排查,不赘述,上链接 官方解决方案 ↓↓↓↓↓↓↓↓
    一定会往这里看的,如果上面的就已经解决了,说明也太不认真了。

    以下的方案包含网上和微信官网给出的一些方案总结,自己亲测可用

    常见问题

    端口问题

    阿里云、腾讯云、天翼云等各种云服务器或者自己的服务器防火墙请确认是否开启了25端口。这个是很多人会忽略的。
    具体开房的地址参考微信支付官方文档文档地址最下面的第三点

    权限问题

    开发webapi的时候经常会在基类里面做了鉴权认证,导致回调接口也继承了基类的鉴权,所以请把回调地址设置为所有人都可以访问,无需鉴权。

    配置问题

    在商户上配置授权地址的时候一定是以 /结束的。比如 https://aaa.com/
    回调地址尽量保持为 https://aaa/com/回调方法,不要在增加深层目录
    错误示范: https://aaa.com/api/v2/回调方法
    备注:没有验证过错误示范的是否能够可以,但是正确示例一定可以。

    webapi的配置问题

    以.netcore为例
    .netcore 默认是支持context-type:json/application格式的。
    但是微信支付V2版本的回调函数是以xml方式回调的,所以请配置webapi支持xml的解析。
    参考代码

    using Microsoft.AspNetCore.Mvc.Formatters;
    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Xml.Serialization;
    
    namespace Light.PhoneNumber.WebApi
    {
        public class ResultTextFormatter : TextInputFormatter
        {
            public ResultTextFormatter()
            {
                SupportedMediaTypes.Insert(0, "text/plain");
                SupportedMediaTypes.Insert(0, "text/xml");
                SupportedEncodings.Add(Encoding.UTF8);
                SupportedEncodings.Add(Encoding.Default);
                SupportedEncodings.Add(Encoding.Unicode);
            }
            public override async Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context, Encoding encoding)
            {
                using (var reader = context.ReaderFactory(context.HttpContext.Request.Body, encoding))
                {
                    var stringContent = await reader.ReadToEndAsync();
                    var type = context.ModelType;
                    var contextType = context.HttpContext.Request.ContentType;
                    if (contextType == "text/plain")
                    {
                        return await Deserialize(stringContent, type);
                    }
                    else if (contextType == "text/xml" || context.HttpContext.Request.Path.Value.ToLower().Contains("/payed"))
                    {
                        return await DeserializeXML(stringContent, type);
                    }
                    return await InputFormatterResult.FailureAsync();
                }
            }
    
            public static async Task<InputFormatterResult> DeserializeXML(string xml, Type type)
            {
                using (var reader = new StringReader(xml))
                {
                    var serializer = new XmlSerializer(type, new XmlRootAttribute("xml"));
                    var result = serializer.Deserialize(reader);
                    return await InputFormatterResult.SuccessAsync(result);
                }
            }
    
            private static async Task<InputFormatterResult> Deserialize(string stringContent, Type type)
            {
                var result = JsonConvert.DeserializeObject(stringContent, type);
                return await InputFormatterResult.SuccessAsync(result);
            }
        }
    }
    

    Startup.cs

         services.AddMvc(config =>
                    {
                        config.InputFormatters.Add(new ResultTextFormatter());
                        config.Filters.Add<LogFilter>();
    
                    }
                 );
    

    .netcore3.0+版本不支持同步导致无法回调

    因为上一个问题的写法导致不支持同步会回调异常
    处理办法

     services.Configure<KestrelServerOptions>(x => x.AllowSynchronousIO = true)
                  .Configure<IISServerOptions>(x => x.AllowSynchronousIO = true);
    
  • 相关阅读:
    add repository(仓库) EntityState状态
    添加 Attribute(属性)和Attribute的用法
    分部视图 Partial View
    MVC架构+ef 添加、删除、查询用户。。。
    首次接触 ef
    了解ASP.NET MVC的基本架构
    C# SqlParameter SqlCommand
    mysql命令行导出导入,附加数据库
    py03_变量
    py02_操作系统
  • 原文地址:https://www.cnblogs.com/xiaoch/p/13417908.html
Copyright © 2011-2022 走看看