商家提前须知:
ISV提前须知:
第一张图,消费者在售货机上选择需要的商品,售货机上出现二维码并引导用户扫码,生成二维码的接口tmall.device.trade.precreate
第二张图,消费者在手机淘宝/手机天猫上扫描二维码,进入到提交订单页面。(ISV后台会收到一条二维码被扫描的推送)
第三张图,消费者在手机淘宝/手机天猫上提交订单并完成支付。(ISV后台会收到一条支付成功的推送)
第四张图,售货机根据收到的支付成功的推送,机器出货
当前的业务玩法主要是:
1)美妆商家通过吸引用户关注店铺,通过售货机低价派发样品;技术对接上主要用到的接口有关注店铺+售货机交易购买。
2)美妆/服饰商家通过售货机,做常态化销售;技术对接上主要用到的接口有售货机交易购买。
每个业务会有区别,详询对接的实施小二。
售货机交易购买API对接。tmall.device.trade.precreate
1、接口参数说明
device_code
设备业务编码
out_trade_id
外部订单ID,下单要保证唯一。
item_list
商品列表,如果是多个商品,要保证是同一个商家名下的商品。
buy_amount : 购买件数,默认为1,可不传
sku_id: 商品SKU ID ,默认为0,可不传
item_id: 商品ID,注意非天猫国际等海外店铺商品
unit_price: 商品单价
type
交易状态类型。1,扫码后跳转下单页,创建订单,2,扫码后跳转收银台,直接支付
callback_url
回调地址,当订单创建,付款成功后,会收到回调。必须是https地址,最好是 ews 域名。可不传
用来接收回调数据的url,需要做urlencode。我们在订单创建、支付成功两个情况下会给该回调url回传数据,同时需要ISV响应我们推送的数据。
eg:2、回调参数说明(平台通过callback_url通知到服务商的参数):
deviceCode
设备业务编码
action
订单状态,trade-created 为订单创建,trade-paid 为订单付款
outTradeId
外部订单ID
tbTradeId
淘宝订单Id
timestamp
回调时间
method
固定值,topNotify
sign
参数签名:action,deviceCode,method,outTradeId,timestamp 参数 kv排列,
加密算法:HmacSHA256,密钥 appSecret
例如上面的例子为 :
加密串:actiontrade-paiddeviceCodeE62F465942methodtopNotifyoutTradeId12345678914timestamp1535635291295 密钥 appsecret
2.2、回调返回说明:
2.3 验签辅助代码
private static final String SIGN_ALGO = "HmacSHA256"; private static final String CHARSET_NAME = "UTF-8"; /** * 获取签名 * * @param params * @return * @throws NoSuchAlgorithmException * @throws UnsupportedEncodingException */ public String signParams(String secret,Map<String,String> params) throws IOException, UnsupportedEncodingException { // 第一步:检查参数是否已经排序 String[] keys = params.keySet().toArray(new String[0]); Arrays.sort(keys); // 第二步:把所有参数名和参数值串在一起 StringBuilder query = new StringBuilder(); for (String key : keys) { String value = params.get(key); if (!StringUtils.isBlank(key) && !StringUtils.isBlank(value)) { query.append(key).append(value); } } return byte2hex(encryptHMACSHA256(query.toString(),secret)); } public static byte[] encryptHMACSHA256(String data, String secret) throws IOException { byte[] bytes; try { SecretKey secretKey = new SecretKeySpec(secret.getBytes(CHARSET_NAME), SIGN_ALGO); Mac mac = Mac.getInstance(secretKey.getAlgorithm()); mac.init(secretKey); bytes = mac.doFinal(data.getBytes(CHARSET_NAME)); } catch (GeneralSecurityException gse) { throw new IOException(gse.toString()); } return bytes; } /** * 把字节流转换为十六进制表示方式。 */ public static String byte2hex(byte[] bytes) { StringBuilder sign = new StringBuilder(); for (int i = 0; i < bytes.length; i++) { String hex = Integer.toHexString(bytes[i] & 0xFF); if (hex.length() == 1) { sign.append("0"); } sign.append(hex.toUpperCase()); } return sign.toString(); }
参考文档:https://open.taobao.com/doc.htm?docId=107161&docType=1
在使用该接口前,您需要在购买聚石塔机器的基础上,接入EWS创建*.ews.m.jaeapp.com格式的域名,在开发H5页面的时候,引入JSSDK