位置: 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程序,实现简易计算机)

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

  • safari阅读模式怎么开(safari阅读模式怎么开ipad)

    safari阅读模式怎么开(safari阅读模式怎么开ipad)

  • 5g和4g手机有什么区别(5g手机和4g手机有什么区别科普)

    5g和4g手机有什么区别(5g手机和4g手机有什么区别科普)

  • 华为p40pro支持hifi音效吗(华为P40PRO支持多大U盘)

    华为p40pro支持hifi音效吗(华为P40PRO支持多大U盘)

  • 华为耳机freebuds3如何挂电话(华为耳机freebuds3怎么连接苹果手机)

    华为耳机freebuds3如何挂电话(华为耳机freebuds3怎么连接苹果手机)

  • 苹果短信特效长按没有(iphone的短信特效)

    苹果短信特效长按没有(iphone的短信特效)

  • 支付宝取消预约火车票(支付宝取消预约转账)

    支付宝取消预约火车票(支付宝取消预约转账)

  • ipad插耳机是外放的(ipad2020插耳机是外放的)

    ipad插耳机是外放的(ipad2020插耳机是外放的)

  • 淘宝晚到必赔是什么意思(淘宝晚到必赔是不是要等收货后)

    淘宝晚到必赔是什么意思(淘宝晚到必赔是不是要等收货后)

  • 钉钉可以定位员工行动轨迹吗(钉钉可以定位员工吗)

    钉钉可以定位员工行动轨迹吗(钉钉可以定位员工吗)

  • 小米9pro动不动就没信号了(小米9pro为什么动不动黑屏)

    小米9pro动不动就没信号了(小米9pro为什么动不动黑屏)

  • 华为p30pro有OTG功能吗

    华为p30pro有OTG功能吗

  • 微信无缘无故被永久封号怎么办(微信无缘无故被投诉了、是怎么回事)

    微信无缘无故被永久封号怎么办(微信无缘无故被投诉了、是怎么回事)

  • 如何把腾讯视频下载到本地(如何把腾讯视频下载的视频导出来)

    如何把腾讯视频下载到本地(如何把腾讯视频下载的视频导出来)

  • 如何把视频下载到手机(如何把视频下载到MP4上)

    如何把视频下载到手机(如何把视频下载到MP4上)

  • 手机直推什么意思(手机直推怎么推)

    手机直推什么意思(手机直推怎么推)

  • 京东订单如何延长收货(京东订单怎么延长收货)

    京东订单如何延长收货(京东订单怎么延长收货)

  • 手机屏幕怎么设置永不休眠(手机屏幕怎么设置别人看是黑的)

    手机屏幕怎么设置永不休眠(手机屏幕怎么设置别人看是黑的)

  • 手机迅雷播放设置在哪(手机迅雷怎么能全屏播放)

    手机迅雷播放设置在哪(手机迅雷怎么能全屏播放)

  • 导航说三方应用是什么意思(第三方导航)

    导航说三方应用是什么意思(第三方导航)

  • 不开网络微信能计步吗(不开网络微信能打电话吗)

    不开网络微信能计步吗(不开网络微信能打电话吗)

  • 拼多多找不到我的商品(拼多多找不到我的步数功能)

    拼多多找不到我的商品(拼多多找不到我的步数功能)

  • 华为nemtl00h是哪款机(nemal00华为是什么型号)

    华为nemtl00h是哪款机(nemal00华为是什么型号)

  • rakuten是哪个球队(rakuten gobal)

    rakuten是哪个球队(rakuten gobal)

  • 安卓隔空投送在哪打开(隔空投送到安卓)

    安卓隔空投送在哪打开(隔空投送到安卓)

  • 虚拟游戏键盘怎么设置(虚拟游戏键盘怎么打字)

    虚拟游戏键盘怎么设置(虚拟游戏键盘怎么打字)

  • 黑解卡是什么(黑解卡多少钱一张)

    黑解卡是什么(黑解卡多少钱一张)

  • 抖音如何选择本地音乐(抖音如何选择本地音乐配乐)

    抖音如何选择本地音乐(抖音如何选择本地音乐配乐)

  • 粘贴在哪里找(粘贴在哪里找出来)

    粘贴在哪里找(粘贴在哪里找出来)

  • Win10 21H1即将推送 上手体验新UI图标(windows 10 21h1)

    Win10 21H1即将推送 上手体验新UI图标(windows 10 21h1)

  • 苹果电脑如何查看Mac版Flash Player的版本号(苹果电脑如何查看内存大小)

    苹果电脑如何查看Mac版Flash Player的版本号(苹果电脑如何查看内存大小)

  • 小规模纳税人收入是含税还是不含税
  • 带息承兑汇票的利息收入要缴纳增值税吗
  • 进口增值税的计税价格为
  • 普通商户怎么开小票
  • 家电公司销售电器赠送小礼品如何做账?
  • 别人开业送的花怎么说
  • 过期的费用发票怎么处理
  • 如何查询分公司开户行
  • 广告宣传费用的计算方法
  • 增值税普通发票怎么开
  • 增值税的会计核算
  • 房地产不可销售的物业有哪些
  • 公司装修费用必须交税吗
  • 国税代开普通发票现需作废需要哪些资料?
  • 税控盘清盘怎么做
  • 关于增值税普通发票开票信息填写要求
  • 印制宣传册
  • 收购药材再销售可以免税
  • 研发失败的项目可以加计扣除吗
  • 贸易公司未开票收入要报税吗
  • 未达账项做完调节表后怎么处理?
  • 全部出售子公司怎么做账
  • 生产企业出口退税全部流程
  • 企业押金怎么管理
  • 发票专用章正规位置盖在哪里
  • 出租商品计入什么科目
  • mac开机声音取消
  • windows 11硬件
  • win7系统还原系统保护关闭
  • 外购货物用于职工福利进项税额可以抵扣吗
  • 作为一名程序员应该掌握哪些语言
  • wgcore.dll是什么文件夹
  • 生育津贴差额账务处理
  • 借款业务包括以下哪些形式
  • Laravel 5.4因特殊字段太长导致migrations报错的解决
  • 在Yii2特定页面如何禁用调试工具栏Debug Toolbar详解
  • 厂房改造支出可以计入厂房价值吗
  • 国际货运代理存在的必要性有哪些方面
  • 新会计准则规定
  • linux大版本升级
  • SQL Server UPDATE语句的用法详解
  • 预付款被退回分录
  • 结转以后年度抵免的境外所得税怎么进行会计处理
  • 为外单位人员报备流程
  • 企业之间的往来款要1900万要交多少税
  • 砂石资源税怎么算
  • 报关单是美元收欧元
  • 没实收资本还怎么做账
  • 车子的上牌费要计入成本吗
  • 商业银行的固定资产
  • mysql中的null值和空
  • mysql命令行导出表结构
  • win2003控制面板在哪里打开
  • win8.1怎么改win7系统
  • win10选择一个选项
  • macbookair如何恢复系统
  • macbookair屏幕变成横版
  • win7中文显示问号
  • centos yum 命令
  • linux定时任务实现原理
  • win7右键没有
  • [置顶]bilinovel
  • 三眼仔啥意思
  • Cocos2dx3.2 CrazyTetris 物理引擎使用初步
  • css样式表实验心得
  • bootstrap2
  • [置顶]JM259194
  • linux什么是二进制文件
  • 安卓app开源项目
  • 深入python3
  • Python for Informatics 第11章之正则表达式(二)
  • 国家税务总局广州市税务局
  • 化妆品的消费税税率是多少
  • 应付和未付的区别
  • 珠宝消费税怎么申报
  • 企业税务情况查询
  • 餐厅税务依据有哪些
  • 调研基本情况介绍范文
  • 专票清单用什么纸打印
  • 开原航天医院官网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设