Implementierungsbeispiel für Scan-Code-Zahlung im Vue-Projekt (mit Demo)

Implementierungsbeispiel für Scan-Code-Zahlung im Vue-Projekt (mit Demo)

Nachfragehintergrund

In der Marktberichtsliste werden zwei Arten von Berichten angezeigt: kostenlose Berichte und kostenpflichtige Berichte. Benutzer können kostenlose Berichte direkt anzeigen, während kostenpflichtige Berichte erst angezeigt werden können, nachdem Benutzer sie gekauft haben.

Gedankenanalyse

  • Klicken Sie hier, um den Zahlungsbericht anzuzeigen. Daraufhin wird ein QR-Code für die Zahlung angezeigt.
  • Erstellen Sie eine Bestellung, und der QR-Code zählt herunter. Nach 5 Sekunden Anzeige beginnt er mit der Überwachung des Ergebnisses des Zahlungsrückrufs mit einer Frequenz von einmal alle fünf Sekunden.
  • Der erste Countdown erreicht 0 Sekunden, erinnert den Benutzer daran, dass der QR-Code abgelaufen ist, und fordert ihn auf, auf den QR-Code zu klicken, um ihn zu aktualisieren.
  • Setzen Sie den Countdown fort und beginnen Sie mit der Überwachung der Ergebnisse des Zahlungsrückrufs.
  • Wenn der Countdown nach dem Aktualisieren 0 Sekunden erreicht und kein Ergebnis ertönt, wird das Popup-Fenster zur Zahlung geschlossen, damit der Benutzer die Zahlung erneut einleiten kann.

UI-Anzeige

So sieht das Zahlungs-Popup-Fenster aus, wenn es nicht abgelaufen ist.

Das Zahlungs-Popup-Fenster läuft wie folgt ab

Erste Schritte

Da die Zahlungsfunktion eine öffentliche Funktion des Projekts ist, kapseln wir sie in einer separaten Komponente, sodass andere Module sie bei ihrer Verwendung als Unterkomponente einführen können.

1. Schreiben Sie eine Zahlungskomponentenvorlage

Nachfolgend finden Sie den spezifischen Quellcode der Vorlage. Da der Stil nicht im Mittelpunkt unserer Betrachtung steht, wird der Stilcode nicht angezeigt. Sie können ihn bei Bedarf hinzufügen.

<Vorlage>
  <div>
    <el-dialog
      Klasse = "Dialog-Bezahlung"
      Titel=""
      :visible.sync="dialogSichtbar"
      :anzeigen-schließen="false"
      @close="Zahlungsvorgang schließen"
    >
      <div Klasse="Inhalt">
        <p class="tip">{{ zahlen.title }}</p>
        <p class="Tipp">
          Zahlungsbetrag: <span class="small">¥</span
          ><span class="large">{{ Geld bezahlen }}</span>
        </p>
        <Bild
          Klasse="Bild"
          :style="{ Deckkraft: btnDisabled ? 1 : 0.3 }"
          :src="zahlen.url"
        />
        <el-Schaltfläche
          Klasse="btn"
          :Klasse="btnDisabled ? 'deaktiviert' : ''"
          Typ="primär"
          :deaktiviert="btnDeaktiviert"
          @click="Code aktualisieren"
          >{{ btnText }}</el-button
        >
      </div>
    </el-dialog>
  </div>
</Vorlage>

2. JS-Code und Beschreibung der Zahlungskomponente

1. Überwachen Sie über das Props-Attribut, ob das Zahlungs-Popup-Fenster in der untergeordneten Komponente angezeigt wird, und empfangen Sie den von der übergeordneten Komponente in der untergeordneten Komponente übergebenen Wert. Verwenden Sie watch, um pay.show zu überwachen. Das Zahlungs-Popup-Fenster wird nur angezeigt, wenn dies zutrifft, und die Methode zur Überwachung der Zahlungsergebnisse wird nach 5 Sekunden Anzeige ausgeführt.

betrachten:
    'zahlen.show': {
      handler(Wert) {
        wenn (Wert) {
          this.dialogVisible = this.pay.show
          setTimeout(diesen.handleReportPayNotify(), 5000)
        }
      },
      sofort: wahr
    }
},

2. Der QR-Code beginnt mit dem Countdown. Der QR-Code startet einen 60-Sekunden-Countdown. Wenn 0 Sekunden erreicht sind, klicken Sie auf „Aktualisieren“, um den QR-Code erneut abzurufen. Der Countdown wird fortgesetzt. Wenn zu diesem Zeitpunkt 0 Sekunden erreicht sind, wird das Popup-Fenster für die Zahlung geschlossen und der Benutzer wird aufgefordert, zu lange zu warten und die Zahlung erneut zu starten.

