CodeSample小助手 2020-04-02
如果您尚未注册支付宝小程序账号,使用支付宝账号登录蚂蚁金服开放平台,并完成企业开发者身份注册。详细信息,请参见开发者入驻说明。
详细信息,请参见下载说明。
小程序开发中创建的云资源会和服务空间进行关联。每个服务空间都有一个全局唯一的space ID。在使用云资源时,都通过这个space ID进行关联。参考以下步骤,创建服务空间并设置数据库权限:
参考以下步骤,在蚂蚁金服开放平台创建支付宝小程序:
您可以通过RSA密钥生成工具一键生成小程序密钥。接口加签方式有普通公钥和证书公钥两种,主要用于签名和验证。其中私钥由开发者保存,公钥可对外公开,私钥用于签名,公钥用于验证签名。开发者需要保存自己的私钥,通过支付宝提供的公钥进行通信来保证信息传输的完整性以及发送者身份的真实性。详细信息,请参见生成支付宝RSA密钥。
在开发前,您需要将支付宝小程序信息添加到阿里云小程序Serverless控制台。
完成以下操作,添加支付宝小程序信息:
appId: '2021*********', // 小程序应用标识
spaceId: 'ca8eb10f-26c1-4bee-**********', // 服务空间标识
clientSecret: 'Xckz2************', // 服务空间 secret key
endpoint: 'https://api.************' // 服务空间地址,从小程序Serverless控制台处获得
在使用小程序Serverless服务前,需要您在小程序中安装小程序Serverless客户端SDK并初始化。小程序Serverless客户端SDK的更多信息请参见安装客户端SDK2.2版本。
// client/app.js
import MPServerless from '@alicloud/mpserverless-sdk';
const mpserverless = new MPServerless({
uploadFile: my.uploadFile,
request: my.request,
getAuthCode: my.getAuthCode,
}, {
appId: ' ', // 小程序应用标识
spaceId: ' ', // 服务空间标识
clientSecret: ' ', // 服务空间 secret key
endpoint: ' ' // 服务空间地址,从小程序Serverless控制台处获得
});
要使用小程序云提供的扩展能力,您需要先在控制台开通云调用功能,然后在小程序中安装云调用SDK并进行初始化。
在调用小程序Serverless服务前,需要先调用authorize接口请求授权,支付宝小程序的授权请求参数authProvider应为alipay_openapi, 更多信息请参见authorize。
// client/app.js
import cloud from 'alipay-serverless-sdk';
cloud.init(my.serverless);
App({
async onLaunch(options) {
var res = await my.serverless.user.authorize({
authProvider: 'alipay_openapi',
});
},
});
以下代码调用payment.common.create和cloud.payment.huabei.create接口实现了创建直接付款订单和花呗分期付款交易能力,更多直接付款和花呗分期接口信息请参见payment.common.create和payment.huabei.create。
async tradeCreate() {
let createRes
if (this.data.checked === '1') {
// 直接付款
createRes = await cloud.payment.common.create('小程序Serverless支付测试', "demo" + new Date().getTime(), '0.03', this.data.userId);
} else {
// 花呗分期
var huabeiConfig = new Object({
hbFqNum: "3",
hbFqSellerPercent: "100"
});
createRes = await cloud.payment.huabei.create('小程序Serverless支付测试', "demo" + new Date().getTime(), '0.03', this.data.userId, huabeiConfig);
}
this.setData({
tradeNO: createRes.tradeNo,
outTradeNo: createRes.outTradeNo
})
return createRes.tradeNo
},
以下代码调用my.tradePay支付宝开放能力API唤起支付宝收银台进行支付,更多小程序支付信息请参见小程序支付。
async onRepeatPayHandler(data) {
my.tradePay({
tradeNO: this.data.tradeNO,
success: async (res) => {
if (res.resultCode === "9000") {
my.alert({
title: '支付成功',
content: res.resultCode,
});
const value = data.currentTarget.dataset.item
const { key } = value
const { paymentHistory } = this.data
paymentHistory.map(v => {
if (v.key === key) {
v.tradeStatus = 'TRADE_SUCCESS'
}
})
my.serverless.db.collection('payment').updateOne({
key
}, {
$set: {
tradeStatus: 'TRADE_SUCCESS'
}
})
this.setData({
paymentHistory
})
}
},
});
},
以下代码调用payment.common.refund云调用接口进行退款操作,更多信息请参见payment.common.refund。
async onRefundPayHandler(data) {
const value = data.currentTarget.dataset.item
const { outTradeNo, totalAmount, key } = value
const rs = await cloud.payment.common.refund(outTradeNo, String(totalAmount))
if (rs.code === "10000") {
my.showToast({
content: '退款成功',
});
const { paymentHistory } = this.data
paymentHistory.map(v => {
if (v.key === key) {
v.tradeStatus = 'TRADE_CLOSED'
}
})
this.setData({
paymentHistory
})
my.serverless.db.collection('payment').updateOne({
key
}, {
$set: {
tradeStatus: 'TRADE_CLOSED'
}
})
} else {
my.showToast({
content: '退款失败',
});
}
console.log(rs)
},