位置: IT常识 - 正文

app内嵌h5支付功能,跳转支付宝&微信,vue组件(h5支付功能)

编辑:rootadmin
app内嵌h5支付功能,跳转支付宝&微信,vue组件 一、功能梳理

推荐整理分享app内嵌h5支付功能,跳转支付宝&微信,vue组件(h5支付功能),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:小程序内嵌h5支付,h5支付怎么设置,h5支付接口接入教程,h5支付功能,app h5支付,小程序内嵌h5支付,h5支付功能,h5支付功能,内容如对您有帮助,希望把文章链接给更多的朋友!

app内前h5涉及到支付的功能,ios非实物商品实付需要使用ios原生支付方式,实物商品则可以三方支付,主要的实现思路为后端返回跳转支付宝或微信的支付scheme链接,前端进行跳转支付,同时需要实时查询用户的支付状态。

整个过程中复杂的部分在于查询用户支付状态的体验方面,需要保证用户在支付成功、支付失败、跳转支付宝、微信回来或者没有跳转支付宝微信等未知的行为下的用户体验。

组件内容为底部升起的支付选择弹窗,可以选择支付宝或者微信。

二、实现步骤app内嵌h5支付功能,跳转支付宝&微信,vue组件(h5支付功能)

用户进行下单操作,前端调用下单接口,成功则返回三方支付app跳转链接,前端进行跳转

跳转三方app同时进行查询订单接口轮训,实时获取订单状态,轮训时间定位30s,依据需求调整

用户如果支付时间超过了30s未返回我们app的情况下,需要针对此种情况进行处理,捕捉用户返回我们app的情况

三、组件可支配参数&事件设置

设置支持参数2个、事件4个,分别为

参数:

successStatus: {default: '1'}, // 支付成功的状态码,默认1errorStatus: {default: '2'} // 支付失败的状态码,默认2

事件:

@payMoney="payMoney" // 下单事件@payStatus="payStatus" //查询支付状态事件@succcessFunction="succcessFunction" // 成功支付操作@errorFunction="errorFunction" // 失败实付操作四、从支付app返回,事件捕获方法

为了防止用户在支付时间超过我们设置轮训时长情况,需要监听用户从支付app返回当前页面,来进行查询支付状态操作。方法为监听页面显示or隐藏事件

