异步消息

简介

针对交易结果,Adapay 系统会通过异步消息的方式通知客户系统。

实现异步消息处理对象

选择使用 Adapay Server SDK 接入时,您可以实现接收异步消息的处理类,并通过 SDK 指定方法完成设置。

代码示例

Java

// 实现您自己的异步消息处理类,启动异步消息的接收
AdaPay.startNotifyListener(new NotifyCallback());

异步消息的监听全过程都在 SDK 内部完成,无需做任何额外的处理,对于您的服务端来说是无感的。在交易或业务完成后,消息将自动推送,并使用预先设置的消息处理类进行处理。消息的内容包含在 Event对象 中。

异步消息将在队列中至少保存 24小时,在这段有效期内,如果您的服务端程序和 Adapay 发生了网络问题导致暂时无法连接,消息仍然不会丢失,一旦网络连接问题恢复,您还是能立刻收到。

为保证异步消息的到达率,当发生异步消息通知时,分布式部署的每个应用实例都会收到消息,请在您的程序中做好幂等处理。

注意事项

在实现异步消息接收的同时,都建议您在重要的业务环节,通过反查接口确认 非终态 支付订单的状态,以保证在发生异步消息延迟或无法送达情况下的支付结果一致性。

Event对象

异步消息内容是通过 Event对象 来传递的。其中包含了不同类型的 Event 以及对应的消息体。

对象的定义

属性

描述

id

事件 id , Adapay 系统内唯一

type

事件类型,详见 Event事件类型

created

事件发生的时间点,Unix 时间戳

livemode

是否为生产环境事件

data

消息数据,JSON格式 对象,根据事件类型不同对应的数据对象也不同,详见 Event事件 返回数据

Event事件类型

类型

描述

charge.success

支付成功

charge.failed

支付失败

charge.close.success

支付关单成功

charge.close.failed

支付关单失败

refund.success

退款成功

refund.failed

退款失败

Event事件 返回数据

charge.success - 支付成功

data 参数中为一个 Charge对象

{
  "id": "0003288641923153920",
  "created": "1564736349",
  "livemode": true,
  "type": "charge.success",
  "data": {
    "id": "ch_Hm5uTSifDOuTy9iLeLPSurrD",
    "created": 1410778843,
    "order_no": "123456789",
    "livemode": true,
    "app_id": "sfjeijibbTe5jLGCi5rzfH4OqPW9KCif913",
    "pay_channel": "alipay",
    "amount": "998.00",
    "currency": "cny",
    "query_url": "https://AdaPay.cloudpnr.com/charge/tmp?token=5jLGCi5rzfH4OqPW9KCi",
    "status": "pending",
    "description": "Charge Discription",
    "extra": {
      "pay_info": "bax028781ovixf6i8xyf60be"
    }
  }
}

charge.failed - 支付失败

data参数中为一个 Charge对象

{
  "id": "0003288641923153920",
  "created": "1564736349",
  "livemode": true,
  "type": "charge.failed",
  "data": {
    "id": "ch_Hm5uTSifDOuTy9iLeLPSurrD",
    "created": 1410778843,
    "order_no": "123456789",
    "livemode": true,
    "app_id": "sfjeijibbTe5jLGCi5rzfH4OqPW9KCif913",
    "pay_channel": "alipay",
    "amount": "998.00",
    "currency": "cny",
    "query_url": "https://AdaPay.cloudpnr.com/charge/tmp?token=5jLGCi5rzfH4OqPW9KCi",
    "status": "pending",
    "description": "Charge Discription",
    "extra": {
      "pay_info": "bax028781ovixf6i8xyf60be"
    }
  }
}

charge.close.success - 支付关单成功

charge.close.failed - 支付关单失败

refund.success - 退款成功

data参数中为一个 Refund对象

{
  "id": "0003288641923153920",
  "created": "1564736349",
  "livemode": true,
  "type": "refund.success",
  "data": {
    "charge_id": "002112019072917310300001847119303360512",
    "created": "1564736347000",
    "failure_code": "",
    "failure_msg": "",
    "fee_amt": "0.00",
    "id": "002112019080216590600003288632355946496",
    "status": "success",
    "amount": "0.04",
    "type": ""
  }
}

refund.failed - 退款失败

data参数中为一个 Refund对象

{
  "id": "0003288641923153920",
  "created": "1564736349",
  "livemode": true,
  "type": "refund.failed",
  "data": {
    "charge_id": "002112019072917310300001847119303360512",
    "created": "1564736347000",
    "failure_code": "channel_unexpected_error",
    "failure_msg": "支付渠道遇到未知错误。",
    "fee_amt": "0.00",
    "id": "002112019080216590600003288632355946496",
    "status": "failed",
    "amount": "0.04",
    "type": "channel_error"
  }
}