第47行: | 第47行: | ||
return $sign; | return $sign; | ||
} | } | ||
+ | </pre> | ||
+ | |||
+ | <div class="code_type">CODE:JAVA</div> | ||
+ | <pre class="brush:js"> | ||
+ | import java.math.BigInteger; | ||
+ | import java.security.MessageDigest; | ||
+ | import java.security.NoSuchAlgorithmException; | ||
+ | import java.util.Arrays; | ||
+ | import java.util.HashMap; | ||
+ | import java.util.Map; | ||
+ | import java.util.Set; | ||
+ | |||
+ | class Sign { | ||
+ | |||
+ | public static final String[] filterKeys = new String[]{"sign", "sign_type", "access_token"}; | ||
+ | |||
+ | public static void main(String[] args) { | ||
+ | Map<String, String> dataList = new HashMap<>(); | ||
+ | // 这里放实际调用接口时的参数 以下仅为示例 | ||
+ | dataList.put("goods_id", "371965"); | ||
+ | dataList.put("appid", "100023"); | ||
+ | dataList.put("sign_type", "md5"); | ||
+ | // 这个是电商签名秘钥 联系微博电商平台申请获取 | ||
+ | String secret = "YOUR SIGN KEY"; | ||
+ | // 开始生成签名 | ||
+ | String sign = getSign(dataList, secret); | ||
+ | // 输出签名 | ||
+ | System.out.println(sign); | ||
+ | } | ||
+ | // 根据算法获取签名 | ||
+ | public static String getSign(Map<String, String> dataList, String secret) { | ||
+ | Set<String> keySet = dataList.keySet(); | ||
+ | String[] keyArray = keySet.toArray(new String[0]); | ||
+ | Arrays.sort(keyArray); | ||
+ | StringBuilder sb = new StringBuilder(); | ||
+ | String prefix = ""; | ||
+ | for (int i = 0; i < keyArray.length; i++) { | ||
+ | if (Arrays.asList(filterKeys).contains(keyArray[i])) { | ||
+ | continue; | ||
+ | } | ||
+ | sb.append(prefix).append(keyArray[i]).append("=").append(dataList.get(keyArray[i])); | ||
+ | prefix = "&"; | ||
+ | } | ||
+ | sb.append(secret); | ||
+ | return md5(sb.toString()); | ||
+ | } | ||
+ | public static String md5(String input) { | ||
+ | try { | ||
+ | MessageDigest md = MessageDigest.getInstance("MD5"); | ||
+ | byte[] messageDigest = md.digest(input.getBytes()); | ||
+ | BigInteger no = new BigInteger(1, messageDigest); | ||
+ | String hashtext = no.toString(16); | ||
+ | while (hashtext.length() < 32) { | ||
+ | hashtext = "0" + hashtext; | ||
+ | } | ||
+ | return hashtext; | ||
+ | } catch (NoSuchAlgorithmException e) { | ||
+ | throw new RuntimeException(e); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | <div class="code_type">CODE:GO</div> | ||
+ | <pre class="brush:js"> | ||
+ | |||
</pre> | </pre> | ||
2022年11月18日 (五) 14:14的版本
电商平台能力接口
提供给电商服务商、自研商家的平台能力,目前包含订单能力接口、商品能力接口。
电商服务商接口验证签名
调用电商服务商接口需带上验证签名的sign参数,其生成方法为:将调用接口的参数,过滤掉不参与签名的参数后,按照键名进行升序排序,之后转换为URL查询字符串(querystring),并在结尾拼接上电商签名秘钥(示例中的 $key 参数),最后将得到的字符串进行md5,得到最终的sign值。
不参与签名的参数,参数名为sign、sign_type、access_token的参数,和参数值为空字符串的参数。
需要特别注意的是:电商能力接口中的 appid 参数,指的是电商服务商身份标识,和获取授权时用到的开放平台 APPKEY 不同,电商服务商身份标识 appid ,与电商签名秘钥(示例中的 $key 参数),为一对一的一组,由微博电商分配,接入时在应用审核通过后,联系微博电商产品申请获取。
签名方法示例:
CODE:PHP
public static function getSign($data_list, $key, $filter_k_list = ["sign", "sign_type", "access_token",], $filter_v_list = ["",]) { // 过滤不参与签名的参数 foreach ($data_list as $k => $v) { if (in_array($k, $filter_k_list, true) || in_array($v, $filter_v_list, true)) { unset($data_list[$k]); } } // 进行排序 ksort($data_list); // 转换为查询字符串,注意过滤前后空格 $parameter = []; foreach ($data_list as $k => $v) { $parameter[] = $k . "=" . trim($v); } $string = implode("&", $parameter); // 拼接密钥 $stringKey = $string . $key; // 进行MD5得到最终签名 $sign = md5($stringKey); return $sign; }
CODE:JAVA
import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Set; class Sign { public static final String[] filterKeys = new String[]{"sign", "sign_type", "access_token"}; public static void main(String[] args) { Map<String, String> dataList = new HashMap<>(); // 这里放实际调用接口时的参数 以下仅为示例 dataList.put("goods_id", "371965"); dataList.put("appid", "100023"); dataList.put("sign_type", "md5"); // 这个是电商签名秘钥 联系微博电商平台申请获取 String secret = "YOUR SIGN KEY"; // 开始生成签名 String sign = getSign(dataList, secret); // 输出签名 System.out.println(sign); } // 根据算法获取签名 public static String getSign(Map<String, String> dataList, String secret) { Set<String> keySet = dataList.keySet(); String[] keyArray = keySet.toArray(new String[0]); Arrays.sort(keyArray); StringBuilder sb = new StringBuilder(); String prefix = ""; for (int i = 0; i < keyArray.length; i++) { if (Arrays.asList(filterKeys).contains(keyArray[i])) { continue; } sb.append(prefix).append(keyArray[i]).append("=").append(dataList.get(keyArray[i])); prefix = "&"; } sb.append(secret); return md5(sb.toString()); } public static String md5(String input) { try { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] messageDigest = md.digest(input.getBytes()); BigInteger no = new BigInteger(1, messageDigest); String hashtext = no.toString(16); while (hashtext.length() < 32) { hashtext = "0" + hashtext; } return hashtext; } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } } }
CODE:GO
订单能力接口
订单业务相关的接口,详细见接口列表:
接口 | 说明 |
---|---|
order/retailerGetSubList | 获取子订单列表 |
order/retailerGetSub | 获取子订单详情 |
order/retailerAddExpress | 提交发货 |
order/retailerSetReceiverInfo | 修改收货人信息 |
order/retailerSetRetailerRemark | 修改商家备注信息 |
商品能力接口
商品业务相关的接口,详细见接口列表:
接口 | 说明 |
---|---|
goods/online | 商品上架 |
goods/offline | 商品下架 |
goods/getGoodsInfo | 根据商品ID查询商品信息 |
goods/getGoodsList | 根据商品更新时间查询商品信息 |
goods/getShopInfo | 获取商家信息 |
goods/getAllCateData | 获取商家类目 |
goods/getDraftExtendField | 获取商品扩展类目 |
goods/setGoodsInfo | 修改商品 |
goods/getDraftList | 获取商品草稿列表 |
goods/addDraft | 创建商品到草稿 |
goods/getTplList | 获取运费模版列表 |
goods/getTplInfo | 获取运费模版详情 |
goods/addTpl | 添加运费模版 |
goods/updateTpl | 更新运费模版 |
goods/delTpl | 删除运费模版 |
附录
订单能力接口中需要用到的各种编码对照表。