即时通讯im采坑

1、回调
看了官方文档一直不清楚怎么配回调的地址,发现有多中方式的回调,一度认为需要配置多个接口才对,后翻阅大量资料发现:
官方给的回调地址参考:https://www.example.com?SdkAppid=KaTeX parse error: Expected 'EOF', got '&' at position 9: SDKAppID&̲CallbackCommand…CallbackCommand&contenttype=json&ClientIP=KaTeX parse error: Expected 'EOF', got '&' at position 9: ClientIP&̲OptPlatform=OptPlatform
注意这个参数:CallbackCommand
固定为 C2C.CallbackAfterSendMsg

也就是通过这个参数去判断,这里给的是单聊发送后回调。
在这里插入图片描述
我这边配的本地地址参考:
http://192.168.2.12:8089/im/api/resultCode?SdkAppid=1400664732&CallbackCommand=C2C.CallbackAfterSendMsg&contenttype=json&ClientIP=192.168.2.12&OptPlatform=Android

java接收回调函数:

@RequestMapping("/resultCode")
@ApiOperation("回调函数")
public JSON imEventCallback(@RequestBody JSONObject jsonObject, HttpServletRequest request) {
    JSONObject returnJson = new JSONObject();
    Map map = new HashMap();
    Enumeration paramNames = request.getParameterNames();
    while (paramNames.hasMoreElements()) {
        String paramName = (String) paramNames.nextElement();
        String[] paramValues = request.getParameterValues(paramName);
        if (paramValues.length == 1) {
            String paramValue = paramValues[0];
            if (paramValue.length() != 0) {
                map.put(paramName, paramValue);
            }
        }
    }
    /**
     *  回调命令
     * */
    String callbackCommand = map.get("CallbackCommand").toString();
    /**
     *  SdkAppid(校验一下是否是自己的账户的消息)
     * */
    String sdkAppid = map.get("SdkAppid").toString();
    /**
     *  如果不是自己账户的消息就丢弃
     * */
    if (String.valueOf(userSigService.getSdkappid()).equals(sdkAppid) && jsonObject != null && jsonObject.size() > 0) {
        // 单聊消息回调
        if ("C2C.CallbackAfterSendMsg".equals(callbackCommand)) {
            List<Map<String,Object>> mapList = (List<Map<String,Object>>)jsonObject.get("MsgBody");
            Map<String,String> stringMap=(Map<String,String>)mapList.get(0).get("MsgContent");
            // 这里把消息提取出来并发送给接收人,通过个推
            FebsResponse febsResponse = toMessage((String) jsonObject.get("From_Account"),stringMap.get("Text"));
            if(200 !=(int)febsResponse.get("code")) {
             throw new RuntimeException("推送失败!"+febsResponse.get("message"));
            }

        }
    }
    // 接收完回调消息后,返回接收成功应答包给IM(无论成功或者失败,都要响应应答包给IM)
    // 因为为了不影响发言,回调失败也响应回调成功,如果业务要求严格,需要做失败处理,具体参考腾讯云IM接口文档。
    returnJson.put("ActionStatus","OK");
    returnJson.put("ErrorInfo","");
    returnJson.put("ErrorCode",0);
    return returnJson;
}

回调地址配置,就是到controller这个地址,已用postman测通。

2、顺便说一下基础配置,发送配置

IMConfig:
  #    请求接口
  #导入
  portImport: v4/im_open_login_svc/account_import
  #查询
  portCheck: v4/im_open_login_svc/account_check
  #单发单聊消息
  portSendMsg: v4/openim/sendmsg
  #    创建应用时即时通信 IM 控制台分配的 SDKAppID
  #正式
#  sdkappid: 
  #测试
  sdkappid: 
  #正式
#  secrekey: e319ed5dbce76ee5588773aa1d4cd3afedc3afb5701f489283d818e643d4fde9
  #测试
  secrekey:
  #必须为 App 管理员帐号,正式
#  identifier: wsygshz
#  测试
  identifier: 
  #请求格式固定值为json
  contenttype: json

在这里插入图片描述

在这里插入图片描述

@Service
@Data
public class UserSigService {
    @Value("${IMConfig.portImport}")
    private String portImport;

    @Value("${IMConfig.portCheck}")
    private String portCheck;

    @Value("${IMConfig.portSendMsg}")
    private String portSendMsg;

    @Value("${IMConfig.sdkappid}")
    private Long sdkappid;

    @Value("${IMConfig.secrekey}")
    private String secrekey;

    @Value("${IMConfig.identifier}")
    private String identifier;

    private Long random= Random32.random32();

    @Value("${IMConfig.contenttype}")
    private String contenttype;

    private long exprie=60*60*24*7;

    public String generateUserSig(String userId){
        TLSSigAPIv2 api = new TLSSigAPIv2(sdkappid,secrekey);

        return api.genSig(userId,exprie);
    }

发送请求(导入账号):

@Override
public JSONObject  importIm(UserEntity body) {
   //https://console.tim.qq.com/v4/im_open_login_svc/account_import?sdkappid=88888888&identifier=admin&usersig=xxx&random=99999999&contenttype=json
   String userSig=userSigService.generateUserSig(userSigService.getIdentifier());
   String url = "https://console.tim.qq.com/"+ userSigService.getPortImport()+"?usersig="+userSig+"&identifier="+userSigService.getIdentifier()
         +"&sdkappid="+userSigService.getSdkappid()+"&contenttype="+userSigService.getContenttype();
   HttpHeaders headers = new HttpHeaders();
   Map<String,String> map = new HashMap<>();
   map.put("UserID",body.getUsername());
   map.put("Nick",body.getNickName());
   map.put("FaceUrl",body.getFaceUrl());
   HttpEntity<Map<String,String>> requestEntity = new HttpEntity<Map<String,String>>(map, headers);
   SSLRestTemplate sslRestTemplate = new SSLRestTemplate();
   ResponseEntity<JSONObject> exchange = sslRestTemplate.exchange(url, HttpMethod.POST, requestEntity, JSONObject .class);
   JSONObject  bodyOne = exchange.getBody();
   return bodyOne;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值