0

0

利用java开发微信公众号案例代码

高洛峰

高洛峰

发布时间:2017-03-14 14:16:17

|

2148人浏览过

|

来源于php中文网

原创

这篇文章利用java开发微信公众号案例代码,如何接入公众号,订阅号怎么样接收消息,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

微信公众号开发一般是针对企业和组织的,个人一般只能申请订阅号,并且调用的接口有限,下面我们就来简单的描述下接入公众号的步骤

1、首先你需要一个邮箱在微信公众号平台进行注册;
     注册的方式有订阅号、公众号、小程序和企业号,个人我们这里只能选择订阅号

2、注册完后,我们登录到公众号平台--->开发--->基本配置,这里需要填写URL和token,URL就是我们使用服务器的接口;

3、Java Web服务器程序编译好且在服务器上部署可以运行的话,可在微信公众号进行在线接口调试

立即学习Java免费学习笔记(深入)”;

    1)、选择合适的接口
    2)、系统会生成该接口的参数表,您可以直接在文本框内填入对应的参数值(红色星号表示该字段必填)
    3)、点击检查问题按钮,即可得到相应的调试信息

   eg:获取access_token的步骤:

   1)、接口类型:基础支持
   2)、接口列表:获取access_token接口/token
   3)、填写相应的参数:grant_type、appid、secret
   4)、点击检查问题
   5)、验证成功会返回结果和提示,结果为:200 ok,提示:Request successful即表示验证成功

   我们这里验证比较多的是消息接口调试:文本消息、图片消息、语音消息、视频消息、etc

4、接口有不理解的地方,可进入开发-->开发者工具-->开发者文档进行查询

5、接口权限:订阅号主要有基础支持、接收消息及网页服务里面的一些接口

萤火商城
萤火商城

萤火商城V2.0,是2021年全新推出的一款轻量级、高性能、前后端分离的电商系统,支持微信小程序 + H5+ 公众号 + APP,前后端源码完全开源,看见及所得,完美支持二次开发,可学习可商用,让您快速搭建个性化独立商城。萤火商城V2.0开源版 [uni-app端]如何使用uni-app端一、导入uniapp项目 1. 首先下载HBuilderX并安装,地址:https://www.dcloud

下载

下面我们主要讲订阅号怎么样接收消息的案例:

1、需要申请一个个人微信订阅号
2、url服务器和服务器端代码部署(可以用腾讯云or阿里云服务器)

1)、AccountsServlet.java类,验证来自微信服务器和微信服务器的消息处理


package cn.jon.wechat.servlet; 
 
import java.io.IOException; 
import java.io.PrintWriter; 
 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
 
import cn.jon.wechat.service.AccountsService; 
import cn.jon.wechat.utils.SignUtil; 
 
public class AccountsServlet extends HttpServlet { 
 
 public AccountsServlet() { 
 super(); 
 } 
 
 
 public void destroy() { 
 super.destroy(); 
 // Put your code here 
 } 
 /** 
 * 确认请求来自于微信服务器 
 */ 
 
 public void doGet(HttpServletRequest request, HttpServletResponse response) 
  throws ServletException, IOException { 
  System.out.println("接口测试开始!!!"); 
  //微信加密签名 
  String signature = request.getParameter("signature"); 
  //时间戳 
  String timestamp = request.getParameter("timestamp"); 
  //随机数 
  String nonce = request.getParameter("nonce"); 
  //随机字符串 
  String echostr = request.getParameter("echostr"); 
  
  PrintWriter out = response.getWriter(); 
  //通过校验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败 
  if(SignUtil.checkSignature(signature,timestamp,nonce)){ 
  out.print(echostr); 
  } 
  out.close(); 
  out = null; 
//  response.encodeRedirectURL("success.jsp"); 
  
  
 } 
 /** 
 * 处理微信服务器发来的消息 
 */ 
 public void doPost(HttpServletRequest request, HttpServletResponse response) 
  throws ServletException, IOException { 
 //消息的接受、处理、响应 
 request.setCharacterEncoding("utf-8"); 
 response.setCharacterEncoding("utf-8"); 
 //调用核心业务类型接受消息、处理消息 
 String respMessage = AccountsService.processRequest(request); 
  
 //响应消息 
 PrintWriter out = response.getWriter(); 
 out.print(respMessage); 
 out.close(); 
  
  
 } 
 