CountDown-Handle() {
  wenn (diese.Sekunde == 1) {
    wenn (diese.aktualisieren) {
      diese.Sekunde = 60
      this.btnDisabled = falsch
      this.btnText = „Klicken Sie auf „Aktualisieren“, um den QR-Code erneut zu erhalten.“
      wenn (dieser.Timer) {
        Intervall löschen(dieser.Timer)
      }
    } anders {
      dies.$emit('closePay', { Typ: 'Fehler' })
      Intervall löschen(dieser.Timer)
      this.$message.warning('Wartezeit ist zu lang, bitte Zahlung erneut einleiten.')
    }
  } anders {
    diese.zweite--
    this.btnDisabled = wahr
    this.btnText = `${this.second} Sekunden bis zum Ablauf des QR-Codes`
    dies.downTimer = setTimeout(() => {
      dies.handleCountDown()
    }, 1000)
  }
},

3. Schließen Sie das Popup-Fenster zur Zahlungsüberwachung

handleClosePay() {
  wenn (dieser.Timer) {
    Intervall löschen(dieser.Timer)
  }
  wenn (dieser.downTimer) {
    Zeitüberschreitung löschen(diesen.downTimer)
  }
  dies.$emit('closePay', { Typ: 'Fehler' })
  this.$message.warning('Sie haben die Zahlung storniert')
},

4. Es gibt zwei Arten von Rückrufergebnissen für die Zahlungsüberwachung. Wenn die Überwachung im normalen Bereich erfolgreich ist, wird die von der übergeordneten Komponente übergebene Funktion ausgeführt und der Timer gelöscht. Wenn das entsprechende Ergebnis nicht erreicht wird, wenn die Anzahl der Überwachungszeiten 12 erreicht, wird das Popup-Fenster für die Zahlung geschlossen und der Benutzer wird aufgefordert, die Wartezeit zu lang zu machen. Bitte initiieren Sie die Zahlung erneut und löschen Sie den Timer.

handleReportPayNotify() {
      sei num = 0
      dieser.timer = setzeInterval(() => {
        Zahl++
        dies.pay.fn().then(res => {
          wenn (res.status == 111111) {
            dies.$emit('closePay', { Typ: 'Erfolg' })
            Intervall löschen(dieser.Timer)
          }
        })
        wenn (Zahl == 12) {
          dies.$emit('closePay', { Typ: 'Fehler' })
          Intervall löschen(dieser.Timer)
          this.$message.warning('Wartezeit ist zu lang, bitte Zahlung erneut einleiten.')
        }
      }, 5000)
    }

5. Löschen Sie den Timer, wenn die Zahlungskomponente zerstört wird. Dieser Schritt wird leicht übersehen, muss aber durchgeführt werden. Löschen Sie den Timer rechtzeitig, wenn die Komponente zerstört wird.

  vorZerstören() {
    wenn (dieser.Timer) {
      Intervall löschen(dieser.Timer)
    }
    wenn (dieser.downTimer) {
      Zeitüberschreitung löschen(diesen.downTimer)
    }
  }
}

Anhang: Vollständiger Quellcode der Komponente JS

