Skip to content

支付宝当面付

支付宝当面付是 T1 后端云云函数结合了 支付宝官方 SDK 封装的支付组件,在支付宝官方 SDK 原有的基础上进行封装,使得使用非常简单,仅需两行代码即可实现在线支付功能!

在使用之前,应当前往支付宝开放平台,申请支付宝当面付(属于支付宝门槛最低的支付通道类型,个人也可申请),并创建应用,获取 App ID支付宝公钥私钥,并填入仪表盘 -> 应用 -> 设置 -> 支付配置中保存即可(支持支付宝 Sandbox 环境,详情请阅读支付宝官方文档)。

WARNING

注意支付宝支付功能仅仅只是 T1 后端云云函数(JavaScript)内置的支付宝官方 SDK,平台并不参与集中收款等手段,收款资金都是实时到账自己支付宝账户。用户必须通过支付宝官方申请,符合申请条件才能使用!

创建订单

语法

  • name 商品名称
  • sys_out_trade_no 订单号
  • total_amount 订单金额
  • notify_url 异步通知地址
  • return_url 同步通知地址
js
const qr_code = alipay.create(
    name,
    sys_out_trade_no,
    total_amount,
    notify_url,
    return_url,
)

创建订单成功后,该函数返回付款 URL,必须生成二维码供用户扫描才可付款。

代码示例

js
function main() {
    const name = '测试商品' // 商品名称
    /*** 生成不重复的订单号 Start ***/
    const timestamp = new Date().getTime() // 获取当前时间戳
    const randomDigits = Math.floor(Math.random() * 1000000)
        .toString()
        .padStart(6, '0') // 生成6位随机数字
    const sys_out_trade_no = `${timestamp}${randomDigits}` // 订单号(不能重复)
    /*** 生成不重复的订单号 End ***/
    const total_amount = '0.01' // 订单金额
    const notify_url = 'https://api.t1y.net/1001/notify' // 异步通知地址(请指向异步通知云函数地址,见下文)
    const return_url = 'https://www.baidu.com/' // 同步通知地址(支付成功后跳转的URL)
    const qr_code = alipay.create(
        name,
        sys_out_trade_no,
        total_amount,
        notify_url,
        return_url,
    ) // 创建订单并得到付款URL
    if (qr_code == null) {
        return '订单创建失败'
    }
    console.warn('付款URL:' + qr_code) // 该付款URL需生成二维码供用户扫描
    const qrcode = tool.createQRCode(qr_code, 256) // 生成一张256x256像素的二维码
    if (qrcode == null) {
        return '生成二维码失败'
    }
    ctx.setHeader('Content-Type', 'text/html') // 设置为网页模式
    return `<img src="data:image/png;base64,` + qrcode + `"/>` // 返回二维码
}

将以上代码粘贴到云函数中,若支付宝配置没有问题,访问云函数即可返回一个付款二维码。

异步通知

当用户付款成功后,支付宝官方服务器会向异步通知地址发送一个 POST 请求,该请求中包含订单号、金额、签名等信息。我们需要使用alipay.notifySignVerify() 方法验证当前请求是不是支付宝官方服务器发送出来的,确保支付安全。

语法

js
alipay.notifySignVerify()

该方法返回一个 boolean 值,表示当前请求是不是支付宝官方服务器发送出来的,该方法的结果是可信的。

代码示例

js
function main() {
    // 该云函数用于提供给支付宝服务器异步通知
    const body = ctx.getBody() // 读取支付宝服务器发送的详细数据
    console.log(body)
    if (alipay.notifySignVerify()) {
        // 验证签名是不是支付宝服务器发出的,只有验证成功才执行业务逻辑(可能存在有人伪冒支付宝服务器发送请求,签名验证是必须的,确保安全)
        console.success('签名验证成功')
        if (ctx.postForm('trade_status') == 'TRADE_SUCCESS') {
            // 判断是否付款成功
            // 付款成功,在这里编写业务逻辑,例如:修改数据库中的用户余额,为用户增加余额
            console.success('付款成功')
        } else {
            console.warn('取消付款或付款失败') // 详细的 trade_status 状态请阅读支付宝开发文档
        }
        return 'success'
    }
    console.error('签名验证失败')
    return 'fail'
}

实战说明

在创建订单时应当在数据库中创建相应的订单以及相应的操作数据,当用户付款成功时,应当判断当前订单有没有处理完成,避免二次充值,并修改订单状态。

举例

例如创建订单时,在数据库中创建订单,订单中应当包含订单号、金额、用户 ID、订单状态等信息。当用户付款成功判断订单状态是否为未处理,如果为未处理,则修改订单状态为已处理,并修改用户余额。

技术支持、市场合作:wwwanghua@outlook.com