NodeJS 适用于SurePost的UPS API

xam8gpfp  于 11个月前  发布在  Node.js
关注(0)|答案(2)|浏览(117)

我正在为一个客户建立一个运输成本最小化。我有一个来自不同供应商(美国邮政,UPS)的运输选项列表,除了UPS SurePost,我都有工作。客户确实为帐户设置了SurePost。有一个线程here,有人把XML示例。我也有补充文档。
有没有人成功地以JSON格式为SurePost Get Rates获取API调用?我尝试了更改工作UPS Ground调用(如下所示)并以JSON格式复制补充文档中的示例XML调用。两者都不起作用,事实上,我从UPS得到的响应甚至不是一些XML样式的错误消息,而是乱码(如下所示)。
请参阅我的示例API数据包。请注意,当Service '03' 'Ground'未注解时,这是一个经过验证的工作API调用。当我将其更改为'93'(适用于SurePost 1 lb或更大)和描述'Parcel Select'(来自补充文档)时,我得到一个响应代码400和一个乱码。

let data = JSON.stringify({
                            "RateRequest":{
                              "Request":{
                                "SubVersion":"1703",
                                "TransactionReference":{
                                  "CustomerContext":" "
                                }
                              },
                              "Shipment":{
                                "ShipmentRatingOptions":{
                                  "UserLevelDiscountIndicator":"TRUE"
                                },
                                "Shipper":{
                                  "Name":"Billy Blanks",
                                  "ShipperNumber":" ",
                                  "Address":{
                                    "AddressLine":"366 Robin LN SE",
                                    "City":"Marietta",
                                    "StateProvinceCode":"GA",
                                    "PostalCode":"30067",
                                    "CountryCode":"US"
                                  }
                                },
                                "ShipTo":{
                                  "Name":"Sarita Lynn",
                                  "Address":{
                                    "AddressLine":"355 West San Fernando Street",
                                    "City":"San Jose",
                                    "StateProvinceCode":"CA",
                                    "PostalCode":"95113",
                                    "CountryCode":"US"
                                  }
                                },
                                "ShipFrom":{
                                  "Name":"Billy Blanks",
                                  "Address":{
                                    "AddressLine":"366 Robin LN SE",
                                    "City":"Marietta",
                                    "StateProvinceCode":"GA",
                                    "PostalCode":"30067",
                                    "CountryCode":"US"
                                  }
                                },
                                "Service":{
                                  // Uncomment the desired service
                                  //"Code" : "03",
                                  //"Description" : "Ground"
                                  "Code":"93",
                                  "Description" : "Parcel Select"
                                },
                                "Package":{
                                  "PackagingType":{
                                    "Code":"02",
                                    "Description":"Package"
                                  },
                                  "Dimensions":{
                                    "UnitOfMeasurement":{
                                      "Code":"IN"
                                    },
                                    "Length":"7",
                                    "Width":"7",
                                    "Height":"6"
                                  },
                                  "PackageWeight":{
                                    "UnitOfMeasurement":{
                                      "Code":"LBS"
                                    },
                                    "Weight":"7"
                                  }
                                }
                              }
                            }
                          });

let headers = {
                'AccessLicenseNumber' : 'MYLICENSENUM',
                'Password' : 'MYPASSWORD',
                'Content-Type' : 'application/json',
                'Content-Length' : data.length,
                'transID' : 'Trans' + Date.now().toString(),
                'transactionSrc' : 'node',
                'Username' : 'MYUSERNAME',
                'Accept' : '*/*'
              };

let options = {
                'hostname' : 'wwwcie.ups.com',
                'path' : '/ship/v1/rating/Rate',
                'method' : 'POST',
                'headers' : headers
              };

字符串
请求作为这些options的节点https.request发送。
对于一个SurePost调用,响应代码是400,消息是乱码,正如我所说的。请看这张图片,其中包括一个toString('hex')显式写入返回的字节值,以及一个普通的toSting()尝试人类可读的打印。


的数据
有没有人对此错误有任何输入,什么可能是畸形的?所有的补充文档说,需要的是服务代码93(或92为小于1磅)。所以,由于这适用于服务代码03 UPS地面,我希望这工作,至少足够好,给予我一个有效的错误信息,解释任何其他需要。

lkaoscv7

lkaoscv71#

我能够让它工作。首先,我从不相关的问题here中发现有一个/json/路由,所以我猜(正确地)我可以使用/json/Rate。此外,为了参与SurePost,我不能使用示例示例中的假Shipper数据,因为帐户必须设置SurePost。完整(消毒)解决方案如下:

