### Initialize Weixin Object with Default Configuration Source: https://context7.com/ansitech/weixin4j/llms.txt Create a Weixin SDK instance using the default configuration loaded from `weixin4j.properties`. This is the simplest way to get started if your properties file is correctly set up. ```java import org.weixin4j.Weixin; public class WeixinInitExample { // 方式1: 使用默认配置(从weixin4j.properties读取) public Weixin createDefaultWeixin() { return new Weixin(); } } ``` -------------------------------- ### Initialize Weixin Object with External Configuration Objects Source: https://context7.com/ansitech/weixin4j/llms.txt Create a Weixin SDK instance by programmatically configuring `WeixinConfig` and `WeixinPayConfig` objects. This method is useful when configurations are managed dynamically or outside of properties files. ```java import org.weixin4j.Weixin; import org.weixin4j.WeixinConfig; import org.weixin4j.WeixinPayConfig; public class WeixinInitExample { // 方式4: 外部配置注入方式 public Weixin createWithConfig() { WeixinConfig weixinConfig = new WeixinConfig(); weixinConfig.setAppid("your_appid"); weixinConfig.setSecret("your_secret"); weixinConfig.setOriginalid("gh_xxxxxxxxxxxx"); weixinConfig.setEncodingtype(2); // 安全模式 weixinConfig.setEncodingaeskey("your_encoding_aes_key"); WeixinPayConfig payConfig = new WeixinPayConfig(); payConfig.setAppId("your_appid"); payConfig.setMchId("your_mch_id"); payConfig.setMchKey("your_mch_key"); payConfig.setNotifyUrl("https://your-domain.com/pay/notify"); payConfig.setCertPath("/path/to/apiclient_cert.p12"); payConfig.setCertSecret("your_cert_secret"); return new Weixin(weixinConfig, payConfig); } } ``` -------------------------------- ### Generate QR Codes with Weixin4j Source: https://context7.com/ansitech/weixin4j/llms.txt Shows how to create temporary and permanent QR codes with different scene types (integer and string) and how to retrieve or save the QR code image. Requires a Weixin instance. ```java import org.weixin4j.Weixin; import org.weixin4j.WeixinException; import org.weixin4j.model.qrcode.Qrcode; import org.weixin4j.model.qrcode.QrcodeType; public class QrcodeExample { public void createQrcode() throws WeixinException { Weixin weixin = new Weixin(); // 创建临时二维码(整型场景值),有效期30天 Qrcode tempQrcode = weixin.qrcode().create( QrcodeType.QR_SCENE, 123456, // 场景值ID 2592000 // 有效期(秒),最长30天 ); System.out.println("临时二维码Ticket: " + tempQrcode.getTicket()); System.out.println("有效期: " + tempQrcode.getExpire_seconds() + "秒"); // 创建临时二维码(字符串场景值) Qrcode tempStrQrcode = weixin.qrcode().create( QrcodeType.QR_STR_SCENE, "campaign_2023", // 字符串场景值 604800 // 有效期7天 ); System.out.println("临时二维码(字符串)Ticket: " + tempStrQrcode.getTicket()); // 创建永久二维码(整型场景值,范围1-100000) Qrcode limitQrcode = weixin.qrcode().createLimit(10001); System.out.println("永久二维码Ticket: " + limitQrcode.getTicket()); // 创建永久二维码(字符串场景值) Qrcode limitStrQrcode = weixin.qrcode().createLimit("vip_channel"); System.out.println("永久二维码(字符串)Ticket: " + limitStrQrcode.getTicket()); // 通过ticket获取二维码图片URL String qrcodeUrl = weixin.qrcode().showQrcode(tempQrcode.getTicket()); System.out.println("二维码图片URL: " + qrcodeUrl); // 保存二维码图片到本地 weixin.qrcode().saveQrcode(tempQrcode.getTicket(), "/path/to/qrcode.jpg"); System.out.println("二维码已保存!"); } } ``` -------------------------------- ### Manage User Tags with Weixin4j Source: https://context7.com/ansitech/weixin4j/llms.txt Demonstrates creating, retrieving, updating, and deleting tags, as well as batch operations for tagging and untagging users. Requires a Weixin instance. ```java import org.weixin4j.Weixin; import org.weixin4j.WeixinException; import org.weixin4j.model.tags.Tag; import java.util.List; public class TagsExample { public void manageUserTags() throws WeixinException { Weixin weixin = new Weixin(); // 创建标签 Tag newTag = weixin.tags().create("VIP会员"); System.out.println("创建标签成功,ID: " + newTag.getId() + ", 名称: " + newTag.getName()); // 获取所有标签 List tags = weixin.tags().get(); for (Tag tag : tags) { System.out.println("标签ID: " + tag.getId() + ", 名称: " + tag.getName() + ", 数量: " + tag.getCount()); } // 编辑标签 weixin.tags().update(newTag.getId(), "超级VIP"); System.out.println("标签编辑成功!"); // 批量为用户打标签 String[] openids = { "oXyDc5xxxxxxxxxxxxxxxxxxx1", "oXyDc5xxxxxxxxxxxxxxxxxxx2" }; weixin.tags().membersBatchtagging(newTag.getId(), openids); System.out.println("批量打标签成功!"); // 获取用户身上的标签 Integer[] userTags = weixin.tags().getIdList("oXyDc5xxxxxxxxxxxxxxxxxxx1"); System.out.println("用户标签: "); for (Integer tagId : userTags) { System.out.println(" 标签ID: " + tagId); } // 批量取消用户标签 weixin.tags().membersBatchuntagging(newTag.getId(), openids); System.out.println("批量取消标签成功!"); // 删除标签 weixin.tags().delete(newTag.getId()); System.out.println("标签删除成功!"); } public void manageBlacklist() throws WeixinException { Weixin weixin = new Weixin(); // 获取黑名单列表 String[] blacklist = weixin.tags().membersGetBlackList(""); System.out.println("黑名单用户: "); for (String openid : blacklist) { System.out.println(" " + openid); } // 批量拉黑用户 String[] openidsToBlack = {"oXyDc5xxxxxxxxxxxxxxxxxxx"}; weixin.tags().membersBatchblacklist(openidsToBlack); System.out.println("拉黑成功!"); // 批量取消拉黑 weixin.tags().membersBatchunblacklist(openidsToBlack); System.out.println("取消拉黑成功!"); } } ``` -------------------------------- ### Initialize Weixin Object with WeixinBuilder Source: https://context7.com/ansitech/weixin4j/llms.txt Utilize the `WeixinBuilder` to construct a Weixin SDK instance with custom configurations, such as providing custom loaders for access tokens and JSAPI tickets. This offers more control over the initialization process. ```java import org.weixin4j.Weixin; import org.weixin4j.WeixinBuilder; public class WeixinInitExample { // 方式3: 使用WeixinBuilder构建器 public Weixin createWithBuilder() { return WeixinBuilder.newInstance("your_appid", "your_secret") .setTokenLoader(new CustomTokenLoader()) // 自定义Token加载器 .setTicketLoader(new CustomTicketLoader()) // 自定义Ticket加载器 .build(); } } ``` -------------------------------- ### Manage WeChat Custom Menus with Java Source: https://context7.com/ansitech/weixin4j/llms.txt Demonstrates creating, querying, and deleting custom menus using the MenuComponent. Requires a configured Weixin instance. ```java import org.weixin4j.Weixin; import org.weixin4j.WeixinException; import org.weixin4j.component.MenuComponent; import org.weixin4j.model.menu.*; import java.util.ArrayList; import java.util.List; public class MenuExample { public void createMenu() throws WeixinException { Weixin weixin = new Weixin(); MenuComponent menuComponent = weixin.menu(); // 创建菜单对象 Menu menu = new Menu(); List buttons = new ArrayList<>(); // 一级菜单1: Click类型按钮 ClickButton button1 = new ClickButton("今日歌曲", "V1001_TODAY_MUSIC"); buttons.add(button1); // 一级菜单2: 包含子菜单 SingleButton button2 = new SingleButton("菜单"); // 子菜单1: View类型,跳转链接 ViewButton subButton1 = new ViewButton("搜索", "http://www.soso.com/"); button2.getSubButton().add(subButton1); // 子菜单2: 小程序类型 MiniprogramButton subButton2 = new MiniprogramButton("小程序"); subButton2.setAppid("wx286b93c14bbf93aa"); subButton2.setPagepath("pages/lunar/index"); subButton2.setUrl("http://mp.weixin.qq.com"); // 不支持小程序的老版本客户端将打开此URL button2.getSubButton().add(subButton2); // 子菜单3: Click类型 ClickButton subButton3 = new ClickButton("赞一下我们", "V1001_GOOD"); button2.getSubButton().add(subButton3); buttons.add(button2); // 一级菜单3: View类型 ViewButton button3 = new ViewButton("关于我们", "https://www.example.com/about"); buttons.add(button3); menu.setButton(buttons); // 创建自定义菜单 menuComponent.create(menu); System.out.println("菜单创建成功!"); } public void queryMenu() throws WeixinException { Weixin weixin = new Weixin(); Menu menu = weixin.menu().get(); System.out.println("当前菜单配置: " + menu.toJSONObject().toJSONString()); } public void deleteMenu() throws WeixinException { Weixin weixin = new Weixin(); weixin.menu().delete(); System.out.println("菜单删除成功!"); } } ``` -------------------------------- ### Initialize Weixin Object for Multiple Public Accounts Source: https://context7.com/ansitech/weixin4j/llms.txt Instantiate a Weixin SDK object for managing multiple WeChat public accounts by providing the specific `appId` and `secret` for each account. This allows for distinct configurations per account. ```java import org.weixin4j.Weixin; public class WeixinInitExample { // 方式2: 多公众号方式,指定appId和secret public Weixin createMultiWeixin(String appId, String secret) { return new Weixin(appId, secret); } } ``` -------------------------------- ### Weixin4j Initialization Properties Source: https://context7.com/ansitech/weixin4j/llms.txt Configure Weixin4j SDK settings, including developer debug mode, token, OAuth credentials, API domains, WeChat Pay details, HTTP client settings, and message handlers. Ensure all sensitive information like app secrets and keys are replaced with actual values. ```properties # 开发者调试设置 weixin4j.debug=true # 公众号Token weixin4j.token=weixin4j # 公众号原始ID weixin4j.oauth.originalid=gh_xxxxxxxxxxxx # 开发者第三方用户唯一凭证 weixin4j.oauth.appid=wx1234567890abcdef # 开发者第三方用户唯一凭证密钥 weixin4j.oauth.secret=your_app_secret_here # 消息加密方式 0:明文模式(默认), 1:兼容模式, 2:安全模式(推荐) weixin4j.oauth.encodingtype=0 # 消息加密密钥(43位字符组成A-Za-z0-9) weixin4j.oauth.encodingaeskey=0123456789abcedfghijklmnopqrstuvwxyzZXCVBNM # 公众平台接口域名 weixin4j.api.domain=api.weixin.qq.com # 微信支付配置 weixin4j.pay.partner.id=your_mch_id weixin4j.pay.partner.key=your_mch_key weixin4j.pay.notify_url=https://your-domain.com/pay/notify # HTTP配置 weixin4j.http.connectionTimeout=25000 weixin4j.http.readTimeout=25000 weixin4j.http.cert.path=/path/to/apiclient_cert.p12 weixin4j.http.cert.secret=your_cert_secret # 消息处理器配置 weixin4j.message.handler.normal=org.weixin4j.spi.DefaultNormalMessageHandler weixin4j.message.handler.event=org.weixin4j.spi.DefaultEventMessageHandler ``` -------------------------------- ### Upload Media Material Source: https://context7.com/ansitech/weixin4j/llms.txt Use `MaterialComponent` to upload temporary media materials like images, voice, and video. Ensure files are in the correct format and size limits are met. ```Java import org.weixin4j.Weixin; import org.weixin4j.WeixinException; import org.weixin4j.model.material.Media; import org.weixin4j.model.media.Attachment; import org.weixin4j.model.message.MediaType; import java.io.File; import java.io.FileOutputStream; public class MaterialExample { public void uploadMedia() throws Exception { Weixin weixin = new Weixin(); // 上传图片 File imageFile = new File("/path/to/image.jpg"); Media imageMedia = weixin.material().upload(MediaType.Image, imageFile); System.out.println("图片上传成功,MediaId: " + imageMedia.getMediaId()); System.out.println("创建时间: " + imageMedia.getCreatedAt()); // 上传语音(AMR格式,最大2MB,时长不超过60秒) File voiceFile = new File("/path/to/voice.amr"); Media voiceMedia = weixin.material().upload(MediaType.Voice, voiceFile); System.out.println("语音上传成功,MediaId: " + voiceMedia.getMediaId()); // 上传视频 File videoFile = new File("/path/to/video.mp4"); Media videoMedia = weixin.material().upload(MediaType.Video, videoFile); System.out.println("视频上传成功,MediaId: " + videoMedia.getMediaId()); // 上传缩略图(64KB以内,JPG格式) File thumbFile = new File("/path/to/thumb.jpg"); Media thumbMedia = weixin.material().upload(MediaType.Thumb, thumbFile); System.out.println("缩略图上传成功,MediaId: " + thumbMedia.getMediaId()); } public void downloadMedia() throws Exception { Weixin weixin = new Weixin(); // 下载临时素材 String mediaId = "your_media_id_here"; Attachment attachment = weixin.material().get(mediaId); if (attachment != null) { System.out.println("文件名: " + attachment.getFileName()); System.out.println("文件大小: " + attachment.getContentLength() + " bytes"); System.out.println("Content-Type: " + attachment.getContentType()); // 保存到本地 FileOutputStream fos = new FileOutputStream("/path/to/downloaded_" + attachment.getFileName()); fos.write(attachment.getFileStream()); fos.close(); System.out.println("文件下载成功!"); } // 下载高清语音(JSSDK上传的语音) Attachment hdVoice = weixin.material().getJssdkVoice(mediaId); System.out.println("高清语音下载成功!"); } } ``` -------------------------------- ### Configure WeChat JS-SDK Source: https://context7.com/ansitech/weixin4j/llms.txt Use JsSdkComponent to retrieve configuration parameters for the WeChat JS-SDK and manage the jsapi_ticket. ```java import org.weixin4j.Weixin; import org.weixin4j.WeixinException; import org.weixin4j.model.js.Ticket; import org.weixin4j.model.js.WxConfig; public class JsSdkExample { public void getJsConfig() throws WeixinException { Weixin weixin = new Weixin(); // 当前页面URL(包含?及参数,不包含#及其后面部分) String url = "https://www.example.com/page?id=123"; // 获取JS-SDK配置 WxConfig wxConfig = weixin.js().getWxConfig(url); System.out.println("AppId: " + wxConfig.getAppId()); System.out.println("Timestamp: " + wxConfig.getTimestamp()); System.out.println("NonceStr: " + wxConfig.getNonceStr()); System.out.println("Signature: " + wxConfig.getSignature()); // 前端使用示例 String jsConfigJson = String.format( "wx.config({" + " debug: false," + " appId: '%s'," + " timestamp: %s," + " nonceStr: '%s'," + " signature: '%s'," + " jsApiList: ['updateAppMessageShareData', 'updateTimelineShareData', 'scanQRCode']" + "});", wxConfig.getAppId(), wxConfig.getTimestamp(), wxConfig.getNonceStr(), wxConfig.getSignature() ); System.out.println("前端配置代码: " + jsConfigJson); } public void getJsApiTicket() throws WeixinException { Weixin weixin = new Weixin(); // 获取jsapi_ticket(会自动缓存) Ticket ticket = weixin.getJsApiTicket(); System.out.println("Ticket: " + ticket.getTicket()); System.out.println("有效期: " + ticket.getExpires_in() + "秒"); } } ``` -------------------------------- ### Send Cash Red Packet Source: https://context7.com/ansitech/weixin4j/llms.txt Use `RedpackComponent` to send cash red packets. Requires merchant certificate configuration. Ensure `total_amount` is in cents. ```Java import org.weixin4j.Weixin; import org.weixin4j.WeixinException; import org.weixin4j.WeixinPayConfig; import org.weixin4j.model.redpack.SendRedPack; import org.weixin4j.model.redpack.SendRedPackResult; public class RedpackExample { public void sendRedPack() throws WeixinException { WeixinPayConfig payConfig = new WeixinPayConfig(); payConfig.setAppId("wx1234567890abcdef"); payConfig.setMchId("1234567890"); payConfig.setMchKey("your_mch_key_32_chars_long_here"); payConfig.setCertPath("/path/to/apiclient_cert.p12"); payConfig.setCertSecret("1234567890"); // 通常与mch_id相同 Weixin weixin = new Weixin(payConfig); // 创建红包对象 SendRedPack redPack = new SendRedPack(); redPack.setNonce_str(java.util.UUID.randomUUID().toString().replace("-", "")); redPack.setMch_billno(payConfig.getMchId() + System.currentTimeMillis()); // 商户订单号 redPack.setMch_id(payConfig.getMchId()); redPack.setWxappid(payConfig.getAppId()); redPack.setSend_name("测试商户"); redPack.setRe_openid("oXyDc5xxxxxxxxxxxxxxxxxxx"); // 接收红包用户的openid redPack.setTotal_amount(100); // 红包金额,单位:分(最小100分即1元) redPack.setTotal_num(1); // 红包发放人数 redPack.setWishing("恭喜发财,大吉大利"); redPack.setClient_ip("127.0.0.1"); redPack.setAct_name("新年红包"); redPack.setRemark("快来领取红包"); // 生成签名 redPack.setSign(redPack.createSign(payConfig.getMchKey())); // 发送红包 SendRedPackResult result = weixin.redpack().sendRedPack(redPack); if ("SUCCESS".equals(result.getReturn_code()) && "SUCCESS".equals(result.getResult_code())) { System.out.println("红包发送成功!"); System.out.println("微信单号: " + result.getSend_listid()); } else { System.out.println("红包发送失败: " + result.getReturn_msg() + " - " + result.getErr_code_des()); } } } ``` -------------------------------- ### Manage WeChat Users with Java Source: https://context7.com/ansitech/weixin4j/llms.txt Provides methods to fetch individual or batch user information, retrieve follower lists, and update user remarks using UserComponent. ```java import org.weixin4j.Weixin; import org.weixin4j.WeixinException; import org.weixin4j.model.user.User; import org.weixin4j.model.user.Followers; import java.util.List; public class UserExample { public void getUserInfo() throws WeixinException { Weixin weixin = new Weixin(); // 获取单个用户信息 String openid = "oXyDc5xxxxxxxxxxxxxxxxxxx"; User user = weixin.user().info(openid); System.out.println("昵称: " + user.getNickname()); System.out.println("性别: " + user.getSex()); System.out.println("城市: " + user.getCity()); System.out.println("省份: " + user.getProvince()); System.out.println("国家: " + user.getCountry()); System.out.println("头像: " + user.getHeadimgurl()); System.out.println("关注时间: " + user.getSubscribe_time()); System.out.println("UnionID: " + user.getUnionid()); } public void batchGetUsers() throws WeixinException { Weixin weixin = new Weixin(); // 批量获取用户信息 String[] openids = { "oXyDc5xxxxxxxxxxxxxxxxxxx1", "oXyDc5xxxxxxxxxxxxxxxxxxx2", "oXyDc5xxxxxxxxxxxxxxxxxxx3" }; List users = weixin.user().batchGet(openids); for (User user : users) { System.out.println("用户: " + user.getNickname() + " - " + user.getOpenid()); } } public void getFollowersList() throws WeixinException { Weixin weixin = new Weixin(); // 获取关注者列表(分页) Followers followers = weixin.user().get(""); System.out.println("关注者总数: " + followers.getTotal()); System.out.println("本次获取数: " + followers.getCount()); System.out.println("下一个openid: " + followers.getNext_openid()); // 获取全部关注者(自动翻页) Followers allFollowers = weixin.user().getAll(); System.out.println("全部关注者总数: " + allFollowers.getTotal()); for (String openid : allFollowers.getData().getOpenid()) { System.out.println("OpenID: " + openid); } } public void updateUserRemark() throws WeixinException { Weixin weixin = new Weixin(); // 设置用户备注名 String openid = "oXyDc5xxxxxxxxxxxxxxxxxxx"; String remark = "VIP客户"; weixin.user().updateRemark(openid, remark); System.out.println("备注名设置成功!"); } } ``` -------------------------------- ### Implement WeChat OAuth with SnsComponent Source: https://context7.com/ansitech/weixin4j/llms.txt Use SnsComponent to generate authorization URLs, handle callbacks to retrieve user information, and manage access tokens. ```java import org.weixin4j.Weixin; import org.weixin4j.WeixinException; import org.weixin4j.component.SnsComponent; import org.weixin4j.model.sns.SnsAccessToken; import org.weixin4j.model.sns.SnsUser; public class OAuthExample { public void getOAuth2Urls() { Weixin weixin = new Weixin(); SnsComponent sns = weixin.sns(); String redirectUri = "https://www.example.com/callback"; // 获取静默授权URL(仅获取openid,不弹出授权页面) String baseUrl = sns.getOAuth2CodeBaseUrl(redirectUri); System.out.println("静默授权URL: " + baseUrl); // 获取用户信息授权URL(弹出授权页面,可获取用户详细信息) String userInfoUrl = sns.getOAuth2CodeUserInfoUrl(redirectUri); System.out.println("用户信息授权URL: " + userInfoUrl); // 自定义授权URL String customUrl = sns.getOAuth2CodeUrl(redirectUri, "snsapi_userinfo", "STATE123"); System.out.println("自定义授权URL: " + customUrl); } public void handleOAuthCallback(String code) throws WeixinException { Weixin weixin = new Weixin(); SnsComponent sns = weixin.sns(); // 通过code获取openid(静默授权场景) String openid = sns.getOpenId(code); System.out.println("用户OpenID: " + openid); // 通过code获取网页授权AccessToken SnsAccessToken accessToken = sns.getSnsOAuth2AccessToken(code); System.out.println("Access Token: " + accessToken.getAccess_token()); System.out.println("Refresh Token: " + accessToken.getRefresh_token()); System.out.println("OpenID: " + accessToken.getOpenid()); System.out.println("Scope: " + accessToken.getScope()); System.out.println("有效期: " + accessToken.getExpires_in() + "秒"); // 通过code直接获取用户信息(用户信息授权场景) SnsUser user = sns.getSnsUserByCode(code); System.out.println("昵称: " + user.getNickname()); System.out.println("性别: " + user.getSex()); System.out.println("头像: " + user.getHeadimgurl()); System.out.println("省份: " + user.getProvince()); System.out.println("城市: " + user.getCity()); System.out.println("国家: " + user.getCountry()); System.out.println("UnionID: " + user.getUnionid()); } public void refreshAccessToken(String refreshToken) throws WeixinException { Weixin weixin = new Weixin(); SnsComponent sns = weixin.sns(); // 刷新access_token SnsAccessToken newToken = sns.refreshToken(refreshToken); System.out.println("新的Access Token: " + newToken.getAccess_token()); // 验证access_token是否有效 boolean isValid = sns.validateAccessToken(newToken.getAccess_token(), newToken.getOpenid()); System.out.println("Token有效: " + isValid); } } ``` -------------------------------- ### Handle Location Message in Weixin4j Source: https://context7.com/ansitech/weixin4j/llms.txt This snippet demonstrates how to extract and display the label from a user's sent location message using the Weixin4j SDK. It's part of message handling logic. ```Java out.setContent("位置选择: " + msg.getSendLocationInfo().getLabel()); return out; } } ``` -------------------------------- ### Send Template Message Source: https://context7.com/ansitech/weixin4j/llms.txt Send a template message to a user. This method supports sending with a jump URL or a mini-program jump. Requires a valid openid and templateId. ```java import org.weixin4j.Weixin; import org.weixin4j.WeixinException; import org.weixin4j.model.message.template.TemplateData; import org.weixin4j.model.message.template.Miniprogram; import java.util.ArrayList; import java.util.List; public class MessageExample { public void sendTemplateMessage() throws WeixinException { Weixin weixin = new Weixin(); String openid = "oXyDc5xxxxxxxxxxxxxxxxxxx"; String templateId = "aBcDeFgHiJkLmNoPqRsTuVwXyZ"; // 构建模板数据 List datas = new ArrayList<>(); datas.add(new TemplateData("first", "您好,您的订单已发货", "#173177")); datas.add(new TemplateData("keyword1", "20231115001234", "#173177")); datas.add(new TemplateData("keyword2", "顺丰快递", "#173177")); datas.add(new TemplateData("keyword3", "SF1234567890", "#173177")); datas.add(new TemplateData("remark", "感谢您的购买,祝您生活愉快!", "#173177")); // 发送模板消息(带跳转URL) String url = "https://www.example.com/order/detail?id=20231115001234"; weixin.message().sendTemplateMessage(openid, templateId, datas, url); System.out.println("模板消息发送成功!"); // 发送模板消息(带小程序跳转) Miniprogram miniprogram = new Miniprogram(); miniprogram.setAppid("wx286b93c14bbf93aa"); miniprogram.setPagepath("pages/order/detail?id=20231115001234"); weixin.message().sendTemplateMessage(openid, templateId, datas, miniprogram, url); System.out.println("模板消息(小程序跳转)发送成功!"); } } ``` -------------------------------- ### Custom Normal Message Handler Source: https://context7.com/ansitech/weixin4j/llms.txt Implement this class to process various types of normal messages sent by users. Each method corresponds to a message type and should return an OutputMessage. ```java import org.weixin4j.model.message.OutputMessage; import org.weixin4j.model.message.output.*; import org.weixin4j.model.message.normal.*; import org.weixin4j.spi.INormalMessageHandler; // 普通消息处理器 public class CustomNormalMessageHandler implements INormalMessageHandler { @Override public OutputMessage textTypeMsg(TextInputMessage msg) { TextOutputMessage out = new TextOutputMessage(); out.setContent("您发送的消息是: " + msg.getContent()); return out; } @Override public OutputMessage imageTypeMsg(ImageInputMessage msg) { TextOutputMessage out = new TextOutputMessage(); out.setContent("收到您的图片,MediaId: " + msg.getMediaId()); return out; } @Override public OutputMessage voiceTypeMsg(VoiceInputMessage msg) { TextOutputMessage out = new TextOutputMessage(); // 开通语音识别后,会有Recognition字段 String recognition = msg.getRecognition(); if (recognition != null) { out.setContent("语音识别结果: " + recognition); } else { out.setContent("收到您的语音消息"); } return out; } @Override public OutputMessage videoTypeMsg(VideoInputMessage msg) { TextOutputMessage out = new TextOutputMessage(); out.setContent("收到您的视频"); return out; } @Override public OutputMessage shortvideoTypeMsg(ShortVideoInputMessage msg) { TextOutputMessage out = new TextOutputMessage(); out.setContent("收到您的小视频"); return out; } @Override public OutputMessage locationTypeMsg(LocationInputMessage msg) { TextOutputMessage out = new TextOutputMessage(); out.setContent(String.format("收到您的位置: %s (%.6f, %.6f)", msg.getLabel(), msg.getLocation_X(), msg.getLocation_Y())); return out; } @Override public OutputMessage linkTypeMsg(LinkInputMessage msg) { TextOutputMessage out = new TextOutputMessage(); out.setContent("收到链接: " + msg.getTitle() + " - " + msg.getUrl()); return out; } } ``` -------------------------------- ### Send Custom News Message Source: https://context7.com/ansitech/weixin4j/llms.txt Send a news message (articles) to a user using the custom message API. Each article can have a title, description, URL, and image URL. Requires a valid openid. ```java import org.weixin4j.Weixin; import org.weixin4j.WeixinException; import org.weixin4j.model.message.Articles; import java.util.ArrayList; import java.util.List; public class MessageExample { public void sendCustomNewsMessage() throws WeixinException { Weixin weixin = new Weixin(); // 发送客服图文消息 String openid = "oXyDc5xxxxxxxxxxxxxxxxxxx"; List articles = new ArrayList<>(); Articles article1 = new Articles(); article1.setTitle("新品上市"); article1.setDescription("全新产品震撼登场,限时优惠中..."); article1.setUrl("https://www.example.com/product/new"); article1.setPicurl("https://www.example.com/images/new_product.jpg"); articles.add(article1); Articles article2 = new Articles(); article2.setTitle("促销活动"); article2.setDescription("双十一大促,全场五折起..."); article2.setUrl("https://www.example.com/promotion"); article2.setPicurl("https://www.example.com/images/promotion.jpg"); articles.add(article2); weixin.message().customSendNews(openid, articles); System.out.println("图文消息发送成功!"); } } ``` -------------------------------- ### Custom Event Message Handler Source: https://context7.com/ansitech/weixin4j/llms.txt Implement this class to process various event messages triggered by user interactions. Each method handles a specific event type and should return an OutputMessage or null. ```java import org.weixin4j.model.message.OutputMessage; import org.weixin4j.model.message.output.*; import org.weixin4j.model.message.event.*; import org.weixin4j.spi.IEventMessageHandler; // 事件消息处理器 public class CustomEventMessageHandler implements IEventMessageHandler { @Override public OutputMessage subscribe(SubscribeEventMessage msg) { TextOutputMessage out = new TextOutputMessage(); out.setContent("欢迎关注我们的公众号!回复【帮助】获取更多信息。"); return out; } @Override public OutputMessage unSubscribe(UnSubscribeEventMessage msg) { // 用户取消关注,无需回复 return null; } @Override public OutputMessage qrsceneSubscribe(QrsceneSubscribeEventMessage msg) { TextOutputMessage out = new TextOutputMessage(); out.setContent("欢迎通过二维码关注!来源: " + msg.getEventKey()); return out; } @Override public OutputMessage qrsceneScan(QrsceneScanEventMessage msg) { TextOutputMessage out = new TextOutputMessage(); out.setContent("扫描二维码成功!场景值: " + msg.getEventKey()); return out; } @Override public OutputMessage location(LocationEventMessage msg) { TextOutputMessage out = new TextOutputMessage(); out.setContent(String.format("您的位置: (%.6f, %.6f)", msg.getLatitude(), msg.getLongitude())); return out; } @Override public OutputMessage click(ClickEventMessage msg) { TextOutputMessage out = new TextOutputMessage(); out.setContent("您点击了菜单: " + msg.getEventKey()); return out; } @Override public OutputMessage view(ViewEventMessage msg) { // 用户点击链接跳转,通常无需回复 return null; } @Override public OutputMessage scanCodePush(ScanCodePushEventMessage msg) { TextOutputMessage out = new TextOutputMessage(); out.setContent("扫码结果: " + msg.getScanCodeInfo().getScanResult()); return out; } @Override public OutputMessage scanCodeWaitMsg(ScanCodeWaitMsgEventMessage msg) { TextOutputMessage out = new TextOutputMessage(); out.setContent("扫码完成: " + msg.getScanCodeInfo().getScanResult()); return out; } @Override public OutputMessage picSysPhoto(PicSysPhotoEventMessage msg) { TextOutputMessage out = new TextOutputMessage(); out.setContent("拍照完成"); return out; } @Override public OutputMessage picPhotoOrAlbum(PicPhotoOrAlbumEventMessage msg) { TextOutputMessage out = new TextOutputMessage(); out.setContent("已选择图片"); return out; } @Override public OutputMessage picWeixin(PicWeixinEventMessage msg) { TextOutputMessage out = new TextOutputMessage(); out.setContent("微信相册选择完成"); return out; } @Override public OutputMessage locationSelect(LocationSelectEventMessage msg) { TextOutputMessage out = new TextOutputMessage(); ``` -------------------------------- ### Send Custom Text Message Source: https://context7.com/ansitech/weixin4j/llms.txt Use this method to send a plain text message to a specific user via the custom message API. Ensure the user's openid is valid. ```java import org.weixin4j.Weixin; import org.weixin4j.WeixinException; public class MessageExample { public void sendCustomTextMessage() throws WeixinException { Weixin weixin = new Weixin(); // 发送客服文本消息 String openid = "oXyDc5xxxxxxxxxxxxxxxxxxx"; String content = "您好,欢迎使用我们的服务!"; weixin.message().customSendContent(openid, content); System.out.println("客服消息发送成功!"); } } ``` -------------------------------- ### Send Mass Text Message Source: https://context7.com/ansitech/weixin4j/llms.txt Broadcast a text message to multiple users specified by their openids. This method returns a message ID upon successful sending. ```java import org.weixin4j.Weixin; import org.weixin4j.WeixinException; public class MessageExample { public void sendMassTextMessage() throws WeixinException { Weixin weixin = new Weixin(); // 根据openid列表群发文本消息 String[] openids = { "oXyDc5xxxxxxxxxxxxxxxxxxx1", "oXyDc5xxxxxxxxxxxxxxxxxxx2" }; String content = "尊敬的会员,本周特惠活动开始啦!"; String msgId = weixin.message().massSendContent(openids, content); System.out.println("群发成功,消息ID: " + msgId); } } ``` === COMPLETE CONTENT === This response contains all available snippets from this library. No additional content exists. Do not make further requests.