reloadState () {// 添加监听器if (typeof document.hidden !== 'undefined') {this.hidden = 'hidden';this.visibilityChange = 'visibilitychange';} else if (typeof document.mozHidden !== 'undefined') {this.hidden = 'mozHidden';this.visibilityChange = 'mozvisibilitychange';} else if (typeof document.msHidden !== 'undefined') {this.hidden = 'msHidden';this.visibilityChange = 'msvisibilitychange';} else if (typeof document.webkitHidden !== 'undefined') {this.hidden = 'webkitHidden';this.visibilityChange = 'webkitvisibilitychange';}document.addEventListener(this.visibilityChange, this.forceUpdate);},forceUpdate () {if (document.visibilityChange === this.hidden) {} else {this.searchTimer();}},五、组件源码<template><div class="pay-info"><div class="pay-content"><span class="pay-left"><img class="pay-icon" src="../assets/zfb.png" alt=""> 支付宝支付</span><img class="radio-icon" src="../assets/radio2.svg" alt=""></div><div class="pay-content"><span class="pay-left"><img class="pay-icon" src="../assets/wx.png" alt=""> 微信支付</span><img class="radio-icon" src="../assets/radio2.svg" alt=""></div><div class="pay-button" @click="payFun"><span>支付</span></div><div class="loading-dom" v-if="loadingPay">支付中<van-loading color="#ffffff" style="margin-left: 5px"/></div></div></template><script type="text/javascript">export default {data () {return {isApp: !!browers.appUA,timer: null,loadingPay: false,orderNo: '', // 订单号payStatus: '' // 订单支付状态};},props: {successStatus: {default: '1'}, // 支付成功的状态码,默认1errorStatus: {default: '2'} // 支付失败的状态码,默认2},mounted () {this.$once('hook:beforeDestroy', () => {clearInterval(this.timer);this.timer = null;});},methods: {reloadState () {// 添加监听器if (typeof document.hidden !== 'undefined') {this.hidden = 'hidden';this.visibilityChange = 'visibilitychange';} else if (typeof document.mozHidden !== 'undefined') {this.hidden = 'mozHidden';this.visibilityChange = 'mozvisibilitychange';} else if (typeof document.msHidden !== 'undefined') {this.hidden = 'msHidden';this.visibilityChange = 'msvisibilitychange';} else if (typeof document.webkitHidden !== 'undefined') {this.hidden = 'webkitHidden';this.visibilityChange = 'webkitvisibilitychange';}document.addEventListener(this.visibilityChange, this.forceUpdate);},forceUpdate () {if (document.visibilityChange === this.hidden) {} else {this.searchTimer();}},payFun () {this.$emit('payMoney', (res) => {this.reloadState();// 下单接口的回调,执行轮训结果this.orderNo = res.order_no;this.loadingPay = true;this.searchPay();// 监听从其他app返回,为了解决从支付宝回来不轮训的问题setTimeout(() => {location.href = res.pay_address;}, 200);});},searchPay () {this.$emit('payStatus', (res) => {if (this.payStatus === '') {this.searchTimer();}// 下单接口的回调,执行轮训结果this.payStatus = res;});},searchTimer() {if (this.timer) {return;}if (this.orderNo) {let times = 0;this.searchPay();if (this.payStatus === '') {this.timer = setInterval(res => {times++;this.searchPay();if (this.payStatus === this.$props.successStatus) {clearInterval(this.timer);this.timer = null;this.loadingPay = false;document.removeEventListener(this.visibilityChange, this.forceUpdate);// 支付成功事件this.$emit('succcessFunction', (res) => {});}if (this.payStatus === this.$props.errorStatus) {clearInterval(this.timer);this.timer = null;this.loadingPay = false;document.removeEventListener(this.visibilityChange, this.forceUpdate);// 支付失败事件this.$emit('errorFunction', (res) => {});}if (times > 30) {this.$toast('未查询到支付状态,请重新支付');clearInterval(this.timer);this.timer = null;this.loadingPay = false;document.removeEventListener(this.visibilityChange, this.forceUpdate);}}, 1000);}}}}};</script><style lang="less" scoped>.pay-info {.pay-content {background: #fff;display: flex;align-items: center;justify-content: space-between;padding: 8px 0;font-size: 28px;color: #222;.pay-left {display: flex;align-items: center;}.pay-icon {width: 60px;height: 60px;margin-right: 10px}.radio-icon {width: 34px;height: 34px;}}.pay-button {width: 100%;text-align: center;margin-top: 30px;span {display: inline-block;background: #4e88f6;color: #fff;width: 100%;font-size: 32px;height: 88px;line-height: 88px;border-radius: 50px;display: inline-block;}}.loading-dom {width: 100%;height: 100vh;background: rgba(0,0,0,.5);color: #fff;text-align: center;font-size: 34px;font-weight: 500;position: fixed;display: flex;align-items: center;justify-content: center;top: 0;left: 0}}</style>六、父组件调用<Pay    @payMoney="payMoney"    @payStatus="payStatus"    @succcessFunction="succcessFunction"    @errorFunction="errorFunction"    :success-status='1'    :error-status='2'></Pay>// 下单事件payMoney (callback) {this.$axios.post(`url`, params).then((res) => {let data = res.data;if (Number(data.code) === 0) {// 执行支付操作,跳转url,结果回调给收银台组件this.currentOrder = data.data.order_no;callback(data.data);} else {this.$toast(data.message);}}).catch((e) => {});},// 轮训状态接口payStatus (callback) {this.$axios.get(`url`).then((res) => {let data = res.data;if (Number(data.code) === 0) {// 执行支付结果查询,结果回调给收银台组件callback(data.data.pay_result);if (data.data.list && data.data.list.length) {this.resultData = data.data.list;}} else {this.$toast(data.message);}}).catch((e) => {});},succcessFunction () {// 支付成功父组件操作事件this.$toast('支付成功');// 先弹出支付成功提示,延时1秒出结果弹窗setTimeout(() => {// 支付成功后刷新一下接口}, 1000);},errorFunction () {// 支付失败父组件操作事件this.$toast('支付失败,请重新发起支付');},
本文链接地址:https://www.jiuchutong.com/zhishi/298634.html 转载请保留说明!

上一篇:用JSP简单的写一个登录注册页面(编写jsp程序,实现简易计算机)

下一篇:视听场景理解经典任务(视听结合的景物描写)

  • 苹果13微信视频怎么设置铃声(苹果13微信视频手机发烫)

    苹果13微信视频怎么设置铃声(苹果13微信视频手机发烫)

  • 拼多多退货运费补贴退到哪里(拼多多退货运费险审核不通过)

    拼多多退货运费补贴退到哪里(拼多多退货运费险审核不通过)

  • opporeno7充电器多少w(oppoReno7充电器多少钱)

    opporeno7充电器多少w(oppoReno7充电器多少钱)

  • 荣耀20Pro怎么设置永不休眠(荣耀20Pro怎么设置桌面插件)

    荣耀20Pro怎么设置永不休眠(荣耀20Pro怎么设置桌面插件)

  • 小程序链接怎么朋友圈(小程序链接怎么变成网页链接)

    小程序链接怎么朋友圈(小程序链接怎么变成网页链接)

  • qq怎么建群(QQ怎么建群文件)

    qq怎么建群(QQ怎么建群文件)

  • 抖音天天掉粉怎么回事(最近抖音掉粉儿厉害怎么办)

    抖音天天掉粉怎么回事(最近抖音掉粉儿厉害怎么办)

  • 微信修改密码提示原密码不对(微信修改密码提示新设备三天后再尝试)

    微信修改密码提示原密码不对(微信修改密码提示新设备三天后再尝试)

  • 聊天记录删除了能找回来吗(聊天记录删除了怎么恢复微信)

    聊天记录删除了能找回来吗(聊天记录删除了怎么恢复微信)

  • ipad7上市时间(苹果ipad7是哪一年上市的)

    ipad7上市时间(苹果ipad7是哪一年上市的)

  • 显卡内存大小的区别(显卡的内存容量)

    显卡内存大小的区别(显卡的内存容量)

  • 下一页的快捷按钮(下一页快捷键ctrl加什么)

    下一页的快捷按钮(下一页快捷键ctrl加什么)

  • 红米note8什么时候出(红米note8多久发布)

    红米note8什么时候出(红米note8多久发布)

  • 微信视频老说网络异常(微信视频老是显示网络异常怎么回事)

    微信视频老说网络异常(微信视频老是显示网络异常怎么回事)

  • 激活和未激活的有什么区别(激活和未激活的耳机有什么区别)

    激活和未激活的有什么区别(激活和未激活的耳机有什么区别)

  • 苹果6能不能用快充头(苹果6能不能用5G卡)

    苹果6能不能用快充头(苹果6能不能用5G卡)

  • 华为p30卡顿怎么解决(华为p30卡顿怎么解决办法)

    华为p30卡顿怎么解决(华为p30卡顿怎么解决办法)

  • 手机支付宝怎么开通商家服务(手机支付宝怎么设置密码锁)

    手机支付宝怎么开通商家服务(手机支付宝怎么设置密码锁)

  • 小米9pro怎么设置息屏预览(小米9a怎么设置)

    小米9pro怎么设置息屏预览(小米9a怎么设置)

  • 怎么把照片加白边(怎么把照片加白色背景)

    怎么把照片加白边(怎么把照片加白色背景)

  • 抖音直播收益怎么提现(抖音直播收益怎么获取的)

    抖音直播收益怎么提现(抖音直播收益怎么获取的)

  • 苹果手机话筒坏了(苹果手机话筒坏了维修大概需要多少钱)

    苹果手机话筒坏了(苹果手机话筒坏了维修大概需要多少钱)

  • nvme固态有必要吗(有必要买nvme固态移动)

    nvme固态有必要吗(有必要买nvme固态移动)

  • 小米cc9e如何截屏(小米cc9e如何截长图)

    小米cc9e如何截屏(小米cc9e如何截长图)

  • vivoy93怎么退出安全模式(vivoy52s怎么退出)

    vivoy93怎么退出安全模式(vivoy52s怎么退出)

  • Waterperry花园,英国牛津郡 (© Lauren Hibbit/Danita Delimont)(water gardens)

    Waterperry花园,英国牛津郡 (© Lauren Hibbit/Danita Delimont)(water gardens)

  • 苹果CMSV10最新大橙子模板使用教程包括苹果CMSV10使用教程和宝塔自动采集教程(苹果cmsv10官网)

    苹果CMSV10最新大橙子模板使用教程包括苹果CMSV10使用教程和宝塔自动采集教程(苹果cmsv10官网)

  • 购买方收取的违约金怎么入账
  • 本年利润总分类账图片
  • 营利性幼儿园怎样登记
  • 工程图纸设计费用收费标准
  • 外贸出口备案需准备什么资料
  • 行政事业单位盘亏或毁损的固定资产
  • 增值税零税率与免税有何不同
  • 机票电子行程单和发票的区别
  • 企业的季度所得税怎么算
  • 律师事务所计提准备金的标准
  • 出口货物免抵退税额城市维护建设税
  • 个人到税务局怎么开增值税普通发票
  • 增值税专用发票可以开电子发票吗
  • 权益性投资损失包括哪些
  • 已经销售但是没货怎么办
  • 应交税金的明细科目
  • 模具费属于什么费用
  • 交易性金融资产是什么意思
  • vue 模拟遥控按钮
  • php生成php文件
  • 结转损益类收入科目
  • 小程序开发必备的东西有哪些
  • 基于强化学习的智能机器人路径规划算法研究(附代码)
  • css中文字垂直排列
  • php数组怎么实现的
  • php用mysql连接数据库并查询
  • 缴纳残保金会计分录最新
  • js原型函数
  • 帝国cms怎么用
  • 办公费用会计科目怎么写
  • 如何利用口诀记住那字
  • 公司的现金收入包括
  • 转出未交增值税最终怎么转平
  • 怎么查电子发票真伪
  • 2023年会计继续教育报名入口
  • 企业注册资本的规定
  • 小型微利企业企业所得税如何计算
  • 公司员工食堂买菜没发票怎么办
  • 电子银行承兑汇票最长期限
  • 外经证预缴税款网上申报
  • 出售不动产账务处理流程
  • 事业单位会计怎么做
  • 收到政府补助的会计分录
  • 其他应付现金流量表
  • 背书转让的电子汇票怎么查询
  • 营改增后租金收入交什么税
  • 其他综合收益什么时候转留存收益什么时候转损益
  • 小企业会计准则和企业会计准则的区别
  • 增值税是否计入税金及附加
  • 工会经费以前没交现在怎么补交
  • 现金日记账的登记日期以什么日期为标准?
  • 现金支票办理电话
  • mysql关联查询原理
  • 深入3DSTUDIOMAX
  • Linux下mysql源码安装笔记
  • sqlserver2000数据库迁移到2008r2
  • 使用u盘安装windows10电脑识别不出来
  • xp系统怎么升级版本
  • mac地图怎么标记多个位置
  • 64位的ubuntu15.04怎么安装WPS?
  • 苹果完美越狱最新消息
  • win7右下角小喇叭
  • 使用自带DISM工具修复Windows8.1映像
  • 5个小技巧让你成长
  • ContentProvider之通过ContentResolver获取图像、视频、音频举例
  • ftp如何上传数据
  • EGL简介
  • js获取html自定义属性
  • vuex的作用和使用场景
  • android 基础
  • windows2003服务器管理器在哪里
  • iframe嵌套页面滚动事件
  • jquery使用教程
  • python简易
  • bootstrap jumbotron
  • 所得税汇总纳税分配表
  • 厂房房产税2021年税率
  • 税务催报通知书怎么接收
  • 开票系统税控盘在哪里
  • 襄城是现在的哪个城市
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设