-
DuerOS开放平台
-
技能开放平台
-
自定义技能
- 自定义技能简介
- 自定义技能创建
-
有屏技能
-
技能交互模型
-
自定义技能协议
- 处理DuerOS发送的请求
-
技能部署
-
技能开发样例
- 账户关联
-
技能测试
-
技能发布
-
技能付费
-
个性化服务
-
内容播报技能
-
小技能
-
平台能力扩展
-
SDK
-
预览版功能
- 全双工(Preview)
-
APP技能(Preview)
-
-
智能家居开放平台
- 品牌使用规范
-
开发者服务条款
本文主要进行技能内付费开发相关的介绍,与非付费技能一致的部分只做简单介绍,具体可以参见自定义技能创建。
注册登录技能开放平台并完成开发者认证,以创建自定义技能为例,技能付费
项选择付费
,付费方式只能选择技能内付费
;随后可按照技能开发流程进行平台基础信息配置、交互模型开发(用户的购买意图需要配置常用表达)、使用付费协议和bot sdk进行技能服务开发、服务部署,设备端进行付费功能的真机测试,完成测试后提交审核,审核通过后技能会成功发布到技能商店,用户可在技能中进行付费购买。
DuerOS目前支持两种购买指令:Buy指令(推荐)和Charge指令。开发者可以根据需要自行选择任一指令:
- Buy指令
- 开发者预先在DuerOS中注册商品
- 可以自定义购买流程中涉及商品展现的相关提示
- DuerOS负责根据商品信息完成下单,收款,并通知技能付款完成
- 开发者可以直接调用DuerOS提供的api,获得商品列表以及用户的购买状态,降低开发成本
- 开发者预先在DuerOS中注册商品
- Charge指令
- 开发者自行管理商品
- 购买流程中涉及商品展现的相关提示都为标准化配置,技能不能自行配置
- DuerOS仅负责完成指令中指定金额的收款,并通知技能付款完成
- 技能负责下单以及维护用户购买状态
- 开发者自行管理商品
开发者需要预先在DuerOS中注册商品。
支付流程如下图。
用户的购买意图,需要在技能开放平台上配置相应的"常用表达",DuerOS会带上识别的购买意图和槽位来请求技能,技能使用商品id返回Buy指令,发起付费流程。
use \Baidu\Duer\Botsdk\Directive\Pay\Buy;
$this->addIntentHandler('purchase', function(){
$buyItem = $this->getSlot('xxx'); // 定义的槽位名称
$productId = get_product_id($buyItem); // 技能负责将物品转换为DuerOS的商品id
$token = gen_token($productId);
$buy = new Buy(
$productId, // 商品id
$token, // 自定义token
);
return [
'directives' => [$buy],
'outputSpeech' => '请支付'
];
});
当用户完成支付,DuerOS会发送Buy扣款事件到技能,并带上baiduOrderReferenceId参数。
$this->addEventListener('Connections.Response.Buy', function($event){
$result = $event['payload']['purchaseResult'];
switch ($result) {
case 'SUCCESS':
do_deliver(); // 给用户发放商品
break;
case 'ERROR_REPEAT_PURCHASE':
do_remind(); // 用户重复购买
break;
default:
handle_error(); // 其它错误
break;
}
});
支付流程如下图。
用户的购买意图,需要在技能开放平台上配置相应的"常用表达",DuerOS会带上识别的购买意图和槽位来请求技能,技能在下单时,商户服务需要产生一个订单,技能在返回的charge指令中携带sellerOrderId,发起付费流程。
use \Baidu\Duer\Botsdk\Directive\Pay\Charge;
$this->addIntentHandler("purchase", function(){
$sellerOrderId = call_create_order(); // 到商户下单
$charge = new Charge(
"10.09", // 价格,单位:元
"thirdpart-orderId-1121223", // 第三方订单号
"productName", // 商品名称
"description", // 商品描述
);
return [
'directives' => [$charge],
'outputSpeech' => '请支付'
];
});
当用户完成支付,DuerOS会发送charge扣款事件到技能,并带上sellerOrderId和baiduOrderReferenceId参数。技能对应的处理如下。
$this->addEventListener('Connections.Response', function($event){
$name = $event['name'];
// charge 事件
if($name == 'charge') {
$result = $event['payload']['purchaseResult'];
// 支付成功
if ($result == 'SUCCESS') {
$ret = call_order_status_update(); // 修改商户订单状态
}
}
});
商户服务与技能通信,包括以下几种。
- 商品是否购买过
当用户表达购买意图后,创建订单之前,应该检查当前用户是否购买过这个商品。 - 创建订单
当用户表达购买意图后,技能应该先去商户创建一个订单,这个订单的状态可能是"待支付",而且会有订单号。 - 订单状态修改
当收到支付成功的事件后,技能应该通知商户,将订单的状态修改为已支付,确保用户购买了这个商品。
当用户支付成功之后,DuerOS通过charge扣款事件通知技能,技能在修改订单状态为支付成功时,应该将这些重要参数与订单一起,进行记录。
- 订单创建时间
creationTimestamp
- 百度订单号
baiduOrderReferenceId
这两个参数是后续与百度结算的重要参数。