支付宝当面付
支付宝当面付是 T1 后端云云函数结合了 支付宝官方 SDK
封装的支付组件,在支付宝官方 SDK 原有的基础上进行封装,使得使用非常简单,仅需两行代码即可实现在线支付功能!
在使用之前,应当前往支付宝开放平台
,申请支付宝当面付(属于支付宝门槛最低的支付通道类型,个人也可申请),并创建应用,获取 App ID
,支付宝公钥
、私钥
,并填入仪表盘 -> 应用 -> 设置 -> 支付配置中保存即可(支持支付宝 Sandbox 环境,详情请阅读支付宝官方文档)。
WARNING
注意支付宝支付功能仅仅只是 T1 后端云云函数(JavaScript)内置的支付宝官方 SDK,平台并不参与集中收款等手段,收款资金都是实时到账自己支付宝账户。用户必须通过支付宝官方申请,符合申请条件才能使用!
创建订单
语法
- name 商品名称
- sys_out_trade_no 订单号
- total_amount 订单金额
- notify_url 异步通知地址
- return_url 同步通知地址
const qr_code = alipay.create(
name,
sys_out_trade_no,
total_amount,
notify_url,
return_url,
)
创建订单成功后,该函数返回付款 URL,必须生成二维码供用户扫描才可付款。
代码示例
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()
方法验证当前请求是不是支付宝官方服务器发送出来的,确保支付安全。
语法
alipay.notifySignVerify()
该方法返回一个 boolean 值,表示当前请求是不是支付宝官方服务器发送出来的,该方法的结果是可信的。
代码示例
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、订单状态等信息。当用户付款成功判断订单状态是否为未处理,如果为未处理,则修改订单状态为已处理,并修改用户余额。