1. 推送事件

事件名是否重发描述
CC_CONSUME卡消费
CC_REFUND卡退款
CC_WITHDRAW_CASH卡取现
CC_REDEEM卡赎回
CC_RECHARGE卡充值/抵押(使用API充值卡充值成功后的通知)
3DS_OTP3DS验证码
3DS_CONFIRM3DS确认编码
CR_RECHARGE卡充值申请提交成功通知(仅IFrame场景下使用)
CA_APPLY卡申请提交成功通知
NE_VERIFY验证类通知
KS_KYCKYC通知(提交KYC认证后认证通过或者拒绝时的通知)
CSC_STATUS_CHANGE卡状态通知(卡状态发生变更时的通知,如:使用API激活卡、锁卡、解锁卡等操作的通知)
MF_MATERIAL_FLOW卡寄送物流通知(寄送卡片成功后的通知)
CS_APPROVED开卡成功通知(一张卡只会通知一次)
实体卡:卡状态变更为待激活时触发该通知
虚拟卡:卡状态为正常时触发该通知
CE_EVENT卡事件通知(卡冻结和解冻时触发)
CC_AUTHORIZATION卡交易授权通知((仅适用于特定共享模式卡段))

2.全局推送格式

参数名类型是否必填项描述
eventString事件名
traceString链路ID,同一笔交易的链路ID一样
orderNoString订单号,全局唯一
timestampLong推送时间时间戳(毫秒)
detailObject推送内容,根据事件不同推送的格式也不一样

2.1. 卡交易推送格式

包含卡消费、卡退款、卡取现、卡赎回、卡充值/抵押

参数名类型是否必填项描述
cardIdString卡唯一ID
cardNumberString卡号
orderNoString订单号
customerNoString客户编号
typeint交易类型(1=充值/抵押,2=消费,3=退款,4=取现,5=赎回,6=管理费)
statusint交易状态(1=成功,2=失败,3=处理中,4=已入账,5=未入账,7=取消)
amountBigDecimal交易金额
directionint收支方向(1=收入,2=支出)
merchantNameString商户名
currencyString交易币种
transactionAtLong交易时间
transactionIdString交易ID,同一笔交易的transactionId一致
originalAmountBigDecimal原始交易金额
originalCurrencyString原始交易币种
reasonString失败原因
feeBigDecimal交易手续费
thirdOrderNoString第三方订单号(卡充值/抵押时有效)
merchantMccStringMCC
merchantCategoryString商户类别
merchantCountryString商户国家

2.2. 3DS OTP推送格式

参数名类型是否必填项描述
cardIdString卡唯一ID
cardNumberString卡号
orderNoString订单号
customerNoString客户编号
3dsCodeString3DS验证码
merchantsString商户名
amountBigDecimal交易金额
transactionCurrencyString交易币种
transactionTimeLong交易时间

2.3. 3DS确认推送格式

参数名类型是否必填项描述
cardIdString卡唯一ID
cardNumberString卡号
customerNoString客户编号
typeString3DS确认类型(code / link)
validateCodeString3DS验证码,type=code时有效
urlString3DS确认链接,type=link时有效
merchantsString商户名称
transactionTimeLong交易时间
amountBigDecimal交易金额
transactionCurrencyString交易币种

2.4. 卡申请提交成功通知推送格式

参数名类型是否必填项描述
cardIdString卡唯一ID
orderNoString订单号
customerNoString客户编号
amountBigDecimal实际支付金额
statusInteger支付状态(1:已支付 2:待支付)
applyAtLong申请时间

2.5. 充值申请提交成功通知推送格式(仅IFrame场景下使用)

参数名类型是否必填项描述
cardIdString卡唯一ID
orderNoString订单号
customerNoString客户编号
cardNumberString卡号
amountBigDecimal实际支付金额
statusInteger支付状态(8:待支付)
subscribeAtLong申请时间

2.6. 验证类通知推送格式

参数名类型是否必填项描述
cardIdString卡唯一ID
orderNoString订单号
codeString验证码
cardNumberString卡号
typeString类型(详见2.7验证通知类型)
customerNoString客户编号

2.7. 验证类通知类型

参数名描述
CARD_ACTIVATION卡激活
LOCK_UNLOCK_CARD卡锁定/解锁
TX_WDR_PWD_MODIFY修改交易(取现)密码
TX_WDR_PWD_SET设置交易(取现)密码
CAT_CARD查看卡片

2.8. KYC通知推送格式

参数名类型是否必填项描述
customerNoString客户编号
documentTypeString证件类型(1:身份证2:护照3:活体,4:驾驶证,5:居留证)
statusString状态(1:已通过 2:已拒绝 3:认证中 4:未认证) 只推送1,2
reasonString认证拒绝原因(仅状态为已拒绝时有效)

2.9. 卡状态通知推送格式

参数名类型是否必填项描述
cardIdString卡唯一ID
cardNumberString卡号
statusString状态 (1=正常,2=待激活,3=已冻结,4=已锁卡,5=已注销,6=申请中,7=激活中,8=锁卡中,9=解锁中,10=注销中,13=已拒绝,14=已取消,15=换卡中,16=已换卡) 只推送1,2,3,4,5,13
orderNoString订单号
customerNoString客户编号
reasonString原因

2.10. 卡寄送物流通知推送格式

参数名类型是否必填项描述
dispatchTimeString发货时间
logisticsOrderNoString物流单号
logisticsCompanyNameString物流公司名
recipientAddressString收件地址
logisticsImageString物流照片
cardIdString卡唯一ID

2.11. 开卡成功通知推送格式

参数名类型是否必填项描述
orderNoString订单号
cardIdString卡唯一ID
cardNumberString卡号
customerNoString客户编号
cardStatusInteger卡状态(1=正常,2=待激活)
实体卡:卡状态为待激活
虚拟卡:卡状态为正常

2.12 卡事件推送格式

参数名类型是否必填项描述
cardIdString卡唯一ID
eventString事件类型(Frozen=已冻结,Unfrozen=已解冻)
reasonString原因

2.13 卡交易授权通知(仅适用于特定共享模式卡段)

参数名类型是否必填项描述
cardIdString卡唯一ID
cardNumberString卡号
amountString交易金额
currencyString交易币种
transactionIdString交易ID
merchantMccStringMCC
authorizationIdString授权ID
transactionChannelString交易渠道

备注:当交易发生后,UPay 在完成前置风控及限制校验后,将通过 Webhook 向商户系统推送授权请求。商户需进行决策,并返回通过(approve)或者拒绝(decline)。若商户未在 2.5 秒内响应,该交易将因超时被拒绝。

对于授权接口,HTTP 响应状态码应返回 200,返回值为字符串类型:approve / decline.

代码示例

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)