使用背景:运营商购买友朋自取柜后,想自己研发APP或小程序及选择自己合作的支付渠道或自有的电子钱包或会员内部员工等逻辑,实现自有消费者终端的业务场景。
01. 开通自取柜第三方支付功能#
请在登录运营后台,在【系统管理】-【支付配置】购买开通第三方支付功能。完成付费后,请联系商务进行技术参数配置。请开发者准备好以下两样资料,提供参数给到商务或友朋群内的技术口同事。1.
运营商开放平台的appid配置的【回调URL】(免费) 和 【支付回调URL】(付费)是两个不同业务场景使用,开发支付业务的开发者可设置开放平台对应appid的 回调URL 和 支付回调URL 为同一个目标地址,由友朋向开发者的目标地址发送请求。
2.
开发者需按文档要求构建自己的异步通知接收服务(即上述回调URL),并确保该服务的持续可用性。
3.
本文档中还有一个【业务回调地址】,是单独跟某一个业务接口独立的、由开发者向友朋发送通知使用的。
02. 支付业务流程及业务时序图#
二维码需要在内容最后带参数 cid=设备ID,用于识别补货扫码开门时识别唯一设备。用于展示自取柜内的商品图片、名称、价格、库存等。(消费者扫码后在APP/小程序上展示使用)当设备上报关门后进行通知 (设备门锁和网络会影响结果及时效)当友朋完成商品识别后通知,(设备网络情况会影响上传视频的速度,上传完后再到算法服务中进行识别)⑥ 开发者回调支付结果给友朋该订单的NotifyUrl:#
NotifyUrl 为 第三步创建订单 cabinet.open.door 时,友朋提供的该订单回调地址 (请务必回调支付结果,否则友朋系统内订单会一直处于待支付状态,影响财务对账)从消费者扫码,开门,拿取商品,关门,上传视频识别,结算全流程业务链路。
03 消费者主动申诉业务逻辑说明#
消费者主动申诉场景根据开发者自身业务需求来判断需要对接哪些场景接口3.
【API支持】在订单完成支付后,订单识别错误(有误、少扣,多扣):在友朋运营系统中,当发生订单识别错误会重新发起一笔新订单,原订单全额退款。
3.1 完成支付后全额退款业务#
3.2 未完成支付前进行申诉#
3.3 支付后进行申诉#
04 开发者异步回调友朋所需实现逻辑#
4.1 开发者回调规则#
业务回调URL: 是在调用友朋业务接口,接口返回参数中的业务回调URL地址,例如创建支付订单。appSecret: 开发者提供给友朋的密钥(注意区分非友朋提供给开发者appSecret)4.2 签名与校验签名#
1.
除 sign 参数外所有参数必须参与签名,参数以文本方式字典排序,排序后使用 key=value&key=value 方式拼接字符串
3.
签名:md5(tmpString+"&"+appSecret) 得出的结果转换为小写字母
4.3 第三方支付业务回调参数说明#
实现业务: 第三方开发者接入自有支付通道,每笔开门订单完成支付(扣款)后,进行【异步回调 】。如回调接口失败,请确保重试补偿机制,确保两边的订单状态同步避免对账问题出现。
参数名称 | 类型 | 是否必须 | 参考值 |
---|
receipt_no | string | Y | 友朋业务订单号全局唯一 |
trade_no | string | Y | 支付渠道交易流水号 (尽可能采用支付通道的业务流水号,避免二次对账) |
trade_status | int | Y | 支付结果 1=支付成功 -1=交易关闭 |
trade_raw_data | object | N | 支付渠道回调的所有参数以 JSON 字符串方式传递,如果没值请传递 {} 空对象字符串 |
complete_status | string | Y | 完成状态 |
pay_time | int | Y | 支付时间 YYYYMMDDHHMMSS, 示例:20210122112001 |
sign | string | Y | 签名 |
友朋收到请求并校验,处理成功后返回 success 纯文本,对于非 success 的返回视为业务处理失败,第三方需要对此回调发起重试,直到返回 success 为止
trade_raw_data 如果没值请传递 {} 字符串且参与签名
complete_status 如果没值请传递 "" 字符串且参与签名
05 友朋异步回调开发者所需实现逻辑#
5.1 开发者需要实现的接口#
支付回调URL: 是指开发者提供的一个 API 请求入口,此 API 接口的请求和响应需要按照以下文档进行开发,并将接口URL提供给友朋。除 sign 参数外所有参数必须参与签名,参数以文本方式字典排序,排序后使用 key=value&key=value 方式拼接字符串
签名:md5(tmpString+"&"+appSecret) 得出的结果转换为小写字母
appSecret 由品牌商在后台配置(此文档里接口 appSecret 用的是支付配置中的签名秘钥,非支付业务接口签名均用开放平台 appSecret)
参数名称 | 类型 | 是否必须 | 说明 |
---|
method | string | Y | 业务方法,以下每个接口表示每个业务方法 (字母小写) |
biz_content | string | Y | 业务参数 json 字符串 |
timestamp | int | Y | unix 时间戳到秒 |
sign_type | string | Y | 签名方式,md5 (小写) |
sign | string | Y | 签名(小写) |
参数名称 | 类型 | 是否必须 | 说明 |
---|
error_code | int | 是 | 错误代码 =0 正常(操作成功,接口调用成功) !=0 异常错误 |
error_msg | string | 是 | 错误描述 |
data | object | 是 | 返回业务内容 |
5.2 接口通知 notify.close.door#
【前置条件】:在调用cabinet.open.door接口后,友朋服务器收到机器关门后,异步触发通知开发者appid对应设置的回调 URL
【回调URL】: 免费 (开发者appid对应设置的回调URL)
【响应要求】: 无
参数名称 | 类型 | 是否必须 | 说明 |
---|
Status | int | Y | 1=机器有开门 2=机器没有开门 |
ReceiptNo | string | Y | 单号 |
Msg | string | Y | 消息文案 |
cabinet.order.vi.result.notify
5.3 通知接口 cabinet.order.vi.result.notify#
【前置条件】: 此接口是用于当自取柜开门后,识别商品回调。当商品识别为异常状态时不会发起通知,需要运营商客服上运营商平台处理异常订单,完成后会发起回调。
【回调URL】: 付费 (开发者提供给友朋的支付回调URL)
【响应要求】: 同步返回
参数名称 | 类型 | 是否必须 | 说明 |
---|
ReceiptNo | string | Y | 友朋订单号 |
Products | array | Y | 商品列表 |
Products: [{
"Qty": 1,
"BarCode": "6925303723910",
"Name": "\u7edf\u4e00\u51b0\u7ea2\u83361L",
"Price": 1,
"CostPrice": 0,
"TotalPrice": 1
}]
//成功
{
"error_code": 0, //业务逻辑成功返回0 不成功返回非0
"error_msg": "SUCCESS",
"data": {
}
}
//失败
{
"error_code": -1,
"error_msg": "业务失败原因的描述",
}
cabinet.order.product.modify
cabinet.order.refunds.result.notify
5.4 通知接口 cabinet.order.product.modify#
【前置条件】: 此接口是用于消费者申诉时,运营商修改订单的识别结果后进行通知。
【回调URL】: 付费 (开发者提供给友朋的支付回调URL)
【响应要求】: 异步返回 (开发需保存PaySuccessNotifyUrl,用于异步回调通知友朋,参考 4.3 第三方支付业务回调参数说明)
参数名称 | 类型 | 是否必须 | 说明 |
---|
ReceiptNo | string | Y | 友朋原订单号 |
originalOrderRow | object | Y | 原订单 |
newOrderRow | object | Y | 调整后订单 |
PaySuccessNotifyUrl | string | Y | 调整后的订单支付成功后回调链接 |
originalOrderRow 对象 | 类型 | 是否必须 | 说明 |
---|
CID | string | 是 | 设备ID |
OID | string | 是 | 运营商ID |
BID | string | 是 | 品牌商ID |
UserID | string | 是 | 用户ID |
OpenID | string | 是 | 平台的OpenID, 如小程序的AppID,支付宝 |
PayType | integer | 是 | 支付方式 0=未知 1=微信(支付分) 2=支付宝 201=品牌商微信代收 99=第三方支付 |
- PayExtend | object | 是 | 支付商户的扩展 |
ClientIPAddress | string | 是 | 客户端ip |
ScenesType | integer | 是 | 支付场景 0=扫码支付 1=友朋刷脸 2=微信刷脸 3=支付宝刷脸 4=密码购 |
ServiceStatus | integer | 是 | 服务状态 0=未开始服务 1=服务中 2=服务结束 (通过回调来更新) 3=价格计算完成 4=价格已确认 |
TradeNo | string | 是 | 第三方交易流水号 |
ThirdpartyAppID | string | |