最近公司的一个商城的客户,做保税仓发货的功能,该功能需要对接到一些第三方的物流仓报关系统以及支持系统的报关功能,中途碰上了N多个坑,因此记录下来,省的下次忘了
1.由于原本的系统并没有计算税费的功能,因此需要在订单中增加税费的计算,这时候,就需要在商品详情里增加几个字段:增值税、消费税、付税方;
增值税一般为:16%,消费税为15%,付税方: 顾客/商家(如果为商家,即为保税)
一般跨境电商的需要交一个综合税,计算方式为:
如果消费税=0,则为 16%*70%=11.2%
如果消费税>0,则为 ((16% + 15% )/(1-16%) )*70%
2.在实际的销售过程中,有可能出现包税的情况存在,如果一张订单里出现包税和不包税的商品,则推送报关单的时候,需要拆分成两张子订单,付款单号可以相同,只要多张子订单的付款金额加起来不超过该付款单的总金额即可。
在包税的子订单里,需要将商品金额中,拆分出税金,这就是为什么上面需要存一个付税方字段,而不是把两个税率都设为0的原因了
计算方式为: 商品总金额=原商品总金额-((商品总金额 / 1+税率) * 税率)
商品单价 = 新的商品总金额/商品数量 (可能会出现除不尽,建议保留小数点后4位)
依次类推,合计数子订单的商品金额和税金
3.由于商城还可能出现一种情况,就是包邮/不包邮的情况。
如果不包邮的情况下,其实运费= 实际运费+运费的税金(运费*综合税率),
如果包邮的情况下,实际上是商家替用户支付了运费的税费,如果实在非要算个一下税费的话,那就将税费平摊到商品里即可
有些对接的系统是需要传一个总税金的字段,那么总税金=运费税金+商品税金总和
4.可能还会再出现一种情况就是包税不包邮,这时候需要拆单的情况下,运费可以根据两张订单占总商品金额的比例将运费和运费税平摊到两张子订单中,在子订单中进行分配
5.如果出现一张订单中,都是跨境电商的商品,那么还算简单,原有的订单结构不需要变化,只是在推送的时候,将订单进行拆分推送就好,子订单的订单号可以简单的在主订单号后加一个后缀标识一下即可,如果出现跨境电商为分仓库发货或者存在跨境电商+直邮商品的情况的,则最好在下单的时候,将订单各自拆分成订单,由于付款单号可以共用,因此 只需要让用户支付一次即可
6.还有个很细节的地方需要特别注意的,,就是由于报关单一般是三单对碰成功之后,才可以,但,支付单是由支付平台推送的,而订单和物流单是另外一个物流报关系统推送的 ,因此这里会存在一个问题就是,物流系统是以什么方式取到支付单的,,根据对接这几天的总结,有两种,一种是通过支付单号匹配,一种是通过订单号取支付单号。。。如果是支付平台提示报关成功,而物流平台提示无法找到支付单的情况,,一定要使用微支付或支付宝的原始交易单号进行提交,不能用支付平台提供的内部支付单号提交,否则就会出现无法匹配到支付单的情况。
7.有些支付平台会要求必须拆单推送,即不管是否存在包税+不包税的情况下,必须拆分成子订单提交,因此,对接时,请跟你的支付商确定好这个问题
8.如果对接的物流系统的商品信息推送接口过程中,,凡是有叫编号或者ID的字段的,不管是否写着可空或者可以默认与xxx字段相等,也都直接添加在界面上,让客户自己去填写,否则可能会出现匹配不到商品的错误
9.由于报关是个很复杂的事情,因此说上面所说的,只是本人碰到的比较简单的情况,,实际对接,请跟对接平台确定好细节
最后的最后,,,如果需要四舍五入的话,一定要使用 System.Math.Round(value , 2, MidpointRounding.AwayFromZero) 这个方法,并且 value必须
是decimal