事件名 是否重发 描述 CC_CONSUME 是 卡消费 CC_REFUND 是 卡退款 CC_WITHDRAW_CASH 是 卡取现 CC_REDEEM 是 卡赎回 CC_RECHARGE 是 卡充值/抵押(使用API充值卡充值成功后的通知) 3DS_OTP 是 3DS验证码 3DS_CONFIRM 是 3DS确认编码 CR_RECHARGE 是 卡充值申请提交成功通知(仅IFrame场景下使用) CA_APPLY 是 卡申请提交成功通知 NE_VERIFY 是 验证类通知 KS_KYC 是 KYC通知(提交KYC认证后认证通过或者拒绝时的通知) CSC_STATUS_CHANGE 是 卡状态通知(卡状态发生变更时的通知,如:使用API激活卡、锁卡、解锁卡等操作的通知) MF_MATERIAL_FLOW 是 卡寄送物流通知(寄送卡片成功后的通知) CS_APPROVED 是 开卡成功通知(一张卡只会通知一次)
实体卡:卡状态变更为待激活时触发该通知
虚拟卡:卡状态为正常时触发该通知 CE_EVENT 是 卡事件通知(卡冻结和解冻时触发) CC_AUTHORIZATION 是 卡交易授权通知((仅适用于特定共享模式卡段)) KS_AUTH_RESULT 是 客户认证结果
参数名 类型 是否必填项 描述 event String 是 事件名 trace String 是 链路ID,同一笔交易的链路ID一样 orderNo String 是 订单号,全局唯一 timestamp Long 是 推送时间时间戳(毫秒) detail Object 是 推送内容,根据事件不同推送的格式也不一样
包含卡消费、卡退款、卡取现、卡赎回、卡充值/抵押
参数名 类型 是否必填项 描述 cardId String 是 卡唯一ID cardNumber String 是 卡号 orderNo String 是 订单号 customerNo String 是 客户编号 type int 是 交易类型(1=充值/抵押,2=消费,3=退款,4=取现,5=赎回,6=管理费) status int 是 交易状态(1=成功,2=失败,3=处理中,4=已入账,5=未入账,7=取消) amount BigDecimal 是 交易金额 direction int 是 收支方向(1=收入,2=支出) merchantName String 否 商户名 currency String 是 交易币种 transactionAt Long 是 交易时间 transactionId String 是 交易ID,同一笔交易的transactionId一致 originalAmount BigDecimal 否 原始交易金额 originalCurrency String 否 原始交易币种 reason String 否 失败原因 fee BigDecimal 否 交易手续费 thirdOrderNo String 否 第三方订单号(卡充值/抵押时有效) merchantMcc String 否 MCC merchantCategory String 否 商户类别 merchantCountry String 否 商户国家
参数名 类型 是否必填项 描述 cardId String 是 卡唯一ID cardNumber String 是 卡号 orderNo String 是 订单号 customerNo String 是 客户编号 3dsCode String 是 3DS验证码 merchants String 否 商户名 amount BigDecimal 否 交易金额 transactionCurrency String 否 交易币种 transactionTime Long 否 交易时间
参数名 类型 是否必填项 描述 cardId String 是 卡唯一ID cardNumber String 是 卡号 customerNo String 是 客户编号 type String 是 3DS确认类型(code / link) validateCode String 否 3DS验证码,type=code时有效 url String 否 3DS确认链接,type=link时有效 merchants String 是 商户名称 transactionTime Long 是 交易时间 amount BigDecimal 是 交易金额 transactionCurrency String 是 交易币种
参数名 类型 是否必填项 描述 cardId String 是 卡唯一ID orderNo String 是 订单号 customerNo String 是 客户编号 amount BigDecimal 是 实际支付金额 status Integer 是 支付状态(1:已支付 2:待支付) applyAt Long 是 申请时间
参数名 类型 是否必填项 描述 cardId String 是 卡唯一ID orderNo String 是 订单号 customerNo String 是 客户编号 cardNumber String 是 卡号 amount BigDecimal 是 实际支付金额 status Integer 是 支付状态(8:待支付) subscribeAt Long 是 申请时间
参数名 类型 是否必填项 描述 cardId String 是 卡唯一ID orderNo String 是 订单号 code String 是 验证码 cardNumber String 是 卡号 type String 是 类型(详见2.7验证通知类型) customerNo String 是 客户编号
参数名 描述 CARD_ACTIVATION 卡激活 LOCK_UNLOCK_CARD 卡锁定/解锁 TX_WDR_PWD_MODIFY 修改交易(取现)密码 TX_WDR_PWD_SET 设置交易(取现)密码 CAT_CARD 查看卡片
参数名 类型 是否必填项 描述 customerNo String 是 客户编号 documentType String 是 证件类型(1:身份证2:护照3:活体,4:驾驶证,5:居留证) status String 是 状态(1:已通过 2:已拒绝 3:认证中 4:未认证) 只推送1,2 reason String 否 认证拒绝原因(仅状态为已拒绝时有效)
参数名 类型 是否必填项 描述 cardId String 是 卡唯一ID cardNumber String 是 卡号 status String 是 状态 (1=正常,2=待激活,3=已冻结,4=已锁卡,5=已注销,6=申请中,7=激活中,8=锁卡中,9=解锁中,10=注销中,13=已拒绝,14=已取消,15=换卡中,16=已换卡) 只推送1,2,3,4,5,13 orderNo String 是 订单号 customerNo String 是 客户编号 reason String 否 原因
参数名 类型 是否必填项 描述 dispatchTime String 是 发货时间 logisticsOrderNo String 是 物流单号 logisticsCompanyName String 是 物流公司名 recipientAddress String 是 收件地址 logisticsImage String 是 物流照片 cardId String 是 卡唯一ID
参数名 类型 是否必填项 描述 orderNo String 是 订单号 cardId String 是 卡唯一ID cardNumber String 是 卡号 customerNo String 是 客户编号 cardStatus Integer 是 卡状态(1=正常,2=待激活)
实体卡:卡状态为待激活
虚拟卡:卡状态为正常
参数名 类型 是否必填项 描述 cardId String 是 卡唯一ID event String 是 事件类型(Frozen=已冻结,Unfrozen=已解冻) reason String 否 原因
参数名 类型 是否必填项 描述 cardId String 是 卡唯一ID cardNumber String 是 卡号 amount String 是 交易金额 currency String 是 交易币种 transactionId String 是 交易ID merchantMcc String 否 MCC authorizationId String 是 授权ID transactionChannel String 否 交易渠道
备注:当交易发生后,UPay 在完成前置风控及限制校验后,将通过 Webhook 向商户系统推送授权请求。商户需进行决策,并返回通过(approve)或者拒绝(decline)。若商户未在 2.5 秒内响应,该交易将因超时被拒绝。
对于授权接口,HTTP 响应状态码应返回 200,返回值为字符串类型:approve / decline.
代码示例
Java Go Python
public ResponseEntity<String> simulation(@RequestBody String body) {
//return ResponseEntity.status(status).body("decline");
return ResponseEntity.status(status).body("approve");
}
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func simulation(c *gin.Context) {
// 读取请求体
body, err := c.GetRawData()
if err != nil {
c.String(http.StatusBadRequest, "failed to read body")
return
}
// 如果需要用 body 做后续处理,可以在这里使用
_ = string(body) // body 是 []byte,可以转为 string 使用
// 返回 "approve"
c.String(http.StatusOK, "approve")
}
from flask import Flask, request, make_response
app = Flask(__name__)
@app.route('/simulation', methods=['POST'])
def simulation():
# 读取请求体
body = request.get_data(as_text=True)
# 如果需要用 body 做后续处理,可以在这里使用
# body 是字符串类型
# 返回 "approve"
return make_response("approve", 200)
参数名 类型 是否必填项 描述 customerNo String 是 客户编号 status String 是 状态(1:已通过 2:已拒绝 3:认证中 4:未认证) reason String 否 认证拒绝原因(仅状态为已拒绝时有效)