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;
}