我正在尝试使用Acumatica Web Service API创建销售订单。我已经能够通过除了支付设置之外的所有必填字段。我们的安装使用Authorize.NET(PX.CPCProcessing.AuthorizeNetTokenizedProcessing)加载项。是否可以通过API与Authorize.NET插件交互,创建新的付款方法并授权付款,以便员工可以在Acumatica内处理订单并在那里获取付款。
下面是我用来创建销售订单的代码。我不确定通过API本身激活"创建新支付配置文件ID"操作所使用的结构。通过GUI,它会打开一个弹出窗口,将卡复制到Authorize.Net,并在Acumatica中保存付款配置文件ID记录。
SO301000Content SO301000 = context.SO301000GetSchema();
context.SO301000Clear();
SO301000Content[] SO30100content = context.SO301000Submit
(
new Command[]
{
//add header info
new Value { Value = "SO", LinkedCommand = SO301000.OrderSummary.OrderType },
new Value { Value = "<NEW>", LinkedCommand = SO301000.OrderSummary.OrderNbr },
new Value { Value = "999999", LinkedCommand = SO301000.OrderSummary.Customer },
//add line items
SO301000.DocumentDetails.ServiceCommands.NewRow,
new Value { Value = "SS1121", LinkedCommand = SO301000.DocumentDetails.InventoryID },
new Value { Value = "2", LinkedCommand = SO301000.DocumentDetails.Quantity },
SO301000.DocumentDetails.ServiceCommands.NewRow,
new Value { Value = "SS1122", LinkedCommand = SO301000.DocumentDetails.InventoryID },
new Value { Value = "2", LinkedCommand = SO301000.DocumentDetails.Quantity },
SO301000.DocumentDetails.ServiceCommands.NewRow,
new Value { Value = "SS1123", LinkedCommand = SO301000.DocumentDetails.InventoryID },
new Value { Value = "2", LinkedCommand = SO301000.DocumentDetails.Quantity },
//add shipping information
new Value { Value = "True", LinkedCommand = SO301000.ShippingSettingsShipToInfoOverrideContact.OverrideContact },
new Value { Value = "DEMO CHURCH SHIP", LinkedCommand = SO301000.ShippingSettingsShipToInfoOverrideContact.BusinessName },
new Value { Value = "True", LinkedCommand = SO301000.ShippingSettingsShipToInfo.OverrideAddress },
new Value { Value = "123 TEST STREET", LinkedCommand = SO301000.ShippingSettingsShipToInfo.AddressLine1 },
new Value { Value = "BUFORD", LinkedCommand = SO301000.ShippingSettingsShipToInfo.City },
new Value { Value = "GA", LinkedCommand = SO301000.ShippingSettingsShipToInfo.State },
new Value { Value = "30519", LinkedCommand = SO301000.ShippingSettingsShipToInfo.PostalCode },
new Value { Value = "FREESHIP", LinkedCommand = SO301000.ShippingSettingsShippingInformation.ShipVia },
//add totals
new Value { Value = "10.00", LinkedCommand = SO301000.Totals.PremiumFreight },
new Value { Value = "94.0000", LinkedCommand = SO301000.Totals.PackageWeight },
//add payment
SO301000.Actions.Save,
SO301000.OrderSummary.OrderNbr
}
);
新代码错误-我现在可以插入客户付款记录,但在尝试将该卡插入现有销售订单时收到错误。
这是我的代码:
SO301000Content SO301000 = context.SO301000GetSchema();
context.SO301000Clear();
SO301000Content[] SO30100content = context.SO301000Submit
(
new Command[]
{
//add header info
new Value { Value = "SO", LinkedCommand = SO301000.OrderSummary.OrderType },
new Value { Value = "000129", LinkedCommand = SO301000.OrderSummary.OrderNbr },
//add payment
new Value { Value = "VISA", LinkedCommand = SO301000.PaymentSettings.PaymentMethod },
new Value { Value = "VISA:****-****-****-7261", LinkedCommand = SO301000.PaymentSettings.CardAccountNo },
SO301000.Actions.Save
}
);
如果有人有什么想法,我将不胜感激。谢谢。
您不能使用"创建新的支付配置文件ID",因为它依赖于web浏览器中的实际用户(我们只是在IFRAME中显示Authorize.net新配置文件页面)。我们这样做是为了限制应用程序暴露在PCI Compliance之下,这样就不会有信用卡号或敏感信息接触Acumatica服务器。您应该直接通过Authorize.net CIM站点或CIM API添加支付配置文件,并将配置文件ID传递给Acumatica。
遗憾的是,您无法将客户配置文件ID直接传递给订单,只有付款配置文件值被接受作为输入,因此您首先需要使用"客户付款方法"屏幕API添加条目。
AR303010Content AR301000 = context.AR303010GetSchema();
context.AR303010Clear();
AR303010Content[] AR303010content = context.AR303010Submit(
new Command[]
{
new Value { Value = "999999", LinkedCommand = AR301000.PaymentMethodSelection.Customer },
new Value { Value = "VISATOK", LinkedCommand = AR301000.PaymentMethodSelection.PaymentMethod },
new Value { Value = "AUTHTOK", LinkedCommand = AR301000.PaymentMethodSelection.ProcCenterID },
new Value { Value = "102000", LinkedCommand = AR301000.PaymentMethodSelection.CashAccount },
new Value { Value = "23640304", LinkedCommand = AR301000.PaymentMethodSelection.CustomerProfileID },
new Value { Value = "27187006", FieldName = "Value", ObjectName = "ccpIdDet"}, //Payment Profile ID, going directly to internal ccpIdDet view to bypass validation error when using AR301000.PaymentMethodDetails.Value
AR301000.Actions.Save,
AR301000.PaymentMethodSelection.CardAccountNo
});
string cardAccountNo = AR303010content[0].PaymentMethodSelection.CardAccountNo.Value;
然后,当你创建销售订单时,你只需要指定要使用的卡,正如AR301000在创建过程后返回的那样:
//add payment
new Value { Value = "VISATOK", LinkedCommand = SO301000.PaymentSettings.PaymentMethod },
new Value { Value = cardAccountNo, LinkedCommand = SO301000.PaymentSettings.CardAccountNoCardAccountNo }, //Use card account number returned earlier, like "VISATOK:****-****-****-1111"
下面的示例展示了如何通过基于屏幕的API在销售订单中设置卡号:
Content orderSchema = context.GetSchema();
orderSchema.PaymentSettings.CardAccountNo.FieldName += "!Descr";
var commands = new Command[]
{
new Value
{
Value = "SO",
LinkedCommand = orderSchema.OrderSummary.OrderType,
Commit = true
},
orderSchema.Actions.Insert,
new Value
{
Value = "ABARTENDE",
LinkedCommand = orderSchema.OrderSummary.Customer,
Commit = true
},
new Value
{
Value = "VISA",
LinkedCommand = orderSchema.PaymentSettings.PaymentMethod
},
new Value
{
Value = "VISA:****-****-****-7630",
LinkedCommand = orderSchema.PaymentSettings.CardAccountNo,
Commit = true
},
orderSchema.Actions.Save
};
context.Submit(commands);
此模式对于在Aspx中设置了TextField属性的每个选择器都是必需的。