Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Quickbooks在线API-支付和#x27;未应用';当提供发票ID时_C#_Quickbooks Online_Intuit - Fatal编程技术网

C# Quickbooks在线API-支付和#x27;未应用';当提供发票ID时

C# Quickbooks在线API-支付和#x27;未应用';当提供发票ID时,c#,quickbooks-online,intuit,C#,Quickbooks Online,Intuit,我已经设法使用C#.NET SDK创建了一个支付,但是当我签入QBO时,它总是显示为“未应用” 我提供了发票ID,并试图遵循他们的开发人员API文档,但我已经在这这么久了,现在可能我错过了什么 下面的代码创建了付款,但没有“收到”发票上的付款,我是否遗漏了什么或需要做什么才能将两者链接在一起 Payment payment = new Payment { ProcessPayment = false, CustomerRef = new ReferenceType { name

我已经设法使用C#.NET SDK创建了一个支付,但是当我签入QBO时,它总是显示为“未应用”

我提供了发票ID,并试图遵循他们的开发人员API文档,但我已经在这这么久了,现在可能我错过了什么

下面的代码创建了付款,但没有“收到”发票上的付款,我是否遗漏了什么或需要做什么才能将两者链接在一起

Payment payment = new Payment
{
    ProcessPayment = false,
    CustomerRef = new ReferenceType { name = customer.DisplayName, Value = customer.Id },
    CurrencyRef = new ReferenceType { type = "Currency", Value = "CAD" },
    TotalAmt = amount,
    TotalAmtSpecified = true
};

if (method == PaymentTypes.Cash)
{
    var paymentType = paymentMethods.FirstOrDefault(o => o.Id == "1");
    if (paymentType != null)
    {
        payment.PaymentMethodRef = new ReferenceType()
            {name = paymentType.Name, Value = paymentType.Id};
    }
}

if (method == PaymentTypes.DebitCard)
{
    var paymentType = paymentMethods.FirstOrDefault(o => o.Id == "9");
    if (paymentType != null)
    {
        payment.PaymentMethodRef = new ReferenceType()
            { name = paymentType.Name, Value = paymentType.Id };
    }
}

if (method == PaymentTypes.CreditCard)
{
    var paymentType = paymentMethods.FirstOrDefault(o => o.Id == "8");
    if (paymentType != null)
    {
        payment.PaymentMethodRef = new ReferenceType()
            { name = paymentType.Name, Value = paymentType.Id };
    }
}

List<LinkedTxn> linkedTxns = new List<LinkedTxn>
{
    new LinkedTxn()
    {
        TxnId = invoice.Id,
        TxnType = TxnTypeEnum.Invoice.ToString()
    },
};

foreach (Line line in invoice.Line)
{
    //line.Amount = amount;
    //line.AmountSpecified = true;
    line.Received = amount;
    line.ReceivedSpecified = true;
    line.DetailType = LineDetailTypeEnum.PaymentLineDetail;
    line.DetailTypeSpecified = true;
    line.LinkedTxn = linkedTxns.ToArray();
}

payment.DepositToAccountRef = new ReferenceType() { Value = "5" };
payment.Line = invoice.Line;
payment.PaymentRefNum = reference;

DataService dataService = new DataService(serviceContext);
dataService.Add<Payment>(payment);
付款付款=新付款
{
ProcessPayment=false,
CustomerRef=新引用类型{name=customer.DisplayName,Value=customer.Id},
CurrencyRef=新引用类型{type=“Currency”,Value=“CAD”},
总金额=金额,
TotalAmtSpecified=true
};
如果(方法==PaymentTypes.Cash)
{
var paymentType=paymentMethods.FirstOrDefault(o=>o.Id==“1”);
如果(paymentType!=null)
{
payment.PaymentMethodRef=新引用类型()
{name=paymentType.name,Value=paymentType.Id};
}
}
if(方法==PaymentTypes.DebitCard)
{
var paymentType=paymentMethods.FirstOrDefault(o=>o.Id==“9”);
如果(paymentType!=null)
{
payment.PaymentMethodRef=新引用类型()
{name=paymentType.name,Value=paymentType.Id};
}
}
if(方法==PaymentTypes.CreditCard)
{
var paymentType=paymentMethods.FirstOrDefault(o=>o.Id==“8”);
如果(paymentType!=null)
{
payment.PaymentMethodRef=新引用类型()
{name=paymentType.name,Value=paymentType.Id};
}
}
List linkedTxns=新列表
{
新LinkedTxn()
{
TxnId=发票.Id,
TxnType=txnTypenum.Invoice.ToString()
},
};
foreach(发票中的行。行)
{
//行。金额=金额;
//line.AmountSpecified=true;
行。收到=金额;
line.ReceivedSpecified=真;
line.DetailType=LineDetailTypeEnum.PaymentLineDetail;
line.DetailTypeSpecified=true;
line.LinkedTxn=linkedTxns.ToArray();
}
payment.DepositoAccountRef=新引用类型(){Value=“5”};
付款行=发票行;
payment.PaymentRefNum=参考;
DataService DataService=新的DataService(serviceContext);
dataService.Add(付款);

这不是答案。然而,评论中有太多的内容需要补充。我希望这将是一个有用的起点(如果不是,我将在以后删除它)

首先,我建议重构您的代码并参数化您的变量。这样,您应该能够单独执行可重复的测试