 public void init() throws ServletException { 
 // Put your code here 
 } 
 
}

2)、SignUtil.java类,请求校验工具类,token需要和微信中填写的token一致


package cn.jon.wechat.utils; 
 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 
import java.util.Arrays; 
import java.util.Iterator; 
import java.util.Map; 
import java.util.Set; 
import java.util.concurrent.ConcurrentHashMap; 
 
/** 
 * 请求校验工具类 
 * @author jon 
 */ 
public class SignUtil { 
 //与微信配置中的的Token一致 
 private static String token = ""; 
 
 public static boolean checkSignature(String signature, String timestamp, 
  String nonce) { 
 String[] arra = new String[]{token,timestamp,nonce}; 
 //将signature,timestamp,nonce组成数组进行字典排序 
 Arrays.sort(arra); 
 StringBuilder sb = new StringBuilder(); 
 for(int i=0;i>>4)&0X0F]; 
 tmpArr[1] = Digit[dByte&0X0F]; 
 String s = new String(tmpArr); 
 return s; 
 } 
 
 public static void main(String[] args) { 
 /*byte dByte = 'A'; 
 System.out.println(byteToHexStr(dByte));*/ 
 Map map = new ConcurrentHashMap(); 
 map.put("4", "zhangsan"); 
 map.put("100", "lisi"); 
 Set set = map.keySet(); 
 Iterator iter = set.iterator(); 
 while(iter.hasNext()){ 
//  String keyV = (String) iter.next(); 
  String key =(String)iter.next(); 
  System.out.println(map.get(key)); 
//  System.out.println(map.get(iter.next())); 
 } 
 /*for(int i=0;i

3)、AccountsService.java服务类,主要是消息的请求和响应处理,并且当用户关注你的公众号的时候,可以设置默认推送消息


package cn.jon.wechat.service; 
 
import java.util.Date; 
import java.util.Map; 
 
import javax.servlet.http.HttpServletRequest; 
 
import cn.jon.wechat.message.req.ImageMessage; 
import cn.jon.wechat.message.req.LinkMessage; 
import cn.jon.wechat.message.req.LocationMessage; 
import cn.jon.wechat.message.req.VideoMessage; 
import cn.jon.wechat.message.req.VoiceMessage; 
import cn.jon.wechat.message.resp.TextMessage; 
import cn.jon.wechat.utils.MessageUtil; 
 
/** 
 * 解耦,使控制层与业务逻辑层分离开来,主要处理请求,响应 
 * @author jon 
 */ 
public class AccountsService { 
 
 public static String processRequest(HttpServletRequest request) { 
 String respMessage = null; 
 //默认返回的文本消息内容 
 String respContent = "请求处理异常,请稍后尝试!"; 
 try { 
  //xml请求解析 
  Map requestMap = MessageUtil.pareXml(request); 
  
  //发送方账号(open_id) 
  String fromUserName = requestMap.get("FromUserName"); 
  //公众账号 
  String toUserName = requestMap.get("ToUserName"); 
  //消息类型 
  String msgType = requestMap.get("MsgType"); 
  
  //默认回复此文本消息 
  TextMessage defaultTextMessage = new TextMessage(); 
  defaultTextMessage.setToUserName(fromUserName); 
  defaultTextMessage.setFromUserName(toUserName); 
  defaultTextMessage.setCreateTime(new Date().getTime()); 
  defaultTextMessage.setMsgType(MessageUtil.MESSSAGE_TYPE_TEXT); 
  defaultTextMessage.setFuncFlag(0); 
  // 由于href属性值必须用双引号引起,这与字符串本身的双引号冲突,所以要转义 
  defaultTextMessage.setContent("欢迎访问jon的博客!"); 
//  defaultTextMessage.setContent(getMainMenu()); 
  // 将文本消息对象转换成xml字符串 
  respMessage = MessageUtil.textMessageToXml(defaultTextMessage); 
 
  
  //文本消息 
  if(msgType.equals(MessageUtil.MESSSAGE_TYPE_TEXT)){ 
  //respContent = "Hi,您发送的是文本消息!"; 
  //回复文本消息 
  TextMessage textMessage = new TextMessage(); 
//  textMessage.setToUserName(toUserName); 
//  textMessage.setFromUserName(fromUserName); 
  //这里需要注意,否则无法回复消息给用户了 
  textMessage.setToUserName(fromUserName); 
  textMessage.setFromUserName(toUserName); 
  textMessage.setCreateTime(new Date().getTime()); 
  textMessage.setMsgType(MessageUtil.MESSSAGE_TYPE_TEXT); 
  textMessage.setFuncFlag(0); 
  respContent = "Hi,你发的消息是:"+requestMap.get("Content"); 
  textMessage.setContent(respContent); 
  respMessage = MessageUtil.textMessageToXml(textMessage); 
  } 
  //图片消息 
  else if(msgType.equals(MessageUtil.MESSSAGE_TYPE_IMAGE)){ 
   
  ImageMessage imageMessage=new ImageMessage(); 
  imageMessage.setToUserName(fromUserName); 
  imageMessage.setFromUserName(toUserName); 
  imageMessage.setCreateTime(new Date().getTime()); 
  imageMessage.setMsgType(MessageUtil.MESSSAGE_TYPE_IMAGE); 
  //respContent=requestMap.get("PicUrl"); 
  imageMessage.setPicUrl("http://img24.pplive.cn//2013//07//24//12103112092_230X306.jpg"); 
  respMessage = MessageUtil.imageMessageToXml(imageMessage); 
  } 
  //地理位置 
  else if(msgType.equals(MessageUtil.MESSSAGE_TYPE_LOCATION)){ 
  LocationMessage locationMessage=new LocationMessage(); 
  locationMessage.setToUserName(fromUserName); 
  locationMessage.setFromUserName(toUserName); 
  locationMessage.setCreateTime(new Date().getTime()); 
  locationMessage.setMsgType(MessageUtil.MESSSAGE_TYPE_LOCATION); 
  locationMessage.setLocation_X(requestMap.get("Location_X")); 
  locationMessage.setLocation_Y(requestMap.get("Location_Y")); 
  locationMessage.setScale(requestMap.get("Scale")); 
  locationMessage.setLabel(requestMap.get("Label")); 
  respMessage = MessageUtil.locationMessageToXml(locationMessage); 
   
  } 
  
  //视频消息 
  else if(msgType.equals(MessageUtil.MESSSAGE_TYPE_VIDEO)){ 
  VideoMessage videoMessage=new VideoMessage(); 
  videoMessage.setToUserName(fromUserName); 
  videoMessage.setFromUserName(toUserName); 
  videoMessage.setCreateTime(new Date().getTime()); 
  videoMessage.setMsgType(MessageUtil.MESSSAGE_TYPE_VIDEO); 
  videoMessage.setMediaId(requestMap.get("MediaId")); 
  videoMessage.setThumbMediaId(requestMap.get("ThumbMediaId")); 
  respMessage = MessageUtil.videoMessageToXml(videoMessage); 
   
  } 
  //链接消息 
  else if(msgType.equals(MessageUtil.MESSSAGE_TYPE_LINK)){ 
  LinkMessage linkMessage=new LinkMessage(); 
  linkMessage.setToUserName(fromUserName); 
  linkMessage.setFromUserName(toUserName); 
  linkMessage.setCreateTime(new Date().getTime()); 
  linkMessage.setMsgType(MessageUtil.MESSSAGE_TYPE_LINK); 
  linkMessage.setTitle(requestMap.get("Title")); 
  linkMessage.setDescription(requestMap.get("Description")); 
  linkMessage.setUrl(requestMap.get("Url")); 
  respMessage = MessageUtil.linkMessageToXml(linkMessage); 
  } 
  //语音消息 
  else if(msgType.equals(MessageUtil.MESSSAGE_TYPE_VOICE)){ 
  VoiceMessage voiceMessage=new VoiceMessage(); 
  voiceMessage.setToUserName(fromUserName); 
  voiceMessage.setFromUserName(toUserName); 
  voiceMessage.setCreateTime(new Date().getTime()); 
  voiceMessage.setMsgType(MessageUtil.MESSSAGE_TYPE_VOICE); 
  voiceMessage.setMediaId(requestMap.get("MediaId")); 
  voiceMessage.setFormat(requestMap.get("Format")); 
  respMessage = MessageUtil.voiceMessageToXml(voiceMessage); 
  } 
  //事件推送 
  else if(msgType.equals(MessageUtil.MESSSAGE_TYPE_EVENT)){ 
  //事件类型 
  String eventType = requestMap.get("Event"); 
  //订阅 
  if(eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)){ 
   respContent = "谢谢关注!"; 
  } 
  //取消订阅 
  else if(eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)){ 
   // 
   System.out.println("取消订阅"); 
   
  } 
  else if(eventType.equals(MessageUtil.EVENT_TYPE_CLICK)){ 
   //自定义菜单消息处理 
   System.out.println("自定义菜单消息处理"); 
  } 
  } 
  
 } catch (Exception e) { 
  // TODO Auto-generated catch block 
  e.printStackTrace(); 
 } 
 return respMessage; 
 } 
 
 public static String getMainMenu() 
 { 
 StringBuffer buffer =new StringBuffer(); 
 buffer.append("您好,我是jon,请回复数字选择服务:").append("\n"); 
 buffer.append("1、我的博客").append("\n"); 
 buffer.append("2、 歌曲点播").append("\n"); 
 buffer.append("3、 经典游戏").append("\n"); 
 buffer.append("4 、聊天打牌").append("\n\n"); 
 buffer.append("回复"+"0"+"显示帮助菜单"); 
 return buffer.toString(); 
  
 } 
}

