各位兄弟们好。
之前一直没怎么研究过小程序。这次有一个项目需要做成小程序。
老哥我屡了屡流程。给各位兄弟弄点干货。
既然提到干货嘛就是不废话。 代码也不墨迹。直接上工具。
这里推荐一个Java 微信开发的工具
binarywang 有需要的老哥可以自己去码云、Git。去弄下来
这里演示的是微信小程序
一、先加入maven支持
<!--微信小程序 -->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>${weixin-java-miniapp.version}</version>
</dependency>
二、编写配置文件。我这里是springBoot项目
wx:
miniapp:
# 小程序号信息
appid: #
secret: #
token: #微信小程序消息服务器配置的token
aesKey: #微信小程序消息服务器配置的EncodingAESKey
msgDataFormat: JSON
三、编写类。引入binarywang提供的微信小程序工具
3.1、配置类
@ConfigurationProperties(prefix = "wx.miniapp")
public class WxMaProperties {
/**
* 设置微信小程序的appid
*/
private String appid;
/**
* 设置微信小程序的Secret
*/
private String secret;
/**
* 设置微信小程序消息服务器配置的token
*/
private String token;
/**
* 设置微信小程序消息服务器配置的EncodingAESKey
*/
private String aesKey;
/**
* 消息格式,XML或者JSON
*/
private String msgDataFormat;
public String getAppid() {
return appid;
}
public void setAppid(String appid) {
this.appid = appid;
}
public String getSecret() {
return secret;
}
public void setSecret(String secret) {
this.secret = secret;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public String getAesKey() {
return aesKey;
}
public void setAesKey(String aesKey) {
this.aesKey = aesKey;
}
public String getMsgDataFormat() {
return msgDataFormat;
}
public void setMsgDataFormat(String msgDataFormat) {
this.msgDataFormat = msgDataFormat;
}
}
3.2、初始化 小程序工具类、以及、监控服务器推送信息的回调方法
WxMaService是关键。像调用 小程序登录 code换取SessionKey、解析用户手机号、用户信息之类的。全在这个工具类中。
WxMaMessageRouter就不用说了。就是服务器推送给你信息。你接受。怎么回复的。
@Configuration
@EnableConfigurationProperties(WxMaProperties.class)
public class WxMaConfiguration {
private WxMaProperties properties;
private static WxMaMessageRouter router;
private static WxMaService maService;
public WxMaProperties getProperties() {
return properties;
}
public void setProperties(WxMaProperties properties) {
this.properties = properties;
}
@Autowired
public WxMaConfiguration(WxMaProperties properties) {
this.properties = properties;
}
public static WxMaService getMaService() {
return maService;
}
public static WxMaMessageRouter getRouter() {
return router;
}
//这里是关键。 初始化WxMaService 根据类。
//像根据Code获取sessionKey啊。解析手机号、解析用户信息啊。方法都在WxMaService里
@PostConstruct
public void init() {
WxMaInMemoryConfig config = new WxMaInMemoryConfig();
config.setAppid(properties.getAppid());
config.setSecret(properties.getSecret());
config.setToken(properties.getToken());
config.setAesKey(properties.getAesKey());
config.setMsgDataFormat(properties.getMsgDataFormat());
WxMaService service = new WxMaServiceImpl();
service.setWxMaConfig(config);
maService = service;
router = this.newRouter(service);
}
private WxMaMessageRouter newRouter(WxMaService service) {
final WxMaMessageRouter router = new WxMaMessageRouter(service);
router
.rule().handler(logHandler).next()
.rule().async(false).content("模板").handler(templateMsgHandler).end()
.rule().async(false).content("文本").handler(textHandler).end()
.rule().async(false).content("图片").handler(picHandler).end()
.rule().async(false).content("二维码").handler(qrcodeHandler).end();
return router;
}
private final WxMaMessageHandler templateMsgHandler = (wxMessage, context, service, sessionManager) ->
service.getMsgService().sendTemplateMsg(WxMaTemplateMessage.builder()
.templateId("此处更换为自己的模板id")
.formId("自己替换可用的formid")
.data(Lists.newArrayList(
new WxMaTemplateData("keyword1", "339208499", "#173177")))
.toUser(wxMessage.getFromUser())
.build());
private final WxMaMessageHandler logHandler = (wxMessage, context, service, sessionManager) -> {
System.out.println("收到消息:" + wxMessage.toString());
service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("收到信息为:" + wxMessage.toJson())
.toUser(wxMessage.getFromUser()).build());
};
private final WxMaMessageHandler textHandler = (wxMessage, context, service, sessionManager) ->
service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("回复文本消息")
.toUser(wxMessage.getFromUser()).build());
private final WxMaMessageHandler picHandler = (wxMessage, context, service, sessionManager) -> {
try {
WxMediaUploadResult uploadResult = service.getMediaService()
.uploadMedia("image", "png",
ClassLoader.getSystemResourceAsStream("tmp.png"));
service.getMsgService().sendKefuMsg(
WxMaKefuMessage
.newImageBuilder()
.mediaId(uploadResult.getMediaId())
.toUser(wxMessage.getFromUser())
.build());
} catch (Exception e) {
e.printStackTrace();
}
};
private final WxMaMessageHandler qrcodeHandler = (wxMessage, context, service, sessionManager) -> {
try {
final File file = service.getQrcodeService().createQrcode("123", 430);
WxMediaUploadResult uploadResult = service.getMediaService().uploadMedia("image", file);
service.getMsgService().sendKefuMsg(
WxMaKefuMessage
.newImageBuilder()
.mediaId(uploadResult.getMediaId())
.toUser(wxMessage.getFromUser())
.build());
} catch (Exception e) {
e.printStackTrace();
}
};
}
3.3、开始走业务逻辑 这里演示一下 。 code换sessionKey、解析手机号、解析用户信息。 其他的你们自己看源码吧。 贼方便
final WxMaService wxService = WxMaConfiguration.getMaService();
//根据Code 换取sessionKey
WxMaJscode2SessionResult session = null;
try {
session = wxService.getUserService().getSessionInfo(code);
} catch (WxErrorException e) {
e.printStackTrace();
}
String sessionKey = session.getSessionKey();
//phoneEncryptedData,phoneIv 是前端调用小程序提供的API。获取的加密内容
//sessionKey 是刚才用Code换取的sessionKey 这个会过期哦 还是不定时的
//解密手机号等用户信息
WxMaPhoneNumberInfo phoneNoInfo= wxService.getUserService().getPhoneNoInfo(sessionKey, phoneEncryptedData, phoneIv);
//userEncryptedData, userIv 是前端调用小程序提供的API。获取的加密内容
//sessionKey 是刚才用Code换取的sessionKey 这个会过期哦 还是不定时的
// 解密用户信息 unionId 头像、openId之类的
WxMaUserInfo userInfo = wxService.getUserService().getUserInfo(sessionKey, userEncryptedData, userIv);
四、这里说一下 小程序登录的逻辑
微信小程序文档:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/wx.login.html
下面咱们需要用到的有2个api
一共分为 4 步
4.1、小程序调用API -> wx.login -> 调用服务端接口换取sessionKey并缓存在本地。
4.2、调用 getPhoneNumber(小程序获取手机号 这里是用户点击按钮才可以获取的) 、 getUserInfo(必须先授权完的)
4.3、在调用接口之前。 前端需要使用 wx.checkSession API来验证一下 sessionKey是否过期。如果过期了。 重新拿Code换一下 sessionKey
4.4、没有过期的话。直接把 sessionKey getPhoneNumber、getUserInfo获取到的加密的信息 传递给后台。 后台调用刚才上面说的工具。 把用户信息、手机号信息。全部解析出来。 进行处理。
各位兄弟,有觉得我这文章对你有帮助的。记得帮老铁我点个赞。抱拳了!!