抖音小程序官方文档
前端 JS API :(https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/api/industry/trading-system/pre-order/create-order
)
后端服务端 OpenAPI:(https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/server/payment/trade-system/trading/refund/apply)
预下单:tt.createOrder
继续支付:tt.continueToPay
退款:tt.applyRefund(我开发的时候前端调不起来,联系抖音客服技术部门他们说让后端调服务端
OpenAPI
,最后前端这块走的接口对接的)
抖音文档有很多都有问题,照着他们文档给的代码示例写,结果还是调不起来,以下是自己跟他们技术客服一点一点对接才完成的功能
在线Json格式化工具:(
http://jsonformat.1688kb.com 或
https://www.bejson.com/explore/index_new )
创建订单成功时会自动调起收银台支付
// 下单 handlePlaceOrder() { console.log('商品ID', this.serviceInfo.productId) console.log('下单数量', parseInt(this.submitForm.num)) console.log('商品单价', this.serviceInfo.actualAmount) console.log('预约门店的 poiId', this.serviceInfo.poiId) console.log('预约店铺名称', this.serviceInfo.shopName) console.log('预约门店的外部店铺id', this.serviceInfo.outshopId) console.log('预定开始时间(ms)', new Date(this.startTimes).getTime()) console.log('预定结束时间(ms)', new Date(this.endTimes).getTime()) console.log('总价', this.totalPrice * 100) console.log('下单者电话', this.submitForm.phone) console.log('下单者姓名', this.submitForm.personName) console.log('下单者备注', this.submitForm.comments) console.log('下单者地址信息', this.submitForm.province + this.submitForm.city + this.submitForm.area + this.submitForm.address) tt.createOrder({ skuList: [{ skuId: this.serviceInfo.productId, // sku 商品Id 必传 skuType: 1, // sku 商品类型 必传 1:商品库商品、2:非商品库商品 quantity: parseInt(this.submitForm.num), // 数量 必传 price: this.serviceInfo.actualAmount, // 价格 非商品库 sku 商品必传 goodsInfo: { goodsName: this.serviceInfo.productName, // 商品名称 必填 goodsPhoto: this.rotographsLists[0].filePath, // 商品图片链接 必填 goodsId: this.serviceInfo.productId, // 商品ID 必填 goodsType: 1, // 商品类型 必填 1:商品库商品、2:非商品库商品 // goodsLabels: ["不可退"], // 商品标签 非必填 // dateRule: "", // 使用规则 非必填 }, }, ], bookInfo: { itemBookInfoList: [{ poiId: this.serviceInfo.poiId, // 预约门店的 poiId,必填 shopName: this.serviceInfo.shopName, // 预约店铺名称,必填 outShopId: this.serviceInfo.outshopId, // 预约门店的外部店铺id,必填 goodsId: this.serviceInfo.productId, // 商品id,必填 bookStartTime: new Date(this.startTimes) .getTime(), // 预定开始时间(ms),13位毫秒时间戳,必填 bookEndTime: new Date(this.endTimes) .getTime(), //预定结束时间(ms),13位毫秒时间戳,必填 // bookStartTime: 1732269309000, // 预定开始时间(ms),13位毫秒时间戳,必填 // bookEndTime: 1732269609000, //预定结束时间(ms),13位毫秒时间戳,必填 reservationInfoList: [{ // 留资信息 非必填 name: this.submitForm.personName, // 姓名 非必填 phoneNumber: this.submitForm.phone, // 电话 非必填 // identificationNumber: "xxxxx", // 身份证号 非必填 }, ], }, ], }, payment: { totalAmount: this.totalPrice * 100, // 订单总价 必填 }, contactInfo: { phoneNumber: this.submitForm.phone, // 手机号 非必传 contactName: this.submitForm.personName, // 姓名 非必传 }, note: this.submitForm.comments, // 备注 非必传 callbackData: { addressDetails: this.submitForm.province + this.submitForm.city + this .submitForm.area + this.submitForm.address, notes: this.submitForm.comments }, // 透传数据,开发者自定义字段 非必传 tradeOption: { life_trade_flag: 1, // 0:非融合链路(默认值) 1:走融合链路(标准融合/完全融合) }, // 透传数据,开发者自定义字段 非必传 success: (res) => { const { orderId, outOrderNo } = res; console.log("预下单success res", res); console.log("预下单orderId", orderId); console.log("预下单outOrderNo", outOrderNo); this.douYinOrderId = orderId this.douYinOoutOrderNo = outOrderNo // this.setData({ // orderId, // outOrderNo // }); }, fail: (res) => { const { orderId, outOrderNo, errNo, errMsg, errLogId } = res; if (errLogId) { console.log("预下单失败errNo", errNo); console.log("预下单失败errMsg", errMsg); console.log("预下单失败errLogId", errLogId); } if (orderId || outOrderNo) { console.log("支付失败errNo", errNo); console.log("支付失败errMsg", errMsg); console.log("支付失败orderId", orderId); console.log("支付失败outOrderNo", outOrderNo); } console.log("预下单fail:errNo", errNo); console.log("预下单fail:errMsg", errMsg); }, }); },
创建订单调起收银台支付取消支付或支付失败会生成一个待支付状态订单,继续支付调起收银台
// 调起抖音支付 onClickDouYinOrder() { tt.continueToPay({ orderId: this.detailsData.douyinOrderId, // 内部订单号 outOrderNo: this.detailsData.id, // 外部订单号 2个订单号必填一个 success: (res) => { const { orderId, outOrderNo } = res; console.log("支付success res", res); console.log("支付orderId", orderId, ); console.log("支付outOrderNo", outOrderNo); // 调用接口 this.getDetail() }, fail: (res) => { const { orderId, outOrderNo, errNo, errMsg, errLogId } = res; if (errLogId) { console.log("支付查询订单信息失败errNo", errNo); console.log("支付查询订单信息失败errMsg", errMsg); console.log("支付查询订单信息失败errLogId", errLogId); } if (orderId || outOrderNo) { console.log("支付失败errNo", errNo); console.log("支付失败errMsg", errMsg); console.log("支付失败orderId", orderId); console.log("支付失败outOrderNo", outOrderNo); } console.log('支付fail', res) }, }); },
加价单必须商家接单后才能二次加价
// 加价单 handlePlaceOrder() { this.totalPrice = this.detailsData.addPrice * this.detailsData.quantity console.log('商品ID', this.detailsData.goodsId) console.log('商品名称', this.detailsData.title) console.log('商品主图', this.goodsData.sku_list[0].goods_info.img_url) console.log('下单数量', this.detailsData.quantity) console.log('预约门店的 poiId', this.goodsData.open_book_info.item_book_info_list[0].poi_id) console.log('预约店铺名称', this.goodsData.open_book_info.item_book_info_list[0].shop_name) console.log('预约门店的外部店铺id', this.goodsData.open_book_info.item_book_info_list[0].ext_shop_id) console.log('预定开始时间(ms)', this.startTime) console.log('预定结束时间(ms)', this.endTime) console.log('加项价', this.detailsData.addPrice) console.log('给抖音加项价*100', this.detailsData.addPrice * 100) console.log('总价', this.totalPrice) console.log('给抖音总价*100', this.totalPrice * 100) tt.createOrder({ skuList: [{ quantity: this.detailsData.quantity, // 数量 必传 skuId: this.detailsData.goodsId, // sku 商品Id 必传 skuType: 2, // sku 商品类型 必传 1:商品库商品、2:非商品库商品 price: this.detailsData.addPrice * 100, // 价格 非商品库 sku 商品必传 goodsInfo: { goodsName: this.detailsData.title, // 商品名称 必填 goodsPhoto: this.goodsData.sku_list[0].goods_info.img_url, // 商品图片链接 必填 goodsId: this.detailsData.goodsId, // 商品ID 必填 goodsType: 2, // 商品类型 必填 1:商品库商品、2:非商品库商品 }, extraInfo: { feeType: 3, // 本次加价类型 }, }, ], payment: { totalAmount: this.totalPrice * 100, // 总价 必填 }, tradeOption: { life_trade_flag: 1, // 0:非融合链路(默认值) 1:走融合链路(标准融合/完全融合) order_relation_info: { related_order_id: this.goodsData.item_order_info_list[0] .item_order_id, // 本次加价关联的抖音侧首单订单id relation_type: 'multi_buy_as_one' } }, // 透传数据,开发者自定义字段 非必传 success: (res) => { const { orderId, outOrderNo } = res; console.log("加价单预下单success res", res); console.log("加价单预下单orderId", orderId); console.log("加价单预下单outOrderNo", outOrderNo); this.douYinOrderId = orderId this.douYinOoutOrderNo = outOrderNo // 调用接口 this.getDetail() // this.setData({ // orderId, // outOrderNo // }); }, fail: (res) => { const { orderId, outOrderNo, errNo, errMsg, errLogId } = res; if (errLogId) { console.log("加价单失败errNo", errNo); console.log("加价单失败errMsg", errMsg); console.log("加价单失败errLogId", errLogId); } if (orderId || outOrderNo) { console.log("加价单支付失败errNo", errNo); console.log("加价单支付失败errMsg", errMsg); console.log("加价单支付失败orderId", orderId); console.log("加价单支付失败outOrderNo", outOrderNo); } console.log("加价单fail:errNo", errNo); console.log("加价单fail:errMsg", errMsg); }, }); },