准备工作:
1.抖音开放平台=》控制台=》我的应用=》点击对应小程序=》开发=》解决方案配置=》找到对应的行业,设置回调地址
必须设置项:
交易扩展点能力-退款申请回调扩展点 (退款申请提交,回调扩展)
交易消息通知能力-交易系统退款通知 (退款同意|拒绝通知接口)
交易消息通知能力-预下单回调扩展点 (tt.createOrder下单回调,不然收银台调不起来)
步骤三:开始下单
流程:前端调用JSAPI组件请求,抖音回调预下单回调,响应正确结果后。收银台调起。
提示:下单链路一定要问清楚抖音同学,这个坑我已经踩过了。我们这种模式。只能用JSAPI去下单,我之前用的服务端OPENAPI,又重做了一把~~。这个问题是抖音对于这种模式的链路也属于摸石头过河阶段,服务端的OPENAPI不健全。
最重要的,下单的商品,
一个是通过创建商品接口,创建到抖音来客后台显示的。单独下单(poi商品下单)
一个是有服务端自己的商品和抖音来客后台商品混合下单(sku+poi商品下单)
tt.createOrder JSAPI下单。这个贴代码,剩下的看文档就可以了。
SKU创建和POI单商品创建:
if (data.lists.sku_flag) { //判断是否附带服务端商品信息,是代表混合下单,不是代表单POI商品下单
const sku = data.lists.sku_list;
let skuList = [];
for (let i = 0; i < sku.length; i++) {
let v = {
skuId: sku[i].sku_id + '',
skuType: sku[i].skuType,
quantity: sku[i].quantity,
price: sku[i].price,
goodsInfo: data.lists.goods_list,
}
skuList.push(v);
}
let payment = {
totalAmount: data.lists.payment.totalAmount
};
let callbackData = {//方便服务端判断的自定义参数
sku_flag: data.lists.sku_flag, //true 混合支付 false 单业务购买
duration: data.lists.duration, //服务时间
order_type: '0',
}
uni.hideLoading()
tt.createOrder({
skuList,
payment,
callbackData,
success: (res) => {
const {
orderId,
outOrderNo
} = res;
this.setData({
orderId, //内部商户订单号
outOrderNo //开发者订单号
});
console.log([orderId, outOrderNo, payment.totalAmount])
if (errMsg === "createOrder:ok") {
//支付成功之后回调服务端处理订单
this.processOrder(orderId, outOrderNo, payment
.totalAmount);
} else {
$msg('操作失败');
}
},
fail: (res) => {
const {
orderId,
outOrderNo,
errNo,
errMsg,
errLogId
} = res;
if (errLogId) {
$msg('下单失败,请联系客服');
console.log("预下单失败", errNo, errMsg, errLogId, 1);
}
if (errNo == 1 || errNo == 2 || errNo == 3 || errNo == 4) {
//支付超时 支付失败 支付关闭 支付取消
this.goPage("/pages/order/order")
}
//$msg('下单失败,请联系客服');
//console.log(errNo, errMsg, errLogId, 3);
},
});
} else {
const god = data.lists.goodsList;
let goodsList = [];
for (let i = 0; i < god.length; i++) {
let v = {
quantity: 1,
price: god[i].price,
goodsName: god[i].goodsName,
goodsPhoto: god[i].goodsPhoto,
goodsId: god[i].goodsId,
goodsType: god[i].goodsType,
}
goodsList.push(v);
}
let payment = {
totalAmount: data.lists.payment.totalAmount
};
let callbackData = {
sku_flag: data.lists.sku_flag, //true 混合支付 false 单业务购买
duration: data.lists.duration, //服务时间
order_type: 0,
}
uni.hideLoading()
tt.createOrder({
goodsList,
payment,
callbackData,
success: (res) => {
const {
errMsg,
orderId,
outOrderNo
} = res;
console.log([orderId, outOrderNo, payment.totalAmount])
if (errMsg === "createOrder:ok") {
this.processOrder(orderId, outOrderNo, payment
.totalAmount);
} else {
$msg('操作失败');
}
},
fail: (res) => {
const {
orderId,
outOrderNo,
errNo,
errMsg,
errLogId
} = res;
if (errLogId) {
$msg('下单失败,请联系客服');
console.log("预下单失败", errNo, errMsg, errLogId, 1);
}
if (errNo == 1 || errNo == 2 || errNo == 3 || errNo == 4) {
//支付超时 支付失败 支付关闭 支付取消
this.goPage("/pages/order/order")
}
//$msg('下单失败,请联系客服');
console.log(errNo, errMsg, errLogId, 3);
},
});
}
正常就是调起收银台,获取组件执行结果。可以自行判断处理订单还是创建未支付订单。只要调起收银台,不管是否支付抖音都会出现一个未支付订单。服务端也需要记录。如果是多个不同商品。每个商品价格不一样。商品的支付单号和以往像支付宝、微信的支付单号不一样。需要将数据存储服务端。
重要字段-预下单回调
order_id 抖音订单号
item_order_id 对应商品的支付单号,退款会用到,如果多个商品。每个支付单号都不一致。单独存储!!!
步骤四:退款
提示:退款链路一定要问清楚抖音同学!!
调用退款JSAPI组件,tt.applyRefund 贴代码
//三个参数依然是服务端组装过来的,操作过创建订单这个就不多介绍
tt.applyRefund({outOrderNo: orderId,refundInfo,itemOrderList,
success(res) {
const { outRefundNo } = res;
if(res.errMsg == "applyRefund:ok"){
that.refundStatus = 'success'//显示成功界面
}
},
fail(res) {
that.refundStatus = 'fail'//显示失败界面
},
});
这一步只是退款申请,回调是请求的
1.上述解决方案中设置的回调地址。交易扩展点能力-退款申请回调扩展点
这个操作代表这个订单需要退款,只是申请发送到了抖音。并不是实际退款。
2.申请处理完毕之后,抖音会异步继续通知
上述解决方案中设置的回调地址。交易消息通知能力-交易系统退款通知
!整体流程:用户调用退款组件-》执行成功-》抖音异步回调退款申请回调扩展点地址=》服务端处理订单退款状态逻辑调整=》如果退款需要审核=》这一步抖音是不会异步通知的。需要在服务端做一个审核按钮,调用同步退款结果=》抖音退款=》退款成功调用退款通知回调=》回调中处理订单退款真实成功或者失败
这个操作代表,抖音需要服务端把这笔订单的退款审批结果在送达抖音端。之后抖音再开始正式的退款或者拒绝操作。
退款多式多样,整退。单独退。主要和创建订单-》预下单回调。中返回的“item_order_id”有关
做到这里基本上整个除了相关业务逻辑操作(im客服小功能就不讲了,看文档就可以了)。和抖音交互的基本没有了。
结语:
抖音的这套链路,和以往常规对接有点出入,对接支付宝、微信的话。基本是都封装好了。业务逻辑处理完传入对应的字段就可以了。这套链路我感觉是更贴合开发者,更深入商品细节。让开发者细微的参数都需要一一处理。包括支付、退款逻辑。单独退款。也比较贴切,更灵活区分业务。还有中途不要被抖音同学的属于给混淆。poi、poi货架、sku。中途也是重工好多功能。希望大家一遍过~