第一部分:小程序用户身份认证实现
必要组件
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>4.5.0</version>
</dependency>
初始化配置
@Slf4j
@Configuration
public class WechatMiniAppConfig {
@Value("${wx.appId:wx0aca260a96c6****}")
private String appId;
@Value("${wx.secret:cd4cbd9e64cae84f7797d9260b03****}")
private String appSecret;
private WxMaUserService userService;
@PostConstruct
public void setup() {
WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
config.setAppid(appId);
config.setSecret(appSecret);
WxMaService service = new WxMaServiceImpl();
service.setWxMaConfig(config);
this.userService = service.getUserService();
}
@Bean
public WxMaUserService wxUserService() {
return this.userService;
}
}
用户认证接口
@RestController
public class AuthController {
@Autowired
private WxMaUserService userService;
@PostMapping("/login")
public ResponseResult miniAppLogin(@RequestBody LoginRequest request) {
if(StringUtils.isEmpty(request.getCode())) {
throw new IllegalArgumentException("授权码不能为空");
}
try {
WxMaJscode2SessionResult session = userService.getSessionInfo(request.getCode());
User user = userService.findByOpenId(session.getOpenid());
return ResponseResult.ok()
.setData("session", session)
.setData("userInfo", user);
} catch (WxErrorException e) {
log.error("微信认证失败", e);
throw new ServiceException("微信服务异常");
}
}
}
第二部分:动态参数二维码生成方案
微信常量定义
public class WechatConstants {
public static final String APP_ID = "wx0aca260a96c6****";
public static final String APP_SECRET = "cd4cbd9e64cae84f7797d9260b03****";
// 接口地址
public static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token";
public static final String QRCODE_API = "https://api.weixin.qq.com/wxa/getwxacodeunlimit";
}
二维码生成服务
@GetMapping("/qrcode")
public void generateQrCode(HttpServletResponse response) throws IOException {
User currentUser = getCurrentUser();
if(StringUtils.isNotBlank(currentUser.getQrCode())) {
response.setContentType("image/png");
response.getOutputStream().write(
Base64.getDecoder().decode(currentUser.getQrCode())
);
return;
}
String token = obtainAccessToken();
JSONObject params = new JSONObject()
.put("scene", currentUser.getId())
.put("env_version", "release");
byte[] qrData = HttpUtil.postForBytes(
WechatConstants.QRCODE_API + token,
params.toString()
);
userService.updateQrCode(currentUser.getId(),
Base64.getEncoder().encodeToString(qrData));
response.setContentType("image/png");
response.getOutputStream().write(qrData);
}
第三部分:微信消息推送服务
模板消息发送
public void sendTemplateMessage(MessageRequest request) {
String accessToken = getAccessToken();
User recipient = userService.findById(request.getUserId());
JSONObject message = new JSONObject()
.put("touser", recipient.getOpenid())
.put("template_id", "ZtkOfAP0MkLESYa4-bwxDDqbv1pd2NQ7mwuk_QCfnnc")
.put("page", "pages/activity/detail?id=" + request.getActivityId());
JSONObject content = new JSONObject()
.put("thing3", new JSONObject().put("value", "限时优惠活动"))
.put("time4", new JSONObject().put("value", request.getExpireTime()));
message.put("data", content);
String result = HttpUtil.post(
WechatConstants.MESSAGE_API + accessToken,
message.toString()
);
log.info("消息推送结果:{}", result);
}
第四部分:HTTP通信工具封装
网络请求工具类
public class HttpUtils {
private static final Logger logger = LoggerFactory.getLogger(HttpUtils.class);
public static String get(String url, Map<String,String> params) {
StringBuilder result = new StringBuilder();
try {
String query = params.entrySet().stream()
.map(e -> e.getKey() + "=" + e.getValue())
.collect(Collectors.joining("&"));
HttpURLConnection conn = (HttpURLConnection)
new URL(url + "?" + query).openConnection();
conn.setRequestMethod("GET");
try(BufferedReader reader = new BufferedReader(
new InputStreamReader(conn.getInputStream()))){
String line;
while ((line = reader.readLine()) != null) {
result.append(line);
}
}
} catch (Exception e) {
logger.error("GET请求异常", e);
}
return result.toString();
}
public static byte[] postForBinary(String url, String jsonBody) {
ByteArrayOutputStream output = new ByteArrayOutputStream();
try {
HttpURLConnection conn = (HttpURLConnection)
new URL(url).openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
try(OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream())){
writer.write(jsonBody);
writer.flush();
InputStream input = conn.getInputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = input.read(buffer)) != -1) {
output.write(buffer, 0, length);
}
}
} catch (Exception e) {
logger.error("POST请求异常", e);
}
return output.toByteArray();
}
}
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...