首页支持中心文档中心
帮助文档
接入指南
菠萝派自建商城
物流平台
电商平台
淘宝蘑菇街微众金鹰购华为商城魔筷星选微一案新零售中粮我买网顺丰大当家快手小店途虎养车脉宝云店EzBuySEE小电铺辣妈计划友好速搭候鸟联华鲸选京东泰国多点商城顺联动力腾讯广告广点通金牛电商微一案每日优鲜天天工厂阿里巴巴C2M店匠饿百零售执御农行e管家天猫国际直营微盟微商城奥买家快团团招行掌上生活小鹅拼拼云集品淘宝台湾微信小商店美团零售综合零售通华润通得物度小店pass小芒电商联团国美集团B2B企鹅小店阿里健康大药房蘑菇街小店一号店Shopee京东全渠道BiliBili供应商招商银行网上商城有赞美业江南银行抖店代发唯品会MP百度健康放心购闲鱼管家壹钱包微信视频号小店立白积分商城小鹅通萌推蚂蚁销客淘菜菜新蛋商城抖音本地生活抖音小时达贝贝网考拉供应商直发海拍客爱奇艺爱库存蜜店宝鲁班天猫超市有赞分销小黑鱼苏宁易购京东全球售五星电器每日一淘格格家履约丰巢好衣库贝壳优品名融秀购商城采多多米多商城飞牛网孩子王一件代发迷橙商城云集POP微盟智慧零售一条电商魅力惠药房网天猫周期送棒棒糖越洋电铺萌店Joom电商绿米新零售零购有量洋葱京东开普勒京东供销美团外卖顺丰优选美丽说有赞零售腾讯枫叶聚宝赞公主购趣头条人人店代理系统舞象微店自如优品Tokopedia京东印尼微盟SnapDeal阿里巴巴国际站阿里大药房国美IntraMirror孔夫子旧书网豆果美食云尚互联蜜芽东南亚Cdiscount聚塔菠萝派自建商城电商京东考拉速卖通好乐买秀品特奢汇好药师百度Mall聚美海淘优物库人人店折800优购邮乐网下厨房美囤妈妈千米拍鞋网卷皮网辣妈汇敦煌网91拼团宝贝购蜜芽明星衣橱微商户融易购微旺铺Ebay拼多多亲宝宝天虹商场聚美优品ShopEx楚楚街拼团诚信通凡客易订货孩子王达令网小红书善融格格家楚楚街亚马逊当当网平安好医生分期乐好食期HiGo返利网Wish小米商城云集微店麦考林大V店寺库楚楚通TST有赞雅虎LaZaDa苏宁自营订货宝美团梦芭莎穿衣助手唯品会JIT苏宁特卖洋码头垂直采楚楚街预售集盒酒仙唯品会库巴授权米家有品京东自营商派国美自营Wacom亚马逊自营网易严选Eyee京东到家
支付平台
仓储平台
海关平台
外卖平台
其他接口
发票平台
菠萝派商城签名算法

菠萝派商城签名规则是采用菠萝派商城开发规范的平台统一使用的签名规则。目的为了防止API调用过程中被黑客恶意篡改,调用任何一个API都需要携带签名,服务端会根据请求参数,对签名进行验证,签名不合法的请求将会被拒绝。目前支持的签名算法只支持MD5,签名大体过程如下:


将除Sign参数外的所有“参数 参数值”进行字典排序生成串,而后将AppSecret加到该串的首尾,将得到的字符串转小写,进行MD5加密,此时的生成的串即为Sign。以抓单为例,若参数分别为以下值:
appkey=438b2f6ff103422a98a9349507293bb2

bizcontent={"OrderStatus":"JH_01","PlatOrderNo":"20182270207","StartTime":"2016-07-26 10:59:10","EndTime":"2016-08-02 10:59:10","TimeType":"JH_02","PageIndex":"1","PageSize":"20"}

method=Differ.JH.Business.GetOrder

