<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ### 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}]&timestamp=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&timestamp=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); } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看