chatgpt对接微信公众号

莘光华
2023-12-01

一,将微信公众号接入ChatGPT API实现用户与AI对话功能

1. 注册并配置微信公众号

在微信公众平台上注册一个公众号,并获取开发者凭据(AppID和AppSecret)。
在公众号管理后台,进入
开发>
基本配置页面。
记录下AppID和AppSecret,后续开发中会用到。
设置服务器配置(URL、Token和EncodingAESKey)。

2. 创建服务器端应用

使用您喜欢的编程语言(如Python、Node.js或Java等)和框架(如Flask、Express或Spring Boot等)创建一个服务器端应用。

3. 验证服务器地址

在您的服务器端应用中,实现一个接收GET请求的接口。微信服务器会通过这个接口来验证服务器地址的有效性。按照微信官方文档的要求,将接收到的参数(signature、timestamp、nonce和echostr)进行处理,返回echostr值以完成验证。

4. 处理用户消息

在同一个接口中,添加一个接收POST请求的逻辑。这个逻辑用于处理来自微信服务器的用户消息。
解密微信服务器发送的加密消息。
根据消息类型(如文本消息、图片消息等)进行相应处理。

5. 调用ChatGPT API

当您收到用户的文本消息时,提取消息内容,然后调用ChatGPT API。
将用户的消息作为输入发送给API。
API会返回一个生成的回复。
将这个回复封装成微信公众号消息格式,并对其进行加密。

6. 回复用户消息

将加密后的回复发送回微信服务器。微信服务器会将回复转发给用户,实现与ChatGPT的交互。

7. 测试与部署

在完成开发后,确保您的服务器端应用能够正确处理微信服务器发送的请求,并正确调用ChatGPT API。
将应用部署到一个公网可访问的服务器上。
注意遵循微信公众号开发文档的相关规定,确保应用的稳定性和安全性。
在实现过程中,可以参考微信公众平台的官方文档以了解更详细的指南和要求。

二,代码实现

以下是使用Java语言、Spring Boot框架实现处理用户消息和调用ChatGPT API的示例代码:

1.添加依赖(pom.xml)

org.springframework.boot spring-boot-starter-web com.github.binarywang weixin-java-mp 3.9.0 org.apache.httpcomponents httpclient 4.5.13

2.创建配置文件(application.properties)

propertiesCopy codewx.mp.appId=YOUR_APP_ID
wx.mp.secret=YOUR_APP_SECRET
wx.mp.token=YOUR_TOKEN
wx.mp.aesKey=YOUR_AES_KEY

chatgpt.api.url=YOUR_CHATGPT_API_URL
chatgpt.api.key=YOUR_CHATGPT_API_KEY

3.创建配置类(WxMpConfig.java)

javaCopy codepackage com.example.chatgpt;

import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class WxMpConfig {

@Value("${wx.mp.appId}")
private String appId;

@Value("${wx.mp.secret}")
private String secret;

@Value("${wx.mp.token}")
private String token;

@Value("${wx.mp.aesKey}")
private String aesKey;

@Bean
public WxMpService wxMpService() {
    WxMpDefaultConfigImpl config = new WxMpDefaultConfigImpl();
    config.setAppId(appId);
    config.setSecret(secret);
    config.setToken(token);
    config.setAesKey(aesKey);

    WxMpService wxMpService = new WxMpServiceImpl();
    wxMpService.setWxMpConfigStorage(config);
    return wxMpService;
}

}

4.创建ChatGPT客户端类(ChatGptClient.java)