token=9415c33b04d24c7dae320b0185f42fb0

按字典排序生成的串为:appkey438b2f6ff103422a98a9349507293bb2bizcontent{"OrderStatus":"JH_01","PlatOrderNo":"20182270207","StartTime":"2016-07-26 10:59:10","EndTime":"2016-08-02 10:59:10","TimeType":"JH_02","PageIndex":"1","PageSize":"20"}methodDiffer.JH.Business.GetOrdertoken9415c33b04d24c7dae320b0185f42fb0。

若Appsecret=5ee2084de90043be989d4d99d0dd0eaa,则带签名字符串为:

5ee2084de90043be989d4d99d0dd0eaaappkey438b2f6ff103422a98a9349507293bb2bizcontent{"OrderStatus":"JH_01","PlatOrderNo":"20182270207","StartTime":"2016-07-26 10:59:10","EndTime":"2016-08-02 10:59:10","TimeType":"JH_02","PageIndex":"1","PageSize":"20"}methodDiffer.JH.Business.GetOrdertoken9415c33b04d24c7dae320b0185f42fb05ee2084de90043be989d4d99d0dd0eaa

转小写:

5ee2084de90043be989d4d99d0dd0eaaappkey438b2f6ff103422a98a9349507293bb2bizcontent{"orderstatus":"jh_01","platorderno":"20182270207","starttime":"2016-07-26 10:59:10","endtime":"2016-08-02 10:59:10","timetype":"jh_02","pageindex":"1","pagesize":"20"}methoddiffer.jh.business.getordertoken9415c33b04d24c7dae320b0185f42fb05ee2084de90043be989d4d99d0dd0eaa

MD5加密后得到签名:

347e07a557e2720256e64e1e828eff1b (注意,签名也是小写的)


C#签名示例代码

//获得http请求传参
var context = System.Web.HttpContext.Current;
var appkey = context.Request["appkey"];
var token = context.Request["token"];
var method = context.Request["method"];
var bizcontent= context.Request["bizcontent"];
var sign=context.Request["sign"];
var appSecret = "5ee2084de90043be989d4d99d0dd0eaa";    //appSecret的值通过在菠萝派中申请应用获得
//将参数加入排序字典。
var dic = new SortedDictionary<string, string>();
dic.Add("method", method);
dic.Add("appkey", appkey);
dic.Add("token", token);
dic.Add("bizcontent", bizcontent);
var newSign=Sign(dic,appSecret);
if(sign!=newSign)
{
    Response.Write("{\"code\":\"40000\",\"message\":\"Logical Error\",\"subcode\":\"GSE.VERIFYSIGN_FAILURE\",\"submessage\":\"签名验证失败\"}");
}

/// <summary>
/// 生成签名。
/// </summary>
/// <returns></returns>
private string Sign(SortedDictionary<string, string> dic,string appSecret)
{
    //构建待签名的字符串。
    var beSignText = string.Empty;
    foreach (string _key in dic.Keys)
        beSignText += _key + dic[_key];

    //转小写生成签名。
    return this.MD5((appSecret + beSignText + appSecret).ToLower());
}

/// <summary>
/// 字符串生成MD5码。
/// </summary>
/// <param name="data">待MD5字符</param>
/// <returns></returns>
public string MD5(string data)
{
    var bytes = Encoding.UTF8.GetBytes(data);
    var hashmd5 = new MD5CryptoServiceProvider();
    byte[] byteOriginal = hashmd5.ComputeHash(bytes);
    StringBuilder ciphertext = new StringBuilder(32);
    for (int i = 0; i < byteOriginal.Length; i++)
    {
        ciphertext.Append(byteOriginal[i].ToString("x").PadLeft(2, '0'));
    }

    return ciphertext.ToString();
}


PHP签名示例代码

