云商店
云商店
- 云商店介绍
-
接入指南
-
商品接入相关接口
- SaaS类商品接入指南 V2.0(新商品上架)
- SaaS类商品接入指南 V1.0(已下线)
- 联营License类授权码商品接入指南(2.0版本)
- 联营License类商品接入指南(已下线)
- 自动部署接入指南
- 联营License客户端软件对接指南
- 商品交易相关接口
-
商品接入相关接口
- 用户指南
-
商家指南
- 为什么要加入云商店
- 商家入驻
- 商品发布
- 商品交易
- 商家结算
- 店铺运营
- 政策与权益
- 中资出海
-
商家常见问题
- 商家入驻相关问题
- 联营计划相关问题
-
商品发布相关问题
- 如何在云商店发布商品
- 如何发布多SKU定价规格
- 商品发布申请提交后,审核需要多久
- 如何判断发布的商品对应云商店上的哪种商品接入类型
- 云商店商品上架的使用有效期
- 新商品发布时,“商品说明”中能否插入图片
- 为什么在商品发布页面没有发布联营商品按钮
- 如何创建SaaS按需规格和按需套餐包
- 如何补充商品交付模板
- 商品名称发布说明
- 商品logo、商品主图与视频、商品简介、商品说明发布说明
- 联营商品服务支持条款发布说明
- 通用商品服务协议发布说明
- 服务与支持、使用指南发布说明
- 软件著作权证书发布说明
- 通用商品规格发布说明
- 联营商品规格对照报价单填写说明
- 联营服务流发布说明
- 生产接口地址、安全漏洞扫描、关联应用发布说明
- 如何发布SaaS类商品试用规格
- 云商店镜像资产无法选择到已创建私人镜像的原因
- 商品管理相关问题
- 服务监管相关问题
- 结算相关问题
- 协议与规范
- 客户服务商指南
- 平台规范与通知
- 文档下载
- 通用参考
本文导读
展开导读
文档首页/
云商店/
接入指南/
商品接入相关接口/
SaaS类商品接入指南 V1.0(已下线)/
通用和自服务SaaS类商品接入指南 V1.0/
代码示例(Java)/
ISV Server验证所有的通知请求
链接复制成功!
ISV Server验证所有的通知请求
代码调用如下图所示。
/** * 校验通知消息的合法性 * @param request http请求通知消息 * @param accessKey 接入码 * @param encryptLength 加密长度 * @return 验证结果 */ public static boolean verificateRequestParams(javax.servlet.http.HttpServletRequest request, String accessKey,int encryptLength) { //解析出url内容 Map<String, String[]> paramsMap = request.getParameterMap(); String timeStamp = null; String authToken = null; String[] timeStampArray = paramsMap.get("timeStamp"); if (null != timeStampArray && timeStampArray.length > 0) { timeStamp = timeStampArray[0]; } String[] authTokenArray = paramsMap.get("authToken"); if (null != authTokenArray && authTokenArray.length > 0) { authToken = authTokenArray[0]; } //对剩下的参数进行排序,拼接成加密内容 Map<String, String[]> sortedMap = new TreeMap<String, String[]>(); sortedMap.putAll(paramsMap); sortedMap.remove("authToken"); StringBuffer strBuffer = new StringBuffer(); Set<String> keySet = sortedMap.keySet(); Iterator<String> iter = keySet.iterator(); while (iter.hasNext()) { String key = iter.next(); String value = sortedMap.get(key)[0]; strBuffer.append("&").append(key).append("=").append(value); } //修正消息体,去除第一个参数前面的& String reqParams = strBuffer.toString().substring(1); String key = accessKey + timeStamp; String signature = null; try { signature = generateResponseBodySignature(key, reqParams); } catch (InvalidKeyException | NoSuchAlgorithmException | IllegalStateException | UnsupportedEncodingException e) { // TODO Auto-generated catch block } return authToken.equals(signature); }
/** * 生成http响应消息体签名示例Demo * @param key 用户在isv console分配的accessKey,请登录后查看 * @param body http响应的报文 * @return 加密结果 * @throws InvalidKeyException * @throws NoSuchAlgorithmException * @throws IllegalStateException * @throws UnsupportedEncodingException */ public static String generateResponseBodySignature(String key, String body) throws InvalidKeyException, NoSuchAlgorithmException, IllegalStateException, UnsupportedEncodingException { return base_64(hmacSHA256(key, body)); }
/** * * hamcSHA256加密算法 * @param macKey 秘钥key * @param macData 加密内容-响应消息体 * @return 加密密文 * @throws NoSuchAlgorithmException * @throws InvalidKeyException * @throws IllegalStateException * @throws UnsupportedEncodingException */ public static byte[] hmacSHA256(String macKey, String macData) throws NoSuchAlgorithmException, InvalidKeyException, IllegalStateException, UnsupportedEncodingException { SecretKeySpec secret = new SecretKeySpec(macKey.getBytes(), "HmacSHA256"); Mac mac = Mac.getInstance("HmacSHA256"); mac.init(secret); byte[] doFinal = mac.doFinal(macData.getBytes("UTF-8")); return doFinal; }
/** * * 字节数组转字符串 * @param bytes 字节数组 * @return 字符串 */ public static String base_64(byte[] bytes) { return new String(Base64.encodeBase64(bytes)); }
父主题: 代码示例(Java)