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

订单支付结果通知API

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


商户请求微信支付分停车服务扣费受理接口,会完成订单受理。订单实际支付完成后,微信支付会把订单支付结果信息发送给商户,商户需要接收处理,并返回应答。同时,如果由于用户余额不足等原因,微信支付会进行垫资,用户对该垫资单进行了还款以后,微信支付会把该笔订单还款信息通知到商户。

注意:

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

• 如果在所有通知频率后没有收到微信侧回调,商户应调用查询订单接口确认订单状态。


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

接口说明

适用对象:直连商户

请求URL:该链接是通过商户[扣费受理]提交notify_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)传输。通知的数据包括了加密的支付结果详情。
(注:由于涉及到回调加密和解密,商户必须先设置好apiv3密钥后才能解密回调通知,apiv3密钥设置文档指引详见APIv3密钥设置指引

参数解密

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

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

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

通知参数

参数名 变量 类型[长度限制] 必填 描述
通知ID id string[1,36] 通知的唯一ID
示例值:EV-2018022511223320873
通知创建时间 create_time string[1,32] 通知创建的时间,格式为yyyyMMddHHmmss(标准iso8601时间格式)
遵循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] 通知的类型,
支付成功通知的类型为TRANSACTION.SUCCESS
支付失败通知的类型为TRANSACTION.FAIL
还款通知的类型为TRANSACTION.PAY_BACK
示例值:TRANSACTION.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编码后的授权/解除授权结果数据密文
附加数据 associated_data string[1,16] 附加数据
随机串 nonce string[1,16] 加密使用的随机串
示例值:fdasflkja484w
回调摘要 summary string[1,64] 回调摘要
示例值:支付订单通知

通知签名

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

回调示例

订单支付结果通知


{
    "id":"EV-2018022511223320873",
    "create_time":"2015-05-20T13:29:35+08:00",
    "resource_type":"encrypt-resource",
    "event_type":"TRANSACTION.SUCCESS",
    "resource" : {
        "algorithm":"AEAD_AES_256_GCM",
        "ciphertext": "...",
        "nonce": "...",
        "associated_data": ""
    },
	"summary": "支付成功"
}

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


{
    "appid": "wx2421b1c4370ec43b",
    "sp_mchid": "10000100",
    "out_trade_no": "20150806125346",
    "trade_state": "SUCCESS",
    "trade_state_description": "扣款成功",
    "bank_type": "BPA",
    "attach": "支付测试",
    "success_time": "2017-08-26T10:43:39+08:00",
    "create_time": "2017-08-26T10:43:39+08:00",
    "user_repaid": "Y",
    "description": "停车场扣费",
    "trade_scene":"PARKING",
    "payer": {
    		"openid": "oUpF8uN95-Ptaags6E_roPHg7AG0"
    },
    "amount" : {
        "total": 528800,
        "discount_total" : 1,
        "payer_total": 518799,
        "currency": "CNY",
    },
    "parking_info":{
        "parking_id":"5K8264ILTKCH16CQ250",
        "plate_number":"粤B88888",
        "plate_color":"BLUE",
        "start_time":"2017-08-26T10:43:39+08:00",
        "end_time":"2017-08-26T10:43:39+08:00",
        "parking_name":"欢乐海岸停车场",
        "charging_duration":3600,
        "device_id":"12321"
    },
    "promotion_detail":[
    	{
        "promotion_id":"109519",
        "name":"单品惠-6",
        "scope":"SINGLE",
        "type":"DISCOUNT",
        "amount":1,
        "activity_id":"931386",
        "wechatpay_contribute":1,
        "merchant_contribute":0,
        "other_contribute":0
    	}
    ],
}

订单支付结果通知参数

