对接快递100
场景
根据单号、快递公司编码、手机号,快速查到订单快递状态。
使用zion外接api的功能对接快递100查询物流信息
1.首先找客户要快递100相关授权信息。
2.查看快递100的api说明文档:https://api.kuaidi100.com/document/5f0ffb5ebc8da837cbd8aefc
可知它的请求类型为post,Content-Type为application/x-www-form-urlencoded 关键的难点是请求参数sign是需要经过MD5加密的
新建个行为流名字叫tosign:入参是com(快递公司编码) ,num(单号),phone(手机号),出参是sign(加密后的签名),param(请求体里param的参数),类型都是文本类型
加密的js代码,入参是com(快递公司编码) ,num(单号),phone(手机号),出参是sign(加密后的签名),param(请求体里param的参数)
3.先在外接API上测通api并保存配置。输入这是没有body的
查询里的参数:
headers里的参数:
4.在页面上使用时就先执行加密的自定义行为(可以放在获取远程数据成功时),执行成功后把出参sign和param赋值给页面数据sign和param
5.用列表展示api里的物流信息
2.利用hiflow对接快递100物流api(其实这种方法比较麻烦且现在参数不支持数组类型,无法配置)
1.首先找客户要快递100相关授权信息。
2.进入腾讯hiflow官网 https://hiflow.tencent.com/,没注册的先注册,他们现在是免费使用的。点击创建新的流程。
步骤1选择内置工具里的webhook
向webhook地址里发送一条测试数据,这个时候请求体body可以按自己需求写。 我这里order_id是订单表id,com是快递公司编码,num是快递单号,单号加编码就可以查出物流相关信息。
点击测试并预览可以得到样本数据,说明第一个webhook测试通了
流程的第二个步骤在全部里搜索快递100应用,选择查询快递实时进度
快递公司选择自定义-步骤1里的com字段,快递单号填步骤1里的num字段,电话号码不用填,点击测试并预览,接收到物流信息成功后,再点击保存。
步骤3选择内置工具里的http,请求类型选post,请求地址是zion里的回调地址,没有加的可以先在zion里建一个回调地址,header里填Content-Type对应application/json。
请求body是对应zion里回调地址需要的参数。这里用到了步骤2里的参数。
当然zion的回调地址需要绑定一个行为流,这个行为流的目的是接收步骤2里的返回的物流信息,并写入到zion的数据库中。
行为流里的的代码如下:
(() => {
const body = context.getArg("fz_callback_body");
console.log('请求体:',JSON.stringify(body));
const orderId = body.order_id;
const time = body.time.substring(1, body.time.length - 1).split(",");
const node = body.node.substring(1, body.node.length - 1).split(",");
const deliveryInfoArr = [];
for (let i = time.length - 1; i >= 0; i--) {
const deliveryInfo = {
logistics_time: new Date(time[i]).getTime(),
logistics_node: node[i],
order_order: orderId,
};
deliveryInfoArr.push(deliveryInfo);
}
if (!deliveryInfoArr.length) {
return;
}
const gql = `mutation insertLogisticsRecords($logisticsObjects: [logistics_record_insert_input!]!) {
response: insert_logistics_record(
objects: $logisticsObjects
on_conflict: {constraint: unique_by_order_id_and_time, update_columns: []}
) {
affected_rows
}
}`;
const insertLogisticsRecordsResult = context.runGql(
"insertLogisticsRecords",
gql,
{ logisticsObjects: deliveryInfoArr },
{ role: "admin" }
).response;
})();