上个小节我们配置好了SpringBoot上面的WebSocket,我们可以主动向客户端推送消息了。那么这节课咱们就补充一下后端Web方法的代码,后端接收到微信平台发送的付款成功通知,然后用WebSocket技术把结果推送给前端页面。
一、编写持久层代码
因为微信平台发送过来的XML数据中,没有userId,所以我们想根据userId查找缓存的Session,然后给客户端推送结果也就犯了难,那怎么办呢?我们可以用商品订单ID查找罚款单记录关联的userId,这不就迎刃而解了。
在TbAmectDao.xml
文件中,定义SQL语句。
<select id="searchUserIdByUUID" parameterType="String" resultType="Integer">
SELECT user_id AS userId
FROM tb_amect
WHERE uuid = #{uuid}
</select>
在TbAmectDao.java
接口中,定义DAO方法。
public interface TbAmectDao {
……
public int searchUserIdByUUID(String uuid);
}
二、编写业务层代码
在AmectService.java
接口中,声明抽象方法。
public interface AmectService {
……
public int searchUserIdByUUID(String uuid);
}
在AmectServiceImpl.java
类中,实现抽象方法。
public class AmectServiceImpl implements AmectService {
……
@Override
public int searchUserIdByUUID(String uuid) {
int userId = amectDao.searchUserIdByUUID(uuid);
return userId;
}
}
三、编写Web层代码
在AmectController.java
类中,添加向前端推送付款结果的代码。
public class AmectController {
……
@Operation(summary = "接收消息通知")
@RequestMapping("/recieveMessage")
public void recieveMessage(HttpServletRequest request, HttpServletResponse response) throws Exception {
……
int rows = amectService.updateStatus(param);
if (rows == 1) {
//根据罚款单ID查询用户ID
int userId = amectService.searchUserIdByUUID(outTradeNo);
//向用户推送结果
WebSocketService.sendInfo("收款成功", userId + "");
……
}
……
}
}