uni-app uni-pay2 弹窗切换支付渠道问题:在 uniCloud 数据库中 provider 变了但 provider_appid 未变化

发布于 1周前 作者 songsunli 来自 Uni-App

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 正确设置。根据实际需求,你可能需要调整映射关系或添加更多支付渠道。

回到顶部