基础支付
JSAPI支付
APP支付
H5支付
Native支付
小程序支付
合单支付
付款码支付
经营能力
微信支付分(公共API)
微信支付分(免确认预授权模式)
微信支付分(需确认模式)
支付即服务
行业方案
智慧商圈
微信支付分停车服务
电子发票
营销工具
代金券
商家券
委托营销
支付有礼
小程序发券插件
H5发券
图片上传(营销专用)
现金红包
资金应用
商家转账到零钱
分账
风险合规
消费者投诉2.0
其他能力
清关报关
图片上传
视频上传
微信支付平台证书

商圈会员场内退款通知

最新更新时间:2022.08.24 版本说明


已授权“商圈会员积分服务”的用户在商圈内门店支付完成后发生退款,微信会通知商圈商户。

注意:

• 同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。
推荐的做法是,当商户系统收到通知进行处理时,先检查对应业务数据的状态,并判断该通知是否已经处理。如果未处理,则再进行处理;如果已处理,则直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。

接入顺序

1. “商圈会员快速积分”小程序插件开发文档

2. 商圈会员积分服务授权结果通知(用户在商圈小程序完成会员积分服务授权后,会将用户的授权情况发送至开通时配置的会员积分服务开通回调地址)

3. 商圈会员场内支付结果通知(已授权商圈会员积分服务的用户,在场内发生微信支付交易时,会将消费信息发送至开通时配置的用户消费回调地址)

4. 商圈会员积分同步(只有接入该接口,才会获取到退款信息)

5. 商圈会员场内退款通知(对已同步过积分的会员消费,监控30天内的退款情况,若发生退款,会将退款信息发送至开通时配置的用户消费回调地址)

6. 商圈会员积分服务授权状态查询 (可通过此api查询已授权过商圈会员积分服务用户的最新授权状态)

7. 商圈会员待积分状态查询(可通过此api查询已授权商圈会员积分服务的用户当天是否有待积分的消费,并可在商圈小程序任意页面引导用户前往“商圈会员快速积分”插件提交积分申请)

8. 商圈会员停车状态同步(可通过此api同步会员停车到场状态给微信支付,对用会员的商场内门店消费可100%自动积分)


特别提醒:商户系统对于确认订单通知的内容一定要做签名验证,并校验通知的信息是否与商户侧的信息一致,防止数据泄露导致出现“假通知”,造成资金损失。

接口说明

适用对象:直连商户

请求URL:由商圈侧提供接口链接地址,必须为https协议。如果链接无法访问,商户将无法接收到微信通知。 通知url必须为直接可访问的url,不能携带参数。示例:“https://pay.weixin.qq.com/wxpay/pay.action”

通知规则

已授权会员在商圈内门店支付完成后发生退款,微信会把相关退款情况通知给商圈商户,商户需要接收处理,并返回应答。出于安全的考虑,我们对通知数据进行了加密,商户需要先对通知数据进行解密,才能得到可用数据。

对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。(通知频率为15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h - 总计 24h4m)


通知报文

退款结果通知是以POST方法访问商户设置的通知url,通知的数据以JSON格式通过请求主体(BODY)传输。通知的数据包括了加密的支付结果详情。

参数解密

下面详细描述对通知数据进行解密的流程:

  1. 1、用商户平台上设置的APIv3密钥【微信商户平台—>账户设置—>API安全—>设置APIv3密钥】,记为key。
  2. 2、针对resource.algorithm中描述的算法(目前为AEAD_AES_256_GCM),取得对应的参数nonce和associated_data。
  3. 3、使用key、nonce和associated_data,对数据密文resource.ciphertext进行解密,得到JSON形式的资源对象。

注: AEAD_AES_256_GCM算法的接口细节,请参考rfc5116。微信支付使用的密钥key长度为32个字节,随机串nonce长度12个字节,associated_data长度小于16个字节并可能为空。

通知参数

参数名 变量 类型[长度限制] 必填 描述
通知ID id string[1,36] 通知的唯一ID。
示例值:EV-2018022511223320873
通知创建时间 create_time string[1,16] 遵循rfc3339标准格式,格式为yyyy-MM-DDTHH:mm:ss+TIMEZONE,yyyy-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss.表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示北京时间2015年05月20日13点29分35秒。
示例值:2015-05-20T13:29:35+08:00
通知类型 event_type string[1,32] 通知的类型, 退款通知的类型为:MALL_REFUND.SUCCESS
示例值:MALL_REFUND.SUCCESS
通知数据类型 resource_type string[1,32] 通知的资源数据类型,用户领卡通知为encrypt-resource。
示例值:encrypt-resource
+通知数据 resource object 通知资源数据
json格式,见示例
参数名 变量 类型[长度限制] 必填 描述
加密算法类型 algorithm string[1,32] 对支付结果数据进行加密的加密算法,目前只支持AEAD_AES_256_GCM。
示例值:AEAD_AES_256_GCM
数据密文 ciphertext string[1,1048576] Base64编码后的支付结果数据密文
示例值:EV-2018022511223320873
原始回调类型 original_type string[1,64] 原始回调类型为:discount_card
示例值:discount_card
附加数据 associated_data string[1,16] 附加数据
示例值:EV-2018022511223320873
随机串 nonce string[1,32] 加密使用的随机串
示例值:fdasflkja484w
回调摘要 summary string[1,64] 回调摘要
示例值:退款成功

