Skip to content

普通支付通知(XML)

当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。

注意:

  • 同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。
  • 后台通知交互时,如果微信收到商户的应答不符合规范或超时,微信会判定本次通知失败,重新发送通知,直到成功为止(在通知一直不成功的情况下,微信总共会发起多次通知,通知频率为15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h - 总计 24h4m),但微信不保证通知最终一定能成功。
  • 在订单状态不明或者没有收到微信支付结果通知的情况下,建议商户主动调用微信支付查单API确认订单状态。
  • 商户系统对于支付结果通知的内容一定要做签名验证,并校验返回的订单金额是否与商户侧的订单金额一致,防止数据泄露导致出现“假通知”,造成资金损失。
  • 当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
请求参数类型描述
headersobject通知的头参数
Request-IDstring通知的唯一标识
Content-Typestringtext/xml
bodyobject通知的XML数据结构
appidstring公众平台APPID
attachstring商家数据包
bank_typestring付款银行
fee_typestring货币种类
is_subscribestring是否关注公众账号
Y | N 枚举值之一
mch_idstring商户号
sub_mch_idstring子商户号
sub_appidstring子商户应用ID
nonce_strstring随机字符串
openidstring用户标识
out_trade_nostring商户订单号
result_codestring业务结果
SUCCESS | FAIL 枚举值之一
return_codestring返回状态码
SUCCESS | FAIL 枚举值之一
signstring签名
time_endstring支付完成时间
total_feestring标价金额
coupon_feestring总代金券金额
coupon_countstring代金券使用数量
coupon_type_$nstring代金券类型
coupon_id_$nstring代金券ID
trade_typestring交易类型
JSAPI | NATIVE | APP | MWEB | PAP 枚举值之一
transaction_idstring微信支付订单号
contract_idstring委托代扣协议id
user_repaidstring⽤户是否已还款
Y | N 枚举值之一
trade_statestring交易状态
SUCCESS | PAY_FAIL 枚举值之一
  1. 普通支付只有支付成功(trade_state=SUCCESS)才有通知

  2. 服务商支付成功会带上(sub_appid及sub_mch_id)字段

  3. 扣款服务回调会带上(contract_id user_repaid trade_state)字段

php
// 使用Psr标准规范,示例如何处理(取值、转换、验签)「回调通知」事件,WebServer不同,用法略有差异,供参考实现。
function webhookProcessor(\Psr\Http\Message\RequestInterface $request,
  string $apiv2Key): array {
  if (\strlen($apiv2Key) !== 32) {
    throw new \WeChatPay\Exception\InvalidArgumentException('API密钥为32字节,长度不对');
  }

  $inBody = (string)$request->getBody();
  // 转换通知的XML文本消息为PHP Array数组
  $inBodyArray = \WeChatPay\Transformer::toArray($inBody);

  if (!\WeChatPay\Crypto\Hash::equals(\WeChatPay\Crypto\Hash::sign(
    $inBodyArray['sign_type'] ?? \WeChatPay\Crypto\ALGO_MD5,
    \WeChatPay\Formatter::queryStringLike(\WeChatPay\Formatter::ksort($inBodyArray)),
    $apiv2Key), $inBodyArray['sign'] ?? null
  )) {
    throw new \WeChatPay\Exception\InvalidArgumentException('通知的数据签名校验未通过');
  }

  return [
    'headers' => $request->getHeaders(),
    'body' => $inBodyArray
  ];
}

// do your business
// ...
// ...
$xml = \WeChatPay\Transformer::toXml([
  'return_code' => 'SUCCESS',
  'return_msg' => 'OK'
]);
应答规范类型描述
bodyobject应答的XML数据结构
return_codestring业务处理状态码
SUCCESS | FAIL 枚举值之一
return_msgstring业务处理附加信息

参阅 官方文档 官方文档 官方文档 官方文档 官方文档 官方文档 官方文档 官方文档 官方文档 官方文档 官方文档 官方文档 官方文档 官方文档 官方文档 官方文档 官方文档 官方文档 官方文档 官方文档 官方文档 官方文档 官方文档 官方文档

Published on the GitHub by TheNorthMemory