倉儲系統接口文檔

業務流程java


第三方電商平臺與中外運訂單倉儲系統的數據交換按照業務的須要主要有如下幾個:推送採購單、取消採購單、採購單貨物清點回調、線下發送提貨單(保稅模式)、提貨單出庫回調、推送訂單、取消訂單、缺貨通知、打單回調、分揀回調、打包回調、打包回調、出庫回調、海關扣留通知、庫存查詢、盤庫結果回調、軌跡查詢。算法

詳細介紹sql


採購單

1.推送採購單
推送採購單是整個業務開始的第一步,採購單由第三方電商平臺推送給中外運訂單倉儲系統,告知中外運該電商平臺於什麼時候有何商品及件數到達某個倉庫,以便中外運倉庫展開後續收貨等操做。apache

2.取消採購單
取消採購單是指第三方電商平臺對以前已經推送過的採購單(中外運倉庫還沒有收貨)進行取消的操做。json

3.採購單貨物清點回調
採購單貨物清點回調是指中外運倉庫在收到第三方電商平臺指定採購單的貨物時,將貨物的數量及貨物的損壞狀況推送/反饋給第三方電商平臺,若倉庫方在入庫理貨時發現商品數量與採購單上標識的不符,會與第三方電商平臺先行線下溝通達成一致後,再調用採購單入庫接口推送入庫數據。api

提貨出庫(保稅模式)

該模式中外運方只負責將第三方電商平臺在中外運國外倉庫的商品按照提貨單發送到電商平臺國內指定保稅倉,不涉訂單及其餘後續流程。安全

1.線下發送提貨單
第三方電商平臺可經過事先約定好的模式告知中外運方須要提貨的商品及明細,以便中外運倉庫進行相應操做。bash

2.提貨單出庫回調
提貨單出庫回調是指中外運倉庫在將指定提貨單的商品進行出庫操做以後,將操做明細反饋給第三方電商平臺。markdown

訂單

訂單由第三方電商平臺按照中外運方指定的格式及內容發送給中外運方,中外運方按照訂單中的商品信息及收貨信息進行後續的發貨和申報操做。訂單的狀態按照操做的順序(已取消狀態不參與排序)有如下狀態:待處理、已打單、已分揀、已打包、已出庫、航空配載、已申報、海關扣留、已清關、轉交國內快遞、正在派送、已簽收、已取消。這些狀態分別對應操做流程中不一樣的環節。
1.推送訂單
推送訂單是指第三方電商平臺將客戶的訂單中的部分信息推送給中外運訂單倉儲系統,以便中外運倉庫進行訂單商品的打包出庫等後續操做。網絡

2.取消訂單
取消訂單是指第三方電商平臺將已發送的訂單取消的操做,當訂單的狀態在
已打包及後續的某個狀態時,該訂單將不可取消。

3.缺貨通知
缺貨通知是指中外運方在某個訂單對應的商品缺貨時發送給第三方電商平臺的通知,以便電商平臺進行後續的採購或者其餘操做。

4.打單回調
打單回調是指中外運方推送給第三方電商平臺,告知某個訂單已經開始在倉庫中進行處理了。

5.分揀回調
分揀回調是指中外運方推送給第三方電商平臺,告知某個訂單已經在倉庫中進行了分揀的操做以及分揀的商品的明細。

6.打包回調
打包回調是指中外運方推送給第三方電商平臺,告知某個訂單已經在倉庫中進行了打包的操做以及打包的商品的明細。

7.出庫回調
出庫回調是指中外運方推送給第三方電商平臺,告知某個訂單已經在倉庫中進行了出庫的操做、訂單的包裹信息(國內快遞單號)以及出庫的商品的明細,至此訂單在中外運國外轉運倉的操做結束。

8.海關扣留通知
海關扣留通知是指中外運方在訂單對應的包裹到運抵國內指定海關關口,進行申報以後海關反饋的狀態,扣留緣由會在反饋的信息中展現。

庫存信息

