到位对接H5商家文档

接入要求

1、须是生活服务相关的、功能完善的独立H5应用,页面不能含有外部链接和下载APP链接
2、须实现到位单点登录接口,用户使用到位账户(已验证的手机号)要能自动注册登录
3、可实现位置信息同步接口(可选),避免让用户再次定位或手动输入位置

准备工作

1.获取secret
secret为到位分配给合作商家用于签名的唯一标识,请注意信息安全。
2.合作商家提供可以连接H5页面的地址。
3.合作商家提供一张首页图(750x750)像素的,首页图突出服务内容,清新美观,不要出现网址、电话、二维码等信息。
4.合作商家提供服务所覆盖城市。

对接流程

1.到位在合作商家提供的H5地址后面增加精度,纬度,手机号(如果合作商家提供的H5地址中有该参数则使用商家提供的参数)生成新的url。
2.使用提供给合作商家的secret进行签名(不需要签名的商家跳过该步骤)。
3.合作商家使用同样的流程验证签名是否正确(不需要签名的商家跳过该步骤)。
4.合作商家能够正确的接收到参数,且能够正确的打开H5页面。
5.联系运营人员给商家店铺上线。

签名机制

假设合作商家的H5地址中有3个参数,分别是“k1”、“k2”、“k3”,它们的值分别是“v1”、“v2”、“v3”,计算方法如下所示:
1、将请求参数格式化为“key=value”格式,如“k1=v1”、“k2=v2”、“k3=v3”;
2、将格式化好的参数键值对以字典序升序排列后,拼接在一起,如“k1=v1&k2=v2&k3=v3”;
3、在拼接好的字符串末尾追加上应用的secret如“k1=v1&k2=v2&k3=v3&secret”;
4、将上述字符串进行MD5所得值即为签名的值。
注意:这些参数中不包含sign(签名)参数,因为sign参数的值此时没有计算出来。

签名算法示例

1.假设合作商家的H5地址中有如下参数:
from=daoway&phone=13800138000&lat=631.04492619861&lng=528.425785884521

2、追加secret(假设secret值为1000)后,整个字符串格式如下所示
from=daoway&phone=13800138000&lat=631.04492619861&lng=528.425785884521&1000

3、计算上述字符串的MD5值,此值即为签名的值
0ca0ceba41ba5ca07af65dea08463621

4、最终请求URL为
http://www.xx.com?from=daoway&phone=13800138000&lat=631.04492619861&lng=528.425785884521&sign=0ca0ceba41ba5ca07af65dea08463621

签名示例

Java代码实现
public static String getSignature(HashMap<String,String> params, String secret) throws IOException{ Map<String, String> sortedParams = new TreeMap<String, String>(params); Set<Entry<String, String>> entrys = sortedParams.entrySet(); StringBuilder basestring = new StringBuilder(); for (Entry<String, String> param : entrys) { basestring.append(param.getKey()).append("=").append(param.getValue()); baseString.append("&"); } basestring.append(secret); // 使用MD5对待签名串求签 byte[] bytes = null; try { MessageDigest md5 = MessageDigest.getInstance("MD5"); bytes = md5.digest(basestring.toString().getBytes("UTF-8")); } catch (GeneralSecurityException ex) { throw new IOException(ex); } // 将MD5输出的二进制结果转换为小写的十六进制 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); } return sign.toString(); }