【无标题】

步骤一:生成 codeUrl

首先,我们需要调用后端接口生成 codeUrl。如果生成失败,给用户提示稍后重试。

步骤二:生成支付二维码

通过获取到的 codeUrl 生成支付二维码。

步骤三:判断用户是否扫描二维码

判断用户是否扫描二维码,并调用后端接口判断支付是否成功。

步骤四:轮询支付状态

如果用户已扫描二维码,轮询后端接口判断支付是否成功。如果返回的 code 为 201,则每隔 2 秒重新请求一次,最多请求 10 次。

javascript 复制代码
import React, { useState } from 'react';
import axios from 'axios';
import QRCode from 'qrcode.react';

const WeChatPay = () => {
  const [codeUrl, setCodeUrl] = useState(null);
  const [orderNumber, setOrderNumber] = useState(null);
  const [isScanned, setIsScanned] = useState(false);
  const [errorMessage, setErrorMessage] = useState('');
  const [pollCount, setPollCount] = useState(0);
  const maxPollCount = 10;

  const generateCodeUrl = async () => {
    try {
      const response = await axios.post('https://ai.xwm1000.com/app-api/pay/createWeChatPayOrder', {
        total: 100, // 充值金额
      });
      if (response.data.code === 200) {
        setCodeUrl(response.data.data.codeUrl);
        setOrderNumber(response.data.data.orderNumber);
        setIsScanned(true);
        startPolling();
      } else {
        setErrorMessage('生成支付二维码失败,请稍后重试。');
      }
    } catch (error) {
      setErrorMessage('生成支付二维码失败,请稍后重试。');
    }
  };

  const startPolling = () => {
    setPollCount(0);
    pollPaymentStatus();
  };

  const pollPaymentStatus = async () => {
    if (pollCount >= maxPollCount) {
      setErrorMessage('充值服务异常,请联系管理员。');
      return;
    }
    try {
      const response = await axios.post('https://ai.xwm1000.com/app-api/pay/checkPaymentStatus', {
        orderNumber: orderNumber,
      });
      if (response.data.code === 200) {
        alert('支付成功!');
      } else if (response.data.code === 201) {
        setPollCount(pollCount + 1);
        setTimeout(pollPaymentStatus, 2000);
      } else {
        alert(response.data.message);
      }
    } catch (error) {
      setErrorMessage('支付状态查询失败,请稍后重试。');
    }
  };

  return (
    <div>
      {errorMessage && <div className="error">{errorMessage}</div>}
      {!codeUrl ? (
        <button onClick={generateCodeUrl}>生成支付二维码</button>
      ) : (
        <div>
          <QRCode value={codeUrl} />
          {!isScanned ? (
            <div>请扫描二维码进行支付</div>
          ) : (
            <div>正在确认支付状态,请稍候...</div>
          )}
        </div>
      )}
    </div>
  );
};

export default WeChatPay;

解释

  1. 生成 codeUrl

    • 调用后端接口生成 codeUrl,如果成功,将 codeUrlorderNumber 存储在组件的状态中。
    • 如果失败,显示错误信息。
  2. 生成支付二维码

    • 使用 qrcode.react 库生成二维码并显示在页面上。
  3. 判断用户是否扫描二维码

    • 设置 isScannedtrue,表示用户已扫描二维码。
  4. 轮询支付状态

    • 调用后端接口检查支付状态,如果返回 code 为 200,表示支付成功。
    • 如果返回 code 为 201,每隔 2 秒重新请求一次,最多请求 10 次。
    • 如果请求次数达到上限,显示错误信息。

注意事项

  1. 后端接口地址

    • 示例中使用了 https://ai.xwm1000.com/app-api/pay/createWeChatPayOrderhttps://ai.xwm1000.com/app-api/pay/checkPaymentStatus,请根据实际情况调整。
  2. 错误处理

    • 示例中简单地处理了错误信息,可以根据实际需求进行更详细的错误处理。
  3. 二维码生成库

    • 示例中使用了 qrcode.react 库来生成二维码,你需要在项目中安装该库:npm install qrcode.react
  4. 样式

    • 可以根据实际需求调整样式,使页面更加美观。
相关推荐
૮・ﻌ・6 分钟前
Vue3:组合式API、Vue3.3新特性、Pinia
前端·javascript·vue3
前端不太难6 分钟前
RN + TypeScript 项目越写越乱?如何规范架构?
前端·javascript·typescript
神算大模型APi--天枢6467 分钟前
全栈自主可控:国产算力平台重塑大模型后端开发与部署生态
大数据·前端·人工智能·架构·硬件架构
苏打水com7 分钟前
第十五篇:Day43-45 前端性能优化进阶——从“可用”到“极致”(对标职场“高并发场景优化”需求)
前端·css·vue·html·js
JS_GGbond13 分钟前
用美食来理解JavaScript面向对象编程
开发语言·javascript·美食
@大迁世界15 分钟前
08.CSS if() 函数
前端·css
Moment21 分钟前
小米不仅造车,还造模型?309B参数全开源,深度思考完胜DeepSeek 🐒🐒🐒
前端·人工智能·后端
苏打水com25 分钟前
第十六篇:Day46-48 前端安全进阶——从“漏洞防范”到“安全体系”(对标职场“攻防实战”需求)
前端·javascript·css·vue.js·html
5C2427 分钟前
从思想到实践:前端工程化体系与 Webpack 构建架构深度解析
前端·前端工程化
咕噜企业分发小米32 分钟前
如何平衡服务器内存使用率和系统稳定性?
java·服务器·前端