点评到家与服务方对接接口

修改时间说明
05-21定义点评到家与服务方的对接接口。这一份为通用接口,针对具体频道接口需要调整,会有单独文档沟通
06-23增加产品图文详情字段

1. 整体介绍

1.1 对接方案v1.0

  1. 服务方离线将服务产品提供给点评,点评为用户提供产品列表、详情展示。(注意:目前点评到家禁止出现引导至其他APP或微信号下单的内容)
  2. 用户选择服务时间、服务份数及服务地点,点评向第三方查询可用技师列表。
  3. 用户选择技师,点评将订单信息同步给服务方用于创建服务方订单,同时生成服务方orderId,后续订单信息同步均以服务方orderId为准。
  4. 用户在点评完成支付后,点评通知服务方支付完成。后续服务及订单状态变更由服务方同步给点评。

1.2 时序图

下单时序图

1.3 接口列表

1.3.1 服务方提供接口

优先级功能接口名
离线同步作业接口
P0获取技师列表queryTechnicianList
P0获取产品列表queryProductList
下单库存查询
P0获取预约时间列表queryAvailableTimeslots
P0获取可用技师列表queryAvailableTechnicians
订单相关
P0创建订单createOrder
P0取消订单cancelOrder
P0订单已支付orderPaied
P0确认完成订单confirmFinishOrder

备注:技师和产品列表变化不大,每天离线定期同步。

1.3.2 点评提供接口

优先级功能接口名
P0更新订单状态updateOrderStatus
P0更新订单信息updateOrderInfo
P1服务方取消订单并全额退款partnerCancelOrder
P3查询点评已同步订单信息loadOrderInfo

备注:接口中所有经纬度,均为火星坐标系(火星坐标与高德、腾讯坐标一致,跟百度之间需要转换)

1.3.3 车类服务商接口(可选)

优先级功能接口名
P2车型库接口carList

1.3.4 城市及状态码

点评城市 ID 编码:

城市ID
上海1
北京2
杭州3
广州4
南京5
苏州6
深圳7
成都8
重庆9
天津10
城市ID
宁波11
扬州12
无锡13
福州14
厦门15
武汉16
西安17
沈阳18
大连19
青岛21
城市ID
济南22
海口23
石家庄24

更多城市ID

点评到家服务项目编码:

如果服务方提供多种类目服务(如美甲, 美容),则需要设置serviceId,由点评提供。
服务方仅一种类目时,忽略serviceId即可。

点评订单状态码:

状态码定义
1待支付
2已支付
3技师出发
4正在服务
5服务完成
6已评价
7订单取消
8订单过期
状态码定义
9已退款
10退款中
11退款失败
12待服务方确认
13服务方已确认
14服务方已拒绝
15订单失败,退款中(点评内部状态)
16支付失败,退款中(点评内部状态)

状态变更

返回结果状态码定义:

code定义
0成功
1未知原因失败
10001签名验证失败
10002第三方内部错误
10003参数不合法
10004订单id不存在
20001不在服务范围内
20002库存不足
20003无技师列表
20004技师已被占用
20005当前服务不支持该车型

msg:简单描述

1.4 签名

所有接口统一使用HTTP POST协议,返回结果为JSON。为安全考虑,请求需要做签名,以防止被伪造或串改,双方互相验证对方签名。联调测试阶段可以忽略签名,线上环境需验证。

测试环境AppKey统一为ABCDEFGHIJKLMNOPQRSTUVWXYZ123456

1.4.1 基础请求字段

字段名描述
methodName请求接口名
version接口版本,便于以后升级
partnerId请求方id,便于定位和统计
sign将数据包计算之后得到的签名

1.4.2 签名计算方法

例如,我们请求接口queryAvailableTechnicians(简化版)
POST /queryAvailableTechnicians
请求参数

字段名
methodNamequeryAvailableTechnicians
version1.0
partnerIddianping
productId4321
serviceAddress北京市朝阳区

服务方验证签名过程示例

