在微信公众平台上注册一个公众号,并获取开发者凭据(AppID和AppSecret)。
在公众号管理后台,进入
开发>
基本配置页面。
记录下AppID和AppSecret,后续开发中会用到。
设置服务器配置(URL、Token和EncodingAESKey)。
使用您喜欢的编程语言(如Python、Node.js或Java等)和框架(如Flask、Express或Spring Boot等)创建一个服务器端应用。
在您的服务器端应用中,实现一个接收GET请求的接口。微信服务器会通过这个接口来验证服务器地址的有效性。按照微信官方文档的要求,将接收到的参数(signature、timestamp、nonce和echostr)进行处理,返回echostr值以完成验证。
在同一个接口中,添加一个接收POST请求的逻辑。这个逻辑用于处理来自微信服务器的用户消息。
解密微信服务器发送的加密消息。
根据消息类型(如文本消息、图片消息等)进行相应处理。
当您收到用户的文本消息时,提取消息内容,然后调用ChatGPT API。
将用户的消息作为输入发送给API。
API会返回一个生成的回复。
将这个回复封装成微信公众号消息格式,并对其进行加密。
将加密后的回复发送回微信服务器。微信服务器会将回复转发给用户,实现与ChatGPT的交互。
在完成开发后,确保您的服务器端应用能够正确处理微信服务器发送的请求,并正确调用ChatGPT API。
将应用部署到一个公网可访问的服务器上。
注意遵循微信公众号开发文档的相关规定,确保应用的稳定性和安全性。
在实现过程中,可以参考微信公众平台的官方文档以了解更详细的指南和要求。
以下是使用Java语言、Spring Boot框架实现处理用户消息和调用ChatGPT API的示例代码:
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
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;
}
}
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;
}
}
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;
}
}
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集成的基础代码。