uniapp支付宝微信支付功能实现

大纲:

具体实现逻辑如下:

  1. 页面初始化时,通过onLoad方法获取传入的钱包(wallet)信息。

  2. 用户输入充值金额,使用watch监听输入值的变化,并更新选中的充值金额选项。判断金额是否大于0,若是小于0,则抛出金额异常信息;

  3. 用户选择充值金额,通过changeCheck方法更新选中的充值金额,并将选中状态进行更新。

  4. 用户点击支付宝或微信支付按钮,根据选择的支付方式调用不同的支付接口生成支付二维码。

  5. 支付二维码生成成功后,将二维码的值更新到qrArr.val中,并显示扫码支付弹窗。

  6. 启动定时器,定时查询支付状态,如果支付成功,则跳转至充值成功页面。

  7. 用户关闭扫码支付弹窗时,隐藏弹窗并清除定时器。

  8. 查询支付状态的方法分为getwxPayStatusgetAlipayStatus,分别用于查询微信支付和支付宝支付的支付状态。

  9. 支付成功后,弹出充值成功的提示,并且等待1秒后清空缓存并重新跳转至登录页面。

<template><view class="container"><view><view class="title">请输入充值金额</view><u-input v-model="money" type="number" placeholder="请输入充值金额"></u-input><view class="tags"><view class="tag" v-for="(item,index) in list" :key="index" :class="item.isCheck?'active':''"@click="changeCheck(item.value)">{{item.value}}</view></view><view class="pay"><view @click="payFor(1)"><u-icon name="zhifubao-circle-fill" size="28" color="#108ee9"></u-icon><text style="color: #108ee9 ;">支付宝支付</text></view><view @click="payFor(2)"><u-icon name="weixin-circle-fill" size="28" color="#7bb32e"></u-icon><text style="color: #7bb32e ;">微信支付</text></view></view><u-modal :show="show" title="扫码支付" @confirm="confirm"><view style="text-align: center;"><view class="tip">{{tip}}</view><tki-qrcode v-if="qrArr.val" ref="qrcode" :val="qrArr.val" :size="qrArr.size":loadMake="qrArr.loadMake" /></view></u-modal></view></view>
</template><script>import * as api from '@/request/index.js'import tkiQrcode from '@/components/tki-qrcode/tki-qrcode.vue';export default {components: { tkiQrcode },data() {return {money: 0,show: false,tip: '',list: [{value: 50,isCheck: false}, {value: 100,isCheck: false}, {value: 150,isCheck: false}, {value: 200,isCheck: false}, {value: 300,isCheck: false}, {value: 400,isCheck: false}, {value: 500,isCheck: false}, {value: 600,isCheck: false}, {value: 700,isCheck: false}, {value: 800,isCheck: false}, {value: 900,isCheck: false}, {value: 1000,isCheck: false},],qrArr: {size: 200,val: '',loadMake: true},out_trade_no: '',timer: null,wallet: {},}},onLoad(option) {this.wallet = JSON.parse(option.data)},watch: {money(val, value) {this.list.forEach(item => {if (val == item.value) {item.isCheck = true} else {item.isCheck = false}})}},methods: {changeCheck(value) {this.money = valuethis.list.forEach(item => {if (item.value == value) {item.isCheck = true} else {item.isCheck = false}})},payFor(type) {if (this.money < 0.01) {uni.showToast({icon: 'none',title: '请输入金额'})return false}// 初始化数据this.qrArr.val = ''if (this.timer) {  // 清空定时器clearInterval(this.timer)}this.show = truethis.tip = type == 1 ? '请打开支付宝进行扫码' : '请打开微信扫一扫进行扫码'if (type == 1) {let params = {bz: '充值',subject: '充值',totalAmount: this.money,cardNo: this.wallet.cardNo,jobNo: this.wallet.jobNo,staffName: this.wallet.staffName,cardTypeName: this.wallet.cardTypeName,acctBalanceB: this.wallet.acctBalanceB * 100,type: 'app'};api.aliWebPayment(params).then(res => {if (res && res.code == 0) {this.$nextTick(() => {this.qrArr.val = res.data.url})this.out_trade_no = res.data.out_trade_nothis.timer = setInterval(() => {this.getAlipayStatus()}, 1000 * 3)}})} else {let params = {acctBalanceB: Number(this.wallet.acctBalanceB),bz: '充值',cardNo: this.wallet.cardNo,cardTypeName: this.wallet.cardTypeName,jobNo: this.wallet.jobNo,staffName: this.wallet.staffName,total: this.money,};api.wxPayNative(params).then(res => {if (res.code == 0) {this.$nextTick(() => {this.qrArr.val = res.data.code_url})this.out_trade_no = res.data.out_trade_nothis.timer = setInterval(() => {this.getwxPayStatus(this.out_trade_no)}, 1000 * 3)}})}},confirm() {this.show = falseif (this.timer) {clearInterval(this.timer)}},// 微信支付状态查询getwxPayStatus(out_trade_no) {api.getwxPayStatus(out_trade_no, this.wallet.jobNo).then(res => {if (res.data.trade_state == 'SUCCESS') {this.back()}})},// 支付支付状态查询getAlipayStatus() {api.getAlipayStatus(this.out_trade_no, this.wallet.jobNo).then(res => {if (res.data.code == 10000 && res.data.msg == 'Success' && res.data.tradeStatus =='TRADE_SUCCESS') {this.back()}})},back() {uni.showToast({icon: 'success',title: '充值成功'})if (this.timer) {clearInterval(this.timer)}setTimeout(() => {//同步清理本地数据缓存uni.clearStorageSync()uni.reLaunch({url: '/pages/recharge/login'});}, 1000)}},}
</script>
<style lang="scss" scoped>.container {width: 100%;height: 100vh;display: flex;justify-content: center;align-items: center;.title {text-align: center;margin-bottom: 20px;font-size: 32px;}>view {width: 600px;.tags {display: flex;justify-content: space-between;flex-wrap: wrap;margin-top: 40px;.tag {width: calc(25% - 20px);height: 50px;line-height: 50px;font-size: 24px;text-align: center;margin-bottom: 20px;border: 1px solid #3c9cff;border-radius: 10px;color: #3c9cff;cursor: pointer;&.active {background-color: #3c9cff;color: #fff;}}}}.pay {display: flex;justify-content: space-between;font-size: 24px;>view {display: flex;align-items: center;line-height: 50px;height: 50px;text {margin-left: 10px;}}}.tip {font-size: 16px;margin-bottom: 20px;}.qrcode {width: 200px;height: 200px;background-color: red;}}
</style>

页面效果图展示:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/60989.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CTF之Web安全SSI注入

前言 如何从外部进入主机&#xff1f; SSI注入攻击介绍 SSI(server side inject)的出现是为了赋予HTML静态页面动态的效果&#xff0c;通过SSI来执行系统命令&#xff1b;并返回对应的结果。 如果再网站目录中发现了.stm&#xff1b;.shtm&#xff1b;.shtml&#xff1b;这…

【Three.js】遮挡剔除

背景 考虑到场景中模型顶点过多会让fps过低&#xff0c;所以想把相机看不到的模型从场景中移除&#xff0c;来提高渲染性能&#xff0c;但是后续测试结果让我恍然大悟。虽然场景中的顶点数降低了很多&#xff0c;但是每次渲染检查遮挡的过程本身就是一个消耗性能的行为&#x…

Python批量查字典和爬取双语例句

最近&#xff0c;有网友反映&#xff0c;我的批量查字典工具换到其它的网站就不好用了。对此&#xff0c;我想说的是&#xff0c;互联网包罗万象&#xff0c;网站的各种设置也有所不同&#xff0c;并不是所有的在线字典都可以用Python爬取的。事实上&#xff0c;很多网站为了防…

汉字形近字(OCR)

近期做中文OCR识别的优化&#xff0c;抓破头皮却收获甚微。 为了百尺竿头更进一步&#xff0c;遂将目光聚焦在中文汉字特有的形近字和生僻字问题上&#xff0c;于是怒发整理形近字大全&#xff08;花了不少刀&#xff09;&#xff0c;希望对同行朋友们也有帮助&#xff1a; 地表…

【LeetCode 75】第二十三题(2352)相等行列对

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码运行结果&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目很简洁&#xff0c;就是要我们寻找行与列相同的对数。相同行与列不仅是要元素相同&#xff0c;还需要顺序也一样&#xff08…

AutoDL服务器的镜像版本太高,配置python3.7 tensorflow1.15版本的框架的步骤

1.选择一个实例&#xff0c;进入后端界面 2. 更新bashrc中的环境变量 conda init bash && source /root/.bashrc查看虚拟环境 conda info --envs可以看到此时有一个base的虚拟环境 但是它的python版本为3.8.10&#xff0c;无法安装tensorflow1.15,所以我们要创建一个…

【字节跳动青训营】后端笔记整理-1 | Go语言入门指南:基础语法和常用特性解析

**本人是第六届字节跳动青训营&#xff08;后端组&#xff09;的成员。本文由博主本人整理自该营的日常学习实践&#xff0c;首发于稀土掘金&#xff1a;&#x1f517;Go语言入门指南&#xff1a;基础语法和常用特性解析 | 青训营 本文主要梳理自第六届字节跳动青训营&#xff…

chapter14:springboot与安全

Spring Boot与安全视频 Spring Security, shiro等安全框架。主要功能是”认证“和”授权“&#xff0c;或者说是访问控制。 认证&#xff08;Authentication&#xff09;是建立在一个声明主体的过程&#xff08;一个主体一般指用户&#xff0c;设备或一些可以在你的应用程序中…

【数据结构OJ题】合并两个有序数组

原题链接&#xff1a;https://leetcode.cn/problems/merge-sorted-array/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 看到这道题&#xff0c;我们注意到nums1[ ]和nums2[ ]两个数组都是非递减的。所以我们很容易想到额外开一个数组tmp[ ]&#x…

Leetcode.1289 下降路径最小和 II

题目链接 Leetcode.1289 下降路径最小和 II rating : 1697 题目描述 给你一个 n x n 整数矩阵 g r i d grid grid &#xff0c;请你返回 非零偏移下降路径 数字和的最小值。 非零偏移下降路径 定义为&#xff1a;从 g r i d grid grid 数组中的每一行选择一个数字&#xff…

【密码学】六、公钥密码

公钥密码 1、概述1.1设计要求1.2单向函数和单向陷门函数 2、RSA公钥密码体制2.1加解密2.2安全性分析 3、ElGamal公钥密码体制3.1加解密算法3.2安全性分析 4、椭圆曲线4.1椭圆曲线上的运算4.2ECC 5、SM2公钥密码体制5.1参数选取5.2密钥派生函数5.3加解密过程5.3.1初始化5.3.2加密…

pytest fixture 常用参数

fixture 常用的参数 参数一&#xff1a;autouse&#xff0c;作用&#xff1a;自动运行&#xff0c;无需调用 举例一&#xff1a;我们在类中定义一个function 范围的fixture; 设置它自动执行autouseTrue&#xff0c;那么我们看下它执行结果 输出&#xff1a; 说明&#xff1a;…