参数名 变量 类型[长度限制] 必填 描述
应用ID appid string[1,32] 调用接口提交的应用ID
示例值:wxd678efh567hg6787
商户号 sp_mchid string[1,32] 调用接口提交的商户号
示例值:1230000109
商户订单号 out_trade_no string[1,32] 调用接口提交的商户服务订单号
示例值:1234323JKHDFE1243252
微信支付订单号 transaction_id string[1,32] 微信支付系统生成的订单号。
示例值:2501201407033
服务描述 description string[1,128] 商户自定义字段,用户交易账单中对扣费服务的描述。
示例值:500001
订单创建时间 create_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年5月20日 13点29分35秒。
示例值:2017-08-26T10:43:39+08:00
交易状态 trade_state string [1,32] 交易状态:
SUCCESS:支付成功
ACCEPT:已接收,等待扣款
PAY_FAIL:支付失败(其他原因,如银行返回失败)
REFUND:转入退款
示例值:SUCCESS
交易状态描述 trade_state_description string [1,256] 对当前订单状态的描述和下一步操作的指引。
示例值:支付失败,请重新下单支付
支付完成时间 success_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年5月20日 13点29分35秒。
示例值:2017-08-26T10:43:39+08:00
付款银行 bank_type string [1,32] 银行类型,采用字符串类型的银行标识,值列表详见银行类型
示例值:CMC
附加数据 attach string [1,128] 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用,实际情况下只有支付完成状态才会返回该字段。
示例值:停车场扣费
用户是否已还款 user_repaid string [1,1] 枚举值:
Y:用户已还款
N:用户未还款
注意:使用此字段前需先确认bank_type字段值为BPA以及 trade_state字段值为SUCCESS。
示例值:Y
交易场景 trade_scene string[1,16] 交易场景值,目前支持
PARKING:车场停车场景
示例值:PARKING
+停车场景信息 parking_info object trade_scene为PARKING时,返回停车场景信息
参数名 变量 类型[长度限制] 必填 描述
停车入场id parking_id string[1,32] 车主服务为商户分配的入场id,商户通过入场通知接口获取入场id
示例值:5K8264ILTKCH16CQ250
车牌号 plate_number string[1,32] 车牌号,仅包括省份+车牌,不包括特殊字符。
示例值:粤B888888
车牌颜色 plate_color string[1,32] 车牌颜色,枚举值:
BLUE:蓝色
GREEN:绿色
YELLOW:黄色
BLACK:黑色
WHITE:白色
LIMEGREEN:黄绿色
示例值:BLUE
入场时间 start_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年5月20日 13点29分35秒。
示例值:2017-08-26T10:43:39+08:00
出场时间 end_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年5月20日 13点29分35秒。
示例值:2017-08-26T10:43:39+08:00
停车场名称 parking_name string[1,32] 所在停车位车场的名称
示例值:欢乐海岸停车场
计费时长 charging_duration int 计费的时间长,单位为秒
示例值:3600
停车场设备id device_id string[1,32] 停车场设备id
示例值:12321
+支付者 payer object 支付者信息,详细说明见下文
参数名 变量 类型[长度限制] 必填 描述
用户在服务商的标识 openid string[1,128] 用户在服务商的标识
示例值:oUpF8uMuAJOM2pxb1Q
+订单金额 amount object 订单金额信息,详细说明见下文
参数名 变量 类型[长度限制] 必填 描述
订单金额 total uint64 订单总金额,单位为分,只能为整数
示例值:888
货币类型 currency string[1,16] 符合ISO 4217标准的三位字母代码,目前只支持人民币:CNY
示例值:CNY
用户实际支付金额 payer_total uint64 用户实际支付金额,单位为分,只能为整数
示例值:888
折扣 discount_total uint64 订单折扣
示例值:100
+优惠功能 promotion_detail array 优惠功能信息,详细说明见下文
参数名 变量 类型[长度限制] 必填 描述
券ID coupon_id string[1,32] 券或者立减优惠id

示例值:109519
优惠名称 name string[1,128] 优惠名称。

示例值:单品惠-6
优惠范围 scope string[1,32] 枚举值
GLOBAL:全场代金券
SINGLE:单品优惠
示例值:GLOBAL
优惠类型 type string[1,16] 枚举值:
CASH:充值型代金券
NOCASH:免充值型代金券

示例值:CASH
优惠券面额 amount uint64 用户享受优惠的金额。

示例值:5
活动ID activity_id string[1,32] 在微信商户后台配置的批次ID。

示例值:931386
微信出资 wechatpay_contribute uint64 特指由微信支付商户平台创建的优惠,出资金额等于本项优惠总金额,单位为分。

示例值:0
商户出资 merchant_contribute uint64 特指商户自己创建的优惠,出资金额等于本项优惠总金额,单位为分。

示例值:0
其他出资 other_contribute uint64 其他出资方出资金额,单位为分。

示例值:5
优惠币种 currency string[1, 16] CNY:人民币,境内商户号仅支持人民币。
示例值:CNY

通知应答

接收成功:HTTP应答状态码需返回200或204,无需返回应答报文。

接收失败:HTTP应答状态码需返回5XX或4XX,同时需返回应答报文,格式如下:


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


{  
    "code": "FAIL",
    "message": "失败"
}



技术咨询

文档反馈