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

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

  • 高德打车如何修改目的地(高德打车如何修改终点)

    高德打车如何修改目的地(高德打车如何修改终点)

  • 微信可以上传多长时间的视频(微信可以上传多少mb的视频)

    微信可以上传多长时间的视频(微信可以上传多少mb的视频)

  • 苹果11数据线为什么没编码(苹果11数据线为什么用不了快充)

    苹果11数据线为什么没编码(苹果11数据线为什么用不了快充)

  • 怎么看qq共同好友(怎么看qq共同好友有哪些)

    怎么看qq共同好友(怎么看qq共同好友有哪些)

  • 小米9pro什么时候出来(小米9pro什么时候更新miui13)

    小米9pro什么时候出来(小米9pro什么时候更新miui13)

  • 电脑切屏会黑屏二三秒(电脑切屏会黑屏二三秒HDM1)

    电脑切屏会黑屏二三秒(电脑切屏会黑屏二三秒HDM1)

  • 16g运行内存手机有哪些(oppo16g运行内存手机)

    16g运行内存手机有哪些(oppo16g运行内存手机)

  • 华为怎么换图标的图案(华为怎么换图标和名字图片)

    华为怎么换图标的图案(华为怎么换图标和名字图片)

  • 屏幕录制麦克风被占用怎么解决(屏幕录制麦克风被占用)

    屏幕录制麦克风被占用怎么解决(屏幕录制麦克风被占用)

  • 手机资料转移到新手机用什么软件(手机资料转移到新手机app)

    手机资料转移到新手机用什么软件(手机资料转移到新手机app)

  • 用乘车码为什么没有能量(乘车码为什么不能使用)

    用乘车码为什么没有能量(乘车码为什么不能使用)

  • 快手上买的东西已收到后如何退货(快手买的东西查不到订单是怎么回事)

    快手上买的东西已收到后如何退货(快手买的东西查不到订单是怎么回事)

  • cad2012安装失败原因(cad2012安装失败c++2005)

    cad2012安装失败原因(cad2012安装失败c++2005)

  • 文件名的命名规则是什么(文件名的命名规则视频)

    文件名的命名规则是什么(文件名的命名规则视频)

  • 打电话有视频广告怎么回事(打电话有视频广告)

    打电话有视频广告怎么回事(打电话有视频广告)

  • 微信一条信息怎么发多个人(微信一条信息怎么发给全部好友)

    微信一条信息怎么发多个人(微信一条信息怎么发给全部好友)

  • 芒果tv放映室怎么没了(芒果tv放映厅在哪)

    芒果tv放映室怎么没了(芒果tv放映厅在哪)

  • wps会员可以同时登录几个账号

    wps会员可以同时登录几个账号

  • 上手机淘宝为什么会黑屏(手机淘宝上不去)

    上手机淘宝为什么会黑屏(手机淘宝上不去)

  • 安卓手机充电口类型(安卓手机充电口修一下多少钱)

    安卓手机充电口类型(安卓手机充电口修一下多少钱)

  • 剪切板是什么中的一个临时存储区(剪切板是什么中的)

    剪切板是什么中的一个临时存储区(剪切板是什么中的)

  • 换手机信息如何转移到另外手机上(换手机之后信息怎么转移)

    换手机信息如何转移到另外手机上(换手机之后信息怎么转移)

  • vivo手机深色模式有什么用(vivo手机深色模式省电吗)

    vivo手机深色模式有什么用(vivo手机深色模式省电吗)

  • 华为自带音乐叫什么(华为自带的华为音乐怎么样)

    华为自带音乐叫什么(华为自带的华为音乐怎么样)

  • ipad可以用u盘吗(ipad可以用优盘吗)

    ipad可以用u盘吗(ipad可以用优盘吗)

  • iphone11输入法怎么移动光标(iphone11输入法怎么清除数据)

    iphone11输入法怎么移动光标(iphone11输入法怎么清除数据)

  • 小米手环nfc和普通版区别(小米手环nfc和普通版充电器通用吗)

    小米手环nfc和普通版区别(小米手环nfc和普通版充电器通用吗)

  • 解析Linux系统中bashrc和profile文件的作用区别(linux |bc)

    解析Linux系统中bashrc和profile文件的作用区别(linux |bc)

  • 虚拟存储器是什么(虚拟存储器什么意思)

    虚拟存储器是什么(虚拟存储器什么意思)

  • windows未能正常启动怎么解决(windows未能正常启动)

    windows未能正常启动怎么解决(windows未能正常启动)

  • 图像的傅里叶变换(图像的傅里叶变换和离散余弦变换实验报告)

    图像的傅里叶变换(图像的傅里叶变换和离散余弦变换实验报告)

  • 小规模企业需要交哪些税
  • 个人补缴的医保要做账吗
  • 异常凭证进项税额转出
  • 固定资产入股交什么税
  • 增值税专票发票代码在哪里看
  • 营改增后房地产企业增值税税收筹划存在问题
  • 简易计税项目税金要计入成本吗
  • 某公司是一家刚成立的大型化妆品生产企业
  • 费用和利润的比例
  • 公司购买的二手车如何计提折旧
  • 逾期还款银行罚息怎么算
  • 用于在建工程的原材料进项税额可以抵扣吗
  • 营改增后工程税收怎么计算
  • 商会会费收入要交所得税吗
  • 公司代扣的社保怎么做分录
  • 两公司之间内部转账的会计处理
  • 以前年度资产损失,汇算清缴怎么填表
  • 出口退税附加税计税依据
  • 工会账户销户
  • mac更新系统版本
  • 华为授权查询系统
  • 收到其他公司退款
  • windows11怎么设置锁屏密码
  • windows7旗舰版为什么很多东西打不开
  • 坏账准备怎么做会计科目
  • 超支福利费按什么计提
  • 职工教育经费计入管理费用吗
  • 美丽的大中华
  • 高翔ORB-SLAM2稠密建图编译(添加实时彩色点云地图+保存点云地图)
  • multipartfile 多文件上传
  • 一般纳税人的进项普票怎么做账
  • phpqrcode
  • 公司给员工餐补计入
  • php -a
  • 小规模所得税申报表利润总额是填季报吗
  • 将本月发生的制造费用总额按生产工人
  • 收到事业单位分红怎么办
  • 转出未交增值税借方余额表示什么
  • 退回的个税手续费计入什么科目
  • 3步搞定纯真ip数量
  • 公司的融资租赁有哪些
  • 出口产品报关多少天
  • 差旅费的处理
  • 适用税率9%的征税行为有
  • sql聚合语句
  • 固定资产增加
  • 工程施工会计如何记账
  • 委托加工物资科目贷方登记的内容有什么
  • 企业固定资产对应哪个科目
  • 税前扣除的意思
  • 归还银行贷款利息计入
  • 货物赔偿款怎么做账
  • 利润表期初余额怎么填
  • 开发成本转到哪里
  • 净现值率和现值指数与净现值什么时候它们评价结果一致
  • 一般纳税人原材料的入账价值怎么算
  • vista正版破解
  • mac系统怎么打开任务管理器
  • 硬盘安装后不显示
  • linux中awk怎么用
  • windows7的关闭方法
  • win7如何设置屏幕不黑屏
  • win8引导文件
  • Win7系统打开D盘文件后怎么没有后退箭头
  • win7系统修改mac地址
  • win7电脑dns存在问题怎么修复
  • 遮罩层出现后怎么点击其他地方隐藏
  • 正则表达式语法 \d
  • 两个js文件互相取变量
  • renderjs echarts
  • 谈谈jQuery Ajax用法详解
  • javascript面向对象编程指南
  • 使用jquery实现的项目
  • jquery修改字体
  • python多线程异常后所有线程均不往下执行
  • js入门基础教程
  • 基于JAVASCRIPT实现的可视化工具是
  • 编写javascript代码
  • javascript教程完整版
  • 合肥地税局客服电话
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设