服务方收到的请求为(urlencode使用UTF8编码):  
curl -d "methodName=queryAvailableTechnicians&productId=4321&serviceAddress=%E5%8C%97%E4%BA%AC%E5%B8%82%E6%9C%9D%E9%98%B3%E5%8C%BA&partnerId=dianping&version=1.0&sign=E15D48CE15536CA94C7E55D5E8963D99" api.{thirdparty.host}.com/dianping/queryAvailableTechnicians

服务方接收到的POST内容为paramsMap,签名计算过程如下: 

appKey='ABCDEFGHIJKLMNOPQRSTUVWXYZ123456' //点评提供的appkey
combinedStr=''   // 计算拼接字符串
keys = paramsMap.keys()
sortedKeys = keys.sort() // keys排序

for(key in sortedKeys)
    if key != 'sign' 
        combinedStr += ( key + urldecode(paramsMap[key]) ) // 这里注意要解码成原始字符串
combinedStr += appKey

sign = upperCase(md5(combinedStr))

2. 服务方提供接口

2.1 获取技师列表(queryTechnicianList)

接口说明:
获取技师列表(服务方所有技师,不区分城市),由点评离线每天调用。如果没有技师概念,需要同点评产品对接人确认后,可不需要提供该接口。

参数说明:

参数名参数类型是否必选说明
currentPageintY分页,1表示第一页
pageSizeintN每页记录条数,默认50

返回结果:

{
    "code": "0",
    "msg": "success",
    "body": {
        "totalSize": 15,
        "technicianList": [
            {
                "technicianId": "10010",
                "name": "苏三",
                "cityId": 1     // 点评城市ID,参考[1.3.3节](#1.3.3)
                "sex": "男",
                "age": 35,
                "photoURL": "http://xx.jpg",
                "workingAge": 5,
                "orderAmount":45, // 接单总量
                "level":3,         // 技师星级,1到5星
                "longitude": 121.134,
                "latitude": 31.54,
                "phone":"13456268429"
                "description": "描述",
                "tags":["90后","小清新"]
            },
            // ...
        ]
    }
}

无技师概念,返回`20003`
{
    "code": "20003",
    "msg": "该服务无技师列表",
}


字段说明

参数名参数类型说明String类型长度限制
totalSizeint技师总量,用于分页
technicianIdstring服务方技师id50
namestring技师称呼32
sexstring男/女男,女 字符类型
ageint技师年龄(可选,没有请传0)
photoURLstring技师图片(完整url)100
workingAgeint工作年限
orderAmountint技师接单量
levelint技师星级
longitudefloat技师经度(可选,没有传0)
latitudefloat技师纬度(可选,没有传0)
phonestring电话(可选,没有传空字符串)32
descriptionstring简要描述1024
tagsjsonArray技师标签(可选,没有传空数组)json长度小于128
cityIdint技师所在城市

2.2 获取服务产品列表(queryProductList)

接口说明:
获取产品列表,由点评离线每天同步。

参数说明:

参数名参数类型是否必选说明
cityIdintY点评城市id
currentPageintY分页,1表示第一页
serviceIdintN点评服务项目代码
pageSizeintN每页记录条数,默认50

返回结果:

