- 使用云函数+云调用,四步实现微信支付
微信支付是云开发原生支持的微信生态能力之一,开发者只需要简单调用相应的函数即可完成整套支付流程,安全又高效。部分优势包括: 无需关心证书、签名,支付流程简化;基于微信私有协议和私有链路,更加安全、高效;免运维,高可用性;按需扩容,弹性伸缩,按量计费,成本缩减;支持通过云函数接受支付回调,无需自建回调服务。流程对比:传统流程 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
2021-07-08 - 微信支付用云函数实现notify_url
没有自己的服务器,怎么用云函数来接收微信支付成功异步通知呢。 步骤如下: (因论坛审核机制,就不上图片了,否则可能触发人工审核) 打开小程序开发工具; 1、云控制台中,点击:设置--环境设置--充值与账单; 此时会跳到腾讯云; 2、点击:账号中心--访问管理; 此时会跳到腾讯云控制台; 3、在左上角点击:云产品--找到:云开发CloudBase; 此时出现小程序的云环境列表 4、选择某个云环境; 5、点击:访问服务; 6、新建一个HTTP访问服务;将一个公网域名URL与一个云函数关联; 比如云函数名:pay_notify与https://<http访问服务的默认域名>/pay_notify关联。 7、在统一下单里,将notify_url设为:https://<http访问服务的默认域名或自定义域名>/pay_notify 此时,可以在pay_notify中处理来自微信支付的异步通知了; 那这个云函数的入口参数是什么样的呢?接口文档: https://cloud.tencent.com/document/product/876/41776 8、固定IP的配置:可以在此处腾讯云中配置,也可以在小程序开发工具的云控制台配置:某云函数--配置--高级设置--固定IP。 9、pay_notify的代码实例:以微信支付V2为例。 const cloud = require('wx-server-sdk') const xml2js = require('xml2js') const crypto = require('crypto') const config = require('./config.js') const key = config.key cloud.init({env: cloud.DYNAMIC_CURRENT_ENV}) const db = cloud.database() const _ = db.command const col = db.collection('payments') exports.main = async event => { let xml = Buffer.from(event.body, 'base64').toString() let payment = await parseXML(xml) if(signVerify(payment)){}else return 'denied' await onPayment(payment) //业务处理 return `` } 至此,不用服务器,通过云函数,就实现了微信支付notify_url的全部功能。
2021-04-28