4)、MessageUtil.java帮助类,包括常量的定义和xml消息转换和处理


package cn.jon.wechat.utils; 
 
import java.io.InputStream; 
import java.io.Writer; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
 
import javax.servlet.http.HttpServletRequest; 
 
import org.dom4j.Document; 
import org.dom4j.Element; 
import org.dom4j.io.SAXReader; 
 
import cn.jon.wechat.message.req.ImageMessage; 
import cn.jon.wechat.message.req.LinkMessage; 
import cn.jon.wechat.message.req.LocationMessage; 
import cn.jon.wechat.message.req.VideoMessage; 
import cn.jon.wechat.message.req.VoiceMessage; 
import cn.jon.wechat.message.resp.Article; 
import cn.jon.wechat.message.resp.MusicMessage; 
import cn.jon.wechat.message.resp.NewsMessage; 
import cn.jon.wechat.message.resp.TextMessage; 
 
import com.thoughtworks.xstream.XStream; 
import com.thoughtworks.xstream.core.util.QuickWriter; 
import com.thoughtworks.xstream.io.HierarchicalStreamWriter; 
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter; 
import com.thoughtworks.xstream.io.xml.XppDriver; 
 
/** 
 * 各种消息的处理类 
 * @author jon 
 */ 
 
public class MessageUtil { 
 /** 
 * 文本类型 
 */ 
 public static final String MESSSAGE_TYPE_TEXT = "text"; 
 /** 
 * 音乐类型 
 */ 
 public static final String MESSSAGE_TYPE_MUSIC = "music"; 
 /** 
 * 图文类型 
 */ 
 public static final String MESSSAGE_TYPE_NEWS = "news"; 
 