javaCopy codepackage com.example.chatgpt;

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Component
public class ChatGptClient {

@Value("${chatgpt.api.url}")
private String apiUrl;

@Value("${chatgpt.api.key}")
private String apiKey;

public String getResponse(String prompt) throws IOException {
    CloseableHttpClient httpClient = HttpClients.createDefault();

    HttpPost httpPost = new HttpPost(apiUrl);
    httpPost.setHeader("Content-Type", "application/json");
    httpPost.setHeader("Authorization", "Bearer " + apiKey);

    String requestBody = "{\"prompt\":\"" + prompt + "\"}";
    httpPost.setEntity(new StringEntity(requestBody));

    CloseableHttpResponse response = httpClient.execute(httpPost);
    HttpEntity responseEntity = response.getEntity();
    String responseBody = EntityUtils.toString(responseEntity);
            // 解析JSON响应以获取生成的消息
    JSONObject jsonResponse = new JSONObject(responseBody);
    String generatedMessage = jsonResponse.getJSONObject("choices").getJSONArray("text").getString(0);

    httpClient.close();

    return generatedMessage;
}

}

5.创建微信消息处理器(WxMessageHandler.java)

javaCopy codepackage com.example.chatgpt;

import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpMessageHandler;
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutTextMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class WxMessageHandler implements WxMpMessageHandler {

@Autowired
private ChatGptClient chatGptClient;

@Override
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService wxMpService)
        throws WxErrorException {
    // 如果收到的是文本消息
    if (WxConsts.XmlMsgType.TEXT.equals(wxMessage.getMsgType())) {
        // 获取用户发送的消息内容
        String userMessage = wxMessage.getContent();

        // 向ChatGPT API发送消息并获取回复
        String chatGptResponse;
        try {
            chatGptResponse = chatGptClient.getResponse(userMessage);
        } catch (IOException e) {
            e.printStackTrace();
            chatGptResponse = "对不起,目前无法回复您的问题。";
        }

        // 创建一个回复消息
        WxMpXmlOutTextMessage response = new WxMpXmlOutTextMessage();
        response.setFromUserName(wxMessage.getToUser());
        response.setToUserName(wxMessage.getFromUser());
        response.setCreateTime(System.currentTimeMillis() / 1000L);
        response.setMsgType(WxConsts.XmlMsgType.TEXT);
        response.setContent(chatGptResponse);

        return response;
    }

    return null;
}

}

6.创建控制器(WxController.java)

javaCopy codepackage com.example.chatgpt;

import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.mp.api.WxMpMessageRouter;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(“/wx”)
public class WxController {

@Autowired
private WxMpService wxMpService;

@Autowired
private WxMessageHandler wxMessageHandler;

@PostMapping(produces = "application/xml; charset=UTF-8")
public String handlePost(@RequestParam(name = "signature", required = false) String signature,
                         @RequestParam(name = "timestamp", required = false) String timestamp,
                         @RequestParam(name = "nonce", required = false) String nonce,
                         @RequestParam(name = "openid", required = false) String openid,
                         @RequestParam(name = "encrypt_type", required = false
                                                      String encType,
                         @RequestParam(name = "msg_signature", required = false) String msgSignature,
                         @RequestBody(required = false) String requestBody) {

    // 验证请求的签名
    if (!wxMpService.checkSignature(timestamp, nonce, signature)) {
        throw new IllegalArgumentException("非法请求,可能属于伪造的请求!");
    }

    // 解析微信服务器发送的消息
    WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(requestBody);

    // 创建消息路由器并添加处理器
    WxMpMessageRouter messageRouter = new WxMpMessageRouter(wxMpService);
    messageRouter.rule().async(false).msgType(WxConsts.XmlMsgType.TEXT).handler(wxMessageHandler).end();

    // 使用消息路由器处理消息
    WxMpXmlOutMessage outMessage = messageRouter.route(inMessage);

    // 如果有回复消息,将其转换为XML字符串并返回
    if (outMessage != null) {
        return outMessage.toXml();
    }

    return "";
}

}

以上代码示例展示了如何使用Java语言、Spring Boot框架、微信Java SDK(weixin-java-mp)和Apache HttpClient库来接收用户在微信公众号上发送的消息,并将其转发给ChatGPT API,然后将API的回复消息发送回给用户。这个示例可以作为实现微信公众号与ChatGPT API集成的基础代码。

 类似资料: