微信小程序云开发支付功能——支付结果通知回调云函数pay_cb传递自定义参数

微信小程序云开发的基本流程:https://blog.youkuaiyun.com/i826056899/article/details/144770162

其中微信小程序使用云开发进行回调时我们使用了如下的方法:

// 云函数代码
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" : "请传入终端 ip 地址,支持 ipv6", // 终端 IP
    "subMchId" : "1900009231", // 商户号
    "totalFee" : 1, // 总金额
    "envId": "test-f0b102", // 云函数环境名称
    "functionName": "pay_cb" // 支付结果通知回调云函数名
  })
  return res
}

在上面的 调用过程中,我们传递了支付结果通知回调云函数pay_cb。本篇我们分析为什么需要这个云函数,以及如何使用这个云函数。

1. 为什么需要这个参数

// 小程序代码
wx.cloud.callFunction({
  name: '函数名',
  data: {
    // ...
  },
  success: res => {
    const payment = res.result.payment
    wx.requestPayment({
      ...payment,
      success (res) {
        console.log('pay success', res)
      },
      fail (err) {
        console.error('pay fail', err)
      }
    })
  },
  fail: console.error,
})

使用上述代码进行支付,当打印pay success时,并不意味着一定支付成功。这里的success只是客户端正确完成了支付完成这个过程,并不意味着实际收到了支付。比如由于网络原因,客户端这里已经完成了支付操作,但是由于信息没有发送到服务端,此时本地依然会打印pay success,但是实际付款并没有成功。

解决方法就是使用这里的functionName参数。因为这里的回调函数只有服务端收到支付后才会回调。

2. 如何使用

支付回调函数的作用

支付回调函数主要用于接收微信支付结果通知,商户服务器需要在收到通知后进行相应的处理,比如更新订单状态等。

支付回调函数的参数

支付回调函数通常会接收到以下参数:

  • transactionId:微信支付订单号
  • outTradeNo:商户订单号
  • totalFee:订单总金额
  • resultCode:支付结果代码,如 SUCCESS 表示支付成功
  • timeEnd:支付完成时间
支付回调函数的示例

以下是一个简单的支付回调函数示例:

function pay_cb(params) {
  const { transactionId, outTradeNo, totalFee, resultCode, timeEnd } = params;

  if (resultCode === 'SUCCESS') {
    // 支付成功,更新订单状态等操作
    console.log('支付成功', transactionId, outTradeNo, totalFee, timeEnd);
    // 更新订单状态为已支付
    updateOrderStatus(outTradeNo, 'paid');
  } else {
    // 支付失败,处理失败情况
    console.log('支付失败', resultCode);
    // 更新订单状态为支付失败
    updateOrderStatus(outTradeNo, 'failed');
  }
}

function updateOrderStatus(orderId, status) {
  // 这里实现更新订单状态的逻辑,比如调用数据库接口等
  console.log(`更新订单 ${orderId} 状态为 ${status}`);
}

3. 传递自定义参数 

以上流程通常可以完成支付流程。但是有时候又会带来更多的麻烦,一个典型的应用场景是我们希望支付成功后修改数据库的内容,比如自动记录总的收款,或者记录某个用户的总支出。

但是由于这是个回调函数,默认传递过来的参数可能不包含一些信息比如数据库中用户id,一个更好的解决方法是使用其中的attach字段,传递自定义参数。

 只不过attach只能传递字符串,不过也足够了,我们可以把我们想要的信息使用逗号拼合,在回调函数中再分割即可。

<think>好的,我现在需要帮助用户了解如何在微信小程序中正确处理支付回调。首先,我需要明确用户的需求。用户已经看过一些参考资料,可能对支付回调的基本流程有一定了解,但需要具体的处理方法和示例代码。 首先,我应该回顾微信小程序支付的整个流程。根据引用[3],流程分为三个接口:统一下单、生成支付参数支付结果通知支付回调属于第三个环节,即支付结果通知。这里需要注意,微信支付V3版本和之前的版本可能有所不同,但用户提到的是JSAPI-V3,所以需要确保示例代码符合V3的规范。 接下来,支付回调的处理需要几个关键步骤。首先,商户服务器需要配置支付通知回调地址,这个地址在统一下单接口中指定。然后,当用户完成支付后,微信服务器会向这个地址发送POST请求,携带支付结果的数据。商户服务器需要验证这个请求的合法性,处理业务逻辑,并返回正确的响应。 验证请求的合法性非常重要。根据微信支付的文档,回调请求会带有签名,服务器需要使用微信支付的API密钥进行验签,确保请求来自微信,防止伪造请求。引用[2]提到支付回调函数需要接收通知并进行处理,比如更新订单状态。因此,在示例代码中,需要包含验签的步骤。 然后,处理业务逻辑。验证通过后,服务器需要解析回调中的数据,如订单号、支付状态等,并更新本地数据库中的订单状态。同时,需要处理可能出现的重复通知问题,微信可能会多次发送回调,因此需要确保处理的幂等性。 接下来是示例代码部分。用户可能需要Node.js的示例,但根据引用[4],示例中有使用wx.request进行网络请求,但支付回调是在服务端处理的。因此,应该提供服务器端的代码示例,比如使用Node.js或Java。由于用户提供的引用中有Java和云开发的例子,可能需要兼顾不同的技术栈,但根据问题描述,用户可能更倾向于云开发或Node.js。 另外,引用[1]提到使用小程序云开发实现支付功能,可能涉及到云函数的使用。云开发支付回调可以使用云函数来处理,但同样需要验证签名和更新订单状态。因此,可能需要分别提供云函数和传统服务器的处理示例。 需要注意,支付回调处理完成后,必须按照微信的要求返回正确的XML或JSON响应,否则微信会持续重试通知。例如,处理成功后返回<return_code><![CDATA[SUCCESS]]></return_code>。 此外,用户可能关心如何处理异步通知,比如在回调中更新订单状态后,如何通知小程序前端。可能需要结合WebSocket或前端轮询来更新支付状态,但回调处理本身是后端逻辑。 最后,要确保代码示例符合最佳实践,比如错误处理、日志记录、数据库事务等,以保证数据的完整性和系统的可靠性。同时,需要提醒用户注意安全事项,如保护API密钥,防止泄露。</think>### 微信小程序支付回调处理方法及示例代码 在微信小程序支付流程中,**支付回调**是接收支付结果的核心环节。以下是处理步骤和示例代码: --- #### 一、回调处理流程 1. **配置回调地址** 在微信支付商户平台设置`支付通知URL`(如`https://yourdomain.com/pay/callback`),该地址用于接收支付结果[^3]。 2. **验证签名** 微信会通过POST请求发送加密数据,需验证签名确保请求合法性: ```javascript // Node.js示例(使用微信支付V3 API) const { createHash } = require('crypto'); function verifySignature(wechatSign, body, timestamp, nonce, publicKey) { const signStr = `${timestamp}\n${nonce}\n${body}\n`; const verify = crypto.createVerify('SHA256'); verify.update(signStr); return verify.verify(publicKey, wechatSign, 'base64'); } ``` 3. **解析并处理业务逻辑** 解析回调数据,更新订单状态并返回响应: ```javascript app.post('/pay/callback', (req, res) => { const { resource } = req.body; // 微信V3回调数据结构 const decryptData = decryptResource(resource); // 解密数据 const { out_trade_no, trade_state } = decryptData; if (trade_state === 'SUCCESS') { // 更新订单状态(需处理幂等性) updateOrderStatus(out_trade_no, 'paid'); res.status(200).send({ code: 'SUCCESS', message: 'OK' }); } else { // 处理失败情况 logError(decryptData); res.status(500).send({ code: 'FAIL', message: '支付异常' }); } }); ``` --- #### 二、云开发示例(小程序云函数) 若使用小程序云开发,可通过云函数处理回调: ```javascript // 云函数 pay_cb const cloud = require('wx-server-sdk'); cloud.init(); exports.main = async (event) => { const { resource } = event; const decryptData = decryptResource(resource); // 解密逻辑 const db = cloud.database(); try { await db.collection('orders').where({ order_id: decryptData.out_trade_no }).update({ data: { status: 'paid' } }); return { code: 'SUCCESS' }; // 必须返回SUCCESS[^2] } catch (err) { console.error('回调处理失败:', err); return { code: 'FAIL' }; } }; ``` --- #### 三、注意事项 1. **签名验证** 必须验证回调请求来源,防止伪造攻击。 2. **幂等性处理** 使用数据库事务或唯一标识,避免重复更新订单。 3. **响应格式** 返回`SUCCESS`避免微信重复通知,格式需严格符合XML或JSON要求[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孽小倩

非常荣幸能帮助到你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值