uni-app uni-pay2 弹窗切换支付渠道问题:在 uniCloud 数据库中 provider 变了但 provider_appid 未变化
uni-app uni-pay2 弹窗切换支付渠道问题:在 uniCloud 数据库中 provider 变了但 provider_appid 未变化
产品分类:uniCloud/App
示例代码:
this.$refs.unipay2.open({
provider: undefined,
total_fee: 1,
order_no: '1234567890',
out_trade_no: '1234567890xyz',
description: '测试',
type: 'recharge',
qr_code: true,
cancel_popup: false,
})
```
### 操作步骤:
1. 用户点击支付按钮,前端弹出扫码支付收银台,选择微信支付渠道。
2. 查看 uniCloud 数据库,在 uni-pay-orders 表格里,发现一条新记录:
```json
{
"id": "66dbab7d99c624f04fda83b0",
"provider": "wxpay",
"provider_pay_type": "native",
"uni_platform": "web",
"status": 0,
"provider_appid": "wx?????????" // 微信 appId
}
```
3. 用户放弃微信支付,点击选择另一个渠道 支付宝。
4. 查看 uniCloud 数据库,在 uni-pay-orders 表格里,发现之前给微信支付创建的记录,变成了
```json
{
"id": "66dbab7d99c624f04fda83b0", // 注意,仍然是原来的记录 id
"provider": "alipay", // 变成了 支付宝
"provider_pay_type": "native",
"uni_platform": "web",
"status": 0,
"provider_appid": "wx?????????" // 错误:仍然是微信的 appId,没有变成支付宝的
}
```
### 预期结果:
切换支付渠道时,既然在数据库的原记录里,把 `provider` 变成了 `alipay`,那么 `provider_appid` 也应该变成支付宝的 appId。
### 实际结果:
实际上 `provider_appid` 没有变,仍然是微信的 appId,如果最终用支付宝完成了支付,那么数据库里就留下了一条错误的记录。
### bug描述:
使用 uni-pay 2,在前端打开扫码支付收银台,选择微信支付,
这时查看云空间的数据表 uni-pay-orders 里,自动创建了一条记录,其中的 `provider: 'wxpay'`, `provider_appid: 'wx???????????????'`。
然后在弹窗里,放弃微信支付,点击选择另一种渠道,支付宝,
这时查看云空间的数据表,没有出现新的记录,而是在上面的现有记录里,把 `provider` 改成了 `"alipay"`,但是 `provider_appid` 却仍然是 `"wx????????????????"`,而不是相应改成了支付宝的 appId。
```
![](https://www.itying.com/uniimg.php?url=https://img-cdn-tc.dcloud.net.cn/uploads/questions/20240907/6a0b6a94aea2e10105199d66e4dda532.png)
![](https://www.itying.com/uniimg.php?url=https://img-cdn-tc.dcloud.net.cn/uploads/questions/20240907/b32bb818f037b9e905658fa566e76ed9.png)
2 回复
此问题会在下版本修复
提示: 此问题不会影响正常的支付和退款,目前provider_appid参数没有实际用到,仅用作记录
在处理 uni-app 结合 uni-pay2 插件时,若遇到支付渠道(provider)在 uniCloud 数据库中变更但对应的 provider_appid
未随之变化的问题,通常可以通过编写代码逻辑来确保当 provider
变更时,provider_appid
也能正确更新。以下是一个示例代码,展示了如何在 uni-app 中通过云函数处理这一逻辑。
云函数代码(Node.js)
首先,确保你的 uniCloud 项目中已经配置好数据库和云函数。以下是一个示例云函数 updateProviderAppid
,用于更新支付渠道信息。
// 云函数入口文件
const cloud = require('wx-server-sdk');
cloud.init();
const db = cloud.database();
exports.main = async (event, context) => {
const { userOpenId, newProvider } = event; // 假设从前端传入用户openid和新支付渠道
try {
// 查询当前用户的支付配置
const _ = db.command;
const result = await db.collection('paymentConfig')
.where(_.eq('user_openid', userOpenId))
.get();
if (result.data.length > 0) {
const config = result.data[0];
// 检查是否需要更新provider_appid
if (config.provider !== newProvider) {
// 根据newProvider设置对应的provider_appid
// 这里假设有一个映射关系,可以根据实际情况调整
let newProviderAppid;
switch (newProvider) {
case 'alipay':
newProviderAppid = 'alipay_appid_xxxx';
break;
case 'wechat':
newProviderAppid = 'wechat_appid_xxxx';
break;
// 添加其他支付渠道
default:
throw new Error('Unsupported provider');
}
// 更新数据库
await db.collection('paymentConfig')
.doc(config._id)
.update({
data: {
provider: newProvider,
provider_appid: newProviderAppid
}
});
return {
success: true,
message: 'Payment provider updated successfully.'
};
} else {
return {
success: true,
message: 'No change needed.'
};
}
} else {
throw new Error('Payment configuration not found.');
}
} catch (error) {
return {
success: false,
message: error.message
};
}
};
前端调用示例
在前端代码中,你可以通过调用这个云函数来更新支付渠道信息。
uni.cloud.callFunction({
name: 'updateProviderAppid',
data: {
userOpenId: uni.getStorageSync('userOpenId'), // 假设已存储用户openid
newProvider: 'alipay' // 新支付渠道,如alipay或wechat
},
success: res => {
if (res.result.success) {
console.log(res.result.message);
} else {
console.error(res.result.message);
}
},
fail: err => {
console.error('Cloud function call failed:', err);
}
});
以上代码展示了如何在 uni-app 中通过云函数更新支付渠道信息,并确保 provider_appid
根据新的 provider
正确设置。根据实际需求,你可能需要调整映射关系或添加更多支付渠道。