 /** 
 * 视频类型 
 */ 
 public static final String MESSSAGE_TYPE_VIDEO = "video"; 
 /** 
 * 图片类型 
 */ 
 public static final String MESSSAGE_TYPE_IMAGE = "image"; 
 /** 
 * 链接类型 
 */ 
 public static final String MESSSAGE_TYPE_LINK = "link"; 
 /** 
 * 地理位置类型 
 */ 
 public static final String MESSSAGE_TYPE_LOCATION = "location"; 
 /** 
 * 音频类型 
 */ 
 public static final String MESSSAGE_TYPE_VOICE = "voice"; 
 /** 
 * 推送类型 
 */ 
 public static final String MESSSAGE_TYPE_EVENT = "event"; 
 /** 
 * 事件类型:subscribe(订阅) 
 */ 
 public static final String EVENT_TYPE_SUBSCRIBE = "subscribe"; 
 /** 
 * 事件类型:unsubscribe(取消订阅) 
 */ 
 public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe"; 
 /** 
 * 事件类型:click(自定义菜单点击事件) 
 */ 
 public static final String EVENT_TYPE_CLICK= "CLICK"; 
 
 /** 
 * 解析微信发来的请求 XML 
 */ 
 @SuppressWarnings("unchecked") 
 public static Map pareXml(HttpServletRequest request) throws Exception { 
  
 //将解析的结果存储在HashMap中 
 Map reqMap = new HashMap(); 
  
 //从request中取得输入流 
 InputStream inputStream = request.getInputStream(); 
 //读取输入流 
 SAXReader reader = new SAXReader(); 
 Document document = reader.read(inputStream); 
 //得到xml根元素 
 Element root = document.getRootElement(); 
 //得到根元素的所有子节点 
 List elementList = root.elements(); 
 //遍历所有的子节点取得信息类容 
 for(Element elem:elementList){ 
  reqMap.put(elem.getName(),elem.getText()); 
 } 
 //释放资源 
 inputStream.close(); 
 inputStream = null; 
  
 return reqMap; 
 } 
 /** 
 * 响应消息转换成xml返回 
 * 文本对象转换成xml 
 */ 
 public static String textMessageToXml(TextMessage textMessage) { 
 xstream.alias("xml", textMessage.getClass()); 
 return xstream.toXML(textMessage); 
 } 
 /** 
 * 语音对象的转换成xml 
 * 
 */ 
 public static String voiceMessageToXml(VoiceMessage voiceMessage) { 
 xstream.alias("xml", voiceMessage.getClass()); 
 return xstream.toXML(voiceMessage); 
 } 
 