在执行
dataService.Add(payment)
时,存储响应对象,因为它可能提供有关如何处理请求的线索。或者,如果这是抑制错误消息,您可能希望尝试使用邮递员发送HTTP请求。这可能有助于确定哪些参数缺失/不正确

避免创建部分指定的对象。这样可以更轻松地读取7并确定需要指定的属性

另外,如果您查看了完整更新付款部分 json有效负载有一个额外的,属性TxnType设置为CreditMemo。我假设您需要添加类似于接收付款信用卡付款的内容

要重构代码,请考虑:

// TODO - Set variables for testing purposes. 
// This can be added as params to a method.
decimal amount = 100;
string reference = "";
string invoiceId = ""; // invoice.Id
string customerDisplayName = ""; //customer.DisplayName
string customerId = ""; //customer.Id
string paymentName = "Cash"; // paymentType.Name
string paymentId = "1"; // paymentType.Id
List<Line> lines = new List<Line>(); // invoice.Line

                        
if(lines.Count() == 0)
{
    // TODO: You might want to check there are lines?
    throw new ArgumentException("No invoice.");
}

Line[] invoiceLines = lines.Select(m => new Line()
{
    AnyIntuitObject = m.AnyIntuitObject,
    Amount = m.Amount,
    AmountSpecified = m.AmountSpecified,
    CustomField = m.CustomField,
    Id = m.Id,
    LineNum = m.LineNum,
    Description = m.Description,
    DetailType = LineDetailTypeEnum.PaymentLineDetail, //m.DetailType,
    DetailTypeSpecified = true, //m.DetailTypeSpecified,
    LinkedTxn = new List<LinkedTxn>
    {
        new LinkedTxn()
        {
            TxnId = invoiceId,
            TxnType = TxnTypeEnum.Invoice.ToString() // TODO: Should this be ReceivePayment?
        },
    }.ToArray(), //m.LinkedTxn,
    LineEx = m.LineEx,
    Received = amount, //m.Received,    
    ReceivedSpecified = true // m.ReceivedSpecified
}).ToArray();            

Payment payment = new Payment
{
    ProcessPayment = false,
    CustomerRef = new ReferenceType { name = customerDisplayName, Value = customerId },
    CurrencyRef = new ReferenceType { type = "Currency", Value = "CAD" },
    TotalAmt = amount,
    TotalAmtSpecified = true,
    DepositToAccountRef = new ReferenceType() { Value = "5" },
    Line = invoiceLines, // Variable is for debugging purposes - it should be inline or call a method. 
    PaymentRefNum = reference,
    PaymentMethodRef = new ReferenceType()
    {
        name = paymentName,
        Value = paymentId,
    }
};

DataService dataService = new DataService(serviceContext);
Payment results = dataService.Add<Payment>(payment);

var json = JsonConvert.SerializeObject(results);
Console.Write(json); // TODO - Use break point/ or write response somewhere for clues.
//TODO-为测试目的设置变量。
//可以将其作为参数添加到方法中。
小数金额=100;
字符串引用=”;
字符串invoiceId=“”;//发票.Id
字符串customerDisplayName=“”//customer.DisplayName
字符串customerId=“”//客户Id
字符串paymentName=“现金”//paymentType.Name
字符串paymentId=“1”;//paymentType.Id
列表行=新列表();//发票行
if(lines.Count()==0)
{
//TODO:您可能想检查是否有线路?
抛出新的ArgumentException(“无发票”);
}
行[]发票行=行。选择(m=>新行()
{
AnyIntuitObject=m.AnyIntuitObject,
金额=m.金额,
指定的数量=指定的数量,
CustomField=m.CustomField,
Id=m.Id,
LineNum=m.LineNum,
描述=m.描述,
DetailType=LineDetailTypeEnum.PaymentLineDetail,//m.DetailType,
DetailTypeSpecified=true,//m.DetailTypeSpecified,
LinkedTxn=新列表
{
新LinkedTxn()
{
TxnId=发票ID,
TxnType=txnTypeNum.Invoice.ToString()//TODO:这应该是收款吗?
},
}.ToArray(),//m.LinkedTxn,
LineEx=m.LineEx,
已收=金额,//m.Received,
ReceivedSpecified=true//m.ReceivedSpecified
}).ToArray();
付款=新付款
{
ProcessPayment=false,
CustomerRef=新引用类型{name=customerDisplayName,Value=customerId},
CurrencyRef=新引用类型{type=“Currency”,Value=“CAD”},
总金额=金额,
TotalAmtSpecified=真,
DepositoAccountRef=新引用类型(){Value=“5”},
Line=invoiceLines,//变量用于调试目的-它应该是内联的或调用方法。
PaymentRefNum=参考,
PaymentMethodRef=新引用类型()
{
name=paymentName,
值=paymentId,
}
};
DataService DataService=新的DataService(serviceContext);
付款结果=dataService.Add(付款);
var json=JsonConvert.SerializeObject(结果);
Console.Write(json);//TODO-使用断点/或在某处写入响应以获取线索。

您为什么要注释掉
行.金额
而改用
行.已收到
?通过测试,
line.Amount
似乎应用了该金额,而
line.Received
没有。我尝试了这两种方法,两种方法都无效。。。两者都显示为“未应用”,我附上了一个屏幕截图。您是否能够捕获发送到中的原始JSON数据