1.庫存查詢
庫存查詢是指第三方電商平臺查詢指定商品在中外運訂單倉儲系統中當前的庫存信息。

2.盤庫結果回調
盤庫結果回調是指中外運倉庫方根據第三方電商平臺的要求進行指定商品的盤庫,並將盤庫的結果反饋給電商平臺。

軌跡信息

1.軌跡查詢
軌跡查詢是指第三方電商平臺根據訂單號從中外運訂單倉儲系統中獲取該訂單當前的軌跡信息。


接口文檔

第三方發送數據流程
  1. 身份驗證,系統會給每一個接入用戶分配一個惟一的身份ID(AppID)及與之對應的訪問祕鑰(AuthCode),API用戶在向接口正式發送或接收數據前,必須先把AppID和AuthCode發送到指定的驗證地址,驗證經過後,API接口會返回一個有時效的Token(兩小時內有效):
驗證地址:https://efreight.cn/api/auth

Request數據:{‘appid’:AppID, ‘auth_token’:AuthCode}
測試系統:    AppID:***** AuthCode: ***** Response數據:Auth_token

2.發送接收數據,將請求報文和身份驗證經過後獲取的Token同時發送給數據處理接口,咱們的平臺處理完成後會返回成功或失敗報文:

數據接口地址:https://efreight.cn/api/post Request數據: { ‘auth_token’: Auth_token, //上一步生成的token ‘platform’: ‘xxxx’,//xxxx:與訂單系統約定好的平臺名稱 ‘function’: ‘xxxxOrder’ , ‘type’: ‘1’ ‘data’: XML報文 }

參數說明:

auth_token    上一步生成的token
platform:    生產環境:xxxx,測試環境:xxxx(需提早溝通約定)
function    海淘訂單接口: HTOrder
            直郵訂單接口: DMOrder
            軌跡接口:LogisticTrace
            身份證接口:IdentityUpload
            商品備案信息接口:MerchantRegisterInfo
            採購訂單接口: InboundPlan 
            取消採購單: CancelPurchase 
            取消用戶訂單: CancelOrder
            庫存查詢: Inventory
            (以上接口在實際過程當中可能根據接入用戶的需求不一樣而不一樣,需雙方提早約定)
type    0: JSON,1: XML data 報文格式見下文說明

Response數據:
對於不一樣的請求報文有不一樣的返回數據,下述爲默認狀況下的標準報文。

<ServiceResult> <ResultCode>1</ResultCode> <!—ResultCode爲1或2時成功,其餘爲失敗--> <ResultContent>服務調用成功</ResultContent> <!—若是失敗,則此節點爲失敗緣由--> <ResultData></ResultData> <!—成功後,返回的數據--> </ServiceResult>

接口明細

1.推送採購單

