• 电商退货退款处理服务流程 产品设计 技术对接 快递鸟提供最有效的解决方案


    近几年来,我国电子商务交易规模越来越大,线上订单越来越多,退换货的情况也越来越常见。退换货环节是线上购物过程中的重要一环,也是体现电商平台与商家服务水平的重要方面。同时,退换货也是电商平台、商家与消费者之间最容易产生纠纷的环节。为了保障这个环节的服务,电商平台不断推出各种服务,其中就包括退换货上门取件服务。

    目前淘宝,京东,拼多多都有这项服务,不幸的是这样的大型电商都是平台内部使用,并不对外提供服务,也就是说,其他电商平台需要使用淘宝,京东的退换货上门取件服务,基本不可能,而我们这些小中型电商要想自主研发也不现实,成本太高,周期长,当然我写这篇文章,也是有充分的信心能够帮助到大家,万幸的是,很多第三方物流服务公司也注意到了这一现状,推出了类似的服务,全国知名品牌快递鸟率先推出了退换货上门取件服务,不同的是,快递鸟的取件服务是真正为我们电商服务的,为此,我专门研究了快递鸟的上门取件业务,做了一点个人总结,分享给大家, 建议产品经理和技术人员必看,一定有收获。1. 

    服务介绍

    什么是退货上门取件?

    退换货上门取件服务是为买家在退货时,提供的一种舒心,便捷的物流退货服务,当买家购买的商品在申请换货或者退货时,由物流公司安排快递员上门取走退货商品的一项服务。

     

    退货上门取件的服务流程

    上图是一个服务流程图,从图中了解到,有买家,电商平台,快递鸟,物流公司,快递员

    我们先说说消费者买家,最后我们都为买家服务的。

    我们先做一个退货服务前后对比,没有对接退货服务前:

    客户申请退货贼麻烦,首先客户要自己电话联系快递员,或者自己送货到快递网点,还要在退货商品上备注小字条,写上订单号与退货说明,商品邮寄出去还要登录网站填写运单号,客户如果填写错误,会影响客户退款资金到账的时效。有过退货经历的,是不是有同感?

    在看对接退货服务以后:

    客户申请退货只需轻轻一点,一件退货,物流公司就会安排快递员上门取件,客户在家喝杯咖啡的功夫就完成了退货。还有各种增值服务,可以预约快递员的上门时间,在线支付运费,有些有运费险的,基本上就不需要费用,客户也不用备注订单,后续操作都是系统自动完成,最后客户只能为你竖起大拇指,说一句:very good!

    接下来我们说电商平台,这也是产品和技术人员比较关心的内容

    电商接收客户退货请求,电商客户会按自己的审核规则进行初审,是否达到退货条件,满足就向快递鸟发起退货申请,不满足就通知客户,这部分功能可以按自己内部的业务需求设计,大的主流程不变,还有其他增值服务的功能,可以去找快递鸟的客服了解,这里就不细说了。

    剩下的几个角色,快递鸟,物流公司,快递员之间的关系,他们有自己的内部业务流程,应该不简单,如果感兴趣可以给我留言,给大家细说。

    服务优势

    上门取件服务是一举多得的业务,对买家,电商平台都受益。

    卖家能够得到什么?

    1, 让您的买家体验快捷方便的退货服务,提供您的店铺竞争力

    2, 在线结算运费,支付无忧

    3, 退货时进行基础验收,保障退货商品符合您的退货要求

    4, 退货信息全程监控,让你实时掌握退货进度

    5, 全程保证退货质量,让您不在担心物流问题

    买家能够得到什么?

    1, 退货更简单,想退货就有人来拿,还能约时间

    2, 支付更便捷,在线支付运费

    3, 不怕退货商品丢失,损毁,快递员做过验收,风险转移

     

    服务接口

    为了照顾刚入门的技术人员,我会分享源代码,把源码复制到你的项目上,就能快速完成上门退货接口对接.更适合刚入门的菜鸟,这里我们以申通快递的上门退货服务为例来讲解,调用快递鸟提供的上门取件API标准接口,成功调用后,申通快递员会上门服务,同时支持申通快递单号的轨迹查询。快递鸟api接口不区分开发语言,支持Java,C#,PHP,Python,ObjectC等开发语言的程序调用。下面具体讲解实现过程.

    3.1.完成前期准备工作

    3.1.1,去快递鸟官网免费注册一个账号

    3.1.2,免费获得一个apiKey(接口权限验证需要),

    3.1.3,完成实名认证流程

    3.1.4,订购一个免费套餐

    3.2.API接口

    3.2.1,测试调用地址:http://sandboxapi.kdniao.com:8080/kdniaosandbox/gateway/exterfaceInvoke.json

    3.2.2,正式调用地址:https://api.kdniao.com/api/OOrderService

    3.2.3,请求方式:POST

    3.2.4,编码格式(utf-8):application/x-www-form-urlencoded;charset=utf-8

    3.2.5,返回类型:JSON

    3.2.6,调试页面:http://kdniao.com/UserCenter/v2/SandBox/TrackQuery.aspx

    3.3.系统请求参数(Headers)

    参数名称

    类型

    说明

    必须要求

    RequestData

    String

    请求内容需进行URL(utf-8)编码。请求内容JSON格式,须和DataType一致。

    R

    EBusinessID

    String

    商户ID,请在我的服务页面查看。

    R

    RequestType

    String

    请求指令类型:

    1801(下单接口)

    1802(取消接口)

    R

    DataSign

    String

    数据内容签名:把(请求内容(未编码)+AppKey)进行MD5加密,然后Base64编码,最后 进行URL(utf-8)编码。详细过程请查看Demo。

    R

    DataType

    String

    请求、返回数据类型:只支持JSON格式

    R

    备注:R-必填(Required),O-可选(Optional),C-报文中该参数在一定条件下可选

    3.4.下单请求参数(Body)

    参数

    类型

    说明

    必须要求

    WarehouseID

    String

    仓库标识

    O

    WarehouseAddress

    String

    仓库地址

    O

    CallBack

    String

    商户标识

    O

    MemberID

    String

    会员标识

    O

    OrderCode

    String

    订单编号

    R

    PayType

    Int

    邮费支付方式:1-现付,2-到付,3-月结,4-第三方支付

    R

    MonthCode

    String

    月结编码

    C

    ExpType

    Int

    快递类型:1-标准快件

    R

    IsReturnSignBill

    Int

    签收回单:1-需要,0-不需要,默认为0

    O

    Receiver

    Company

    String

    收件人公司

    O

    Name

    String

    收件人

    R

    Tel

    String

    电话与手机,必填一个

    R

    Mobile

    String

    PostCode

    String

    收件人邮编

    O

    ProvinceName

    String

    收件省(如广东省,不要缺少“省”)

    R

    CityName

    String

    收件市(如深圳市,不要缺少“市”)

    R

    ExpAreaName

    String

    收件区(如福田区,不要缺少“区”或“县”)

    O

    Address

    String

    收件人详细地址

    R

    Sender

    Company

    String

    发件人公司

    O

    Name

    String

    发件人

    R

    Tel

    String

    电话与手机,必填一个

    R

    Mobile

    String

    PostCode

    String

    发件人邮编

    O

    ProvinceName

    String

    发件省(如广东省,不要缺少“省”)

    R

    CityName

    String

    发件市(如深圳市,不要缺少“市”)

    R

    ExpAreaName

    String

    发件区(如福田区,不要缺少“区”或“县”)

    O

    Address

    String

    发件人详细地址(实际取件)

    R

    SenderShowAddress

    String

    发件人详细地址

    O

    StartDate

    String

    上门取货时间段:"yyyy-MM-dd HH:mm:ss"格式化,本文中所有时间格式相同

    O

    EndDate

    String

    O

    Weight

    Double

    物品总重量kg

    O

    Quantity

    Int

    件数/包裹数

    O

    Volume

    Double

    物品总体积m3

    O

    Remark

    String

    备注

    O

    AddServices

    AddService

    Name

    String

    增值服务名称

    O

    Value

    String

    增值服务值

    O

    CustomerID

    String

    客户标识(选填)

    O

    Commoditys

    Commodity

    GoodsName

    String

    商品名称

    R

    GoodsCode

    String

    商品编码

    O

    Goodsquantity

    Int

    商品数量

    O

    GoodsPrice

    Decimal

    商品价格

    O

    GoodsWeight

    Decimal

    商品重量

    O

    GoodsDesc

    String

    商品描述

    O

    GoodsVol

    Double

    商品体积m3

    O

    PackingType

    Int

    包装类型:包装类型(快运字段)默认为 0; 0- 纸 1- 纤 2- 木 3- 托膜 4- 木托 99-其他

    O

    DeliveryMethod

    Int

    送货方式:0-自提,1-送货上门(不含上楼)2-送货上楼。(适用于快运类型订单,物流公司可能会收取费用),默认为0

    O

    3.5.下单返回参数(Return)

    参数名称

    类型

    说明

    必须要求

    EBusinessID

    String

    用户ID

    R

    Order

    OrderCode

    String

    订单编号

    R

    KDNOrderCode

    String

    快递鸟订单编号

    R

    ShipperCode

    String

    快递公司编码

    R

    LogisticCode

    String

    快递单号

    O

    Success

    Bool

    成功与否

    R

    ResultCode

    String

    结果编码

    R

    Reason

    String

    失败原因

    O

    UniquerRequestNumber

    String

    唯一标识

    R

    3.6.下单请求参数(Json示例)

    {
        "OrderCode":"012657018199",
        "ShipperCode":"STO",
        "PayType":1,
        "MonthCode":"1234567890",
        "ExpType":1,
        "Sender":{
            "Company":"LV",
            "Name":"Taylor",
            "Mobile":"15018442396",
            "ProvinceName":"上海",
            "CityName":"上海市",
            "ExpAreaName":"青浦区",
            "Address":"明珠路"
        },
        "Receiver":{
            "Company":"GCCUI",
            "Name":"Yann",
            "Mobile":"15018442396",
            "ProvinceName":"北京",
            "CityName":"北京市",
            "ExpAreaName":"朝阳区",
            "Address":"三里屯街道"
        },
        "Commodity":[
            {
                "GoodsName":"鞋子",
                "Goodsquantity":1,
                "GoodsWeight":1
            }
        ],
        "Weight":1,
        "Quantity":1,
        "Volume":0,
        "Remark":"小心轻放"
    }

    3.7.下单请求完整报文(URL编码)

    RequestData=%7b%0d%0a++++%22OrderCode%22%3a%22012657018199%22%2c%0d%0a++++%22ShipperCode%22%3a%22STO%22%2c%0d%0a++++%22PayType%22%3a1%2c%0d%0a++++%22MonthCode%22%3a%221234567890%22%2c%0d%0a++++%22ExpType%22%3a1%2c%0d%0a++++%22Sender%22%3a%7b%0d%0a++++++++%22Company%22%3a%22LV%22%2c%0d%0a++++++++%22Name%22%3a%22Taylor%22%2c%0d%0a++++++++%22Mobile%22%3a%2215018442396%22%2c%0d%0a++++++++%22ProvinceName%22%3a%22%e4%b8%8a%e6%b5%b7%22%2c%0d%0a++++++++%22CityName%22%3a%22%e4%b8%8a%e6%b5%b7%e5%b8%82%22%2c%0d%0a++++++++%22ExpAreaName%22%3a%22%e9%9d%92%e6%b5%a6%e5%8c%ba%22%2c%0d%0a++++++++%22Address%22%3a%22%e6%98%8e%e7%8f%a0%e8%b7%af%22%0d%0a++++%7d%2c%0d%0a++++%22Receiver%22%3a%7b%0d%0a++++++++%22Company%22%3a%22GCCUI%22%2c%0d%0a++++++++%22Name%22%3a%22Yann%22%2c%0d%0a++++++++%22Mobile%22%3a%2215018442396%22%2c%0d%0a++++++++%22ProvinceName%22%3a%22%e5%8c%97%e4%ba%ac%22%2c%0d%0a++++++++%22CityName%22%3a%22%e5%8c%97%e4%ba%ac%e5%b8%82%22%2c%0d%0a++++++++%22ExpAreaName%22%3a%22%e6%9c%9d%e9%98%b3%e5%8c%ba%22%2c%0d%0a++++++++%22Address%22%3a%22%e4%b8%89%e9%87%8c%e5%b1%af%e8%a1%97%e9%81%93%22%0d%0a++++%7d%2c%0d%0a++++%22Commodity%22%3a%5b%0d%0a++++++++%7b%0d%0a++++++++++++%22GoodsName%22%3a%22%e9%9e%8b%e5%ad%90%22%2c%0d%0a++++++++++++%22Goodsquantity%22%3a1%2c%0d%0a++++++++++++%22GoodsWeight%22%3a1%0d%0a++++++++%7d%0d%0a++++%5d%2c%0d%0a++++%22Weight%22%3a1%2c%0d%0a++++%22Quantity%22%3a1%2c%0d%0a++++%22Volume%22%3a0%2c%0d%0a++++%22Remark%22%3a%22%e5%b0%8f%e5%bf%83%e8%bd%bb%e6%94%be%22%0d%0a%7d%0d%0a&EBusinessID=1365742&RequestType=1801&DataSign=ZTcxNTBkNjNhNjkxYjkzMGViNDcxZTRjNzc3NzlkNjI%3d&DataType=2

    3.8.下单成功返回报文(Json示例)

    {
        "EBusinessID":"1237100",
        "Success":true,
        "Order":{
            "OrderCode":"012657018199",
            "KDNOrderCode":"KDN012657018199",
            "ShipperCode":" STO",
            "LogisticCode":"615123456789"
        },
        "ResultCode":"100",
        "Reason":""
    }

    实际业务会存在,取消操作功能,客户下的订单,由于多方原因需要取消下单,为此快递鸟也提供了取消上门取件的接口,我们来讲解一下如何调用。

     3.9.取消请求参数(Body)

    名称

    类型(字符长度)

    是否必须

    描述

    ShipperCode

    String(20)

    R

    快递公司编码

    详细编码参考《快递鸟接口支持快递公司编码.xlsx》

    OrderCode

    String(30)

    R

    订单编号(自定义,不可重复)

    LogisticCode

    String(30)

    O

    快递单号

    Reason

    String(100)

    O

    取消原因

     

     

     

     

     

     

    3.10.消返回参数(Return)

    名称

    类型(字符长度)

    是否必须

    描述

    EBusinessID

    String(10)

    R

    用户ID

    Success

    Bool(10)

    R

    成功与否(true/false)

    ResultCode

    String(5)

    R

    返回编号

    Reason

    String(50)

    O

    失败原因

     

     

     

     

     

     

    3.11取消请求参数(Json示例)

    {
      "OrderCode": "012657018199",
      "ShipperCode": "SF",
    }

    3.12取消成功返回报文(Json示例)

    {
        "EBusinessID": "1237100",
        "Success": true,
        "ResultCode": "100",
    }

    3.13.分步讲解(C#版本)

    • 请求数据包结构

    • C#调用代码示例
    //电商ID
    string eEBusinessID = "test1617571";
     //电商加密私钥,快递鸟提供,注意保管,不要泄漏
     string appKey= "554343b2-7252-439b-b4eb-1af42c8f2175";
     //请求url
     string reqURL = "http://sandboxapi.kdniao.com:8080/kdniaosandbox/gateway/exterfaceInvoke.json";
     //请求指令 
     string reqType="1801";
     //2-json 
     string dataType = "2"; 
     //字符编码采用UTF-8 
     string charset = "UTF-8"; 
     //JSON字符串
     string string jsonStr = "{
        "OrderCode":"012657018199",
        "ShipperCode":"STO",
        "PayType":1,
        "MonthCode":"1234567890",
        "ExpType":1,
        "Sender":{
            "Company":"LV",
            "Name":"Taylor",
            "Mobile":"15018442396",
            "ProvinceName":"上海",
            "CityName":"上海市",
            "ExpAreaName":"青浦区",
            "Address":"明珠路"
        },
        "Receiver":{
            "Company":"GCCUI",
            "Name":"Yann",
            "Mobile":"15018442396",
            "ProvinceName":"北京",
            "CityName":"北京市",
            "ExpAreaName":"朝阳区",
            "Address":"三里屯街道"
        },
        "Commodity":[
            {
                "GoodsName":"鞋子",
                "Goodsquantity":1,
                "GoodsWeight":1
            }
        ],
        "Weight":1,
        "Quantity":1,
        "Volume":0,
        "Remark":"小心轻放"
    }" ;
     //把(jsonStr+APIKey)进行MD5加密
     string md5Str=MD5(jsonStr + apiKey, charset);
     //把md5Str 进行Base64编码
     string base64Str=base64(md5Str,charset);
     //进行URL编码 (utf-8)
     string datasign = HttpUtility.UrlEncode(base64Str, charset); 
     //请求报文参数 
     string postStr = "RequestType=reqType&EBusinessID= eEBusinessID&RequestData=jsonStr 
    &DataSign= datasign&DataType=dataType"; 
    //通讯协议使用Http协议Post请求方式 返回轨迹数据
    string post = SendPost(reqURL, postStr);
    
    //获取到的post数据就是快递鸟返回的完整报文,接下来自己写一个解析json的方法就能获取到里面的字段信息。
    ————————————————
    版权声明:本文为CSDN博主「老杨占线」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/yanghanwen/article/details/104880185
    • C#调用方法
    ///<summary>
        /// 字符串MD5加密
        ///</summary>
        ///<param name="str">要加密的字符串</param>
        ///<param name="charset">编码方式</param>
        ///<returns>密文</returns>
        private string MD5(string str, string charset)
        {
            byte[] buffer = System.Text.Encoding.GetEncoding(charset).GetBytes(str);
            try
            {
                System.Security.Cryptography.MD5CryptoServiceProvider check;
                check = new System.Security.Cryptography.MD5CryptoServiceProvider();
                byte[] somme = check.ComputeHash(buffer);
                string ret = "";
                foreach (byte a in somme)
                {
                    if (a < 16)
                        ret += "0" + a.ToString("X");
                    else
                        ret += a.ToString("X");
                }
                return ret.ToLower();
            }
            catch
            {
                throw;
            }
        }
        /// <summary>
        /// base64编码
        /// </summary>
        /// <param name="str">内容</param>
        /// <param name="charset">编码方式</param>
        /// <returns></returns>
        private string base64(String str, String charset)
        {
            return Convert.ToBase64String(System.Text.Encoding.GetEncoding(charset).GetBytes(str));
    }
     /// <summary>
        /// Post方式提交数据,返回网页的源代码
        /// </summary>
        /// <param name="url">发送请求的 URL</param>
        /// <param name="postData">请求报文参数</param>
        /// <returns>远程资源的响应结果</returns>
        private string SendPost(string url, string postData)
        {
            string result = "";
            byte[] byteData = Encoding.GetEncoding("UTF-8").GetBytes(postData.ToString());
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.ContentType = "application/x-www-form-urlencoded";
                request.Referer = url;
                request.Accept = "*/*";
                request.Timeout = 30 * 1000;
                request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)";
                request.Method = "POST";
                request.ContentLength = byteData.Length;
                Stream stream = request.GetRequestStream();
                stream.Write(byteData, 0, byteData.Length);
                stream.Flush();
                stream.Close();
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream backStream = response.GetResponseStream();
                StreamReader sr = new StreamReader(backStream, Encoding.GetEncoding("UTF-8"));
                result = sr.ReadToEnd();
                sr.Close();
                backStream.Close();
                response.Close();
                request.Abort();
            }
            catch (Exception ex)
            {
                result = ex.ToString();
            }
            return result;
        }

    3.14.关于签名

    快递鸟和第三方电子商务公司系统进行对接,有一定的安全机制。采用 IP 认证加签名
    的方式对接,具体方案如下:

    防止数据被篡改 
    在 POST 请求中会传递 5 个必须(R)参数 
    RequestData==数据内容(URL 编码:UTF-8) 
    EBusinessID==用户 ID 
    RequestType=请求指令类型 
    DataSign== 数据内容签名:把(请求内容(未编码)+ApiKey)进行 MD5 加密,然后 Base64 
    编码,最后进行 URL(utf-8)编码 
    DataType==2(返回数据类型为 json) 
    注:
    DataSign 生成后,对方接收到数据后,以同样的算法进行签名(推送接口 RequestType 为 101/102 不需要进行 URL 编码),生成摘要,对比两者的摘要是否相同,如果不同,说明传递过程中发生数据篡改。 
    调用接口的身份认证 
    注册成为快递鸟用户后,会生成对应的用户 ID 和 APIKey,用户 ID 相当于用户名, 
    APIKey 相当于密码。 

    3.15.返回码定义

    编码

    说明

    100

    成功

    101

    缺少必要参数

    102

    校验问题

    103

    格式问题

    总结

    愿意掏钱来我们平台购物的客户,也一定会考虑退货带来的便利,解决客户后顾之忧才是好的服务,我并不赞同有些产品经理的观点,他们认为退款的流程要做的足够复杂,让消费者觉得退货好麻烦,索性就不退了,这样的思维是不可取的,我们应该在产品质量上下功夫,好的产品,比如 微信,支付宝,这些产品我们都是手机必备,就算有个定期弹窗提醒你,哥们,把微信卸载吧,你依然是无动于衷的,因为你离不开微信, 我就很讨厌某些软件,安装的时候是一键安装,卸载的时候连卸载按钮都很难被发现,并且还卸不干净,像狗皮膏药一样,附在电脑上,网购也是一样的道理,能做到一键购买,更要做到一键退货,这年头,客户是上帝,如果购物的是大爷,那退货的就是佛爷,退货我们让佛爷难受,佛爷就会让我们为惨淡的销量买单。到那个时候就别想着如何给客户发货了,也只能发愁了,哈哈!一愁,愁出了少白头。相反,我们更要把退货流程做到极致,不要担心客户退货,质量问题,该退的留不住,你保住了一单,失去的是一个客户,客户的传播效应,会让你失去整个市场,好买更好退,销量才翻倍,退货服务能考验电商对消费者的服务态度。留住回头客没有捷径,一定要服务到最后一站。做好上门退货服务!

    附言

    由于篇幅较长,我会在下一篇文章单独讲解取件状态推送接口,上门取件下单成功以后,快递员收到订单,会反馈接单状态,快递鸟会把状态实时推送到电商平台的服务器

  • 相关阅读:
    vue学习笔记之v-if
    vue学习笔记之属性和方法
    vue学习笔记之v-for与-repeat
    王阳明心学
    读《铁血并购》
    心理测试:DISC性格测试(完整版)
    关于旅行
    [转载]win32 计时器使用
    [转]C#中调用资源管理器(Explorer.exe)打开指定文件夹 + 并选中指定文件 + 调用(系统默认的播放类)软件(如WMP)打开(播放歌曲等)文件
    [转]C#读写TEXT文件
  • 原文地址:https://www.cnblogs.com/51api/p/12498887.html
Copyright © 2020-2023  润新知