decryptPayCallback
支付回调参数解密
使用示例
ts
import { WechatService } from 'nest-wxpay'
import type { PayCallbackResponse, Order } from 'nest-wxpay'
@Injectable()
export class Controller {
constructor(private readonly wechatService: WechatService) {}
@Post('callback')
async callback(
@Body() body: PayCallbackResponse,
@Headers() headers: Record<string, string>
): Promise<Order> {
const timestamp = headers['Wechatpay-Timestamp']
const nonce = headers['Wechatpay-Nonce']
const signature = headers['Wechatpay-Signature']
const result = await this.wechatService.verifySign({
nonce,
signature,
timestamp,
requestBody: JSON.stringify(body)
})
if (result) {
const { resource: { ciphertext, associated_data } } = requestBody
return this.wechatService.decryptPayCallback({
nonce,
ciphertext,
associated_data
})
}
}
}
参数解析
PayCallbackResource
字段名 | 类型 | 是否必填 | 用途 |
---|---|---|---|
algorithm | string | 是 | 对开启结果数据进行加密的加密算法,目前只支持AEAD_AES_256_GCM |
ciphertext | string | 是 | Base64编码后的开启/停用结果数据密文 |
associated_data | string | 是 | 附加数据 |
original_type | string | 是 | 原始回调类型,为transaction |
nonce | string | 是 | 加密使用的随机串 |
PayCallbackResponse
字段名 | 类型 | 是否必填 | 用途 |
---|---|---|---|
id | string | 是 | 通知的唯一ID |
create_time | string | 是 | 通知创建的时间,遵循rfc3339标准格式 |
event_type | string | 是 | 通知的类型,支付成功通知的类型为TRANSACTION.SUCCESS |
resource_type | string | 是 | 通知的资源数据类型,支付成功通知为encrypt-resource |
resource | PayCallbackResource | 是 | 通知资源数据 |
响应参数
CommRespPayerInfo
字段名 | 类型 | 是否必填 | 用途 |
---|---|---|---|
openid | string | 否 | 用户唯一标识 |
CommRespAmountInfo
字段名 | 类型 | 是否必填 | 用途 |
---|---|---|---|
total | number | 否 | 总金额,单位为分 |
payer_total | number | 否 | 支付者支付金额,单位为分 |
currency | string | 否 | 货币类型 |
payer_currency | string | 否 | 支付者货币类型 |
CommRespSceneInfo
字段名 | 类型 | 是否必填 | 用途 |
---|---|---|---|
device_id | string | 否 | 设备ID |
GoodsDetailInPromotion
字段名 | 类型 | 是否必填 | 用途 |
---|---|---|---|
goods_id | string | 是 | 商品ID |
quantity | number | 是 | 商品数量 |
unit_price | number | 是 | 商品单价,单位为分 |
discount_amount | number | 是 | 折扣金额,单位为分 |
goods_remark | string | 否 | 商品备注 |
PromotionDetail
字段名 | 类型 | 是否必填 | 用途 |
---|---|---|---|
coupon_id | string | 是 | 优惠券ID |
name | string | 否 | 优惠券名称 |
scope | 'GLOBAL' | 'SINGLE' | 否 |
type | 'CASH' | 'NOCASH' | 否 |
amount | number | 是 | 优惠金额,单位为分 |
stock_id | string | 否 | 库存ID |
wechatpay_contribute | number | 否 | 微信支付出资金额,单位为分 |
merchant_contribute | number | 否 | 商户出资金额,单位为分 |
other_contribute | number | 否 | 其他出资金额,单位为分 |
currency | string | 否 | 货币类型 |
goods_detail | GoodsDetailInPromotion[] | 否 | 商品详情 |
Order
字段名 | 类型 | 是否必填 | 用途 |
---|---|---|---|
appid | string | 是 | 应用ID |
machid | string | 是 | 商户ID |
out_trade_no | string | 是 | 商户订单号 |
transaction_id | string | 否 | 微信支付订单号 |
trade_type | 'JSAPI' | 'NATIVE' | 'APP' |
trade_state | 'SUCCESS' | 'REFUND' | 'NOTPAY' |
trade_state_desc | string | 是 | 交易状态描述 |
bank_type | string | 否 | 银行类型 |
attach | string | 否 | 附加数据 |
success_time | string | 否 | 支付成功时间 |
payer | CommRespPayerInfo | 否 | 支付者信息 |
amount | CommRespAmountInfo | 否 | 订单金额信息 |
scene_info | CommRespSceneInfo | 否 | 场景信息 |
promotion_detail | PromotionDetail[] | 否 | 优惠详情 |