虾皮 Open Platform 与经典程序流程图

不管是在哪开始学习写程序,都一定会看到最经典的流程图:

至今,流程图的正确画法也不是那麽容易被在乎,反正只要看起来能解读成正确的意思就好; 但总的来说,以前的我只知道 if else 条件控制要用菱形,现在大概也只知道菱形的涵义。

既然这麽经典,那我就不多 Survey 这个流程图的细节了,像这样的标准流程图应该可以参考 Wiki,我们直接来看看有趣的部份。

有一大阵子前,我去申请了 Shopee Open Platform 的 API 串接,那真的是个噩梦,虾皮的文件 Definition 有些栏位告诉你是 float 或数值,但是在他没有给定的时候,value 会直接送你一个 "" 空字串 (哈哈,想不到吧),然後程序就爆炸了 (抱怨结束);

详情可以看看这个 Golang Open Platform API Wrapper 的描述:
https://github.com/teacat/shopeego

进入本题,虾皮的文件 (V1, V2) 中特别注记了 API Call Flows 的流程,而且把它们画成流程图:

V1: https://open.shopee.com/documents?module=63&type=2&id=54&version=1
V2: https://open.shopee.com/documents?module=87&type=2&id=60&version=2

之所以 Shopee Open Platform 要把它们画成 API,是因为开发者也必须知道店商流程是怎麽跑的,不能乱叫 API,作为范例,提供两个重点的流程图:

https://ithelp.ithome.com.tw/upload/images/20210911/20092753IMfrKMQnGT.png

这张图告诉你,一个买家买完商品之後,一开始捞到的资料会是 UNPAID 状态,如果他付完款 (含货到付款,等一下之後),就会进入 READY_TO_SHIP 这个状态,这个时候卖家後台应该就可以取得物流编号去超商寄件,只要被寄出之後,物流公司就会更新虾皮状态,状态变成 SHIPPED

了解状态流之後,接下来要看订单要如何改变状态,则需要参考第二个流程: Arrange Shipment & Get TrackingNo & Print AirwayBill

https://ithelp.ithome.com.tw/upload/images/20210911/200927535OS62g73kh.png

这上面大致上告诉你,如果你有一个很酷的应用程序,你可以用 get_shipment_list 或是 get_order_list 拿到订单列表,然後你还需要 call 一个必要的 get_order_detail 这个函数,取得订单详细资料,也许是要呼叫这个,你才能拿到订单是否需要拆开 (split_order) 这个资料栏位。

然後,不管怎样你还需要呼叫 get_shipping_parameter 取得这个人的运送方式,於是,流程图分支出现了 !!!,他居然写 select one,意思是跟开发者说,请你选择一个物流方式,这个应该不是叫你选一种,打天下,你可能会需要一些判断,看资料有没有某些参数,至少我在处理这个选择时,程序是这麽写的:


// 看看 NonIntegrated, Pickup, Dropoff 是不是空的,假设了虾皮给资讯也是三责一给,不会超过 1 个。
if orderShipmentDetail.InfoNeeded.NonIntegrated != nil {
    nonIntegrated = &shopeego.InitRequestNonIntegrated{
        TrackingNo: "卖家自选物流 " + order.ID,
    }
}
if orderShipmentDetail.InfoNeeded.Pickup != nil {
    // TODO: 实作 Pickup (没实作,因为在台湾没有用到)
}
if orderShipmentDetail.InfoNeeded.Dropoff != nil {
    dropoff = &shopeego.InitRequestDropoff{
        SenderRealName: p.SenderRealName,
    }
}

此时,看看 API 文件说了什麽?

https://open.shopee.com/documents?module=95&type=1&id=553&version=2

从文件上看来,NonIntegrated 是自选物流,比方说 XX 物流XX 邮政,而且是卖家自己选的,不会有物流追踪;

Pickup 很玄,大概是登门跟卖家取货,至少之前在台湾我没有遇过任何一个这样的订单,不过 2021 年 09 月虾皮多了一个店到店的物流,也许跟这个有关;

DropOff 是目前处理过的大部分订单都是给这个,这个才是最重要的,甚至里面要放卖家寄件的名字,而且名称不能乱填,否则退货你卖家就无法领,通通拿去烧毁。

总之,他告诉你 Select one 意思就是请你选一个带出直就好,不要三个 value 一起送,如果你这样送:

