Notify消息
(在使用签名规则时,基本的步骤都差不多!步骤:排序、拼装、签名、验证签名)
1.功能描述:当用户订购淘宝服务成功后,TOP会发送通知消息给ISV应用。ISV可收集用户订购信息进行统计核算
2.用户订购交互流程:
在淘宝服务中,用户发起订购;转到订购中心,用户缴费并完成订购;再转到淘宝服务,发送ISV通知消息;由淘宝服务到ISV应用,接收通知消息并未用户开通服务
3.Notify消息通知接收机制:
<1>.消息类型包括:新订、续订、升级、退订。
<2>.订购通知是通过Http协议Post给ISV应用的NotifyUrl,
NotifyUrl的配置可通过后台的应用管理录入。
<3>.通知功能实现方式是收到消息后,先进行签名验证。
<4>.编码方式是UTF-8。
4.Notify消息参数说明
参数名 类型 描述
userId Long 订购者的用户数字Id
nick String 订购者的用户昵称
leaseId Long 租赁实体ID:应用ID或者应用包ID
validateDate Date 生效日期,例如:2009-01-01 00:00:00
invalidateDate Date 失效日期,例如:2009-12-31 23:59:59
factMoney Double 实收金额,例如:899,00,以分为单位
subscType Long 订单类型,1=订购,2=续费,3=升级,4=后台赠送,5=自动续费,6=订单审核后生成订购关系(预留,目前TOP应用不会用到)
versionNo Integer 版本编号:1,初级;2,中级;3,高级
oldVersionNo Long 升级前版本号:1,初级;2,中级
status Long 状态:1,等待开通;2,开通;3,关闭(1,表示订单将来才生效;2,表示立即生效;3,表示订单失效,用于退订的情况)
sign String 签名
gmtCreateDate Date 订购发生时间
tadgetCode String 应用实例的应用code即服务code
5.签名规则
将除sign之外所有参数获取过来,进行签名算法,最后与sign进行对比
签名公式:
sign=MD5(secretCode + param1 + value1 + param2 + value2 + … + paramN + valueN+ secretCode) ).toUpper();
(注:即使param对应的value为空,也要以param+空串的方式进行签名)
<1>.排序
将所有参数param1,param2,……,paramN,按照参数名称字母顺序从小到大排列
<2>.拼串
将排好序的参数拼接成串,param1 + value1 + param2 + value2 + … +paramN + valueN
<3>.首尾加密钥
在上述字符串首部和尾部都加上应用的密钥secretCode,即secretCode + param1 + value1 + param2 + value2 + … +paramN + valueN + secretCode
<4>.签名
进行MD5编码,即:MD5(secretCode + param1 + value1 + param2 + value2 + … + paramN + valueN+ secretCode) )
<5>.转换大写
再转换成大写字母,即:MD5(secretCode + param1 + value1 + param2 + value2 + … + paramN + valueN+ secretCode) ).toUpper()
*****************************************************************
容器回调参数签名规则(版本号验证)
1.容器回调参数签名的意义
对开发者而言,从此不需要依赖于Notify通知消息或者taobao.appstore.subscribe.get来给用户开通订购关系。开发者只需对从容器过来的访问请求进行签名验证,一旦校验通过,即可让用户访问该应用。即:完全信任淘宝容器过来的访问请求。关于用户的订购关系,后续我们会在合作伙伴后台里提供查询和导出功能,同时保留API查询功能
2.参数说明
目前,在使用淘宝箱订购的应用时,系统会跳转到"用户TOP授权码"页面,需要用户同意"免责声明 ",该页面出接收回调签名参数外,还接收如下四个请求参数:
参数名 类型 描述
leaseId Long 插件实例ID
versionNo Long 用户订购的应用版本号
appkey String 应用的AppKey
timestamp Long 当前系统的时间戳
(注:考虑传递明文参数的安全性,需要对以上参数进行签名)
3.签名规则
<1>.排序:
根据参数名称,将以上四个请求参数,按照字母先后顺序排序,例如:leaseId=51865,versionNo=1,appkey=93996,timestamp=1287547223869,排好序为:appkey=93996,leaseId=51865,timestamp=1287547223869,versionNo=1
<2>.拼装:
将以上排好序的参数键值对,拼装成串,例如:appkey=93996,leaseId=51865,timestamp=1287547223869,versionNo=1拼装为:appkey93996leaseId51865timestamp1287547223869versionNo1
<3>.签名(utf-8编码)
将secret同时拼接到参数字符串头、尾部,进行md5加密,再转化成大写,格式是:uppercase(hex(md5(secretkey1value1key2value2...secret))。 例如:secert= c1927d998894b85dfab19cbcc8aee93b, sign=uppercase(hex(md5(c1927d998894b85dfab19cbcc8aee93bappkey93996leaseId51865timestamp1287547223869versionNo1c1927d998894b85dfab19cbcc8aee93b))) = 639B98FFD3B33D275238FA5B476AAD52
<4>.验证签名
将请求参数sign的值与以上步骤计算出来的sign比较,如果相等,则签名验证通过,否则签名验证失败 可选地,可以判断当前系统的时间戳与请求参数timestamp(精确到毫秒级别)进行比较,如果超过一定的时间如6分钟,则拒绝该次请求