 /** 
 * 视频对象的转换成xml 
 * 
 */ 
 public static String videoMessageToXml(VideoMessage videoMessage) { 
 xstream.alias("xml", videoMessage.getClass()); 
 return xstream.toXML(videoMessage); 
 } 
 
 /** 
 * 音乐对象的转换成xml 
 * 
 */ 
 public static String musicMessageToXml(MusicMessage musicMessage) { 
 xstream.alias("xml", musicMessage.getClass()); 
 return xstream.toXML(musicMessage); 
 } 
 /** 
 * 图文对象转换成xml 
 * 
 */ 
 public static String newsMessageToXml(NewsMessage newsMessage) { 
 xstream.alias("xml", newsMessage.getClass()); 
 xstream.alias("item", new Article().getClass()); 
 return xstream.toXML(newsMessage); 
 } 
 
 /** 
 * 图片对象转换成xml 
 * 
 */ 
 
 public static String imageMessageToXml(ImageMessage imageMessage) 
 { 
 xstream.alias("xml",imageMessage.getClass()); 
 return xstream.toXML(imageMessage); 
  
 } 
 
 /** 
 * 链接对象转换成xml 
 * 
 */ 
 
 public static String linkMessageToXml(LinkMessage linkMessage) 
 { 
 xstream.alias("xml",linkMessage.getClass()); 
 return xstream.toXML(linkMessage); 
  
 } 
 
 /** 
 * 地理位置对象转换成xml 
 * 
 */ 
 
 public static String locationMessageToXml(LocationMessage locationMessage) 
 { 
 xstream.alias("xml",locationMessage.getClass()); 
 return xstream.toXML(locationMessage); 
  
 } 
 
 /** 
 * 拓展xstream,使得支持CDATA块 
 * 
 */ 
 private static XStream xstream = new XStream(new XppDriver(){ 
 public HierarchicalStreamWriter createWriter(Writer out){ 
  return new PrettyPrintWriter(out){ 
  //对所有的xml节点的转换都增加CDATA标记 
  boolean cdata = true; 
   
  @SuppressWarnings("unchecked") 
  public void startNode(String name,Class clazz){ 
   super.startNode(name,clazz); 
  } 
   
  protected void writeText(QuickWriter writer,String text){ 
   if(cdata){ 
   writer.write(""); 
   }else{ 
   writer.write(text); 
   } 
  } 
  }; 
 } 
 }); 
 
}

