关键代码片段
对云商店请求参数进行签名验证:
Copied!
public static IMessageResp verifySignature(IsvProduceReq isvProduceReq, HttpServletRequest request, String accessKey) throws Exception {
IMessageResp resp = new IMessageResp();
resp.setResultCode(ResultCodeEnum.SUCCESS.getResultCode());
resp.setResultMsg(ResultCodeEnum.SUCCESS.getResultMsg());
Map<String, String[]> paramsMap = request.getParameterMap();
String reqParams = objectMapper.writeValueAsString(isvProduceReq);
String reqTimestamp = getParamValue(paramsMap, IsvProduceConstant.TIMESTAMP);
String nonce = getParamValue(paramsMap, IsvProduceConstant.NONCE);
String reqSignature = getParamValue(paramsMap, IsvProduceConstant.SIGNATURE);
String signature = getSignature(accessKey, reqParams, nonce ,reqTimestamp);
if (reqSignature.equalsIgnoreCase(signature)) {
return resp;
}
resp.setResultCode(ResultCodeEnum.INVALID_TOKEN.getResultCode());
resp.setResultMsg(ResultCodeEnum.INVALID_TOKEN.getResultMsg());
return resp;
}
如果验证不通过须返回失败,如果返回了成功则云商店默认数据同步成功,不会再重新触发数据同步;
如果验证通过后需要根据请求参数activity来区分具体同步场景,根据不同场景,商家需实现对应的业务逻辑:
Copied!
private Map<String, Function<IsvProduceReq, IMessageResp>> initConsumers() {
Map<String, Function<IsvProduceReq, IMessageResp>> consumers = new HashMap<>();
consumers.put(Activity.REFRESH, this::refresh);
consumers.put(Activity.UPDATE, this::updateStatus);
consumers.put(Activity.RELEASE, this::release);
return consumers;
}
详细示例代码可参见源码
参考
具体接入流程介绍参考:
联营License类商品接入指南(2.0版本):https://support.huaweicloud.com/accessg-marketplace/zh-cn_topic_0070649166.html
联营License类商品接入指南(旧版):https://support.huaweicloud.com/accessg-marketplace/zh-cn_topic_0070649151.html
通用SaaS类商品接入指南:https://support.huaweicloud.com/accessg-marketplace/zh-cn_topic_0046212972.html
联营SaaS类商品接入指南:https://support.huaweicloud.com/accessg-marketplace/zh-cn_topic_0070649101.html
功能介绍
基于Spring boot构建,可以直接启动,通过修改application.properties配置文件里的server.port可以改变启动端口号, 默认访问路径为:http://127.0.0.1:8080/isv/produce ,可以通过卖家中心的应用工具菜单下的license授权码交付接口调试页面生成链接用来本地调试
更新授权码有效期
按周期售卖的商品,商家必须实现续费场景的接口开发
1.客户续费下单,云商店将调用该接口请求商家执行业务延期,商家接口需要执行将到期日进行更新,并返回通知云商店。
2.商家需要保障续费接口通畅,将业务进行延期,如续费失败,将可能导致用户的业务被释放的风险。
3.针对续费场景接口调用失败的情况,云商店会最多调用60次(每2分钟1次)后停止调用,“卖家中心—生产接口消息”中可查询接口“异常信息”,若商家接口问题在60次调用时间内解决,则在下一次调用时接口响应成功;若商家接口问题在60次调用后仍无解决,系统停止调用,请在修复接口异常后,在云商店对该失败调用进行重新调用。
4.请及时关注商家信息中客服邮箱以及云商店账号绑定的邮箱的通知,收到调用失败通知邮件及时处理接口异常。
5.云商店会对接口异常的情况做监控,如License商品频繁出现因接口异常的情况,云商店将对该商品做下架处理。
变更授权码状态
释放授权码
可以学到什么
开发时序图/流程图
流程说明如下:
前置条件
您需要拥有华为云商家账号,进入卖家中心页面,单击左侧导航的“商家管理>商家信息”。
在商家信息页面单击小眼睛图标获取accessKey值。 (https://console.huaweicloud.com/marketplace/isv/?region=cn-north-4#/console/business)
关键代码片段
对云商店请求参数进行签名验证:
/** * 商家接收到云商店发送的请求后需要对入参进行验签 * 取出入参并排序,然后进行签名,并和请求里面的签名信息进行比较来验签 * 请求里含有签名reqSignature;随机数nonce;时间戳reqTimestamp * 先进行验证签名 */ public static IMessageResp verifySignature(IsvProduceReq isvProduceReq, HttpServletRequest request, String accessKey) throws Exception { IMessageResp resp = new IMessageResp(); resp.setResultCode(ResultCodeEnum.SUCCESS.getResultCode()); resp.setResultMsg(ResultCodeEnum.SUCCESS.getResultMsg()); Map<String, String[]> paramsMap = request.getParameterMap(); String reqParams = objectMapper.writeValueAsString(isvProduceReq); // 获取请求时间戳 String reqTimestamp = getParamValue(paramsMap, IsvProduceConstant.TIMESTAMP); // 获取随机字符串 String nonce = getParamValue(paramsMap, IsvProduceConstant.NONCE); // 获取请求里的签名 String reqSignature = getParamValue(paramsMap, IsvProduceConstant.SIGNATURE); // 生成签名信息 String signature = getSignature(accessKey, reqParams, nonce ,reqTimestamp); // 判断计算后的签名与云市场请求中传递的签名是否一致 不区分大小写 if (reqSignature.equalsIgnoreCase(signature)) { return resp; } resp.setResultCode(ResultCodeEnum.INVALID_TOKEN.getResultCode()); resp.setResultMsg(ResultCodeEnum.INVALID_TOKEN.getResultMsg()); return resp; }
如果验证不通过须返回失败,如果返回了成功则云商店默认数据同步成功,不会再重新触发数据同步;
如果验证通过后需要根据请求参数activity来区分具体同步场景,根据不同场景,商家需实现对应的业务逻辑:
/** * 根据活动类型调用对应的接口实现方法:更新授权码有效期、变更授权码状态、释放授权码 */ private Map<String, Function<IsvProduceReq, IMessageResp>> initConsumers() { Map<String, Function<IsvProduceReq, IMessageResp>> consumers = new HashMap<>(); consumers.put(Activity.REFRESH, this::refresh); consumers.put(Activity.UPDATE, this::updateStatus); consumers.put(Activity.RELEASE, this::release); return consumers; }
详细示例代码可参见源码
参考
具体接入流程介绍参考:
联营License类商品接入指南(2.0版本):https://support.huaweicloud.com/accessg-marketplace/zh-cn_topic_0070649166.html
联营License类商品接入指南(旧版):https://support.huaweicloud.com/accessg-marketplace/zh-cn_topic_0070649151.html
通用SaaS类商品接入指南:https://support.huaweicloud.com/accessg-marketplace/zh-cn_topic_0046212972.html
联营SaaS类商品接入指南:https://support.huaweicloud.com/accessg-marketplace/zh-cn_topic_0070649101.html