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

如何在ReactJS中集成Zoho CRM?新手求解决方案及集成方式

Zoho CRM 集成到React外部应用的解决方案及实现建议

嘿,作为经常帮开发者搞定Zoho CRM集成的老鸟,我来给你把这个事儿说清楚~

首先明确:必须通过后端实现集成

绝对不建议直接在React前端调用Zoho CRM的API,原因有这几个:

  1. 敏感信息安全:Zoho的Client ID、Client Secret、OAuth令牌这些都是敏感数据,如果放在前端,很容易被浏览器控制台或网络请求抓包获取,导致你的CRM账号被滥用。
  2. 跨域与权限限制:Zoho的API大多不支持前端直接跨域调用,而且很多高级操作(比如批量修改、删除数据)需要更高权限,前端调用会被限制。
  3. 业务逻辑可维护性:把CRM的操作逻辑封装在后端,前端只负责数据展示和用户交互,后续修改业务规则、扩展功能都会更方便。

具体解决方案步骤

1. 准备Zoho CRM开发者凭证

  • 登录Zoho开发者控制台,创建一个Server-side类型的应用(专门给后端调用用的)
  • 记下生成的Client ID、Client Secret,并设置好后端的回调URL(用于第一次授权获取Refresh Token)
  • 给你的应用申请对应Zoho CRM模块的权限(比如联系人、线索的读写权限)
  • 完成第一次授权流程,获取到Refresh Token(这个令牌可以长期用来刷新访问令牌)

2. 搭建后端API层(以Node.js/Express为例)

我们需要在后端封装Zoho CRM的API调用,对外提供给React前端的安全接口。下面是一个简单的示例:

const express = require('express');
const axios = require('axios');
const cors = require('cors');
require('dotenv').config();

const app = express();
app.use(cors({ origin: 'http://localhost:3000' })); // 允许你的React前端域名
app.use(express.json());

// 从环境变量读取Zoho凭证(别硬编码!)
const ZOHO_CLIENT_ID = process.env.ZOHO_CLIENT_ID;
const ZOHO_CLIENT_SECRET = process.env.ZOHO_CLIENT_SECRET;
const ZOHO_REFRESH_TOKEN = process.env.ZOHO_REFRESH_TOKEN;
const ZOHO_API_BASE = 'https://www.zohoapis.com/crm/v2';

// 自动刷新访问令牌
async function getAccessToken() {
  try {
    const res = await axios.post('https://accounts.zoho.com/oauth/v2/token', {
      client_id: ZOHO_CLIENT_ID,
      client_secret: ZOHO_CLIENT_SECRET,
      refresh_token: ZOHO_REFRESH_TOKEN,
      grant_type: 'refresh_token'
    });
    return res.data.access_token;
  } catch (err) {
    throw new Error('获取访问令牌失败:' + err.message);
  }
}

// 对外接口:获取CRM联系人列表
app.get('/api/zoho/contacts', async (req, res) => {
  try {
    const token = await getAccessToken();
    const contactsRes = await axios.get(`${ZOHO_API_BASE}/Contacts`, {
      headers: { Authorization: `Zoho-oauthtoken ${token}` }
    });
    res.json(contactsRes.data);
  } catch (err) {
    console.error(err);
    res.status(500).json({ error: '无法获取CRM联系人数据' });
  }
});

// 对外接口:创建新的CRM联系人
app.post('/api/zoho/contacts', async (req, res) => {
  try {
    const token = await getAccessToken();
    const createRes = await axios.post(
      `${ZOHO_API_BASE}/Contacts`,
      { data: [req.body] },
      { headers: { 
        Authorization: `Zoho-oauthtoken ${token}`,
        'Content-Type': 'application/json'
      }}
    );
    res.json(createRes.data);
  } catch (err) {
    console.error(err);
    res.status(500).json({ error: '创建CRM联系人失败' });
  }
});

const PORT = process.env.PORT || 3001;
app.listen(PORT, () => console.log(`后端服务运行在端口 ${PORT}`));

3. React前端调用后端接口

前端只需要调用我们自己后端的接口,不用直接接触Zoho的API。下面是一个React组件示例:

import { useState, useEffect } from 'react';
import axios from 'axios';

function ZohoContactManager() {
  const [contacts, setContacts] = useState([]);
  const [formData, setFormData] = useState({ Last_Name: '', Email: '' });

  // 加载联系人列表
  useEffect(() => {
    const fetchContacts = async () => {
      try {
        const res = await axios.get('http://localhost:3001/api/zoho/contacts');
        setContacts(res.data.data || []);
      } catch (err) {
        console.error('加载联系人失败:', err);
      }
    };
    fetchContacts();
  }, []);

  // 提交新联系人
  const handleSubmit = async (e) => {
    e.preventDefault();
    try {
      await axios.post('http://localhost:3001/api/zoho/contacts', formData);
      alert('联系人创建成功!');
      // 刷新列表
      const res = await axios.get('http://localhost:3001/api/zoho/contacts');
      setContacts(res.data.data || []);
      setFormData({ Last_Name: '', Email: '' });
    } catch (err) {
      console.error('创建联系人失败:', err);
      alert('创建失败,请稍后重试');
    }
  };

  return (
    <div className="contact-manager">
      <h2>Zoho CRM 联系人管理</h2>
      <ul className="contact-list">
        {contacts.map(contact => (
          <li key={contact.id}>
            {contact.Last_Name} - {contact.Email}
          </li>
        ))}
      </ul>
      <form onSubmit={handleSubmit} className="contact-form">
        <input
          type="text"
          placeholder="姓氏"
          value={formData.Last_Name}
          onChange={(e) => setFormData({...formData, Last_Name: e.target.value})}
          required
        />
        <input
          type="email"
          placeholder="邮箱"
          value={formData.Email}
          onChange={(e) => setFormData({...formData, Email: e.target.value})}
          required
        />
        <button type="submit">添加联系人</button>
      </form>
    </div>
  );
}

export default ZohoContactManager;

额外注意事项

  • 环境变量管理:后端的Zoho凭证一定要用环境变量(比如dotenv)存储,绝对不能提交到代码仓库。
  • CORS配置:后端要正确配置CORS,只允许你的React前端域名访问,避免跨域问题。
  • 错误处理:前后端都要做好错误捕获和提示,给用户友好的反馈。
  • API版本:Zoho CRM的API会更新,记得使用最新的稳定版本(当前是v2)。

内容的提问来源于stack exchange,提问作者Arun Ravindran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:56:50