5)、BaseMessage.java消息基类(包括:开发者微信号、用户账户、创建时间、消息类型、消息ID接口0),文本、视频、图片消息都会接口1此基类,在此基础上扩展自己的变量,可根据开发者文档中的各种消息属性进行定义


package cn.jon.wechat.message.req; 
/** 
 * 消息基类 (普通用户-公众号) 
 * @author jon 
 */ 
public class BaseMessage { 
 
 //开发者微信号 
 private String ToUserName; 
 //发送方账号(一个openId) 
 private String FromUserName; 
 //消息创建时间(整型) 
 private long CreateTime; 
 //消息类型(text/image/location/link...) 
 private String MsgType; 
 //消息id 64位整型 
 private String MsgId; 
 
 public BaseMessage() { 
 super(); 
 // TODO Auto-generated constructor stub 
 } 
 
 public BaseMessage(String toUserName, String fromUserName, long createTime, 
  String msgType, String msgId) { 
 super(); 
 ToUserName = toUserName; 
 FromUserName = fromUserName; 
 CreateTime = createTime; 
 MsgType = msgType; 
 MsgId = msgId; 
 } 
 
 public String getToUserName() { 
 return ToUserName; 
 } 
 
 public void setToUserName(String toUserName) { 
 ToUserName = toUserName; 
 } 
 
 public String getFromUserName() { 
 return FromUserName; 
 } 
 
 public void setFromUserName(String fromUserName) { 
 FromUserName = fromUserName; 
 } 
 public long getCreateTime() { 
 return CreateTime; 
 } 
 
 public void setCreateTime(long createTime) { 
 CreateTime = createTime; 
 } 
 public String getMsgType() { 
 return MsgType; 
 } 
 
 public void setMsgType(String msgType) { 
 MsgType = msgType; 
 } 
 public String getMsgId() { 
 return MsgId; 
 } 
 
 public void setMsgId(String msgId) { 
 MsgId = msgId; 
 } 
}

6)、TextMessage.java文本消息,继承自5中基类,扩展内容属性


package cn.jon.wechat.message.req; 
/** 
 * 文本消息 
 * @author jon 
 */ 
public class TextMessage extends BaseMessage{ 
 //消息内容 
 private String content; 
 
 public String getContent() { 
 return content; 
 } 
 
 public void setContent(String content) { 
 this.content = content; 
 } 
 
}

7)、ImageMessage.java图片消息 


package cn.jon.wechat.message.req; 
/** 
 * 图片消息 
 * @author jon 
 */ 
public class ImageMessage extends BaseMessage{ 
 //图片链接 
 private String PicUrl; 
 
 public String getPicUrl() { 
 return PicUrl; 
 } 
 
 public void setPicUrl(String picUrl) { 
 PicUrl = picUrl; 
 } 
}

8)、VideoMessage.java视频消息


package cn.jon.wechat.message.req; 
 
public class VideoMessage extends BaseMessage { 
 
 private String mediaId; 
 private String thumbMediaId; 
 public String getMediaId() { 
 return mediaId; 
 } 
 public void setMediaId(String mediaId) { 
 this.mediaId = mediaId; 
 } 
 public String getThumbMediaId() { 
 return thumbMediaId; 
 } 
 public void setThumbMediaId(String thumbMediaId) { 
 this.thumbMediaId = thumbMediaId; 
 } 
 
}

相关文章

微信app下载
微信app下载

微信是一款手机通信软件,支持通过手机网络发送语音短信、视频、图片和文字。微信可以单聊及群聊,还能根据地理位置找到附近的人,带给大家全新的移动沟通体验,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

9

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

12

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

4

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

18

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

19

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

3

2026.01.29

Java空对象相关教程合集
Java空对象相关教程合集

本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3万人学习

C# 教程
C# 教程

共94课时 | 8万人学习

Java 教程
Java 教程

共578课时 | 53.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号