let data = JSON.stringify({
                            "Security": {
                              "UsernameToken": {
                                "Username": "MYUSERNAME",
                                "Password": "MYPASSWORD"
                              },
                              "UPSServiceAccessToken": {
                                "AccessLicenseNumber": "MYACCESSLICENSENUMBER"
                              }
                            },
                            "RateRequest":{
                              "Request":{
                                "SubVersion":"2201",
                                "RequestOption" : "Rate",
                                "TransactionReference":{
                                  "CustomerContext":" "
                                }
                              },
                              "Shipment":{
                                "ShipmentRatingOptions":{
                                  "UserLevelDiscountIndicator":"TRUE"
                                },
                                "Shipper":{
                                  "Name":"MYCOMPANYNAME",
                                  "ShipperNumber":"MYSIXDIGITNUMBER",
                                  "Address":{
                                    "AddressLine":"MYCOMPANYADDRESS",
                                    "City":"MYCITY",
                                    "StateProvinceCode":"MYSTATE",
                                    "PostalCode":"MYZIP",
                                    "CountryCode":"US"
                                  }
                                },
                                "ShipTo":{
                                  "Name":"Sarita Lynn",
                                  "Address":{
                                    "AddressLine":"355 West San Fernando Street",
                                    "City":"San Jose",
                                    "StateProvinceCode":"CA",
                                    "PostalCode":"95113",
                                    "CountryCode":"US"
                                  }
                                },
                                "ShipFrom":{
                                  "Name":"Billy Blanks",
                                  "Address":{
                                    "AddressLine":"366 Robin LN SE",
                                    "City":"Marietta",
                                    "StateProvinceCode":"GA",
                                    "PostalCode":"30067",
                                    "CountryCode":"US"
                                  }
                                },
                                "Service":{
                                  "Code":"93",
                                  "Description":"Parcel Select"
                                },
                                "Package":{
                                  "PackagingType":{
                                    "Code":"02",
                                    "Description":"Package"
                                  },
                                  "Dimensions":{
                                    "UnitOfMeasurement":{
                                      "Code":"IN"
                                    },
                                    "Length":"10",
                                    "Width":"7",
                                    "Height":"5"
                                  },
                                  "PackageWeight":{
                                    "UnitOfMeasurement":{
                                      "Code":"LBS"
                                    },
                                    "Weight":"7"
                                  }
                                }
                              }
                            }
                          });

let headers = {
                'Content-Type' : 'application/json',
                'Content-Length' : data.length,
                'Accept' : '*/*'
              };

// wwwcie - Customer Integration
// onlinetools - Production
let options = {
                'hostname' : 'wwwcie.ups.com',
                'path' : '/json/Rate',
                'method' : 'POST',
                'headers' : headers
              };

let result = "";

async function api_call(){

    let req = https.request(options, res => {
                                              console.log(`statusCode: ${res.statusCode}`);
                                              res.on('data', (d) => { result += d.toString(); });
                                            });


    req.on('error', error => {
        console.error(error)
    });

    await req.write(data);
    await req.end();

}

字符串
编辑:作为最后一个'gotcha',当做SurePost小于1磅(代码'92'),一定要使用“代码”:“OZS”为'PackageWeight'.'UnitOfMeasurement'.请注意,'OZ'将 * 不 * 工作和错误消息不 * 指示您使用'OGS'.对我来说,当使用'LBS'它只是说测量单位是错误的,当使用'OZ'它说只使用'LBS'或'KGS'!文档和错误消息,留下了很多需要.

gpnt7bae

gpnt7bae2#

请求的这一部分确实有效。如果你得到“.一个计量单位”的错误,这是92/93服务代码。92为OZS和.1 - 15.99盎司。93为1磅及以上。

"Service": {
      "Code": "92",
      "Description": "SurePost"
    },
    "Package": {
      "Description": " ",
      "Packaging": {
        "Code": "02",
        "Description": "Nails"
      },
      "Dimensions": {
        "UnitOfMeasurement": {
          "Code": "IN",
          "Description": "Inches"
        },
        "Length": "10",
        "Width": "30",
        "Height": "45"
      },
      "PackageWeight": {
        "UnitOfMeasurement": {
          "Code": "OZS",
          "Description": "Ounces"
        },
        "Weight": "14"
      }

字符串

相关问题