通知签名

加密不能保证通知请求来自微信。微信会对发送给商户的通知进行签名,并将签名值放在通知的HTTP头Wechatpay-Signature。商户应当验证签名,以确认请求来自微信,而不是其他的第三方。签名验证的算法请参考 《微信支付API v3签名验证》

回调示例

退款结果通知


{
  "id": "608888fa-d775-51bf-a003-e69999999943",
  "create_time": "2020-07-17T19:34:36+08:00",
  "resource_type": "encrypt-resource",
  "event_type": "MALL_REFUND.SUCCESS",
  "summary": "退款成功",
  "resource": {
    "original_type": "mall_refund",
    "algorithm": "AEAD_AES_256_GCM",
    "ciphertext": "HKclSVKXUpTlcv5BtKJmJUB6bXGgewG2dxLBHT9Ug17P/q3zSCIpSDQb6toxMKHpA7szV7aec7cwVVXTojkHl6pppX4O4CIvwtyJvUy2HL5q/vsSKtuD6Xf77yl4nU5G/53UBDxsFvnxqhQ3yYOrAH7YJxm5bh1mi0rBWJ5K3YzTiSgNvOk/Mw5DK88XVFKlBVnmcvTzcQFrNf6DVRj92JZGftn8bimY75zPePZ/LOyQx5Nflr02Vxa3BBn5Y7d5Lh35T8kAssbBjh70jcfZI+VWjP1FymW+apyDQUYocT7T17RaUTVY14A+vI3GLEJbu2Z9DqDF3V04vRc0vNZfCqwXL3J82SnpI7YG9KTGrUynINWNXck5M17EvgEjIRiSsNtxlh75eSLptDvC5dVuexlc+Prf4IKsXmMIPlQRHfnxeCRvTPBOkh6m9YGrisaHHjmg8+wJ6NC5+Q4X1zNd07Q/0/x9",
    "associated_data": "mall_refund",
    "nonce": "gHGhrVwsadasdrT"
  }
}

商户对resource对象进行解密后,得到的资源对象示例


{
  "mchid": "1234567890",
  "merchant_name": "万象天地",
  "shop_name": "重庆烤鱼(万象天地店)",
  "shop_number": "50001",
  "openid": "swe23be954ffots3jrvjweslfmde",
  "appid": "wx2c23be954ff1624f",
  "refund_time": "2018-05-23T12:13:50+08:00",
  "pay_amount": 100,
  "refund_amount":100,
  "transaction_id": "42000001217201407033233368018",
  "refund_id": "1217752501201407033233368999"
}

退款结果通知参数

参数名 变量 类型[长度限制] 必填 描述
商户号 mchid string[1,32] 微信支付分配的商户号
示例值:1230000109
商圈商户名称 merchant_name string[1,128] 商圈商户名称
示例值:微信支付
门店名称 shop_name string[1,32] 门店名称,商圈在商圈小程序上圈店时填写的门店名称
示例值:微信支付
门店编号 shop_number string[1,128] 门店编号,商圈在商圈小程序上圈店时填写的门店编号,用于跟商圈自身已有的商户识别码对齐
示例值:123456
小程序APPID appid string[1,32] 顾客授权积分时使用的小程序的appid
示例值:wx1234567890abcdef
用户标识 openid string[1,128] 顾客授权时使用的小程序上的openid
示例值:oWmnN4xxxxxxxxxxe92NHIGf1xd8
退款完成时间 refund_time string[1,32] 交易完成时间,遵循rfc3339标准格式,格式为yyyy-MM-DDTHH:mm:ss+TIMEZONE,yyyy-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss表示时分秒毫秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示北京时间2015年05月20日13点29分35秒(需要增加所有跟时间有关的参数的描述)
示例值:2015-05-20T13:29:35+08:00
消费金额 pay_amount int64 用户实际消费金额,单位(分)
示例值:100
退款金额 refund_amount int64 用户退款金额,单位(分)
示例值:100
微信支付订单号 transaction_id string[1,32] 微信支付订单号
示例值:1234567890
微信支付退款单号 refund_id string[1,32] 微信支付退款单号
示例值:1217752501201407033233368999

通知应答

商户后台在正确处理回调之后,需要返回200或者204的HTTP状态码。其他的状态码,微信支付均认为通知失败,并按照前述的策略定期发起通知。

注意:当商户后台应答失败时,微信支付将记录下应答的报文,建议商户按照以下格式返回。


参数名 变量 类型[长度限制] 必填 描述
返回状态码 code string[1,32] 错误码,SUCCESS为接收成功,其他错误码为失败。
示例值:SUCCESS
返回信息 message string[1,256] 返回信息,如非空,为错误原因。
示例值:系统错误


{
 "code": "SUCCESS",
 "message": "成功"
}



技术咨询

文档反馈