### 1.篩選
將所有請求參數組合為一個集合,包括公共請求參數(消息通知無此項)和業務參數,但***不包括sign參數和值為NUll參數***
### [](https://duobaoyu.com.cn/documentcenter?onlyFlag=414ce68bebb334fe46d941321863e22b#2%E5%BA%8F%E5%88%97%E5%8C%96%E5%8F%82%E6%95%B0%E5%B9%B6%E6%8B%BC%E6%8E%A5)2.序列化參數并拼接
將篩選后的集合序列化為JSON格式,并保證***所有層級的Key***按照ASCII碼遞增排序(字母升序排序),將序列化后參數使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串,在字符串最后拼接`&appSecret=`應用的秘鑰
### [](https://duobaoyu.com.cn/documentcenter?onlyFlag=414ce68bebb334fe46d941321863e22b#3%E7%AD%BE%E5%90%8D)3.簽名
使用MD5算法對拼接后的字符串采用"UTF-8"格式生成文件摘要,并轉為16進制字符串,把生成的字符串轉為大寫賦值給公共的請求參數`sign`
### [](https://duobaoyu.com.cn/documentcenter?onlyFlag=414ce68bebb334fe46d941321863e22b#4%E7%A4%BA%E4%BE%8B)4.示例
#### [](https://duobaoyu.com.cn/documentcenter?onlyFlag=414ce68bebb334fe46d941321863e22b#41-%E6%8F%90%E4%BA%A4%E8%AE%A2%E5%8D%95%E9%A2%84%E4%B8%8B%E5%8D%95)4.1 提交訂單(預下單)
* 接口名:dby.scm.order.submit
* 版本號:v1
* 請求方式:POST
* 請求數據類型: application/json
* 業務請求參數:
~~~json
{
"orderRemark":"測試下單",
"consigneeAddress":"安騰國際",
"consigneeMobile":"15900000000",
"consigneeName":"張三",
"consigneeProvinceCode":"42",
"consigneeTownCode":"420106010",
"consigneeCountyCode":"420106",
"consigneeCityCode":"4201",
"skuInfos":[
//嵌套的key也需要排序
{
"unitPrice":8000,
"skuNum":1,
"skuCode":"50180878441"
}],
"tradeNo":"1598510632214159360"
}
~~~
#### [](https://duobaoyu.com.cn/documentcenter?onlyFlag=414ce68bebb334fe46d941321863e22b#42-%E5%85%AC%E5%85%B1query%E8%AF%B7%E6%B1%82%E5%8F%82%E6%95%B0)4.2 公共Query請求參數
~~~
method=dby.scm.order.submit
appKey=7knzxd30ob
version=v1
timestamp=1669949608466
sign=
~~~
#### [](https://duobaoyu.com.cn/documentcenter?onlyFlag=414ce68bebb334fe46d941321863e22b#43-%E6%8E%92%E5%BA%8F%E5%90%8E%E7%9A%84%E5%8F%82%E6%95%B0)4.3 排序后的參數
~~~json
{
"appKey":"7knzxd30ob",
"consigneeAddress":"安騰國際",
"consigneeCityCode":"4201",
"consigneeCountyCode":"420106",
"consigneeMobile":"15900000000",
"consigneeName":"張三",
"consigneeProvinceCode":"42",
"consigneeTownCode":"420106010",
"method":"dby.scm.order.submit",
"orderRemark":"測試下單",
"skuInfos":[
{
"skuCode":"50180878441",
"skuNum":1,
"unitPrice":8000
}
],
"timestamp":1669949608466,
"tradeNo":"1598510632214159360",
"version":"v1"
}
~~~
#### [](https://duobaoyu.com.cn/documentcenter?onlyFlag=414ce68bebb334fe46d941321863e22b#44-%E6%8B%BC%E6%8E%A5%E4%B8%BA%E5%BE%85%E7%AD%BE%E5%90%8D%E5%AD%97%E7%AC%A6%E4%B8%B2)4.4 拼接為待簽名字符串
~~~
appKey=7knzxd30ob&consigneeAddress=安騰國際&consigneeCityCode=4201&consigneeCountyCode=420106&consigneeMobile=15900000000&consigneeName=張三&consigneeProvinceCode=42&consigneeTownCode=420106010&method=dby.scm.order.submit&orderRemark=測試下單&skuInfos=[{"skuCode":"50180878441","skuNum":1,"unitPrice":8000}]×tamp=1669949608466&tradeNo=1598510632214159360&version=v1&appSecret=2077wuuyh88gfzf2vpv2s2gf1cqkkuro
~~~
#### 4.5 對待簽名字符串進行md5簽名后轉換為16進制字符串并轉為大寫,賦值給公共Query參數`sign`,最終的請求為
~~~
curl -XPOST -H "Content-type: application/json" -d '{
????"consigneeAddress":"安騰國際",
????"consigneeCityCode":"4201",
????"consigneeCountyCode":"420106",
????"consigneeMobile":"15900000000",
????"consigneeName":"張三",
????"consigneeProvinceCode":"42",
????"consigneeTownCode":"420106010",
????"orderRemark":"測試下單",
????"skuInfos":[
????????{
????????????"skuCode":"50180878441",
????????????"skuNum":1,
????????????"unitPrice":8000
????????}
????],
????"tradeNo":"1598523628516773888"
}' 'http://127.0.0.1/open/api?method=dby.scm.order.submit&appKey=7knzxd30ob&version=v1×tamp=1669952706993&sign=7D2F11F449D7160D1684968A029583A6'
~~~
### [](https://duobaoyu.com.cn/documentcenter?onlyFlag=414ce68bebb334fe46d941321863e22b#5-%E7%AD%BE%E5%90%8D%E5%8F%82%E8%80%83)5\. 簽名參考
Java
~~~json
public class SignUtil {
/**
* 簽名參考
*
* @param appKey 商戶應用appKey
* @param method 接口方法名稱
* @param timestamp 13位格式時間戳,5分鐘誤差內
* @param version 版本號,現在固定為v1
* @param appSecret 商戶應用appSecret
* @param bizParam 業務參數,具體參數請查看接口對接文檔
* @return 簽名字符串
*/
public static String sign(String appKey, String method, Long timestamp, String version, String appSecret, Object bizParam) {
//參數排序
SortedMap signParam = new TreeMap<>();
//添加通用參數
signParam.put("appKey", appKey);
signParam.put("method", method);
signParam.put("timestamp", timestamp);
signParam.put("version", version);
//添加業務參數
if (ObjectUtil.isNotNull(bizParam)) {
//對參數進行排序(a-z)
//所有的層級都需要排序
String jsonStr = JSONObject.toJSONString(bizParam, SerializerFeature.MapSortField);
JSONObject bizJson = JSONObject.parseObject(jsonStr, Feature.OrderedField);
signParam.putAll(bizJson);
}
StringBuilder strBuilder = new StringBuilder();
boolean isFirst = true;
for (Map.Entry entry : signParam.entrySet()) {
//排除值為NULL的參數
if (entry.getKey() != null && entry.getValue() != null) {
if (isFirst) {
isFirst = false;
} else {
strBuilder.append("&");
}
//拼接字符串
strBuilder.append(Convert.toStr(entry.getKey())).append("=").append(Convert.toStr(entry.getValue()));
}
}
//末尾拼接appSecret
strBuilder.append("&appSecret=" + appSecret);
//生成待簽名字符串
String signStr = strBuilder.toString();
//使用Md5算法生成摘要并轉為16進制字符串
return new Digester(DigestAlgorithm.MD5).digestHex(signStr, CharsetUtil.UTF_8).toUpperCase();
}
}
~~~
PHP
~~~json
<?php
/**
* 簽名參考
*
* @param string appKey 商戶應用appKey
* @param string method 接口方法名稱
* @param string timestamp 13位格式時間戳,5分鐘誤差內
* @param string version 版本號,現在固定為v1
* @param string appSecret 商戶應用appSecret
* @param array bizParam 業務參數,具體參數請查看接口對接文檔
* @return 簽名字符串
*/
function sign($appKey, $method, $timestamp, $version, $appSecret, array $bizParam)
{
//添加通用參數
$commonParam = array();
$commonParam[‘appKey’] = $appKey;
$commonParam[‘method’] = $method;
$commonParam[‘timestamp’] = $timestamp;
$commonParam[‘version’] = $version;
//合并通用參數和業務參數數組
$paramArr = array_merge($commonParam, bizParam);
//對所有層級參數遞歸排序(a-z)
recursion_ksort(paramArr);
//將參數按序拼接成字符串
$spliceStr = ‘&’;
foreach ($paramArr as $key => $value) {
if (!is_null($value)) {
$spliceStr .= ‘&’ . $key . ‘=’ . (is_array($value) ? json_encode($value, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) : $value);
}
}
$spliceStr = trim($spliceStr, ‘&’) . ‘&appSecret=’ . $appSecret;
//生成待簽名字符串,md5簽名并轉大寫
$sign = strtoupper(md5($spliceStr));
return $sign;
}
/**
* 關聯數組遞歸排序
* @param array $arr
* @param bool $removeNull
* @return void
*/
function recursion_ksort(array &$arr,$removeNull = true)
{
$kstring = true;
foreach ($arr as $k => &$v) {
if (!is_string($k)) {
$kstring = false;
}
if(is_null($v) && $removeNull){
unset($arr[$k]);
}
if (is_array($v)) {
recursion_ksort($v,$removeNull);
}
}
if ($kstring) {
ksort($arr);
}
}
~~~
- 產品介紹
- 開發指南
- 實物商品對接流程
- 簽名規則
- JAVA SDK使用
- PHP SDK使用
- 商品消息對接流程
- 虛擬商品對接流程
- 電影H5對接流程
- 卡密信息解密規范
- 錯誤碼查詢
- 商品API文檔
- 商品
- 查詢商品SPU詳情
- 查詢商品SPU深度分頁
- 查詢商品可售性
- 手機號所屬運營商查詢
- 查詢商品詳情
- 查詢商戶商品上下架狀態
- 查詢商品最小起訂量
- 查詢商品價格
- 根據SKU查詢商品SPU詳情
- 查詢商品分類逐級獲取
- 查詢商品分類分頁獲取
- 訂單
- 運費評估
- 確認收貨
- 查詢訂單物流信息
- 查詢訂單詳情
- 取消訂單
- 確認下單
- 實物商品預下單
- 虛擬商品預下單
- 售后
- 查詢售后退款詳情
- 查詢售后訂單詳情
- 取消售后申請
- 確認售后完成
- 提交運單信息
- 查詢售后支持的物流
- 查詢客戶寄回地址
- 創建退款退貨申請
- 上傳商品售后憑證
- 批量查詢商品售后權益
- 地址
- 詳細地址轉換成供應鏈地址編碼
- 省市區街道4級地址查詢
- 消息
- 消息通知
- 賬戶
- 查詢商戶賬戶信息
- 電影API文檔
- 電影H5
- 電影H5首頁免登錄
- 設置商戶價格策略
- 設置商戶貨幣兌換比例
- H5電影訂單詳情
- H5電影訂單確認
- H5電影訂單列表
- 電影消息
- 電影消息通知