{
    "purchase_id": "purchase_id", // 採購單號;String類型,建議預留40位 "transport_service_code": "ems", // 物流供應商代號,非必填;String類型 "transport_order_id": "qaws12345", // 物流單號,非必填;String類型 "remark": "集裝箱號xxx,司機電話xxx", // String類型 "expect_arrival_time": "2014-11-06 16:16:20", // 預期抵達時間,非必填;String類型 "order_items": [// 物品列表 { "sku_id": "sku_id", // sku_id;String類型,建議預留40位 "product_no": "12345", // 自定義商品序列號 與sku一一對應 可打印成條形碼;String類型,建議預留40位 "goods_name": "飛利浦電飯煲", // 商品名;String類型 "sku_name": "飛利浦電飯煲(白金內膽)", // 規格名稱;String類型 "qty": 1000 // 數量;int類型 }, { "sku_id": "sku_id", "product_no": "12345", "goods_name": "飛利浦電飯煲", "sku_name": "飛利浦電飯煲(鋁合金內膽)", "qty": 1000 } ] }

2.取消採購單報文

{
    "purchase_id":"test_purchase_id" // 採購單號 }

3.海淘訂單請求報文

<Order> <!--商品供應商:ABC,SINOTRANS--> <SupplyVendor>SINOTRANS</SupplyVendor> <!--轉運渠道:跨境我的物品,跨境直郵--> <SupplyChannel/> <!--清關口岸:廣州,成都,杭州--> <ClearPort/> <!--填電商企業名稱,需提早約定好--> <eStoreNo>電商企業編碼</eStoreNo> <!--第三方商城的訂單號--> <OrderNo>訂單編號</OrderNo> <!--可不填--> <PaymentNo>支付單號</PaymentNo> <!--提早約定好的快遞單號--> <ParcelCode>包裹單號</ParcelCode> <OrderTotalAmount>訂單總金額</OrderTotalAmount> <OrderTotalCount>總件數</OrderTotalCount> <!--可不填--> <FreightCharge>運費</FreightCharge> <!--可不填--> <TarrifCharge>關稅</TarrifCharge> <OrderTime>成交時間</OrderTime> <Note>訂單備註</Note> <Buyer> <BuyerID>購買人電商帳號</BuyerID> <BuyerName>購買人姓名</BuyerName> <BuyerEmail>購買人郵箱</BuyerEmail> <BuyerPhone>聯繫電話</BuyerPhone> <BuyerAddress>地址</BuyerAddress> <BuyerIdentityCardType>證件類型</BuyerIdentityCardType> <BuyerIdentityCardNo>證件號碼</BuyerIdentityCardNo> </Buyer> <Consignee> <!--必填--> <ConsigneeName>收件人姓名</ConsigneeName> <ConsigneeEmail>收件人郵箱</ConsigneeEmail> <!--必填--> <ConsigneePhone>收件人電話</ConsigneePhone> <ConsigneePost>收件人郵編</ConsigneePost> <!--必填--> <ConsigneeAddress>收件人地址</ConsigneeAddress> <!--必填,報關時使用--> <ConsigneeIdentityCardType>證件類型</ConsigneeIdentityCardType> <!--必填,報關時使用--> <ConsigneeIdentityCardNo>證件號碼</ConsigneeIdentityCardNo> </Consignee> <OrderDetailList> <OrderDetailItem> <!--此處請填寫約定好的商品ID--> <SKUCode>商品編號</SKUCode> <SKUName>商品名稱</SKUName> <SKUModel>規格型號</SKUModel> <SKUPrice>單價</SKUPrice> <SKUCount>數量</SKUCount> <NETWeight>淨重</NETWeight> </OrderDetailItem> <OrderDetailItem> <SKUCode>商品編號</SKUCode> <SKUName>商品名稱</SKUName> <SKUModel>規格型號</SKUModel> <SKUPrice>單價</SKUPrice> <SKUCount>數量</SKUCount> <NETWeight>淨重</NETWeight> </OrderDetailItem> </OrderDetailList> </Order>

4.直郵訂單報文

<Order> <!--商品供應商:ABC,SINOTRANS--> <SupplyVendor>SINOTRANS</SupplyVendor> <!--轉運渠道:跨境直郵,保稅--> <SupplyChannel/> <!--清關口岸:廣州,成都,杭州--> <ClearPort/> <!--填電商企業名稱,需提早約定好--> <eStoreNo>電商企業編碼</eStoreNo> <!--第三方商城的訂單號--> <OrderNo>訂單編號</OrderNo> <!--可不填--> <PaymentNo>支付單號</PaymentNo> <!--提早約定好的快遞單號--> <ParcelCode>包裹單號</ParcelCode> <OrderTotalAmount>訂單總金額</OrderTotalAmount> <OrderTotalCount>總件數</OrderTotalCount> <!--可不填--> <FreightCharge>運費</FreightCharge> <!--可不填--> <TarrifCharge>關稅</TarrifCharge> <OrderTime>成交時間</OrderTime> <Note>訂單備註</Note> <Buyer> <BuyerID>購買人電商帳號</BuyerID> <BuyerName>購買人姓名</BuyerName> <BuyerEmail>購買人郵箱</BuyerEmail> <BuyerPhone>聯繫電話</BuyerPhone> <BuyerAddress>地址</BuyerAddress> <BuyerIdentityCardType>證件類型</BuyerIdentityCardType> <BuyerIdentityCardNo>證件號碼</BuyerIdentityCardNo> </Buyer> <Consignee> <!--必填--> <ConsigneeName>收件人姓名</ConsigneeName> <ConsigneeEmail>收件人郵箱</ConsigneeEmail> <!--必填--> <ConsigneePhone>收件人電話</ConsigneePhone> <ConsigneePost>收件人郵編</ConsigneePost> <!--必填--> <ConsigneeAddress>收件人地址</ConsigneeAddress> <ConsigneeIdentityCardType>證件類型</ConsigneeIdentityCardType> <ConsigneeIdentityCardNo>證件號碼</ConsigneeIdentityCardNo> </Consignee> <OrderDetailList> <OrderDetailItem> <!--此處請填寫約定好的商品ID--> <SKUCode>商品編號</SKUCode> <SKUName>商品名稱</SKUName> <!--如Size:S、M、L或顏色等信息--> <SKUModel>規格型號</SKUModel> <!--申報須要用到的單價,不是大家商城的價格--> <SKUPrice>單價</SKUPrice> <SKUCount>數量</SKUCount> <NETWeight>淨重</NETWeight> <mailTaxNo>行郵稅號</mailTaxNo> <!--海關備案產生 --> <goodsItemNo>商品料號</goodsItemNo> <!--142:中國--> <productionMarketingCountry>產銷國編碼</productionMarketingCountry> <!--142:人民幣--> <bargainCurrency>幣種編碼</bargainCurrency> <!--申報數量--> <declareCount>1.00</declareCount> <!--011: 件--> <declareMeasureUnit>申報計量單位</declareMeasureUnit> <goodsRoughWeight>商品毛重</goodsRoughWeight> <firstUnit>第一單位</firstUnit> <firstCount>第一數量</firstCount> <secondUnit/> <secondCount/> </OrderDetailItem> <OrderDetailItem> <!--此處請填寫約定好的商品ID--> <SKUCode>商品編號</SKUCode> <SKUName>商品名稱</SKUName> <!--如Size:S、M、L或顏色等信息--> <SKUModel>規格型號</SKUModel> <!--申報須要用到的單價,不是大家商城的價格--> <SKUPrice>單價</SKUPrice> <SKUCount>數量</SKUCount> <NETWeight>淨重</NETWeight> <mailTaxNo>行郵稅號</mailTaxNo> <!--海關備案產生 --> <goodsItemNo>商品料號</goodsItemNo> <!--142:中國--> <productionMarketingCountry>產銷國編碼</productionMarketingCountry> <!--142:人民幣--> <bargainCurrency>幣種編碼</bargainCurrency> <!--申報數量--> <declareCount>1.00</declareCount> <!--011: 件--> <declareMeasureUnit>申報計量單位</declareMeasureUnit> <goodsRoughWeight>商品毛重</goodsRoughWeight> <firstUnit>第一單位</firstUnit> <firstCount>第一數量</firstCount> <secondUnit/> <secondCount/> </OrderDetailItem> </OrderDetailList> </Order>

5.取消訂單

{
    "order_id":"test_order_id" //訂單號 }

6.庫存查詢

{
    "sku_ids": [// 查詢的sku id列表 "sku_id_1", "sku_id_2", "sku_id_3" ] }

7.軌跡請求報文

<OrderNo>訂單編號</OrderNo><!--第三方商城的訂單號-->

8.身份證上傳報文
對應有商品備案的模式,即直郵訂單,不須要傳身份證

<IdentityInfo> <!-- 證件人名稱 --> <IDName>張三</IDName> <!-- 證件號碼 --> <IDCard>身份證號</IDCard> <!-- 證件類型 --> <MsgType>身份證</MsgType> <Forwarder/> <InputHandler>上傳人</InputHandler> <Filepaths> <Filepath> <!-- 0:正面,1:反面 --> <frontandback>0</frontandback> <ImgData><![CDATA[ 圖片base64編碼 ]]></ImgData> </Filepath> <Filepath> <!-- 0:正面,1:反面 --> <frontandback>1</frontandback> <ImgData><![CDATA[ 圖片base64編碼 ]]></ImgData> </Filepath> </Filepaths> </IdentityInfo>

第三方接收數據流程

由第三方提供用於接收中外運推送數據的地址, 中外運方負責推送倉庫做業中關鍵節點的數據。

  1. 凡涉及時間類型,統一使用以下格式『2014-12-12 23:23:23』,若是部分數值取不到,顯示00,例如:『2014-12-12 00:00:00』

  2. 凡涉及重量的數值,單位均取『克』

  3. 接口都採用HTTP POST請求,用於認證和容錯的相關字段直接放POST請求的body parameter,具體報文以JSON字符串放在data這個parameter裏面,data的格式詳見下文

4.第三方返回數據格式:

{
    "success」:true/false, "error_msg":"失敗緣由" }

5.若是一方訪問對方接口的請求失敗,則其必須保證用以前請求的流水號(notify_id)發起重試請求,直至返回成功結果

sign                 abc1234
    notify_type          31 notify_id opopz notify_time 2014-12-12 23:23:23 wms_id zwy stock_id 123 owner_id 456 data {"weight":1,"transport_order_id": "123"}

參數解釋

sign:加密簽名,算法見附錄
notify_type:10 - 導入採購單、11 - 取消採購單、20 - 用戶下單、21 - 取消用戶下單、30 - 採購單入庫回調、31 - 用戶訂單出庫回調、40 - 指令倉庫發貨、50 - 盤點、51 – 提貨出庫、60 - 庫存查詢 notify_id:網絡請求流水號,notify_id相同的請求被認爲是同一個請求的屢次重試 notify_time:請求時間戳 wms_id:第三方WMS系統在網易系統中的代號,雙方提早約定;String類型 stock_id:具體倉庫在網易系統中的ID,會提早告知第三方WMS;int類型 owner_id:網易在第三方WMS系統中的ID;int類型 data:具體數據,標準JSON格式字符串,詳見下文

接口明細

1.採購單入庫回調
當採購貨物到達倉庫,倉庫完成貨品清點,將貨品入庫狀況通知第三方。

{
    "purchase_id": "test_purchase_id",// 入庫操做對應的採購單號 "transport_service_code": "EMS",// 物流商,非必填 "transport_order_id": "qaws12345",// 物流號,非必填 "arrival_begin_time": "2014-11-06 16:16:20",// 入庫開始時間 "arrival_end_time": "2014-11-06 16:16:20",// 入庫結束時間 "order_items": [// 物品列表 { "sku_id": "sku id", "weight": 110, // 入庫時給物品進行稱重,單位『克』;int類型 "qty_good": 1000, // 良品數 "qty_not_good": 1000,// 不良品數 "qty_bad": 1000// 次品數 }, { "sku_id": "sku id", "weight": 110, "qty_good": 1000, "qty_not_good": 1000, "qty_bad": 1000 } ] }

2.用戶訂單出庫(出庫細分爲打單、分揀、打包、發貨等子狀態)回調
中外運倉庫處理第三方電商平臺推送過來的訂單,遇到打單,分揀,打包,發貨,分揀缺貨,海關扣留等節點時,經過該接口通知第三方電商平臺。

{
    "order_id": "test_order_id",// 訂單號 "order_status": 100,// 細分爲50 - 打單(打印分揀單)、100 - 分揀(分揀員揀貨)、200 - 打包(按照用戶訂單打包)、300 - 發貨(包裹交付物流商攬收)、400 - 分揀缺貨(揀貨時發現庫存不足)、500 - 海關扣留等子狀態;int類型 "weight": 110,//發貨時需要返回包裹實際重量,用於結算運費,單位『克』;int類型 "transport_service_code": "EMS",//物流商,發貨(300)時才需要這個字段 "transport_order_id": "qaws12345",//物流號,發貨(300)時才需要這個字段 "order_items": [//物品清單,發貨(300)時需要填寫物品列表,其餘子狀態不須要 { "sku_id": "sku id",//商品sku "qty": 1000//商品件數 }, { "sku_id": "sku id", "qty": 1000 } ] }

3.盤點狀況回調
倉庫進行例行盤點或者網易提出盤點要求時,倉庫方進行盤點並將結果回傳網易。

{
    "check_id": "test_check_id",// 盤點單號,具體格式見下文;String類型 "type": 0, // 0 – 盤盈;1 – 盤虧;int類型 "remark": "關於這次盤點狀況的說明", "inventory": [ { "sku_id": "test_sku_id_1", // sku_id "good_profit_qty": 1,// 良品盤盈數 "good_loss_qty": 0, // 良品盤虧數 "bad_profit_qty": 1, // 次品盤盈數 "bad_loss_qty": 0// 次品盤虧數 }, { "sku_id": "test_sku_id_2", "good_profit_qty": 0, "good_loss_qty": 1, "bad_profit_qty": 0, "bad_loss_qty": 1 } ] }

4.提貨出庫回調
第三方電商或者海關等有關部門直接從中外運倉庫提貨,倉庫方與第三方電商平臺溝通確認後調用此接口通知電商系統這次提貨的出庫狀況。

{
    "lading_id": "test_lading_id", // 提貨單號,具體格式見下文;String類型 "type": 2, // 2 – 提貨出庫;int類型 "remark": "關於這次提貨狀況的說明", // 提貨狀況備註 "inventory": [ { "sku_id": "test_sku_id_1", // sku_id "good_qty": 1, // 良品提貨數 "bad_qty": 1// 次品提貨數 }, { "sku_id": "test_sku_id_2", "good_qty": 1, "bad_qty": 1 } ] }

爲了提升加密安全性,簽名算法爲RSA加密
RSA代碼見下面RSA.java文件內容,主要包括:
genRSAKeyPair – 生成公私鑰對
sign(PrivateKey privateKey, String src, String encode) – 使用私鑰從src(即:接口定義中的『data』字段)生成sign;encode取值『UTF-8』
verify(PublicKey publicKey, String sign, String src, String encode) – 使用公鑰驗證sign合法性;encode取值『UTF-8』

RSA.java
import java.nio.charset.Charset; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.security.SecureRandom; import java.security.Signature; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; /** * RSA加密,公私鑰、加密串等都是16進制編碼 * * @author mamingli */ public class RSA { private static final Logger logger = Logger.getLogger(RSA.class); public static final String SIGN_ALGORITHMS = "SHA1WithRSA"; /** * 獲得私鑰對象 * * @param key * 密鑰字符串(通過16進制編碼) * @throws Exception */ public static PrivateKey getPrivateKey(String key) throws PayException { try { byte[] keyBytes = StringUtil.hexStrToBytes(key.trim()); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); return keyFactory.generatePrivate(keySpec); } catch (Exception e) { String info = "getPrivateKey failed: " + key + " | " + e.getMessage(); logger.error(info, e); throw new PayException(PayException.NORMAL_ERROR, info, e); } } /** * 獲得公鑰對象 * * @param key * 密鑰字符串(通過16進制編碼) * @throws Exception */ public static PublicKey getPublicKey(String key) throws PayException { try { byte[] keyBytes = StringUtil.hexStrToBytes(key.trim()); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); return keyFactory.generatePublic(keySpec); } catch (Exception e) { String info = "getPublicKey failed: " + key + " | " + e.getMessage(); logger.error(info, e); throw new PayException(PayException.NORMAL_ERROR, info, e); } } /** * 本方法使用SHA1withRSA簽名算法產生簽名 * * @param privateKey * privateKey 簽名時使用的私鑰(16進制編碼) * @param src * src 簽名的原字符串 * @return String 簽名的返回結果(16進制編碼)。當產生簽名出錯的時候,返回null。 * @throws PayException */ public static String sign(PrivateKey privateKey, String src, String encode) throws PayException { try { Signature sigEng = Signature.getInstance(SIGN_ALGORITHMS); sigEng.initSign(privateKey); sigEng.update(src.getBytes(encode)); byte[] signature = sigEng.sign(); return StringUtil.bytesToHexStr(signature); } catch (Exception e) { String info = "sign failed: " + src + " | " + e.getMessage(); logger.error(info, e); throw new PayException(PayException.GENERATE_SIGNATURE_FAIL, info, e); } } /** * 本方法使用SHA1withRSA簽名算法驗證簽名 * * @param publicKey * pubKey 驗證簽名時使用的公鑰(16進制編碼) * @param sign * sign 簽名結果(16進制編碼) * @param src * src 簽名的原字符串 * @throws PayException * 驗證失敗時拋出異常 */ public static void verify(PublicKey publicKey, String sign, String src, String encode) throws PayException { try { if (StringUtils.isBlank(sign) || StringUtils.isBlank(src)) { throw new PayException(PayException.VERIFY_SIGNATURE_FAIL, "sign or src isBlank"); } Signature sigEng = Signature.getInstance("SHA1withRSA"); sigEng.initVerify(publicKey); sigEng.update(src.getBytes(encode)); byte[] sign1 = StringUtil.hexStrToBytes(sign); if (!sigEng.verify(sign1)) { throw new PayException(PayException.VERIFY_SIGNATURE_FAIL); } } catch (Exception e) { String info = "verify failed: " + sign + " | " + src + " | " + e.getMessage(); logger.error(info, e); throw new PayException(PayException.VERIFY_SIGNATURE_FAIL, info, e); } } /** * 本方法用於產生1024位RSA公私鑰對。 * * @return 私鑰、公鑰 */ private static String[] genRSAKeyPair() { KeyPairGenerator rsaKeyGen = null; KeyPair rsaKeyPair = null; try { logger.error("Generating a pair of RSA key ... "); rsaKeyGen = KeyPairGenerator.getInstance("RSA"); SecureRandom random = new SecureRandom(); random.setSeed(("" + System.currentTimeMillis() * Math.random() * Math.random()).getBytes(Charset .forName("UTF-8"))); rsaKeyGen.initialize(1024, random); rsaKeyPair = rsaKeyGen.genKeyPair(); PublicKey rsaPublic = rsaKeyPair.getPublic(); PrivateKey rsaPrivate = rsaKeyPair.getPrivate(); String privateAndPublic[] = new String[2]; privateAndPublic[0] = StringUtil.bytesToHexStr(rsaPrivate.getEncoded()); privateAndPublic[1] = StringUtil.bytesToHexStr(rsaPublic.getEncoded()); logger.error("私鑰:" + privateAndPublic[0]); logger.error("公鑰:" + privateAndPublic[1]); logger.error("1024-bit RSA key GENERATED."); return privateAndPublic; } catch (Exception e) { logger.error("genRSAKeyPair error:" + e.getMessage(), e); return null; } } }
關於product_no的詳細說明

商品出廠時打印在商品上面的條形碼其實存在能夠對應多個sku的狀況,建議電商平臺爲每一個sku生成一個product_no,這個product_no有雙重做用:

  1. 保稅模式下,在海關備案,即:做爲料號
  2. 中外運倉庫方打印成條形碼,貼在每個單個貨品上,用於取代商品出廠時原生的條形碼,以便在倉庫做業時掃描



文/Mars白雲(簡書做者) 原文連接:http://www.jianshu.com/p/6e11f187db8f 著做權歸做者全部,轉載請聯繫做者得到受權,並標註「簡書做者」。
相關文章
相關標籤/搜索