eBay API delphi 中的 CompleteSaleRequest 不保存 ShipmentTrackingDetails

eBay API CompleteSaleRequest in delphi doesn't save ShipmentTrackingDetails

我在调用 CompleteSaleRequest eBay API 函数时尝试保存 ShipmentTrackingDetailsShippingCarrierUsedShipmentTrackingNumber)。据我所知,我所做的所有事情都符合 eBay API 规范,调用 returns 成功,但当我检索订单时,跟踪详细信息未保存。我的函数如下所示:

function CompleteSale(OrderID: String; var ErrMsg: String): Boolean;
var
  req: CompleteSaleRequest;
  service: eBayAPIInterface;
  res: CompleteSaleResponse;
begin
  Result := False;
  service := GeteBayAPIInterface(nil, 'CompleteSale');

  req := CompleteSaleRequest.Create;
  req.OrderID := OrderID;
  req.Shipment := ShipmentType.Create;
  req.Shipment.SetShipmentTrackingDetailsLength(1);
  req.Shipment.ShipmentTrackingDetails[0] := ShipmentTrackingDetailsType.Create;
  ShipmentTrackingDetailsType(req.Shipment.ShipmentTrackingDetails[0]).ShippingCarrierUsed := [some custom text];
  ShipmentTrackingDetailsType(req.Shipment.ShipmentTrackingDetails[0]).ShipmentTrackingNumber := [some customer tracking number];
  req.Shipped := True;

  try
    try
      InitRequest(req);
      Screen.Cursor := crHourGlass;
      res := service.CompleteSale(req);
      Screen.Cursor := crDefault;
      Result := True;
    except
      on E: Exception do
        ErrMsg := E.Message;
    end;
  finally
    req.Free;
  end;
end;

有什么建议吗?

首先,请尝试检查由您的请求生成并由 Ebay api 返回的 xml。为此,将 tXMLDocument 放在窗体上,然后使用 THTTPRIO 的 OnBeforeExecute 和 OnAfterExecute 事件:

procedure TForm1.HTTPRIO1BeforeExecute(const MethodName: string;
SOAPRequest: TStream);
begin
XML1.LoadFromStream(SOAPRequest);
XML1.SaveToFile('Somefile.xml');
...

这样您就可以控制您的输入 xml 并最终更改代码。 基本上,如果您可以在 xml 中看到 ShipmentTrackingNumber 和 ShipmentCarrieUsed,调用应该会成功,但是有时需要几个小时,因为 Ebay 实际上 "refreshes" 数据在他们的服务器上(根据我的经验)

如果您有兴趣,这里有完整的工作生产解决方案,不幸的是它是 C++ Builder:

  String    CallName="CompleteSale";
  int SiteId=Ebay->SiteId; //77
  String Version=Ebay->Version;
  String AppId=Ebay->AppId;
  String DevId=Ebay->DevId;
  String CertId=Ebay->CertId;
  String SiteUrl=Ebay->SiteUrl;
  String AuthToken=Ebay->AuthToken;
  String CarrierUsed=Ebay->CarrierUsed;
  String Link=UnicodeString(SiteUrl)+CallName+'&'+"&siteid="+SiteId+'&'+"&appid="+
  AppId+'&'+"&version="+Version+'&'+"&routing=default";

  while(!FDQWorker->Eof) {
  String OrderLineItemId=FDQWorker->FieldByName("OrderLineItemID")->AsString;

CompleteSaleRequest * CS = new CompleteSaleRequest;
CompleteSaleResponse * CSResp = new CompleteSaleResponse;
RequesterCredentials * HDR = new RequesterCredentials;
CallName="CompleteSale";
String PUrl =  Link;
 EbayCall = GeteBayAPIInterface(false,PUrl,HTP1);
 HDR->eBayAuthToken=AuthToken;
 UserIdPasswordType *Cred = new UserIdPasswordType();
 HDR->Credentials  =  Cred;
 HDR->Credentials->AppId=AppId;
 HDR->Credentials->DevId=DevId;
 HDR->Credentials->AuthCert=CertId;
 _di_ISOAPHeaders headers = EbayCall;
 HTP1->SOAPHeaders->Send(HDR);
 HTP1->SOAPHeaders->SetOwnsSentHeaders(True);
 CS->Version=Version;
 CS->OrderLineItemID=OrderLineItemId;
 CS->Shipped=true;
 CS->WarningLevel=WarningLevelCodeType::High;
 ShipmentType * Shipment = new ShipmentType;
 CS->Shipment = Shipment;

 Array_Of_ShipmentTrackingDetailsType ShipmentD;

 ShipmentD.Length=PNumbers->Count; //Multiple Parcels Stringlist

 for (int i = 0; i < ShipmentD.Length; i++) {
  ShipmentTrackingDetailsType * ShipmentT = new ShipmentTrackingDetailsType;
  ShipmentT->ShipmentTrackingNumber=PNumbers->Strings[i];
  ShipmentT->ShippingCarrierUsed=CarrierUsed;
 ShipmentD[i]=ShipmentT;
 }


 CS->Shipment->ShipmentTrackingDetails=ShipmentD;

  CSResp = EbayCall->CompleteSale(CS);
...
}

此致