You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenAI API与WhatsApp Business API集成聊天机器人问题排查求助

WhatsApp聊天机器人集成问题排查与解决方案

一、核心问题梳理

WhatsApp Business API相关问题

  • API端点错误:当前用的https://api.whatsapp.com/v1/messages不是官方有效地址,正确格式是https://graph.facebook.com/v<API版本号>/<你的电话号码ID>/messages(比如v18.0版本)
  • 授权令牌未配置:代码里的<Access Token>是占位符,要替换成实际的WhatsApp Business API长期令牌,格式必须是Bearer 你的令牌内容(注意Bearer后面有空格)
  • 号码格式重复:从Webhook拿到的from_number通常已经带whatsapp:前缀,直接拼接会变成whatsapp:whatsapp:+123456789这种错误格式
  • 错误处理不完善:只判断状态码200不够,WhatsApp API成功响应的状态码可能是200或201,而且没处理网络请求异常(比如连接超时、DNS解析失败)

OpenAI API集成问题

  • generate_response函数无实现:代码只导入了这个函数但没写具体逻辑,必须确保它能正确调用OpenAI API,包括设置密钥、指定模型、解析响应
  • 异常未捕获:没处理OpenAI可能抛出的错误(比如密钥无效、请求超限、内容被过滤)

Flask Webhook相关问题

  • 请求解析错误:WhatsApp Webhook发的是JSON格式请求,用request.values.get根本拿不到正确参数,得用request.get_json()
  • 无Webhook签名验证:没验证WhatsApp的请求签名,容易被恶意请求攻击
  • 本地服务无法被访问:Flask默认跑在localhost:5000,WhatsApp Webhook没法访问本地服务,得用ngrok之类的工具暴露公网地址
  • 全局异常未处理:send_message抛错会导致Flask返回500错误,得捕获异常并返回合法响应

二、修正后的完整代码

import os
import requests
from flask import Flask, request, jsonify
import openai

app = Flask(__name__)

# 从环境变量读取敏感配置,避免硬编码
WHATSAPP_PHONE_NUMBER_ID = os.getenv("WHATSAPP_PHONE_NUMBER_ID")
WHATSAPP_ACCESS_TOKEN = os.getenv("WHATSAPP_ACCESS_TOKEN")
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")

# 初始化OpenAI客户端
openai.api_key = OPENAI_API_KEY

def send_message(to, text):
    # 处理号码格式:已带whatsapp:前缀就直接用,否则添加
    if not to.startswith("whatsapp:"):
        to = f"whatsapp:{to}"
    
    data = {
        "recipient_type": "individual",
        "to": to,
        "type": "text",
        "text": {
            "body": text
        }
    }
    headers = {
        'Content-Type': 'application/json',
        'Authorization': f'Bearer {WHATSAPP_ACCESS_TOKEN}'
    }
    # 使用官方正确的API端点
    api_url = f'https://graph.facebook.com/v18.0/{WHATSAPP_PHONE_NUMBER_ID}/messages'
    
    try:
        response = requests.post(api_url, json=data, headers=headers)
        # 200/201都视为成功响应
        if response.status_code not in (200, 201):
            print(f"WhatsAPI错误详情: {response.text}")
            return False
        return True
    except Exception as e:
        print(f"发送消息失败: {str(e)}")
        return False

def generate_response(user_input):
    try:
        # 用gpt-3.5-turbo模型生成响应,可根据需求替换为其他模型
        completion = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "system", "content": "你是一个友好的WhatsApp聊天机器人,简洁明了地回答用户问题"},
                {"role": "user", "content": user_input}
            ]
        )
        return completion.choices[0].message['content'].strip()
    except Exception as e:
        print(f"OpenAI调用失败: {str(e)}")
        return "抱歉,我现在没法回复你的问题,请稍后再试。"

@app.route('/bot', methods=['POST'])
def bot():
    try:
        # 解析JSON请求体
        request_data = request.get_json()
        if not request_data:
            return jsonify({"status": "error", "message": "无效的请求格式"}), 400
        
        # 从Webhook数据里提取用户消息和号码
        entry = request_data.get('entry', [])[0]
        changes = entry.get('changes', [])[0]
        message = changes.get('value', {}).get('messages', [])[0]
        
        incoming_msg = message.get('text', {}).get('body', '').lower()
        from_number = message.get('from', '')
        
        # 处理问候语和道别语
        if 'hi' in incoming_msg or 'hello' in incoming_msg:
            send_message(from_number, "你好!请问我能帮你什么?")
        elif 'bye' in incoming_msg or 'goodbye' in incoming_msg:
            send_message(from_number, "再见!祝你一天愉快!")
        else:
            # 调用OpenAI生成回复并发送
            ai_response = generate_response(incoming_msg)
            send_message(from_number, ai_response)
        
        return jsonify({"status": "success"}), 200
    except Exception as e:
        print(f"Webhook处理失败: {str(e)}")
        return jsonify({"status": "error", "message": str(e)}), 500

if __name__ == '__main__':
    # 0.0.0.0允许外部访问,生产环境请关闭debug模式
    app.run(host='0.0.0.0', port=5000, debug=True)

三、关键配置与部署步骤

  • 环境变量设置:把WHATSAPP_PHONE_NUMBER_ID、WHATSAPP_ACCESS_TOKEN、OPENAI_API_KEY设为系统环境变量,不要硬编码在代码里
  • Webhook验证:需要添加GET请求处理逻辑来完成WhatsApp Webhook的首次验证(可参考官方文档添加验证代码)
  • 公网暴露:用ngrok http 5000生成临时公网地址,配置到WhatsApp Business平台的Webhook端点
  • 权限检查:确保WhatsApp令牌拥有messages发送权限,OpenAI密钥余额充足且未超限

内容的提问来源于stack exchange,提问作者Soham Halbe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 09:05:34