在語音應用開發中,讓使用者直接在 Alexa 技能內購買商品或服務,能大幅提升使用者經驗和應用價值。本文將深入探討如何在 Alexa 技能中實作 In-Skill Purchasing (ISP),包含購買流程處理、結果判斷、錯誤處理,以及如何建構退款機制。我們將著重於 BuyResponseHandlerCancelResponseHandler 這兩個核心類別的 Python 程式碼實作,並提供退款功能的實踐步驟和程式碼範例,涵蓋產品 ID 設定、請求處理、會話屬性更新等導向。藉由理解這些關鍵技術細節,開發者能建構完整且穩健的 ISP 功能,提升 Alexa 技能的商業價值和使用者黏著度。

BuyResponseHandler 類別

以下是 BuyResponseHandler 類別的實作:

class BuyResponseHandler(AbstractRequestHandler):
    """這個類別負責處理購買後的回應"""
    
    def can_handle(self, handler_input):
        # type: (HandlerInput) -> bool
        return (ask_utils.is_request_type("Connections.Response")(handler_input) 
                and handler_input.request_envelope.request.name == "Buy")
    
    def handle(self, handler_input):
        # type: (HandlerInput) -> Response
        logger.info("正在處理購買後的回應")
        
        speech = None
        reprompt = None
        
        # 取得購買結果
        purchase_result = handler_input.request_envelope.request.payload.get("purchaseResult")
        
        if purchase_result == PurchaseResult.ACCEPTED.value:
            # 如果購買成功,更新會話屬性並提供成功反饋
            session_attr = handler_input.attributes_manager.session_attributes
            session_attr["paid_jokes"] = True
            handler_input.attributes_manager.session_attributes = session_attr
            speech = "您已成功購買更多笑話,享受吧"
            reprompt = "您可以要求更多笑話"
        elif purchase_result in (PurchaseResult.DECLINED.value, PurchaseResult.ERROR.value):
            # 如果購買失敗,提供失敗反饋
            speech = "購買失敗,請稍後再試"
            reprompt = "您可以再次嘗試購買"
        
        return handler_input.response_builder.speak(speech).ask(reprompt).response

註冊請求處理器

為了使 BuyResponseHandler 類別生效,我們需要將其註冊到 Alexa Skills Builder 中:

sb.add_request_handler(BuyResponseHandler())

這樣,當使用者完成購買後,Alexa 會觸發 Connections.Response 事件,並由 BuyResponseHandler 類別進行處理。根據購買結果,該類別會提供相應的反饋給使用者。

Alexa 技術深入:In-Skill Purchasing 的實作

10.1 In-Skill Purchasing 概述

In-Skill Purchasing(ISP)是 Alexa 中的一項功能,允許使用者在技能中購買商品或服務。這項功能使得開發者可以建立更豐富、更具吸引力的技能,以滿足使用者的需求。

10.2 實作 In-Skill Purchasing

要實作 In-Skill Purchasing,需要在技能中新增相關的邏輯和程式碼。以下是實作 In-Skill Purchasing 的步驟:

10.2.1 處理購買結果

當使用者購買商品或服務時,Alexa 會向技能傳送一個購買結果事件。技能需要處理這個事件,並根據購買結果傳回相應的回應。

if purchase_result == PurchaseResult.NOT_ENTITLED.value:
    speech = "Thanks for your interest. Ask for another free joke"
    reprompt = "Ask for a joke"
elif purchase_result == PurchaseResult.ALREADY_PURCHASED.value:
    logger.info("Already purchased product")
    speech = "You’ve already purchased more jokes, just ask for another joke"
    reprompt = "Ask for a joke, help or exit"
else:
    # Invalid purchase result value
    logger.info("Purchase result: {}".format(purchase_result))
    speech = "Sorry, there was an error, please try again"
    reprompt = "Ask for a joke, help or exit"

10.2.2 更新會話屬性

如果購買結果需要更新會話屬性,需要在技能中新增相關的程式碼。

return handler_input.response_builder.speak(speech).ask(reprompt).response

10.2.3 處理錯誤

如果購買結果出現錯誤,需要在技能中新增相關的錯誤處理程式碼。

else:
    logger.log("Error: {}".format(handler_input.request_envelope.request.status.message))
    return handler_input.response_builder.speak("There was an error handling your purchase request. Please try again or ask for help")

10.3 測試 In-Skill Purchasing

要測試 In-Skill Purchasing,需要在 Alexa Developer Console 中啟用這項功能,並組態相關的設定。然後,可以使用 Alexa Simulator 或實際裝置測試技能中的 In-Skill Purchasing 功能。

10.3.1 測試購買結果

可以測試不同的購買結果,例如「yes」和「no」,以確保技能正確地處理購買結果。

  flowchart TD
    A[購買結果] --> B[處理購買結果]
    B --> C[傳回回應]
    C --> D[更新會話屬性]

10.3.2 測試錯誤處理

可以測試錯誤處理,例如購買結果出現錯誤,以確保技能正確地處理錯誤。

  flowchart TD
    A[錯誤] --> B[錯誤處理]
    B --> C[傳回錯誤回應]

10.6 Alexa技能購買(In-skill Purchasing, ISP)實作

10.6.1 處理購買失敗

在購買流程中,需要檢查購買是否失敗。這可以在BuyResponseHandler程式碼中實作:

else:
    # 無效的購買結果值
    logger.info("購買結果:{}".format(purchase_result))
    speech = "抱歉,發生了錯誤,請再試一次"
    reprompt = "詢問一個笑話,幫助或離開"

10.6.2 退款實作

為了實作退款功能,需要新增一個新的意圖(Intent)。命名為RefundPurchase,並新增一些使用者可能說的話語,例如“退款”,“退回商品”,“我想要退款”等。

或者,可以新增以下JSON程式碼:

{
    "name": "RefundPurchase",
    "slots": [],
    "samples": [
        "我想要退款",
        "退回商品",
        "退款購買",
        "退款"
    ]
}

然後,需要新增退款程式碼。與購買類別似,會有兩個處理器(Handler):一個使用add_directive傳送一個SendRequestDirective,型別為“Cancel”;另一個處理器用於處理亞馬遜/ Alexa 的回應(記得之前的錯誤:無法找到合適的請求處理器)。

新增以下處理器:

sb.add_request_handler(TellMeMoreHandler())
sb.add_request_handler(BuyHandler())
sb.add_request_handler(BuyResponseHandler())
sb.add_request_handler(RefundPurchaseHandler())
sb.add_request_handler(CancelResponseHandler())

定義RefundPurchaseHandler類別:

class RefundPurchaseHandler(AbstractRequestHandler):
    def can_handle(self, handler_input):
        # type: (HandlerInput) -> bool
        return ask_utils.is_intent_name("RefundPurchase")(handler_input)

這樣就完成了退款功能的實作。

處理退款購買的 Alexa 技術

在開發語音控制的 IoT 應用時,處理退款購買是一個重要的功能。以下是如何使用 Alexa 和 Raspberry Pi 來實作這個功能的技術。

退款購買處理器

首先,我們需要定義一個處理退款購買的處理器。這個處理器將會接收到 Alexa 的退款請求,並且傳回一個相應的回應。

def handle(self, handler_input):
    # type: (HandlerInput) -> Response
    logger.info("In RefundPurchaseHandler")
    product_id = 'ADD YOUR PRODUCT ID HERE'
    return handler_input.response_builder.add_directive(
        SendRequestDirective(
            name="Cancel",
            payload={
                "InSkillProduct": {
                    "productId": product_id
                }
            },
            token="correlationToken"
        )
    ).response

這個處理器簡單地傳回了一個 Cancel RequestDirective,包含了產品 ID 和 token。

退款回應處理器

接下來,我們需要定義一個處理退款回應的處理器。這個處理器將會接收到 Alexa 的退款回應,並且更新 session 屬性。

class CancelResponseHandler(AbstractRequestHandler):
    # This handles the Connections.Response event after a cancel occurs.
    def can_handle(self, handler_input):
        # type: (HandlerInput) -> bool
        return (ask_utils.is_request_type("Connections.Response")(handler_input)
                and handler_input.request_envelope.request.name == "Cancel")

    def handle(self, handler_input):
        # type: (HandlerInput) -> Response
        session_attr = handler_input.attributes_manager.session_attributes
        session_attr["paid_jokes"] = False
        handler_input.attributes_manager.session_attributes = session_attr

這個處理器更新了 session 屬性,將 paid_jokes 設為 False。

實作細節

在實作這個功能時,我們需要注意以下幾點:

  • 需要知道產品 ID,以便 Alexa 可以識別要退款的產品。
  • 需要實作 Cancel Response Handler,以便處理 Alexa 的退款回應。
  • 需要更新 session 屬性,以便記錄退款的狀態。

Alexa 技術深入:In-skill Purchasing 處理

在 Alexa 技術的應用中,In-skill Purchasing (ISP) 是一項重要功能,允許使用者在技能中購買商品或服務。為了處理這些購買請求,開發者需要實作特定的處理邏輯。在本章中,我們將深入探討如何實作 ISP 處理,特別是關注 CancelResponseHandler 的實作。

從商業價值視角來看,完善的 In-Skill Purchasing (ISP) 流程,對於提升 Alexa 技能的變現能力至關重要。本文深入探討了 ISP 的核心環節,包含購買流程的成功與失敗處理、會話屬性更新,以及關鍵的退款機制。透過BuyResponseHandlerCancelResponseHandler 等類別的設計,我們可以有效管理購買狀態,並針對不同購買結果(ACCEPTED, DECLINED, ERROR, ALREADY_PURCHASED, NOT_ENTITLED)提供對應的使用者反饋。然而,程式碼範例中缺乏對錯誤狀態的具體處理邏輯,例如網路連線失敗或伺服器錯誤,這在實際應用中是不可忽視的環節。此外,程式碼片段中存在硬編碼產品 ID 的問題,這不利於產品的後續管理和維護,建議採用更具彈性的組態方式。展望未來,更精細化的使用者購買行為分析,例如追蹤購買轉化率、分析使用者購買偏好等,將有助於開發者最佳化產品策略,提升技能的商業價值。對於開發者而言,除了完善程式碼邏輯外,還需關注使用者經驗,例如簡化購買流程、提供清晰的退款指引,才能真正將技術轉化為商業成功。 玄貓認為,隨著語音商務的蓬勃發展,精通 ISP 流程的開發者將在未來的市場競爭中佔據更大的優勢。