<Skript>
Standard exportieren {
  Name: 'WechatPay',
  Requisiten: {
    bezahlen: Objekt
  },
  Daten() {
    zurückkehren {
      dialogVisible: false,
      btnDisabled: wahr,
      btnText: '',
      Sekunde: 60,
      Timer: null,
      aktualisieren: true
    }
  },
  betrachten:
    'zahlen.show': {
      handler(Wert) {
        wenn (Wert) {
          this.dialogVisible = this.pay.show
          setTimeout(diesen.handleReportPayNotify(), 5000)
        }
      },
      sofort: wahr
    }
  },
  montiert() {
    dies.handleCountDown()
  },
  Methoden: {
    /**
     * @description: QR-Code aktualisieren*/
    handleRefreshCode() {
      dies.$bus.$emit('refreshCode')
      dies.handleCountDown()
      this.handleReportPayNotify()
      this.refresh = falsch
    },
    /**
     * @Beschreibung: QR-Code-Countdown*/
    CountDown-Handle() {
      wenn (diese.Sekunde == 1) {
        wenn (diese.aktualisieren) {
          diese.Sekunde = 60
          this.btnDisabled = falsch
          this.btnText = „Klicken Sie auf „Aktualisieren“, um den QR-Code erneut zu erhalten.“
          wenn (dieser.Timer) {
            Intervall löschen(dieser.Timer)
          }
        } anders {
          dies.$emit('closePay', { Typ: 'Fehler' })
          Intervall löschen(dieser.Timer)
          this.$message.warning('Wartezeit ist zu lang, bitte Zahlung erneut einleiten.')
        }
      } anders {
        diese.zweite--
        this.btnDisabled = wahr
        this.btnText = `${this.second} Sekunden bis zum Ablauf des QR-Codes`
        dies.downTimer = setTimeout(() => {
          dies.handleCountDown()
        }, 1000)
      }
    },
    /**
     * @descripttion: Warten Sie, bis das Popup-Fenster zur Zahlung geschlossen wird*/
    handleClosePay() {
      wenn (dieser.Timer) {
        Intervall löschen(dieser.Timer)
      }
      wenn (dieser.downTimer) {
        Zeitüberschreitung löschen(diesen.downTimer)
      }
      dies.$emit('closePay', { Typ: 'Fehler' })
      this.$message.warning('Sie haben die Zahlung storniert')
    },
    /**
     * @description: Ergebnisse des Zahlungsrückrufs überwachen*/
    handleReportPayNotify() {
      sei num = 0
      dieser.timer = setzeInterval(() => {
        Zahl++
        dies.pay.fn().then(res => {
          wenn (res.status == 111111) {
            dies.$emit('closePay', { Typ: 'Erfolg' })
            Intervall löschen(dieser.Timer)
          }
        })
        wenn (Zahl == 12) {
          dies.$emit('closePay', { Typ: 'Fehler' })
          Intervall löschen(dieser.Timer)
          this.$message.warning('Wartezeit ist zu lang, bitte Zahlung erneut einleiten.')
        }
      }, 5000)
    }
  },
  vorZerstören() {
    wenn (dieser.Timer) {
      Intervall löschen(dieser.Timer)
    }
    wenn (dieser.downTimer) {
      Zeitüberschreitung löschen(diesen.downTimer)
    }
  }
}
</Skript>

Damit ist dieser Artikel über das Implementierungsbeispiel der QR-Code-Zahlung im Vue-Projekt (mit Demo) abgeschlossen. Weitere relevante Inhalte zur Vue-QR-Code-Zahlung finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Zusammenfassung der Verwendung des offiziellen WeChat-Kontos zur Zahlung im Vue-Projekt und der aufgetretenen Fallstricke
  • Fallstricke bei der Implementierung der WeChat-Zahlungsfunktion in Vue
  • Vue imitiert die Bezahlfunktion von Alipay
  • Vue.js WeChat-Zahlungs-Frontend-Codefreigabe
  • So erhalten Sie den WeChat-Zahlungscode in Vue und lösen das Problem, dass der Code belegt ist
  • Implementierung der Zahlungsfunktion im Vue-Projekt (WeChat-Zahlung und Alipay-Zahlung)

<<:  Beispielanalyse der MySQL-Variablenverwendung [Systemvariablen, Benutzervariablen]

>>:  So erstellen Sie schnell Ihren eigenen Server - ausführliches Tutorial (Java-Umgebung)

Artikel empfehlen

Der Unterschied zwischen HTML-Name-ID und Klasse_PowerNode Java Academy

Name Geben Sie einen Namen für das Tag an. Format...

9 praktische CSS-Eigenschaften, die Web-Frontend-Entwickler kennen müssen

1. Abgerundete Ecken Heutige Webdesigns halten stä...

Detaillierte Erklärung einiger Einstellungen für Tabellenanpassung und Überlauf

1. Zwei Eigenschaften des Tabellen-Resets: ①borde...

JS implementiert einen Stoppuhr-Timer

In diesem Artikelbeispiel wird der spezifische JS...

Apache Calcite-Code zur Dialektkonvertierung

Definition Calcite kann SQL vereinheitlichen, ind...

Detaillierte Anwendungsfälle von Vue3 Teleport

Offizielle Website https://cli.vuejs.org/en/guide...

Vue Element UI-Komponente für benutzerdefinierte Beschreibungsliste

In diesem Artikelbeispiel wird der spezifische Co...

CSS: besuchte geheime Erinnerungen des Pseudoklassenselektors

Gestern wollte ich a:visited verwenden, um die Fa...

Detaillierte Erklärung des Vue-Lebenszyklus

Inhaltsverzeichnis Warum den Lebenszyklus versteh...

Unterschiede zwischen diesem Schlüsselwort in NodeJS und Browsern

Vorwort Jeder, der JavaScript gelernt hat, muss s...