中华人民共和国最高人民法院 民 事 判 决 书 （2020）最高法知民终857号 上诉人（原审被告、反诉原告）：链推（上海）信息科技有限公司。住所地：上海市青浦区朱家角镇康泰路**********。 法定代表人：潘杨，该公司执行董事。 被上诉人（原审原告、反诉被告）：姬嘉（上海）商贸有限公司。住所地。住所地：上海市宝山区呼兰西路********iv> 法定代表人：沈姬，该公司董事长。 委托诉讼代理人：刘耀中，上海思济律师事务所律师。 委托诉讼代理人：欧阳平，上海思济律师事务所律师。 原审被告：潘杨，男，1989年1月22日出生，满族，住上海市闵行区。 上诉人链推（上海）信息科技有限公司（以下简称链推公司）因与被上诉人姬嘉（上海）商贸有限公司（以下简称姬嘉公司）、原审被告潘杨计算机软件开发合同纠纷一案，不服上海知识产权法院于2020年3月30日作出的（2019）沪73知民初647号民事判决，向本院提起上诉。本院于2020年6月1日立案后，依法组成合议庭，并于2020年7月28日公开开庭审理了本案，上诉人链推公司的法定代表人暨原审被告潘杨、被上诉人姬嘉公司的委托诉讼代理人欧阳平、刘耀中到庭参加诉讼。本案现已审理终结。 链推公司上诉请求：1.撤销原审判决第一项、第二项、第三项、第五项，改判姬嘉公司应向链推公司支付剩余尾款4万元整；2.本案一审和二审诉讼费由姬嘉公司承担。事实和理由：（一）原审判决适用法律错误。链推公司已按约完成技术服务内容，姬嘉公司应根据《中华人民共和国合同法》（以下简称合同法）第三百三十一条、第三百六十二条、第三百五十九条支付合同尾款，并根据第三百三十三条承担违约责任。原审法院以合同法第九十七条解除《微信营销系统软件服务协议》（以下简称《软件服务协议》），并要求链推公司退还4万元技术服务费适用法律错误。（二）原审判决认定事实错误。链推公司提交的《补充证据》《证据光盘》及《诉讼证据保全申请书》《开放源代码申请书》并未在判决中提及。链推公司提交的证据可证实本案涉及的微信小程序系姬嘉公司自营独立使用，中粮我买网仅为姬嘉公司微信小程序“姬嘉优选”中的产品供应商之一，并非姬嘉公司所主张的微信小程序要完全对应中粮我买网各项规则与功能。根据协议“服务内容及资费标准”明确限定小程序为“旗舰旺铺版”而并非定制开发版，姬嘉公司主张“约定链推公司为姬嘉公司定制微信商城（微信小程序）”与事实不符。链推公司提供的是旗舰版微信小程序，姬嘉公司在签订合约时已知晓并确认。本案涉及未满足的功能系姬嘉公司于2018年10月29日新增功能，属合同外需求。合同内“附件一《功能配置表》”有明确约定链推公司针对中粮我买网与姬嘉公司微信小程序商城做接口对接，合同涉及的接口开发业务已于2018年10月25日对接完成。姬嘉公司的微信小程序商城是正常使用的，姬嘉公司主张无法使用不成立。综上所述，原审判决适用法律及认定事实有误，请二审法院支持上诉请求。 姬嘉公司答辩：链推公司开发的程序没有达到要求，无法使用，姬嘉公司实际损失比原审判决的赔偿要严重。 姬嘉公司以委托合同纠纷曾向上海市闵行区人民法院提起诉讼，上海市闵行区人民法院于2019年4月10日立案受理，链推公司于4月24日提起反诉，上海市闵行区人民法院审查认为，《软件服务协议》约定研发小程序以及定制接口，双方因此发生的纠纷属于计算机软件开发合同纠纷，于2019年7月18日裁定本案移送原审法院。 原审法院于2019年8月22日立案受理姬嘉公司的起诉，姬嘉公司起诉请求：1.解除姬嘉公司与链推公司签订的《软件服务协议》；2.链推公司退还姬嘉公司已支付的价款9万元；3.潘杨对链推公司的上述债务承担连带责任。事实和理由：2018年9月6日，姬嘉公司与链推公司签订《软件服务协议》，约定链推公司为姬嘉公司定制微信商城（微信小程序），链推公司负责打通微信商城与案外人的购物平台中粮我买网的数据对接，合同总金额为13万元。合同签订后，姬嘉公司按照合同约定支付了9万元开发费用。链推公司开发的“姬嘉优选”微信商城在测试阶段出现运费、物流、库存与中粮我买网不一致等问题，不能正常使用。此外，链推公司给姬嘉公司的微信商城是基于SaaS平台的通用模板开发，不能满足数据信息安全需求。链推公司构成根本违约，姬嘉公司已通知链推公司解除合同，链推公司应当返还所收取的款项。潘杨作为链推公司的唯一股东，其应当对公司债务承担连带责任。 链推公司、潘杨原审辩称：根据合同约定，姬嘉公司的“姬嘉优选”采用的是微信商城通用版，通用版的功能有限。姬嘉公司在订立合同前并未告知链推公司中粮我买网的运费规则等特殊规定，姬嘉公司现在的要求已经超出了合同的约定。链推公司已经履行了《软件服务协议》约定的义务，姬嘉公司无权解除合同。链推公司是依法成立的有限责任公司，具有独立的法人人格，潘杨不需对链推公司的债务承担连带责任。姬嘉公司的诉讼请求无事实和法律依据，应当予以驳回。 原审法院于2019年11月12日受理链推公司提起的反诉，链推公司反诉请求：1.姬嘉公司支付链推公司合同余款4万元；2.姬嘉公司支付链推公司律师费8000元。事实和理由：姬嘉公司与链推公司签订《软件服务协议》后，链推公司已完成了软件开发义务。姬嘉公司应付链推公司开发费用共计13万元，实际支付了9万元，余款4万元至今未付。此外，链推公司为本案诉讼支付了律师费8000元。姬嘉公司构成违约，应承担相应的违约责任。 姬嘉公司原审辩称：链推公司未完成软件开发任务，其开发的软件无法正常使用，链推公司构成根本违约，应驳回链推公司的反诉请求。 原审法院查明： 2018年9月6日，姬嘉公司（甲方）与链推公司（乙方）签订《软件服务协议》。协议约定服务内容及资费标准为：公众号通版旗舰旺铺版（3万元），制作中粮我买与微信商城端接（10万元），总金额13万元。协议约定，我买网api对接包括：1.商品接口。编号、详情、上下架、图片、库存（定时获取库存信息）。2.订单接口。推送、预定单确认、查询、取消、售后申请、售后取消、状态变化通知。3.物流信息接口。物流信息查询、包裹物流信息查询、平台单号、包裹编号。4.接口传输错误预警。订单、物流信息接收错误报警。服务条款中的第八条约定：项目合同签订后3日内，甲方向乙方支付合同金额的80%，乙方正式启动项目，进行设计、研发、实施等与项目需求有关的各项工作。乙方将系统功能研发完成后，经甲方书面验收确认没有问题后的2个工作日内，甲方向乙方支付合同金额剩余的20%。乙方应予收到最后一笔款项三日内向甲方提供等同于合同金额的发票（增值税专用发票）。 2018年9月17日，姬嘉公司支付链推公司开发费5万元。2018年10月8日，姬嘉公司支付链推公司开发费4万元。 2018年9月，姬嘉公司组建了包含姬嘉公司工作人员、链推公司工作人员、中粮我买网工作人员的技术工作微信群。2018年10月15日，链推公司通过电子邮件，将程序的用户名、密码等告知姬嘉公司，由姬嘉公司和中粮我买网的工作人员对程序进行测试。在测试期间，链推公司法定代表人潘杨与姬嘉公司法定代表人沈姬等人就“姬嘉优选”微信商城存在的运费信息、库存信息、物流信息及软件开发时间节点等问题通过微信进行了沟通。姬嘉公司举证的录音、录像显示，2018年11月6日、7日，姬嘉公司法定代表人沈姬与链推公司法定代表人潘杨等人就“姬嘉优选”微信商城存在的运费信息、物流信息、SaaS平台安全性、商品分类、库存信息等问题进行了面对面沟通，但双方未能就解决方案协商一致。 2018年11月23日，姬嘉公司委托律师向链推公司发送律师函，称链推公司构成根本违约，告知其终止合同，退还已经支付的9万元。链推公司确认收到该律师函。 链推公司陈述，因姬嘉公司未支付合同余款，故未将源代码交付给姬嘉公司，但其主张姬嘉公司通过非正常途径获得了软件源代码。 另查明，链推公司为一人有限责任公司，股东为潘杨。 原审审理过程中，姬嘉公司主张，链推公司开发的“姬嘉优选”微信商城主要存在以下问题：1.运费计算错误。中粮我买网的商品分为常温商品和生鲜商品，并分别计算运费。客户在中粮我买网同时购买常温商品和生鲜商品时，网站会自动分成两单，并分别计算运费。但在“姬嘉优选”微信商城中，无法实现常温商品和生鲜商品分别计算运费，导致运费计算错误。2.无法显示订单物流信息。3.微信商城采用SaaS平台通用版，不能保证数据安全。4.物品分类混乱，商品图片错误，不能自动导入商品信息。5.部分商品库存显示不准确，如中粮我买网有库存，微信商城显示无库存。6.退货退款流程差错。7.无法和中粮我买网同步显示赠品、优惠券。链推公司称，姬嘉公司所称的大部分问题，都是因为“姬嘉优选”微信商城采用了SaaS平台的通用版，通用版微信商城的功能有限，不可能和中粮我买网有完全相同的功能。具体而言：1.关于运费问题，因中粮我买网的运费规则复杂，通用版微信商城无法实现中粮我买网的运费规则，需要定制开发微信商城，但要额外支付开发费用；或者将“姬嘉优选”分成两个小程序，将生鲜货物和常温货物分开运营。2.关于物流信息问题，因中粮我买网是自有物流，通用版微信商城无法对接中粮我买网的物流信息，现在中粮我买网已经开放了物流信息。3.采用通用版微信商城是姬嘉公司自主选择，姬嘉公司为了节省费用选择了通用版。4.关于商品分类错误问题，可以通过后台改进商品分类解决。通用版只能手动批量导入商品信息和商品图片，无法自动更新。出现图片显示错误的原因应该是中粮我买网的原图地址错误。5.关于库存显示不准确的问题，可以通过后台设置库存数据更新频率及库存缺货阈值解决，并不是程序本身的问题。6.退款退货中的问题是姬嘉公司工作人员不熟悉流程，其和中粮我买网没有沟通好，程序本身没有问题。7.赠品、优惠券只能通过后台人工设置，通用版无法自动导入。 原审法院认为，本案的主要争议焦点为：链推公司是否已完成了软件开发任务；姬嘉公司是否有权解除合同；各方当事人应当承担的责任。 关于链推公司是否已完成了软件开发任务，链推公司主张，其已按照合同的约定开发了软件并交付给姬嘉公司，其已完成了软件开发任务。姬嘉公司则主张，涉案软件无法使用，链推公司未完成软件开发任务。 原审法院认为，姬嘉公司提出的“姬嘉优选”微信商城存在部分问题，如库存信息不准确、商品分类不准确问题、退款退货等问题，可通过优化程序后台参数或者改善业务操作流程等方式予以解决，现有证据尚不能认定上述问题属于软件瑕疵。姬嘉公司希望实现的自动导入商品信息、自动退货退款等功能，亦非通用版微信商城能实现的功能。双方均确认，姬嘉公司提出的其他问题，如运费计算错误、物流信息、数据安全等问题，上述问题的根源在于“姬嘉优选”采用了SaaS平台通用版微信商城，通用版的功能有限，而中粮我买网在运费规则、物流等方面有其特殊的规则，通用版微信商城无法满足其要求。对于购物小程序而言，上述问题属于严重缺陷，且在通用版商城的基础上无法解决，链推公司关于其已履行了全部合同义务的主张原审法院不予支持。 关于姬嘉公司是否有权解除合同，姬嘉公司主张，链推公司开发的“姬嘉优选”微信商城不能实现正常购物，链推公司构成违约。链推公司则主张，采用通用版微信商城是姬嘉公司的自主选择，《软件服务协议》明确约定微信商城采用通版旗舰旺铺版，链推公司已经完成了合同约定的义务。 原审法院认为，虽涉案合同中对于软件需要实现的功能没有具体的描述，但双方在订立合同前均知道“姬嘉优选”微信商城需与案外人的中粮我买网实现对接。姬嘉公司和链推公司在“姬嘉优选”上线测试后才发现合同约定的微信商城通用版不能满足姬嘉公司的需求，对此双方均有责任。姬嘉公司作为委托方，其与中粮我买网的运营方存在合作关系，其有条件了解中粮我买网的运费规则、物流、数据安全等特殊要求。对于链推公司而言，在涉案合同签订前，中粮我买网已经在线运营，链推公司作为专业的软件开发方，亦可以通过适当的需求调研知晓其提供的微信商城通用版不能很好地对接中粮我买网。姬嘉公司和链推公司在签订合同前均没有进行充分的需求调研，在签订合同后亦未及时与中粮我买网的运营方进行充分的沟通，直至链推公司开发的“姬嘉优选”微信商城上线测试后，双方才发现问题。 对于涉案微信商城问题的解决方案，链推公司表示可以通过开发两个小程序，分别运营生鲜货物和常温货物，以解决运费计算错误的问题；或者弃用通用版微信商城，通过定制开发的方式解决问题，但需要另行支付开发费。姬嘉公司则表示，其不同意上述解决方案，已另行委托他人开发软件。原审法院认为，由于现有的通用版微信商城无法通过修复的方式进行完善，双方对于解决方案又不能达成一致，涉案合同无法继续履行，姬嘉公司要求解除合同的诉讼请求可予以支持。 关于各方当事人应当承担的责任，根据合同法第九十七条的规定，合同解除后，尚未履行的，终止履行；已经履行的，根据履行情况和合同性质，当事人可以要求恢复原状、采取其他补救措施，并有权要求赔偿损失。因姬嘉公司和链推公司对于涉案程序开发失败均有过错，原审法院根据合同的履行情况及当事人的过错程度，确定链推公司返还姬嘉公司开发费4万元。链推公司要求姬嘉公司支付合同余款的诉讼请求，原审法院不予支持。链推公司要求姬嘉公司支付律师费的诉讼请求没有依据，不予支持。 链推公司系一人有限责任公司，潘杨作为链推公司的股东，其未证明公司财产独立于股东自己的财产，姬嘉公司要求潘杨对链推公司债务承担连带责任的诉讼请求，予以支持。 原审法院判决：（一）姬嘉公司与链推公司签订的《微信营销系统软件服务协议》于判决生效之日解除；（二）链推公司于本判决生效之日起十日内退还姬嘉公司合同款4万元；（三）潘杨对链推公司上述第二项付款义务承担连带责任；（四）驳回姬嘉公司的其余诉讼请求；（五）驳回链推公司的反诉诉讼请求。如果未按本判决指定的期间履行给付金钱义务，应当依照《中华人民共和国民事诉讼法》第二百五十三条之规定，加倍支付迟延履行期间的债务利息。本诉案件受理费2050元，由姬嘉公司负担1139元，由链推公司、潘杨负担911元；反诉案件受理费500元，由链推公司负担。 本院二审期间，当事人未提交新的证据。 原审查明的事实基本属实，本院予以确认。 本院另查明：（一）链推公司上诉主张其提交但未在原审判决中提及的《补充证据》等，系原审法庭辩论终结之后补充的证据。 （二）原审庭前会议2019年12月11日：第3页：链推公司当庭演示程序（略）。第4-5页：审：“…，程序中有些BUG可以修复，有些问题解决不了，究竟哪些是不能解决的核心问题？”姬嘉公司：“第一个是运费模板问题，生鲜和常温的货物要分别计算运费，如果客户一起下单的话，要分成两单来分别计算运费，然后配送的时候也是分别配送的，但是小程序实现不了，是混在一起计算的，做成一单，通过接口到中粮那边，对应问题3。”技术调查官：“你们现在的意思是：他既无法实现将生鲜和常温货物分成两单，也无法实现生鲜和常温货物分别计算运费？”姬嘉公司：“是的。”链推公司：“我解释下，在我买网APP是自动拆单的，我们这个商城订单无法拆开两单，但是运费是可以分别计算的。我们如果发一笔混合的订单，我买网是会退单的。”姬嘉公司：“举例说，常温货物99元包邮，生鲜199元包邮，客户下了一单，包括常温货物和生鲜，价格大于99元，从小程序判断，该订单免邮费。但我方将客户的订单发给我买网，按照我买网的计算，常温货物和生鲜货物都不满足包邮的条件，都需要支付运费，这样的话，小程序端客户支付的货款与我买网实际计算的运费加货款不符合，差额需要我方支付。”链推公司：“是这样的，认可。实际上客户支付的价款是支付到原告的账户上的。”第6页：技术调查官：“你方发送的订单的运费是由小程序端计算得到的吗？”链推公司：“是的，在小程序后台管理页面，配送管理-配送设置中进行运费计算的设置，设置页面有买家承担运费或卖家包邮；按重量、体积、件数计算运费；设置起送价；满额免运费；指定区域配送和运费。我买网的运费计算方式要复杂得多。我们设计的小程序中，运费计算模板不能满足我买网的实际运费计算规则。这也是我们事后得知的。”第5页：技术调查官：“这个问题能解决吗？”链推公司：“这个运费规则我们双方事先都不知道的，等我们开发好了以后才知道分别计算运费的规则。我们这个标准化的软件产品没有办法对于新运费规则这个需求进行二次开发。解决方案有两个，一个是按需定制一套的方案，要重新开发小程序，而且工作量要更大，不能使用通用模板。还有一个是把生鲜和常温货物分开，做成两个小程序。”姬嘉公司：“这个之前双方谈过，做成两个小程序，用户体验不好。所以我们第二个方案不同意。” （三）“中粮我买|姬嘉优选+”在微信小程序中可查找到，界面显示“评分人数不足”，更多资料显示更新时间“1年前”。 （四）SaaS（SoftwareasaService），意为软件即服务，即通过网络提供软件服务。 本院认为，本案二审争议焦点问题是：（一）链推公司交付的软件是否符合合同约定。（二）原审判决法律适用是否正确。 （一）链推公司交付的软件是否符合合同约定 合同法第八条规定：“依法成立的合同，对当事人具有法律约束力。当事人应当按照约定履行自己的义务，不得擅自变更或者解除合同。”第六十一条规定：“合同生效后，当事人就质量、价款或者报酬、履行地点等内容没有约定或者约定不明确的，可以协议补充；不能达成补充协议的，按照合同有关条款或者交易习惯确定。”第一百二十五条第一款规定：“当事人对合同条款的理解有争议的，应当按照合同所使用的词句、合同的有关条款、合同的目的、交易习惯以及诚实信用原则，确定该条款的真实意思。”本案中，《软件服务协议》约定服务内容及资费标准（勾选）为“公众号程序通版√旗舰旺铺版，3万元”“定制接口：制作中粮我买与微信商城端接打通，10万元”，协议约定“我买网api对接”“商品售价管理系统（本地）”等功能模块，但内容约定概念化、没有细节，例如“我买网api对接”中，商品接口约定为：“编号、详情、上下架、图片、库存（定时获取库存数据）”，订单接口约定为：“推送、预订单确认、查询、取消、售后申请、售后取消、状态变化通知”。在案证据表明，2018年10月15日，链推公司向姬嘉公司交付“姬嘉优选”小程序后台管理账号、密码，2018年10月25日，实现微信商城端与中粮我买网接口对接。随后在测试环节发现，微信商城小程序中的运费计算模板不能满足中粮我买网的实际运费计算规则，即通过“姬嘉优选”微信商城下单我买网商品，对于特殊订单，会形成订单包邮但微信商城应向中粮我买网结算运费的严重缺陷，由于链推公司提供的微信商城来自第三方，链推公司在微信商城基础上无法解决上述缺陷。双方对定制接口等含义产生分歧，链推公司主张微信商城、定制接口依约完成，运费模板属于新增功能，需要另外开发，引起纠纷。 本院认为，《软件服务协议》约定订单接口的功能，但具体内容的约定不明确，经协商无法达成一致，应当按照合同有关条款或者交易习惯确定。双方以定制接口对接购物平台订立的软件开发合同，意在实现商品、订单、物流信息对接的商业目的，基于购物平台公开的运费规则产生的运费是商品订单不可缺少的组成部分，链推公司主张运费模板属于新增功能，与按照合同目的、交易习惯确定的订单的真实意思不符，链推公司交付的软件不能实现商业对接目的，不符合合同约定。链推公司关于原审判决事实认定错误的上诉理由不成立，本院不予支持。 （二）原审判决法律适用是否正确 就软件开发合同而言，本案约定不明导致纠纷的本质在于双方选定的通版软件无法满足需求，链推公司作为开发方，需求调研工作不足存在过失，姬嘉公司作为需求方其需求来自拟对接的中粮我买网，尤其与商业目的有关的公开信息属于功能需求的重要内容，但姬嘉公司未明确描述功能需求存在过失，致使双方定约前、履行之初均未意识到上述缺陷的存在，合同无法继续履行，最终导致损失发生。据此，原审判决根据合同的履行情况及当事人的过错程度，确定链推公司返还姬嘉公司开发费4万元并无不当。链推公司关于原审判决法律适用错误、事实认定错误的上诉理由不成立，本院不予支持。 综上所述，链推公司的上诉主张不成立，不予支持。原审判决认定事实、适用法律无不当，应予维持。依照《中华人民共和国合同法》第八条、第六十一条、第九十七条、第一百二十五条第一款，《中华人民共和国民事诉讼法》第一百七十条第一款第一项规定，判决如下： 驳回上诉，维持原判。 二审案件受理费1800元，由链推（上海）信息科技有限公司负担。 本判决为终审判决。 审判长 焦 彦 审判员 钱建国 审判员 袁晓贞 二〇二〇年十一月三十日 法官助理祁帅 书记员韩丰 裁判要点                            案  号                       （2020）最高法知民终857号                               案  由                       计算机软件开发合同纠纷                               合 议 庭                       审判长：焦 彦             审判员：钱建国、袁晓贞                                                     法官助理：祁帅                       书记员：韩丰                               裁判日期                       2020年11月30日                               涉案软件                       “姬嘉优选”微信小程序                               关 键 词                       软件开发 需求分析 约定不明 解除合同；                               当 事 人                       上诉人（原审被告、反诉原告）：链推（上海）信息科技有限公司。             被上诉人（原审原告、反诉被告）：姬嘉（上海）商贸有限公司。             原审被告：潘杨。                               裁判结果                       驳回上诉，维持原判。             原判主文：一、原告（反诉被告）姬嘉（上海）商贸有限公司与被告（反诉原告）链推（上海）信息科技有限公司签订的《微信营销系统软件服务协议》于判决生效之日解除；             二、被告（反诉原告）链推（上海）信息科技有限公司于本判决生效之日起十日内退还原告（反诉被告）姬嘉（上海）商贸有限公司合同款4万元；             三、被告潘杨对被告（反诉原告）链推（上海）信息科技有限公司上述第二项付款义务承担连带责任；             四、驳回原告（反诉被告）姬嘉（上海）商贸有限公司的其余诉讼请求；             五、驳回被告（反诉原告）链推（上海）信息科技有限公司的反诉诉讼请求。                               涉案法条                       1.《中华人民共和国合同法》第八条、第六十一条、第九十七条、第一百二十五条第一款；             2.《中华人民共和国民事诉讼法》第一百七十条第一款第一项。                               法律问题                       合同内容的确定                               裁判观点                       合同生效后，当事人就质量、价款或者报酬、履行地点等内容没有约定或者约定不明确的，可以协议补充；不能达成补充协议的，按照合同有关条款或者交易习惯确定。                               注：本摘要并非判决书之组成部分，不具有法律效力。