//获得http请求传参
$method = $_REQUEST['method'];
$appkey = $_REQUEST['appkey'];
$token = $_REQUEST['token'];
$bizcontent = $_REQUEST['bizcontent'];
$sign = $_REQUEST['sign'];
$appSecret="5ee2084de90043be989d4d99d0dd0eaa";    //appSecret的值通过在菠萝派中申请应用获得
$unsign=$appSecret."appkey".$appkey."bizcontent".$bizcontent."method".$method."token".$token.$appSecret;
$newsign=md5(strtolower($unsign));
if($sign!=$newsign)
{
    echo("{\"code\":\"40000\",\"message\":\"Logical Error\",\"subcode\":\"GSE.VERIFYSIGN_FAILURE\",\"submessage\":\"签名验证失败\"}");
}


C++签名示例代码

String MD5UTF8String(String ASrc)
{
    String strRet = "";
    TIdHashMessageDigest5 *MD5Encode = new TIdHashMessageDigest5();
    try
    {
    strRet = MD5Encode->HashStringAsHex(ASrc, Sysutils::TEncoding::UTF8 ).LowerCase();
    }
    __finally
    {
    delete MD5Encode;
    }
    return strRet;
}

//---------------------------------------------------------------------------
void __fastcall TForm1::IdHTTPServerCommandGet(TIdContext *AContext, TIdHTTPRequestInfo *ARequestInfo,
TIdHTTPResponseInfo *AResponseInfo)
{
    String Method = ARequestInfo->Params->Values["method"];
    String Appkey = ARequestInfo->Params->Values["appkey"];
    String Token = ARequestInfo->Params->Values["token"];
    String Bizcontent = ARequestInfo->Params->Values["bizcontent"]; 
    String Sign = ARequestInfo->Params->Values["sign"];
    String AppSecret="5ee2084de90043be989d4d99d0dd0eaa"; //appSecret的值通过在菠萝派中申请应用获得
    String Unsign = AppSecret + "appkey" + Appkey
+ "bizcontent" + Bizcontent + "method" + Method + "token" + Token  + AppSecret ;	
    String Newsign = MD5UTF8String(Unsign.LowerCase()).LowerCase(); 

    if (Sign != Newsign) 
    {
        AResponseInfo->ContentText = "{\"code\":\"40000\",\"message\":\"Logical Error\",\"subcode\":\"GSE.VERIFYSIGN_FAILURE\",\"submessage\":\"签名验证失败\"}";
    }         
}


java 签名示例代码

        private String GetSign(OriginalRequestInfo request,String appSecret) throws Exception{
        SortedMap<String, String> sortedMap = new TreeMap<>();
        sortedMap.put("method", request.getMethod());
        sortedMap.put("appkey", request.getAppKey());
        sortedMap.put("token", request.getToken());
        sortedMap.put("bizcontent", request.getBizContent());
        
        StringBuilder sb = new StringBuilder(appSecret);
        sortedMap.forEach((name, value) -> {
           if(StringUtils.isNotEmpty(name) && StringUtils.isNotEmpty(value)){
              sb.append(name).append(value);
           }
        });
        sb.append(appSecret);
        return makeMD5(sb.toString().toLowerCase(),EncodingEnum.UTF_8.toString()).toLowerCase();
        }
        
    public String makeMD5(String text, String encoding) throws Exception {
        if (encoding == null || encoding.isEmpty()) {
            encoding = "UTF-8";
        }
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        byte[] resultByte = text.getBytes(encoding);
        byte[] md5Bytes = md5.digest(resultByte);
        StringBuilder hexValue = new StringBuilder();
        for (byte md5Byte : md5Bytes) {
            int val = (md5Byte) & 0xff;
            if (val < 16) {
                hexValue.append("0");
            }
            hexValue.append(Integer.toHexString(val));
        }
        return hexValue.toString();
    }

注意事项:

  • 所有的请求和响应数据编码皆为utf-8格式,URL里的所有参数名和参数值请做URL编码。

  • 所有API请尽量使用POST发起请求。



返回顶部
客服机器人