爱做饭的电饭煲
文章正文
发布时间:2024-10-18 00:28
一个帮助现实中打牌的人记分的微信小程序,需要每局记分。
问题:ab同时在小程序里,a发送结算通知,b能收到;a在小程序,b不在,a发送结算通知,b再进入小程序接收不到,需要a再发送。能否做到a发送了,b即使不在小程序,只要登录小程序就能接受到?或者有什么其他方法可以解决确认问题?
ab同时在小程序里,a发送,b能收到,
想要实现a发送了,b即使不在小程序,只要登录小程序就能接受到:
可以考虑以下方案:
当用户操作引发事件推送时,微信服务器会将消息以及数据包发送到配置的url,根据a用户和b用户对不同的消息类型进行相应处理
项目中的需求是当用户b打开后,自动回复a发送的结算通知。
public
class MsgController extends BaseController{
@Autowired
private WxConfig wxConfig;
@Autowired
private MpService mpService;
@
RequestMapping(value = "/reply",method = {RequestMethod.GET, RequestMethod.POST})
@ResponseBody
public String reply(@
RequestParam("signature") String signature, @
RequestParam("timestamp") String timestamp, @
RequestParam("nonce") String nonce, @RequestBody Map<String,String> param) throws Exception {
mpService.msg
Reply(signature,timestamp,nonce,param,wxConfig);
return
"success";
}
}
public
class MpService {
@Autowired
private AccessTokenUtils accessTokenUtils;
@
Resource(name = "redisTemplateBusiness")
private RedisTemplate redisTemplate;
public void msg
Reply(String signature,String timestamp,String nonce, Map<String,String> param,WxConfig wxConfig) throws Exception {
MpSignService signService=
new MpSignService(signature,wxConfig.getMpMsgReplyToken(),nonce,timestamp);
if(!signService.validate
()){
return;
}
log.info(
JsonUtil.toJson(param));
String fromUserName=param.get(
"FromUserName");
String msgType=param.get(
"MsgType");
String event=param.get(
"event");
if(msgType.equals(
"event")&&
StringUtils.is
NotEmpty(event)&&event.equals(
"user_enter_tempsession"))
{
//查询openid(用户b)是否已经接受消息
if(is
NewUser(fromUserName)) {
String token = accessTokenUtils.get
Token(wxConfig.getMpAppId(), wxConfig.get
MpAppSecret());
this.send
QywxImage(fromUserName, token);
}
}
}
private void send
QywxImage(String openId,String accessToken) throws Exception {
String url=
String.format(PushConstants.WxUrl.MP_MSG_SEND_MSG_URL,accessToken);
Map<String,Object> map =
new HashMap();
map.put(
"touser",openId);
map.put(
"msgtype",
"image");
Map<String,String> m=
new HashMap();
m.put(
"media_id",(String)redisTemplate.ops
ForValue().get(CachePrefix.QYWX_QRCODE));
map.put(
"image",m);
String result=
HTTPUtils.http
Post(url,map);
log.info(result);
}
}