PC 微信扫码登陆-前端实现-react

956 阅读1分钟

后端实现方式见此链接

www.jianshu.com/p/3733777a2…

import React, { Component } from 'react';

import { Button, Image, message } from 'antd';

import router from 'next/router';

import { UndoOutlined } from '@ant-design/icons';

import { getPublicPath } from "@/utils";

import QRCode from 'qrcode.react';

import { wxNativePay, getOrderState } from "@/services/request";

import './style/WechartPayment.less'

class WechartPayment extends Component {

constructor(props) {

super(props)

this.state = {

qrUrl: null,//二维码

second: null,//倒计时-时间

overdue: false// 是否支付成功

}

this.intervalWx = null //倒计时

this.throttle = false //节流

}

//通过后端提供的接口获取微信支付二维码

getWxNativePay = async () => {

// 节流

if (this.throttle) {

return

}

this.throttle = true

setTimeout(() => {

this.throttle = false

}, 1000)

const { orderNumber } = this.props;

const { code, data } = await wxNativePay({ orderNumber })

if (code === "0") {

this.setState({

qrUrl: data.result,

overdue: false

})

this.countDown(61);// 倒计时时间可随意调整,且可读性强

clearInterval(this.intervalWx)

this.intervalWx = setInterval(() => {

this.paySuccess()

}, 3000)

} else {

this.setState({

qrUrl: null

})

}

}

//二维码倒计时,例如:自定义设置1分钟之内失效,需用户手动刷新二维码

countDown = (waitTime) => {

if (waitTime > 0) {

waitTime--;

this.setState({

second: waitTime

})

} else {

this.setState({

overdue: true

})

return;

}

setTimeout(() => {

this.countDown(waitTime);

}, 1000);

}

//轮询获取支付状态,这里通过后端提供的接口获取订单状态,从而获取支付状态

paySuccess = async () => {

const { orderNumber } = this.props;

const { code, data } = await getOrderState({ orderNumber });

// 获取订单状态

if (code === "0" && data !== "UNPAID") {

clearInterval(this.intervalWx)

this.intervalWx = null

//支付成功回调

this.props.success()

}

}

componentWillUnmount() {

clearInterval(this.intervalWx)

}

componentDidMount() {

this.getWxNativePay()

}

render() {

const { qrUrl, second, overdue } = this.state;

return (

微信支付

{second !== null &&

距离二维码过期还剩 {second} 秒 过期后请刷新二维码

}

{qrUrl ?

<>

<QRCode

value={qrUrl} // value参数为生成二维码的链接

size={260} // 二维码的宽高尺寸

fgColor="#000000" // 二维码的颜色

/>

{overdue &&

获取二维码失败

点击重新获取二维码

}

</>

:

<Image

preview={false}

width={260}

height={260}

src="error"

fallback="获取失败默认图片"

/>

}

扫描二维码支付

刷新

<Image preview={false} width={310} className="wp-component-content-phone" src={getPublicPath("/images/phoneEn.png")} />

);

}

}

export default WechartPayment