package cn.jpush.api.push; import cn.jiguang.common.ClientConfig; import cn.jiguang.common.ServiceHelper; import cn.jiguang.common.connection.HttpProxy; import cn.jiguang.common.connection.IHttpClient; import cn.jiguang.common.connection.NativeHttpClient; import cn.jiguang.common.resp.APIConnectionException; import cn.jiguang.common.resp.APIRequestException; import cn.jiguang.common.resp.ResponseWrapper; import cn.jiguang.common.utils.Base64; import cn.jiguang.common.utils.Preconditions; import cn.jiguang.common.utils.sm2.SM2Util; import cn.jpush.api.push.model.EncryptKeys; import cn.jpush.api.push.model.EncryptPushPayload; import cn.jpush.api.push.model.PushPayload; import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; import java.util.Map; /** * Created by caiyaoguan on 2017/7/4. */ public class GroupPushClient { private IHttpClient _httpClient; private String _baseUrl; private String _groupPushPath; private String _encryptType; private Gson _gson = new Gson(); private JsonParser _jsonParser = new JsonParser(); public GroupPushClient(String groupMasterSecret, String groupKey) { this(groupMasterSecret, groupKey, null, ClientConfig.getInstance()); } public GroupPushClient(String groupMasterSecret, String groupKey, HttpProxy proxy, ClientConfig conf) { ServiceHelper.checkBasic(groupKey, groupMasterSecret); this._baseUrl = (String) conf.get(ClientConfig.PUSH_HOST_NAME); this._groupPushPath = (String) conf.get(ClientConfig.GROUP_PUSH_PATH); this._encryptType = (String) conf.get(ClientConfig.ENCRYPT_TYPE); String authCode = ServiceHelper.getBasicAuthorization("group-" + groupKey, groupMasterSecret); this._httpClient = new NativeHttpClient(authCode, proxy, conf); } public GroupPushResult sendGroupPush(PushPayload pushPayload) throws APIConnectionException, APIRequestException { Preconditions.checkArgument(! (null == pushPayload), "pushPayload should not be null"); ResponseWrapper response = _httpClient.sendPost(_baseUrl + _groupPushPath, getEncryptData(pushPayload)); // 2020-8-6 兼容分组推送新返回的group_msgid结构 JsonObject responseJson = _jsonParser.parse(response.responseContent).getAsJsonObject(); String groupMsgIdKey = "group_msgid"; JsonElement _groupMsgId = responseJson.get(groupMsgIdKey); String groupMsgId = null != _groupMsgId ? _groupMsgId.getAsString() : ""; responseJson.remove(groupMsgIdKey); Map result = _gson.fromJson(responseJson, new TypeToken>(){}.getType()); return new GroupPushResult(groupMsgId, result); } /** * 获取加密的payload数据 * @param pushPayload * @return */ private String getEncryptData(PushPayload pushPayload) { if (_encryptType.isEmpty()) { return pushPayload.toString(); } if (EncryptKeys.ENCRYPT_SMS2_TYPE.equals(_encryptType)) { EncryptPushPayload encryptPushPayload = new EncryptPushPayload(); try { encryptPushPayload.setPayload(String.valueOf(Base64.encode(SM2Util.encrypt(pushPayload.toString(), EncryptKeys.DEFAULT_SM2_ENCRYPT_KEY)))); } catch (Exception e) { throw new RuntimeException("encrypt word exception", e); } encryptPushPayload.setAudience(pushPayload.getAudience()); return encryptPushPayload.toString(); } // 不支持的加密默认不加密 return pushPayload.toString(); } }