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