{
    "order_sn": "F020D20S2F0DS20F",
    "non_integrated": { …略 },
    "pickup": { …略 },
    "dropoff": { …略 },
}

这将是一个 big no no。

https://ithelp.ithome.com.tw/upload/images/20210911/20092753LdJOa36xpj.png

请你送出一个就好:

{
    "order_sn": "DS5F4S4DF54DS", 
    "dropoff": { …略 },
}

https://ithelp.ithome.com.tw/upload/images/20210911/20092753D6bEtWk4xW.png

当你组合好必要的参数之後,就使用 logistics.ship_order 送出,此时你的订单应该会进入产生物流的状态,接着你就要不断 update ,要用 update_shipping_order 去检查这个订单产生好了没,因为有时候物流家的系统会自杀,全台物流大爆炸,卖家无法寄件,这时候你的系统就要等他。

总之如果他产生好了,对开发者来说还有两个选择可以进行 (self-design airway bill?) ,你要自己设计物流单吗?

https://ithelp.ithome.com.tw/upload/images/20210911/20092753qP9GNeeiSl.png

要的话,只需要呼叫 get_shipping_document_info 自己产生条码,如果不是,你可以按照 No 那排的流程依序呼叫,你就会拿到物流单的影像档,像是全家是给你 Image,7-11 是丢给你网页(现在应该是 pdf),莱尔富跟 OK 都是 pdf,对於 pdf 的处理要小心就是,如果你用太旧的 pdf engine 处理,你的字体会直接爆炸。

过来人建议: 以调动成本考量,虾皮或超商一天到晚在那边变动,自己产生条码似乎是降低维护成本的方法。

对於流程图的范例,可以看到虾皮用了经典的 【档案】 流程图来描述更多讯息:

https://ithelp.ithome.com.tw/upload/images/20210911/20092753UJ8WTBfKqE.png

对於这个符号的使用情境,似乎会让人有点好奇,为什麽不直接写文字注解框起来就好,而是用档案符号,所以啦,除了菱形是条件 (condition) 之外,其实你要怎麽画,反正可以表达清楚就好。

额外补充

下面是一个初始化订单的范例的程序码 (框架基於 shopeego),不过这是 for V1 的 api。

// 初始化一个 Shopee 客户端。client:=shopeego.NewClient(&shopeego.ClientOptions{
	Secret: "0c2c7b3bd597fcf49dc985df2e44",
})
// 取得指定商店的资料。shop, _:=client.GetShopInfo(&shopeego.GetShopInfoRequest{
	PartnerID: 1234567,
	ShopID:    1234567,
	Timestamp: int(time.Now().Unix()),
})

// v1 code 建立出货单
_, err = client.Init(&shopeego.InitRequest{
        OrderSN:   orderID,
        PartnerID: p.PartnerID,
        ShopID:    p.ShopID,
        Timestamp: int(time.Now().Unix()),
        Dropoff:       dropoff,  // 如果没有,这个应该要是 nil
        Pickup:        pickup,  // 如果没有,这个应该要是 nil
        NonIntegrated: nonIntegrated, //如果没有,这个应该要是 nil
    })

if err != nil {
        panic("gg")
    }

随题附上可以绘制流程图的工具参考: Visio、Visual Paradigm,也可以使用 Cacoo、Figma 或是用 HackMD 内建的 flowcharts 语法,用 code 来绘制流程图,看起来就很潮。


<<:  Day 11 | 进阶清单元件RecyclerView

>>:  Day 11-假物件 (Fake) - 虚设常式 (Stub)-3 (核心技术-3)

如何用 Apps Script 寄出客制化的 Google 表单并搜集分散在 Google Sheet 中的回应?(三)一次搜集很多 Google Form 内的回应

今天的目标 很多时候我们会需要搜集些不同的资料。像是 Marketing 在做大规模但针对不同组织的...

Day 7 - 原型 (6): 预览主页

前言 今天利用之前所建的主页, 建立一个可让使用者互动的原型。 预览 利用Figma的预览功能, 即...

学习javascript前...CSS1

现在来学习CSS 如果说 HTML 是用来处理主要网页结构,CSS 就是来处理网页细节的。负责美化跟...

[Day28]- 新手的Web系列JSON Injection 0x1

Day28- 新手的Web系列JSON Injection 0x1 正文 JSON 介绍 JSON ...

Day28 ATT&CK for ICS - Command and Control

Command and Control 攻击者已经进入工控环境之後,从自己的服务器传送指令给受害主机...