fedexapixml数据格式的正确方法

2024-05-12 14:55:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Django应用程序,我试图打一个电话到联邦快递的API,为那些想把产品寄来换取现金的人发送一个运输标签。当我试着打电话时,它说我正在填写的XML中的Expiration字段存在数据验证问题。我发誓在过去,我将日期格式化为“YYYY-MM-DD”,但现在不行了。我读到联邦快递需要将日期格式化为ISO格式,但这也不能通过数据验证。我正在使用一个python包来帮助开发Fedex的API。在

用于发送API调用的Django视图函数

def Fedex(request, quote):
    label_link = ''
    expiration_date = datetime.datetime.now() + datetime.timedelta(days=10)

    # formatted_date = "%s-%s-%s" % (expiration_date.year, expiration_date.month, expiration_date.day)
    formatted_date = expiration_date.replace(microsecond=0).isoformat()

    if quote.device_type != 'laptop':
        box_length = 9
        box_width = 12
        box_height = 3
    else:
        box_length = 12
        box_width = 14
        box_height = 3

    logging.basicConfig(stream=sys.stdout, level=logging.INFO)

    ## Page 411 of FedEx Dev Guide - 20.14 Email Labels

    CONFIG_OBJ = FedexConfig(key=settings.FEDEX_KEY, password=settings.FEDEX_PASSWORD, account_number=settings.FEDEX_ACCOUNT,
                             meter_number=settings.FEDEX_METER, use_test_server=settings.USE_FEDEX_TEST)

    fxreq = FedexCreatePendingShipRequestEmail(CONFIG_OBJ, customer_transaction_id='xxxxxx id:01')
    fxreq.RequestedShipment.ServiceType = 'FEDEX_GROUND'
    fxreq.RequestedShipment.PackagingType = 'YOUR_PACKAGING'
    fxreq.RequestedShipment.DropoffType = 'REGULAR_PICKUP'
    fxreq.RequestedShipment.ShipTimestamp = datetime.datetime.now()

    # Special fields for the email label
    fxreq.RequestedShipment.SpecialServicesRequested.SpecialServiceTypes = ('RETURN_SHIPMENT', 'PENDING_SHIPMENT')
    fxreq.RequestedShipment.SpecialServicesRequested.PendingShipmentDetail.Type = 'EMAIL'
    fxreq.RequestedShipment.SpecialServicesRequested.PendingShipmentDetail.ExpirationDate = formatted_date
    email_address = fxreq.create_wsdl_object_of_type('EMailRecipient')
    email_address.EmailAddress = quote.email
    email_address.Role = 'SHIPMENT_COMPLETOR'

    # RETURN SHIPMENT DETAIL
    fxreq.RequestedShipment.SpecialServicesRequested.ReturnShipmentDetail.ReturnType = ('PENDING')
    fxreq.RequestedShipment.SpecialServicesRequested.ReturnShipmentDetail.ReturnEMailDetail = fxreq.create_wsdl_object_of_type(
        'ReturnEMailDetail')
    fxreq.RequestedShipment.SpecialServicesRequested.ReturnShipmentDetail.ReturnEMailDetail.MerchantPhoneNumber = 'x-xxx-xxx-xxxx'

    fxreq.RequestedShipment.SpecialServicesRequested.PendingShipmentDetail.EmailLabelDetail.Recipients = [email_address]
    fxreq.RequestedShipment.SpecialServicesRequested.PendingShipmentDetail.EmailLabelDetail.Message = "Xxxxxx Xxxxxx"

    fxreq.RequestedShipment.LabelSpecification = {'LabelFormatType': 'COMMON2D', 'ImageType': 'PDF'}

    fxreq.RequestedShipment.Shipper.Contact.PersonName = quote.first_name + ' ' + quote.last_name
    fxreq.RequestedShipment.Shipper.Contact.CompanyName = ""
    fxreq.RequestedShipment.Shipper.Contact.PhoneNumber = quote.phone
    fxreq.RequestedShipment.Shipper.Address.StreetLines.append(quote.address)
    fxreq.RequestedShipment.Shipper.Address.City = quote.city
    fxreq.RequestedShipment.Shipper.Address.StateOrProvinceCode = quote.state
    fxreq.RequestedShipment.Shipper.Address.PostalCode = quote.zip
    fxreq.RequestedShipment.Shipper.Address.CountryCode = settings.FEDEX_COUNTRY_CODE

    fxreq.RequestedShipment.Recipient.Contact.PhoneNumber = settings.FEDEX_PHONE_NUMBER
    fxreq.RequestedShipment.Recipient.Address.StreetLines = settings.FEDEX_STREET_LINES
    fxreq.RequestedShipment.Recipient.Address.City = settings.FEDEX_CITY
    fxreq.RequestedShipment.Recipient.Address.StateOrProvinceCode = settings.FEDEX_STATE_OR_PROVINCE_CODE
    fxreq.RequestedShipment.Recipient.Address.PostalCode = settings.FEDEX_POSTAL_CODE
    fxreq.RequestedShipment.Recipient.Address.CountryCode = settings.FEDEX_COUNTRY_CODE

    fxreq.RequestedShipment.Recipient.AccountNumber = settings.FEDEX_ACCOUNT
    fxreq.RequestedShipment.Recipient.Contact.PersonName = ''
    fxreq.RequestedShipment.Recipient.Contact.CompanyName = 'Xxxxxx Xxxxxx'
    fxreq.RequestedShipment.Recipient.Contact.EMailAddress = 'xxxxxx@xxxxxxxxx'

    # Details of Person Who is Paying for the Shipping
    fxreq.RequestedShipment.ShippingChargesPayment.PaymentType = 'SENDER'
    fxreq.RequestedShipment.ShippingChargesPayment.Payor.ResponsibleParty.AccountNumber = settings.FEDEX_ACCOUNT
    fxreq.RequestedShipment.ShippingChargesPayment.Payor.ResponsibleParty.Contact.PersonName = 'Xxxxx Xxxxx'
    fxreq.RequestedShipment.ShippingChargesPayment.Payor.ResponsibleParty.Contact.CompanyName = 'Xxxxx Xxxxxx'
    fxreq.RequestedShipment.ShippingChargesPayment.Payor.ResponsibleParty.Contact.PhoneNumber = 'x-xxx-xxx-xxxx'
    fxreq.RequestedShipment.ShippingChargesPayment.Payor.ResponsibleParty.Contact.EMailAddress = 'xxxxxxx@xxxxxxxxx'

    fxreq.RequestedShipment.ShippingChargesPayment.Payor.ResponsibleParty.Address.StreetLines = 'Xxxxx N. xXxxxxx'
    fxreq.RequestedShipment.ShippingChargesPayment.Payor.ResponsibleParty.Address.City = 'Xxxxxxx'
    fxreq.RequestedShipment.ShippingChargesPayment.Payor.ResponsibleParty.Address.StateOrProvinceCode = 'XX'
    fxreq.RequestedShipment.ShippingChargesPayment.Payor.ResponsibleParty.Address.PostalCode = 'xxxxx'
    fxreq.RequestedShipment.ShippingChargesPayment.Payor.ResponsibleParty.Address.CountryCode = 'US'

    # Package Info
    package1 = fxreq.create_wsdl_object_of_type('RequestedPackageLineItem')
    package1.SequenceNumber = '1'
    package1.Weight.Value = 1
    package1.Weight.Units = "LB"
    package1.Dimensions.Length = box_length
    package1.Dimensions.Width = box_width
    package1.Dimensions.Height = box_height
    package1.Dimensions.Units = "IN"
    package1.ItemDescription = 'Phone'
    fxreq.RequestedShipment.RequestedPackageLineItems.append(package1)
    fxreq.RequestedShipment.PackageCount = '1'

    try:
        fxreq.send_request()
        label_link = str(fxreq.response.CompletedShipmentDetail.AccessDetail.AccessorDetails[0].EmailLabelUrl)
    except Exception as exc:
        print('Fedex Error')
        print('===========')
        print(exc)
        print('==========')

    return label_link

错误日志

^{pr2}$

Tags: boxdatesettingsaddresscontactquoterecipientfedex