使用云函数和云调用的最佳实践:四步轻松实现微信支付
概述
微信支付是云开发原生支持的微信生态能力之一,开发者只需要简单调用相应的函数即可完成整套支付流程,安全又高效。部分优势包括:
- 无需关心证书、签名,支付流程简化;
- 基于微信私有协议和私有链路,更加安全、高效;
- 免运维,高可用性;
- 按需扩容,弹性伸缩,按量计费,成本缩减;
- 支持通过云函数接受支付回调,无需自建回调服务。
流程对比:传统流程 vs 云开发
代码示例
第 1 步:小程序调用云函数
C 端用户发起支付流程后,小程序端调用云函数(此处假设云函数名为 makeOrder
):
// 小程序代码
wx.cloud.callFunction({
name: "makeOrder",
data: {
/* 开发者自定义参数 */
}
});
第 2 步:云函数生成订单,返回订单信息
云函数 makeOrder 收到调用之后,使用微信服务端 SDK 提供的 API,无需证书和签名,可直接生成订单。
生成订单之后,利用 CloudPay.unifiedOrder() 统一下单接口,将订单信息返回给小程序。
CloudPay.unifiedOrder() 接口文档:
https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/open/pay/CloudPay.unifiedOrder.html
// 云函数 makeOrder
const cloud = require("wx-server-sdk");
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
});
exports.main = async (event, context) => {
const res = await cloud.cloudPay.unifiedOrder({
body: "小秋TIT店-超市",
outTradeNo: "1217752501201407033233368018",
spbillCreateIp: "127.0.0.1",
subMchId: "1900009231",
totalFee: 1,
envId: "test-f0b102",
functionName: "payCallback" // 支付回调的函数名
});
return res;
};
第 3 步:小程序端发起支付
小程序端收到云函数返回的订单信息后,发起支付:
// 小程序代码
wx.cloud.callFunction({
name: "makeOrder",
data: {
/* 开发者自定义参数 */
},
success: (res) => {
// 取得云函数返回的订单信息
const payment = res.result.payment;
// 调起微信客户端支付
wx.requestPayment({
...payment,
success(res) {
/* 成功回调 */
},
fail(res) {
/* 失败回调 */
}
});
}
});
第 4 步:使用云函数接收支付回调,完成支付流程
用户完成付款之后,微信后台将会调用指定的云函数(此处假设名为 payCallback),传入的参数中会带有订单信息。
开发者可以在此云函数中,实现自己的发货、完成订单的逻辑。
// 云函数 payCallback
exports.main = async (event, context) => {
const {
return_code, // 状态码
appid, // 小程序 AppID
mch_id, // 微信支付的商户号
device_info, // 微信支付分配的终端设备号
openid, // 用户在商户appid下的唯一标识
trade_type, // 交易类型:JSAPI、NATIVE、APP
bank_type // 银行类型
// ......
// 更多参数请参考:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7&index=8
} = event;
/*
开发者自己的逻辑
*/
// 向微信后台返回成功,否则微信后台将会重复调用此函数
return { errcode: 0 };
};
相关文档:
云函数文档:
https://docs.cloudbase.net/cloud-function/introduce.html
云调用文档:
https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/openapi/openapi.html
wx-server-sdk 文档:
https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/Cloud.html
CloudPay.unifiedOrder() 接口文档:
https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/open/pay/CloudPay.unifiedOrder.html
推荐阅读
-
35 岁实现财务*,腾讯程序员手握2300万提前退休?-1000万房产、1000万腾讯股票、加上300万的现金,一共2300万的财产。有网友算了一笔账,假设1000万的房产用于自住,剩下1300万资产按照平均税后20-50万不等进行计算,大约花上26-60年左右的时间才能赚到这笔钱。也就是说,普通人可能奋斗一辈子,才能赚到这笔钱。在很多人还在为中年危机而惶惶不可终日的时候,有的人的35岁,就已经安全着陆,试问哪个打工人不羡慕?但问题是有这样财富积累必然有像样的实力做靠山。没有人可以不劳而获。 看到这里,肯定有人说,那么对于普通人来说,卷可能真就成了唯一的出路。但是卷也有轻松的卷,“偷懒”的卷法,对于程序员而言,刨除掉一时无法改掉的开会传统占用的大部分时间,如何把有限的时间和精力放在真正重要的架构设计、需求设计上,而不是重复的造*,编码、改bug、手动测试。因此在科技改变生活的今天,学会使用AI工具成为程序员们的必备技能。 以全栈式全自动的软件开发工具飞算SoFlu软件机器人为例,作为全球首款面向微服务架构设计和最佳实践的软件机器人,SoFlu软件机器人改变了原来手工编码的作业模式,通过可视化拖拽方式以及参数配置就能实现等同于编写复杂代码的业务逻辑,在设计业务逻辑时就完成了微服务应用开发,做到“业务即图,图即代码”,实现“软件开发,十倍提效”。 而作为飞算SoFlu软件机器人的一个重要组成部分,FuncGPT(慧函数)支持所有类型函数创建。通过自然语言描述Java函数需求,实时生成高质量、高可读性的Java函数代码。生成代码可直接复制到IDEA,或一键导入Java全自动开发工具函数库。 FuncGPT(慧函数)具有五大核心能力: ● 自然语言:通过自然语言即可生成函数,降低软件开发门槛。 ● 秒级函数开发:全自动秒级开发函数,秒级完成,效率千倍提升。 ● 一站式函数开发应用:函数生成即可直接应用,效率、安全有保障。 ● 质量可靠:生成的函数代码符合业界规范、具备良好的可读性,符合最优解。 ● 灵活生成:可以根据开发人员的具体需求生成并支持调整和修改。 以“将文件流转换为File对象”这个需求为例,以下是FuncGPT(慧函数)秒级生成的代码: / 类名:FileConverter // 函数名:convertStreamToFile // 函数功能:将文件流转换为File对象 // POM依赖包:无 import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; public class FileConverter { /** * 将文件流转换为File对象 * @param inputStream 文件流 * @param filePath 文件路径 * @param fileName 文件名 * @return 转换后的File对象 * @throws IOException 如果发生I/O异常 */ public static File convertStreamToFile(InputStream inputStream, String filePath, String fileName) throws IOException { File file = new File(filePath + File.separator + fileName); // 创建File对象 try (FileOutputStream outputStream = new FileOutputStream(file)) { // 创建文件输出流 byte buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { // 从文件流读取数据并写入文件 outputStream.write(buffer, 0, bytesRead); } } return file; // 返回转换后的File对象 } } // 函数示例 // 将文件流转换为File对象示例 // 入参:inputStream,文件流 // 入参:filePath,文件路径 // 入参:fileName,文件名 // 出参:file,转换后的File对象 // 调用示例: // InputStream inputStream = new FileInputStream("example.txt"); // String filePath = "C:\\Users\\User\\Documents"; // String fileName = "example.txt"; // File file = FileConverter.convertStreamToFile(inputStream, filePath, fileName); // System.out.println(file.getAbsolutePath); // 输出结果:例如,将文件流转换为File对象后,文件的绝对路径为:C:\Users\User\Documents\example.txt // 则输出结果为:C:\Users\User\Documents\example.txt 通过分析,不难发现以上代码:
-
使用云函数和云调用的最佳实践:四步轻松实现微信支付