# 无忧退货(运费险)简介
小程序无忧退货(运费险)是微信官方推出的售后退换货保障服务。商家向微信充值保费后,可以为用户订单购买运费险,若订单发生退换货,无忧退货支持用户预约上门取件,寄退货免付基础运费,最高抵扣¥19.35(基本全国免费寄退货)。商家使用无忧退货无需支付额外费用。
# 接入案例
# 1. 运作流程
- 预充值:商家通过微信向保司充值保费,账期60天,到期未用余额自动原路退回。
- 投保:商家需要对订单投保时,通过投保接口向微信主动发起投保。
- 理赔:
- 上门取件:京东上门取件,用户寄件时直接抵扣基础运费,最高抵扣¥19.35。
- 自行寄回:支持全部物流公司,用户自行线下寄回后填写退货物流单号,理赔款¥10打款到用户微信零钱包。
- 退款:商家主动向微信/系统自动发起退款,资金原路返回。
注:微信支付单号、保单号、理赔单号一一对应,一笔交易订单仅能投保和理赔一次。
# 2. 用户体验 (消息无需订阅,页面无需开发)
# 3. 开通路径 (无需支付额外费用)
# 开通位置
小程序后台-功能-物流服务-无忧退货(运费险)
# 签署服务协议
# 后台接口对接
# 保费预充值(支持扫码/网银转账)
# 查看投保和资金记录
# 4. 开票流程
目前支持开具电子普票、纸质普票和纸质增值税专用发票,商家可以在指定日期,按照要求邮件申请(附件大小不超过15M),开具的纸质发票将通过快递的方式寄送给商家,发票邮寄费用由商家自行承担。电子发票由所填邮箱接收。
邮件标题:运费险发票申请-xx小程序x月
邮件正文及附件内容:
小程序主体名、小程序appid、开票金额(元)、纳税人名称(与小程序主体一致)、纳税人识别号、地址、电话、开户行及账号、电子邮箱、联系人及电话
营业执照扫描件/复印件,加盖公章
需要开票的保单信息(可在小程序后台-物流服务-无忧退货-保单信息中筛选下载excel)
发送时间:请在每月初1-5日,发送邮件申请。
开票邮箱: xuziyi900@pingan.com.cn
# 5. 开发文档
# 接入流程泳道图
# 请求域名
https://api.weixin.qq.com{PathName}?access_token=${access_token}
# 调用方式
文档所有接口请求方式均为HTTPS-POST请求,UTF-8编码,请求和相应参数仅支持JSON数据格式,所有接口的调用均需要获取access_token授权,服务商获取access_token,走微信开放平台-第三方平台的模式。
调用主体为小程序appid 或 第三方平台appid均可,二选一即可。
# 基本返回参数
参数名 | 参数描述 | 类型 | 备注 |
---|---|---|---|
errcode | 错误码 | int32 | 成功:0 |
errmsg | 错误描述 | string |
# 常见返回码
返回码 | 说明 |
---|---|
2 | 缺少必要参数 |
1010 | 投保时间错误 |
1011 | 物流单号重复 |
2001 | 重复开通 |
2003 | 充值金额限制,单次最高1万元 |
2004 | 未开通无忧退货 |
2007 | 重复理赔 |
2008 | 系统安全原因,暂停理赔 |
2009 | 未找到对应投保单 |
2011 | 订单错误 - 订单号/openid错误 |
2012 | 订单错误 - 非该小程序内下单 |
2013 | 订单错误 - 支付时间错误 |
2014 | 订单错误 - 支付金额错误 |
2015 | 订单错误 - 其他 |
2028 | 物流单号查不到轨迹 |
4001 | 余额不足 |
# 6. API接口列表
# 开通无忧退货接口
PathName: /wxa/business/insurance_freight/open
请求参数:
无
返回参数:
无
# 查询开通状态接口
PathName: /wxa/business/insurance_freight/query_open
请求参数:
无
返回参数:
参数名 | 参数描述 | 类型 | 备注 |
---|---|---|---|
is_open | 是否开通 | uint32 | 0:否,1:是 |
# 投保接口(发货时投保)
PathName: /wxa/business/insurance_freight/createorder
请求参数:
参数名 | 参数描述 | 类型 | 是否必须 | 备注 |
---|---|---|---|---|
openid | 买家openid | string | Y | 必须和理赔openid一致 |
order_no | 微信支付单号 | string | Y | 一个微信支付单号只能投保一次 |
pay_time | 微信支付时间 | uint32 | Y | 秒级时间戳,时间误差3天内 |
pay_amount | 微信支付金额 | uint32 | Y | 单位:分 |
delivery_no | 发货运单号 | string | Y | |
delivery_place | 发货地址 | object | Y | |
- province | 省 | string | Y | |
- city | 市 | string | Y | |
- county | 区 | string | Y | |
- address | 详细地址 | string | Y | |
receipt_place | 收货地址 | object | Y | |
- province | 省 | string | Y | |
- city | 市 | string | Y | |
- county | 区 | string | Y | |
- address | 详细地址 | string | Y | |
product_info | 投保订单信息 | object | Y | 用于微信下发投保和理赔通知给用户,用户点击可查看投保订单,点击订单可跳回商家小程序 |
- order_path | 投保订单在商家小程序的path | string | Y | 投保订单在商家小程序的path |
- goods_list | 投保订单商品列表 | Array | Y | 投保商品list,一个元素为对象的数组,结构如下↓ |
goods_list内对象参数名称 | 类型 | 必选 | 备注 |
---|---|---|---|
name | string | Y | 投保商品名称 |
url | string | Y | 投保商品图片url |
返回参数:
参数名 | 参数描述 | 类型 | 备注 |
---|---|---|---|
policy_no | 保单号 | string | |
insurance_end_date | 保险止期 | string | 格式: yyyy-mm-dd hh24:mi:ss |
estimate_amount | 保险公司预估理赔金额 | uint64 | 单位: 分 |
premium | 保费 | uint32 | 单位: 分 |
请求参数示例
{
"openid":"oZGTP5DwGDPfEf1EBBHH_oxHw2aU",
"order_no": "4200001197202103228672982585",
"pay_amount": 1,
"pay_time": 1679473667,
"delivery_place":{
"province":"广东省",
"city": "广州市",
"county": "海珠区",
"address": "创业园23号"
},
"receipt_place":{
"province":"广东省",
"city": "惠州市",
"county": "惠普区",
"address": "龙山村10-2"
},
"delivery_no": "d20230322001"
}
返回参数示例
{
"errcode": 0,
"errmsg": "ok",
"policy_no": "10288003264673876282",
"insurance_end_date": "2023-06-20 16:36:54",
"estimate_amount": 1200
}
# 理赔接口 (收到用户退货后再触发)
PathName: /wxa/business/insurance_freight/claim
请求参数:
参数名 | 参数描述 | 类型 | 是否必须 | 备注 |
---|---|---|---|---|
openid | 买家openid | string | Y | 与投保保持一致 |
order_no | 微信支付单号 | string | Y | 与投保保持一致 |
refund_delivery_no | 退款运单号 | string | Y | 理赔退款运单号唯一 |
refund_company | 退款快递公司 | string | Y |
返回参数:
参数名 | 参数描述 | 类型 | 备注 |
---|---|---|---|
report_no | 理赔报案号 | string | 成功申请理赔时返回 |
is_home_pick_up | 是否上门取件 | uint32 | 0:否;1:是 |
请求参数示例
{
"openid": "oZGTP5DwGDPfEf1EBBHH_oxHw2aU",
"order_no": "4200001197202103228672982585",
"refund_delivery_no" : "rd20230322001",
"refund_company": "SF"
}
返回参数示例
{
"errcode": 0,
"errmsg": "ok",
"report_no": "90581008120350195232",
"is_home_pick_up": 1
}
# 理赔结果推送
# 接入方式
如果需要监听理赔结果的事件,接入方式可以参考公众平台的消息推送:
如果开发者是小程序商家,请移步 消息推送
如果开发者是服务商第三方平台,请移步 消息与事件接收配置
# 理赔结果推送事件
事件类型: wxainsurance_claim_result
参数
参数名 | 参数描述 | 类型 | 备注 |
---|---|---|---|
OrderNo | 支付单号 | string | |
Status | 保单状态 | uint32 | 5:理赔成功;6:理赔失败 |
FinishTime | 理赔成功时间 | uint32 | 理赔成功时返回 |
PayFailReason | 理赔失败原因 | string | 理赔失败时返回 |
参数示例
<xml>
<ToUserName>gh_abcdefg</ToUserName>
<FromUserName>oABCD</FromUserName>
<CreateTime>1234455555</CreateTime>
<MsgType>event</MsgType>
<Event>wxainsurance_claim_result</Event>
<upload_event>
<OrderNo><![CDATA[42000021662024041000000000000]]></OrderNo>
<Status>5</Status>
<FinishTime>1234455555</FinishTime>
</upload_event>
</xml>
# 申请充值订单号接口 (支持自定义金额)
PathName: /wxa/business/insurance_freight/createchargeid
请求参数:
参数名 | 参数描述 | 类型 | 是否必须 | 备注 |
---|---|---|---|---|
quota | 充值金额 | uint64 | Y | 单位:分 |
返回参数:
参数名 | 参数描述 | 类型 | 备注 |
---|---|---|---|
order_id | 充值订单id | uint64 |
请求参数示例
{
"quota" : 1000
}
返回参数示例
{
"errcode": 0,
"errmsg": "ok",
"order_id": 2850151276313431996
}
# 申请支付接口
PathName: /wxa/business/insurance_freight/applypay
请求参数:
参数名 | 参数描述 | 类型 | 是否必须 | 备注 |
---|---|---|---|---|
order_id | 充值订单id | uint64 | Y | 与createchargeid 保持一致,js等语言防止精度错误传string |
返回参数:
参数名 | 参数描述 | 类型 | 备注 |
---|---|---|---|
pay_url | 充值链接 | string |
特别提示: 充值后退款只能退回原充值账号
请求参数示例
{
"order_id" : 2850151276313431996
}
返回参数示例
{
"errcode": 0,
"errmsg": "ok",
"pay_url": "https://fuwu.weixin.qq.com/service/common/buy?hasApply=1&orderId=2850151276313431996"
}
# 拉取充值订单信息接口
PathName: /wxa/business/insurance_freight/getpayorderlist
请求参数:
参数名 | 参数描述 | 类型 | 是否必须 | 备注 |
---|---|---|---|---|
status_list | 订单状态 | array[uint32] | Y | 状态如下: 1: 待支付 2: 支付成功 3: 使用中 4: 已用完 5: 退款中 6: 已退款 10: 支付超时 |
offset | 分页offset | uint32 | N | 默认0 |
limit | 分页limit | uint32 | N | 默认30 |
返回参数:
参数名 | 参数描述 | 类型 | 备注 |
---|---|---|---|
total | 总数 | uint32 | 总数 |
list | 充值订单列表 | array[object] | |
- order_id | 充值单号 | uint64 | |
- order_status | 订单状态 | uint32 | 状态如下: 1: 待支付 2: 支付成功 3: 使用中 4: 已用完 5: 退款中 6: 已退款 10: 支付超时 |
- total_price | 充值金额 | uint64 | 单位:分 |
- create_time | 订单创建时间 | uint32 | 秒级时间戳 |
- pay_time | 支付时间 | uint32 | 秒级时间戳 |
- can_refund | 是否可以退款 | bool | |
- refund_time | 退款时间 | uint32 | 秒级时间戳 |
- refund_status | 退款状态 | uint32 | 状态如下: 1: 未退款 2: 退款中 4: 退款成功 5: 退款失败 |
- refund_amt | 退款金额 | uint64 | 单位:分 |
请求参数示例
{
"status_list": [
2, 3, 4, 5, 6
],
"offset": 0,
"limit": 20
}
返回参数示例
{
"errcode": 0,
"errmsg": "ok",
"list": [
{
"order_id": 2850151276313431996,
"order_status": 5,
"total_price": 1000,
"create_time": 1678966793,
"pay_time": 1678966880,
"can_refund": true,
"refund_time": 0,
"refund_status": 1
}
],
"total": 1
}
# 退款接口
PathName: /wxa/business/insurance_freight/refund
请求参数:
无
返回参数:
无
特别提示: 充值后退款只能退回原充值账号
# 拉取摘要接口 (查询当前保费、投保单量、理赔单量、账号余额等信息)
PathName: /wxa/business/insurance_freight/getsummary
请求参数:
参数名 | 参数描述 | 类型 | 是否必须 | 备注 |
---|---|---|---|---|
begin_time | 查询开始时间 | uint32 | N | 秒级时间戳 |
end_time | 查询结束时间戳 | uint32 | N | 秒级时间戳 |
返回参数:
参数名 | 参数描述 | 类型 | 备注 |
---|---|---|---|
total | 投保总数 | uint32 | |
claim_num | 理赔总数 | uint32 | |
claim_succ_num | 理赔成功数 | uint32 | |
premium | 当前保费 | uint32 | 单位:分 |
funds | 当前账号余额 | uint32 | 单位: 分 |
need_close | 是否不能投保 | bool | 系统安全原因不能投保 |
# 拉取保单信息接口
PathName: /wxa/business/insurance_freight/getorderlist
请求参数:
参数名 | 参数描述 | 类型 | 是否必须 | 备注 |
---|---|---|---|---|
openid | 买家openid | string | N | 与投保理赔保持一致 |
order_no | 微信支付单号 | string | N | 与投保理赔保持一致 |
policy_no | 保单号 | string | N | |
report_no | 理赔报案号 | string | N | |
delivery_no | 发货运单号 | string | N | |
refund_delivery_no | 退款运单号 | string | N | |
begin_time | 查询开始时间 | uint32 | N | 秒级时间戳 |
end_time | 查询结束时间 | uint32 | N | 秒级时间戳 |
status_list | 保单状态 | array[uint32] | N | 状态如下: 2: 保障中 4: 理赔中 5: 理赔成功 6: 理赔失败 7: 投保过期 |
offset | 分页offset | uint32 | N | |
limit | 分页limit | uint32 | N | 默认为100,最大为100 |
sort_direct | 排序方式 | uint32 | N | 0:create_time正序,1:create_time倒序 |
返回参数:
参数名 | 参数描述 | 类型 | 备注 |
---|---|---|---|
total | 总数 | uint32 | |
list | 保单列表 | array[object] | |
- order_no | 微信支付单号 | string | |
- policy_no | 保单号 | string | |
- report_no | 理赔报案号 | string | |
- delivery_no | 发货运单号 | string | |
- refund_delivery_no | 退款运单号 | string | |
- premium | 保费 | uint32 | 单位:分 |
- estimate_amount | 预估理赔金额 | uint32 | 单位:分 |
- status | 保单状态 | uint32 | 状态如下: 2: 保障中 4: 理赔中 5: 理赔成功 6: 理赔失败 7: 投保过期 |
- pay_fail_reason | 理赔打款失败原因 | string | |
- pay_finish_time | 理赔款打给用户的时间 | uint32 | |
- is_home_pick_up | 是否上门取件 | uint32 | 0:否;1:是 |
请求参数示例
{
"status_list": [
2, 4, 5
],
"offset": 0,
"limit": 20
}
返回参数示例
{
"errcode": 0,
"errmsg": "ok",
"list": [
{
"order_no": "4200001197202103228672982584",
"policy_no": "10288003264673876281",
"report_no": "",
"status": 2,
"insurance_end_date": "2023-06-14 19:41:34",
"premium": 20,
"estimate_amount": 1200,
"delivery_no": "delivery20230321001",
"refund_delivery_no": "delivery20230322001",
"is_home_pick_up": 1
},
{
"order_no": "4200001197202103228672982585",
"policy_no": "10288003264673876282",
"report_no": "90581008120350195232",
"status": 4,
"insurance_end_date": "2023-06-20 16:36:54",
"premium": 20,
"estimate_amount": 1200,
"delivery_no": "delivery20230322001",
"refund_delivery_no": "delivery20230322001",
"is_home_pick_up": 1
}
],
"total": 2
}
# 设置告警余额接口
开发者可通过接口自定义余额为xx时通知小程序管理员(余额xx无改动情况下24h内通知一次)。通知消息将通过 微信公众平台 下发。
PathName: /wxa/business/insurance_freight/update_notify_funds
请求参数:
参数名 | 参数描述 | 类型 | 是否必须 | 备注 |
---|---|---|---|---|
notify_funds | 通知的金额 | uint32 | N | 单位:分;设置为0不通知 |
返回参数:
无
# 创建退货 ID
- 描述:商家在同意用户退货之后,通过本接口创建退货ID,shop_order_id和退货 ID 一一对应。一个订单需要多次退货”的场景,可以在商家内部 1 个退货订单号映射多个shop_order_id。注:该接口中文相关的字段用UTF-8。
- 提醒退货通知:商家创建退货 ID 时,平台会自动下发模板消息给用户,提醒用户退货。
- 请求地址:https://api.weixin.qq.com/cgi-bin/express/delivery/no_worry_return/add?access_token=ACCESS_TOKEN
- 请求方式:POST
- 请求参数
参数名称 | 类型 | 必选 | 备注 |
---|---|---|---|
shop_order_id | string | 是 | 商家内部系统使用的退货编号 |
biz_addr | object | 是 | 商家退货地址 |
user_addr | object | 否 | 用户购物时的收货地址 |
openid | string | 是 | 退货用户的openid |
wx_pay_id | string | 是 | 填写已投保的微信支付单号 |
order_path | string | 是 | 退货订单在商家小程序的path。如投保时已传入订单商品信息,则以投保时传入的为准 |
goods_list | Array | 是 | 退货商品list,一个元素为对象的数组,结构如下↓ 如投保时已传入订单商品信息,则以投保时传入的为准 |
goods_list内对象参数名称 | 类型 | 必选 | 备注 |
---|---|---|---|
name | string | 是 | 退货商品的名称 |
url | string | 是 | 退货商品图片的url |
//请求示例
{
"shop_order_id": "xxx",//商家内部系统使用的退货编号
"biz_addr": { //商家退货地址,必填
"name": "张三",
"mobile": "13600000000",//仅支持输入一个联系方式
"country": "中国",
"province": "广东省",
"city": "广州市",
"area": "海珠区",
"address": "xx路xx号"
},
"user_addr": { //用户购物时的收货地址,选填
"name": "李四",
"mobile": "13600000000",
"country": "中国",
"province": "广东省",
"city": "广州市",
"area": "海珠区",
"address": "xx路xx号"
},
"openid":"xxx",//退货用户的openid,用于给用户下发模版消息,通过模版消息用户可以选择退货方式
"order_path":"xxx",//退货订单在商家小程序的path
"goods_list":[
{
"name":"xxx",//退货商品的名称
"url":"xxx"//退货商品图片的url
}
],
"order_price":1//退货订单的价格,
"wx_pay_id":"420000198020231123341140012"//微信支付投保单号
}
- 返回参数
{
"errcode": 0,
"errmsg": "OK",
"return_id": "1935761508265738242"
}
- 错误码列表
"errcode": 40097 //参数错误:order_id为空或者退货地址为空或者wx_pay_id为空
"errcode": 9300522 //参数错误:shop_order_id 已存在
"errcode": 9300569 //参数错误:wx_pay_id 为空
"errcode": 9300570 //逻辑错误:该微信支付单号填写错误或未投保
"errcode": -1 //系统错误:请联系微信平台解决
# 查询退货 ID 状态
- 描述:本接口用于商家查询用户退货状态(是否填写退货信息)及追踪用户退货物流,方便仓库收货。通过本接口查询退货 ID 状态,其中status是退货ID状态,order_status是退货 ID 对应的用户运单号的状态。
- 请求地址:https://api.weixin.qq.com/cgi-bin/express/delivery/no_worry_return/get?access_token=ACCESS_TOKEN
- 请求方式:POST
- 请求参数
{
"return_id": "1935761508265738242"
}
- 返回参数
{
"errcode": 0,
"errmsg": "OK",
"status": "1", // 0.用户未填写退货信息 1.预约上门取件 2.填写自行寄回运单号
"waybill_id": "JDxxxxxx", //运单号
"order_status": 0, //0.已下单待揽件 1.已揽件 2.运输中 3.派件中 4.已签收 5.异常 6.代签收 7.揽收失败 8.签收失败(拒收,超区) 11.已取消 13.退件中 14.已退件 99.未知
"delivery_name": "申通快递"//运力公司名称
"delivery_id": SF,//运力公司编码
}
- 错误码列表
"errcode": 40097 //参数错误:return_id为空
"errcode": 931023 //参数错误:运单不存在
"errcode": -1 //系统错误:请联系微信平台解决
# 解绑退货 ID
- 描述:当商家同意退货申请之后,与用户达成协商「无需退货」时,可以通过本接口可以解除商家退货单与退货 ID的绑定。考虑到预约快递员上门取件的情况在用户侧发生,因此只有当用户是自主填写运单号情况下才支持解绑退货 ID 。
- 请求地址:https://api.weixin.qq.com/cgi-bin/express/delivery/no_worry_return/unbind?access_token=ACCESS_TOKEN
- 请求方式:POST
- 请求参数
{
"return_id": "1935761508265738242"
}
- 返回参数
{
"errcode": 0,
"errmsg": "OK",
}
- 错误码列表
"errcode": 40097 //参数错误:return_id为空
"errcode": 931023 //参数错误:运单不存在
"errcode": -1 //系统错误:请联系微信平台解决
# 7. 组件调用
商家可选择调用组件(the latest version)至小程序页面,实现用户在小程序页面内点击按钮拉起退货寄件。
①订单有运费险:拉起无忧退货页面,上门取件抵扣基础运费。
②订单无运费险:拉起半屏弹窗,上门取件自付运费。
# 代码示例
# 基本用法
test.wxml:
// 需要使用两个插槽节点(slot="refund" 和 slot="refund_detail" 分别对应退货前跟退货后状态的插槽节点,如果没有要求退货状态,可以使用同意的元素节点)
// 对状态有要求,不同状态展示不同文案节点
<view>
<sales-return returnId="{{returnId}}">
<button slot="refund">立即退货</button> //还未退过货的插槽节点
<button slot="refund_detail">退货详情</button> //还退完货后的插槽节点
</sales-return>
</view>
// 对状态无要求,不同状态展示相同同文案节点
<view>
<sales-return returnId="{{returnId}}">
<button slot="refund">立即退货</button> //还未退过货的插槽节点
<button slot="refund_detail">立即退货</button> //退完货后的插槽节点
</sales-return>
</view>
test.js:
data: {
returnId: "xxx";
}
test.json:
{
"usingComponents": {
"sales-return": "plugin://logisticsPlugin/sales-return"
}
}
app.json 引入插件:
{
"pages": [
"pages/index/index",
],
"window": {
},
"plugins": {
"logisticsPlugin": {
"version": "2.3.0",
"provider": "wx9ad912bf20548d92"
}
},
}
# goods_info内容
参数名称 | 类型 | 必选 | 备注 |
---|---|---|---|
returnld | string | 是 | 退货 ID |
# 插槽 Slots
插槽名 | 类型 | 必选 | 备注 |
---|---|---|---|
refund | string | 是 | 还未退货的插槽节点,用来触发弹窗、跳转页面的节点(必填) |
refund_detail | string | 是 | 退完货的插槽节点,用来触发弹窗、跳转页面的节点(必填,如果退货行为完成前后是相同文案可使用refund所使用的的文案) |