{  
    "code": "0", 
    "msg": "success",  
    "body": { 
        "totalSize":15, 
        "productList":[ 
        { 
            // 这些为服务产品通用字段
            "productId":"10010", 
            "productName":"蝴蝶梦", 
            "orderAmount": 33,          // 产品销量
            "duration":120,             // 服务耗时,以分钟为单位
            "abstract":"产品简要描述,用于展现在产品列表页的一行内容(可选字段)",
            "description":"简要描述",
            "originalPrice":130,        // 原始价格
            "settlePrice":89,           // 真实价格
            "minOrders":1,              // 最小下单份数
            "maxOrders":1,              // 最大下单份数
            "imageUrls": [
                "http://a.jpg", "http://b.jpg" // 产品图片
            ],
            "thumbUrl": "http://a.min.jpg", // 产品预览图
            "details": [{   // 图文详情
                "type": 1,  //  1: 图片url, 2: 纯文本 
                "content": "http://a.big.jpg"
            }, {
                "type": 1,
                "content": "http://b.big.jpg"
            }, {
                "type": 2,
                "content": "描述文案..."
            },  // ... ],
            // 以下为可选字段
            "rank": 1,  // 排序,越小越靠前
            "packageList":[ 
                { 
                    "packageId":"1", 
                    "packageName":"基础套餐", 
                    "originalPrice":96,         // 套餐原始价格,以元为单位
                    "settlePrice":64,           // 套餐实际价格
                    "duration":30               // 服务时长,分钟为单位
                    // 可选字段,不提供则统一试用产品数据
                    "description":"简要描述",
                    "imageUrls": [
                        "http://b.jpg", "http://c.jpg", ...
                    ],  // 套餐图片
                    "details": [{   // 图文详情
                        "type": 1,  //  1: 图片url, 2: 纯文本 
                        "content": "http://a.big.jpg"
                    }, {
                        "type": 1,
                        "content": "http://b.big.jpg"
                    }, {
                        "type": 2,
                        "content": "描述文案..."
                    },  // ... ]
                }, 
                { 
                    "packageId":"2", 
                    "packageName":"基础套餐+半贴片", 
                    "originalPrice":126, 
                    "realPrice":126, 
                    "duration":30,
                    // ...
                },
                ....
            ]
            "style": "样式",
            "color": "花色", 
            "keptTime":25,              // 产品保持时间,以天为单位
        },
        // ... //更多product
        ] 
    }  
}

重要说明
重要:点评数,卖出订单量是根据产品id productId关联,同一产品更改名字请勿更改productId。
单一产品无套餐概念,点评会自动帮助第三方创建一个 “packageId”:”1” 的 默认套餐,如果 无套餐概念,
变成有套餐概念,请确保packageId的唯一性,如果相同会出现2个相同套餐。
产品,套餐下线都需要通知点评。

字段说明
备注:product字段不同频道可能会不同,从packageList以下均为可选字段,可根据频道特定做字段定制

参数名参数类型说明String类型长度限制
productIdstring第三方产品id50
productNamestring产品名称64
orderAmountint产品近期销量
durationint产品服务耗时,以分钟为单位
abstractstring用于展现在产品列表页的一行内容(可选字段)256
descriptionstring产品描述2048
detailsjsonArray图文详情,目前支持两种类型: 1图片url,2纯文本。content总长度不能超过4000字节json总长度不超过4000
originalPricefloat原始价格,以元为单位
settlePricefloat真实价格
minOrdersint最小下单份数,默认为1
maxOrdersint最大下单份数,默认为1
imageUrlsjsonArray多张产品图片。图片大小640×360单一url小于256
thumbUrlstring预览图,图片大小 640×640256
rankint控制排序,越小越靠前(有好评的,好评数排序优先)

details

展示具体效果见 点评app-上海市-到家-宠物-握爪-产品详情页,数据如下(不支持html标签)

[
    {
        "type":1,
        "content":"http://7oxer3.com2.z0.glb.qiniucdn.com/gougouliucheng1-1.png   "
    },
    {
        "type":1,
        "content":"http://7oxer3.com2.z0.glb.qiniucdn.com/gougouliucheng1-2.png  "
    },
    {
        "type":1,
        "content":"http://7oxer3.com2.z0.glb.qiniucdn.com/gougouliucheng1-3.png  "
    },
    {
        "type":2,
        "content":"【服务范围】:上海(郊县及边远地区除外)\n 【温馨提示】\n宠物不适宜情况:\n 1、疫苗未完成或完成一周内的幼犬猫;\n 2、怀孕、哺乳期间的犬猫;\n 3、高龄犬猫(10岁以上);\n 4、10KG以上狗狗和8KG以上猫猫;\n 5、具有强烈攻击性的犬猫 \n 【下单提醒】\n请至少提前三天预约。\n 建议下单后第一时间拨打400-032-8170联系握爪客服,为您安排上门服务时间。\n如需取消或更改订单时间的,请提前一天以上拨打400-032-8170联系握爪客服"
    }
]

美甲/按摩/美睫等频道需要额外提供字段:

参数名参数类型说明
packageListjsonArray产品的套餐列表
packageIdstring套餐id
packageNamestring套餐名称
originalPricefloat原价,以元为单位
settlePricefloat真实价格
durationint服务耗时,以分钟为单位
imageUrlsjsonArray套餐图片。图片大小640×360
stylestring产品样式
colorstring产品花色
keptTimeint产品保持时间,以天为单位

2.3 可预约时间列表(queryAvailableTimeslots)

接口说明:
给定服务项目、套餐类型、预约份数、服务地点,返回可服务的时间列表。点评在用户选择时间前调用。
timeslot1的标记位表示可以提供服务。

备注:
1. 如果服务地址覆盖不到(比如过于偏远,没有服务点/技师)可返回code:20001
2. 可选时间需考虑派单的处理时长。假设每天上班时间为8:00,派单需2小时处理完成,当前时间为中午12:00。那么用户仅可选择当天的开始时间在2小时之后的时间段(>= 14:00),以及当天以后的开始时间在上班时间2小时之后的时间段(>= 10:00)。

参数说明:

参数名参数类型是否必选说明
cityIdintY点评城市id
productIdstringY服务方产品id
serviceAddressstringY预约服务地址
longitudefloatY服务地址经度
latitudefloatY服务地址维度
packageIdstringN服务方套餐id,没有套餐概念可不提供
serviceIdintN点评服务项目代码
quantityintN产品预约份数,默认为1
queryDayNumintN可预约天数,默认查最近7天

返回结果:

{ 
    "code":"0", 
    "msg":"success" 
    "body":{ 
        "timeList":[  
        { 
            "date":"2015-04-18",  // 预约日期
            "timeslot":"000000001111110000111100000000000011111100001111" 
            // 以30分钟为单位,共48位,表示时间是否可预约 
        }, 
        { 
            "date":"2015-04-19", 
            "timeslot":"000000001111110000111100000000000011111100001111" 
        } 
        ... 
        ] 
    } 
} 

2.4 获取可用技师(queryAvailableTechnicians)

接口说明:
用户选择服务产品、服务份数、服务地址及服务时间,点评调用服务方接口,获取可用技师列表。
服务方需要保证:
1. 判断服务地址是否在服务范围内;
2. 在用户选定时间是否有可用技师(如果不支持技师选择,可伪造技师id为”0”)。

参数说明:

参数名参数类型是否必选说明
cityIdstringY点评城市 ID
productIdstringY服务方产品ID
serviceTimestringY服务开始时间,格式为2015-04-18 10:30:00
latitudestringY服务地址经纬度(火星坐标系)
longitudestringY服务地址经纬度(火星坐标系)
serviceAddressstringY服务地址,精确到小区
houseNumberstringY服务地址,门牌号等详细信息
packageIdstringN套餐ID,没有套餐概念,可不提供
quantityintN产品预约份数,默认为1
serviceIdstringN点评到家服务项目 ID

返回结果:

成功:
{
    "code": "0",
    "msg": "success",
    "body": {
        "technicianIds": [
            "10000001",
            "10000002",
            ..] // 返回技师列表,默认用第一个 
    }
}

成功,伪造技师:
{
    "code": "0",
    "msg": "success",
    "body": {
        "technicianIds": [
            "0"] // 伪造技师id,使用0
    }
}

2.5 创建订单(createOrder)

接口说明:
用户确认技师后,进入支付页面,点击确认付款,点评调用服务方该接口,创建一个未支付订单。支付必须要10分钟内完成,否则订单过期,库存自动解锁。

参数说明:
备注:这些参数是基本信息,不同频道可能有特殊需求,可单独沟通

参数名参数类型是否必选说明
cityIdstringY点评城市 ID
productIdstringY服务方产品ID
serviceTimestringY服务开始时间,格式为2015-04-18 10:30:00
pricefloatY产品价格,以为单位,精确到(由于优惠活动,支付价格可能与此不同).
latitudestringY服务地址经纬度(火星坐标系)
longitudestringY服务地址经纬度(火星坐标系)
serviceAddressstringY服务地址,精确到小区
houseNumberstringY服务地址,门牌号等详细信息
cellphonestringY用户电话
serviceIdstringN点评服务项目ID
packageIdstringN服务方套餐ID
quantityintN预约份数,默认为1
technicianIdstringN技师id
commentstringN用户备注
extraInfostringN订单个性化信息,JSON字符串(具体内容在对接的时候进行沟通)

返回结果:

{
    "code": "0",
    "msg": "success",
    "body": {
        "orderId": "12345" // 服务方订单id,后续订单操作均以此id为标准
    }
}

2.6 订单已支付(orderPaied)

接口说明:
订单支付后,点评调用服务方该接口,通知订单已付款。

参数说明:

参数名参数类型是否必选说明
orderIdstringY服务方订单ID
settlePricefloatY用户实付金额(扣除优惠价格,以单位,精确到.

返回结果:

{
    "code": "0",
    "msg": "success",
}

幂等性: 如果第三方订单处于已支付状态,点评再次调用orderPaied接口,应该返回如下结果(原因:只要保证两边订单状态的最终一致性即可)

{
    "code": "0",
    "msg": "success",
}

2.7 取消订单并解锁库存(cancelOrder)

接口说明:
订单创建后,用户取消订单或订单过期未支付,点评调用服务方取消订单。建议服务方自己也做个监控,长时间未支付订单直接过期掉。

参数说明:

参数名参数类型是否必选说明
orderIdstringY服务方订单ID
commentstringN订单取消备注,目前不传该字段

返回结果:

{
    "code": "0",
    "msg": "success",
}

幂等性: 如果第三方订单处于已取消状态,如果点评再次调用cancelOrder接口,应该返回以下数据(原因:只要保证两边订单状态的最终一致性即可)

{
    "code": "0",
    "msg": "success",
}

2.8 确认完成订单(confirmFinishOrder)

接口说明:
点评客户端支持用户自己来确认完成订单,用户确认后点评会把该状态同步给第三方(有重试机制)

参数说明:

参数名参数类型是否必选说明
orderIdstringY服务方订单ID

返回结果:

{
    "code": "0",
    "msg": "success",
}

幂等性: 如果第三方订单处于确认完成状态,如果点评再次调用confirmFinishOrder接口,应该返回以下数据(原因:只要保证两边订单状态的最终一致性即可)

{
    "code": "0",
    "msg": "success",
}

3. 点评提供接口

3.1 更新订单状态(updateOrderStatus)

接口说明:
服务方接单后,更新状态进度。服务方更新状态目前只支持13(确认订单)、3(技师出发)、4(服务中)、5(服务已完成)四种状态。

参数说明:

参数名参数类型是否必选说明
orderIdstringY服务方订单ID
statusintY订单状态,用点评订单状态码,参加1.3.3节

返回结果:

{
    "code": "0",
    "msg": "success",
}

测试环境点评接口

curl -d "methodName=updateOrderStatus&orderId=0&status=3&sign=A9053F1E7FD0D38B2F3848A7E8D5FDCC" http://m.api.51ping.com/tohome/openapi/3rd/

orderId=0时仅验证签名

3.2 更新订单信息(updateOrderInfo)

接口说明:
服务方调用点评,更新订单信息。目前只支持更新服务的指派技师(确认后即可调用),后续视需要可开通更多信息更新。技师id用于做评价及再次预约入口。

参数说明:

参数名参数类型是否必选说明
orderIdstringY服务方订单ID
technicianIdstringN指派的服务技师id
serviceTimestringN指派的服务时间(格式:yyyy-MM-dd HH:mm,示例:2015-08-07 12:00:00)
serviceAddressstringN指派的服务地址
houseNumberstringN指派的服务详细地址

返回结果:

{
    "code": "0",
    "msg": "success",
}

3.3 服务方取消订单(partnerCancelOrder)

接口说明:
服务方调用点评,取消订单并退款,不管当前订单状态(如果用户已支付)。目前默认全额退款,后续会支持服务方设置价格。安全考虑,除了签名验证,点评端会做ip白名单。

参数说明:

参数名参数类型是否必选说明
orderIdstringY服务方订单ID

返回结果:

{
    "code": "0",
    "msg": "success",
}

3.4 查询已同步订单状态(loadOrderInfo)

接口说明:
服务方调用点评,查询已同步订单,安全考虑,除了签名验证,点评端会做ip白名单。

参数说明:

参数名参数类型是否必选说明
orderIdstringY服务方订单ID

返回结果:

{
  "code": "0",
  "msg": "success",
  "body": {
    "cityId": 1,
    "productId": 1,
    "serviceTime": "2015-07-06 19:30",
    "price": 111,
    "latitude": 31.215377,
    "longitude": 121.420333,
    "serviceAddress": "长宁区安化路492号A6",
    "houseNumber": "长宁区安化路492号A6",
    "cellphone": "13564950570",
    "serviceId": 1,
    "packageId": "1",
    "quantity": 1,
    "status": 2
  }
}

测试环境点评接口

curl -d "methodName=loadOrderInfo&orderId=643&sign=9ACB6DB1DC74C2A5C7C6B80D06237E93" http://m.api.51ping.com/tohome/openapi/3rd/

orderId=0时仅验证签名

4. 车类服务商接口

4.1 车类服务商接口

接口说明:
服务方需要提供汽车品牌信息接口,接口返回json数据。
相应车类信息 ,会在 createOrder 中通过额外字段extraInfo={“carbrand” : “奔驰(进口)”,”carseries” : “A级系列”,”caryear”: “A160(W169) 1.6L 2009.04-2014”} 传回车型信息。

参数说明:

参数名参数类型是否必选说明
currentPageintY分页,1表示第一页
pageSizeintN每页记录条数,默认100

返回结果:

{
  "totalSize": 100,
  "brand_list": [
    {
      "brand_id": "1",
      "brand_name": "丰田(品牌名称)",
      "logo_url": "http://www.baidu.com",
      "brand_first_char": "F",
      "series_list": [
        {
          "series_id": "1",
          "series_name": "汉兰达(系列名称)",
          "status": 1,
          "carType_list": [
            {
              "type_id": "1",
              "type_name": "年款"
            },
            {
              "type_id": "2",
              "type_name": "年款2"
            }
          ]
        },
        {
          "series_id": "2",
          "series_name": "海狮(系列名称)",
          "status": 1,
          "carType_list": [
            {
              "type_id": "1",
              "type_name": "年款"
            },
            {
              "type_id": "2",
              "type_name": "年款2"
            }
          ]
        }
      ]
    },
    {
      "brand_id": "1",
      "brand_name": "丰田(品牌名称)",
      "logo_url": "http://www.baidu.com",
      "brand_first_char": "F",
      "series_list": [
        {
          "series_id": "1",
          "series_name": "汉兰达(系列名称)",
          "status": 1,
          "carType_list": [
            {
              "type_id": "1",
              "type_name": "年款"
            },
            {
              "type_id": "2",
              "type_name": "年款2"
            }
          ]
        },
        {
          "series_id": "2",
          "series_name": "海狮(系列名称)",
          "status": 1,
          "carType_list": [
            {
              "type_id": "1",
              "type_name": "年款"
            },
            {
              "type_id": "2",
              "type_name": "年款2"
            }
          ]
        }
      ]
    }
  ]
}

字段说明

参数名参数类型说明String类型长度限制
totalSizeint品牌总量,用于分页
brand_idstring品牌id
brand_namestring品牌名称45
logo_urlstring品牌logo完整url
brand_first_charstring品牌首字母(大写)
series_idstring品牌系列id
series_namestring系列名称45
type_idstring年款id
type_namestring年款名称
status