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

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

  • 论坛推广发帖技巧 怎么在论坛发帖推广(论坛推广发帖技巧和方法)

    论坛推广发帖技巧 怎么在论坛发帖推广(论坛推广发帖技巧和方法)

  • 手机千牛待发货打不开(手机千牛待发货无法看到地址和电话)

    手机千牛待发货打不开(手机千牛待发货无法看到地址和电话)

  • duilib.dll是干嘛的(duilib32.dll)

    duilib.dll是干嘛的(duilib32.dll)

  • 苹果siri不说话只显示字(苹果siri不说话怎么办)

    苹果siri不说话只显示字(苹果siri不说话怎么办)

  • 华为荣耀30s上市时间(华为荣耀80上市时间和价格)

    华为荣耀30s上市时间(华为荣耀80上市时间和价格)

  • 华为手机卡包功能在哪里(华为手机的卡包功能)

    华为手机卡包功能在哪里(华为手机的卡包功能)

  • 保留与word早期版本的兼容性是什么意思(保留与word早期版本的兼容性要勾选吗)

    保留与word早期版本的兼容性是什么意思(保留与word早期版本的兼容性要勾选吗)

  • 腾讯会议怎么禁用麦克风权限(腾讯会议怎么禁止录屏)

    腾讯会议怎么禁用麦克风权限(腾讯会议怎么禁止录屏)

  • 华为nova2plus怎么录屏(华为nova2plus怎么开启volte)

    华为nova2plus怎么录屏(华为nova2plus怎么开启volte)

  • 钉钉群未认证是什么意思(钉钉群显示未认证)

    钉钉群未认证是什么意思(钉钉群显示未认证)

  • 手机卡不注销影响大吗(手机卡不注销影响考公务员吗)

    手机卡不注销影响大吗(手机卡不注销影响考公务员吗)

  • oppoa37m怎么装内存卡(oppoa37m怎么加内存卡)

    oppoa37m怎么装内存卡(oppoa37m怎么加内存卡)

  • 为什么电脑主机开了又自己关了(为什么电脑主机亮了屏幕不亮)

    为什么电脑主机开了又自己关了(为什么电脑主机亮了屏幕不亮)

  • 苹果查找iphone怎么用(苹果查找iphone怎么关闭)

    苹果查找iphone怎么用(苹果查找iphone怎么关闭)

  • 手机yy怎么上麦(手机yy怎么上麦图解)

    手机yy怎么上麦(手机yy怎么上麦图解)

  • oppo下拉搜索怎么去掉(oppo下滑搜索)

    oppo下拉搜索怎么去掉(oppo下滑搜索)

  • 土壤污染原因有哪些(土壤受污染的现象及原因)

    土壤污染原因有哪些(土壤受污染的现象及原因)

  • 华为mate30pro5g外观尺寸(华为mate30pro5G外屏碎了点二手卖多少钱)

    华为mate30pro5g外观尺寸(华为mate30pro5G外屏碎了点二手卖多少钱)

  • 怎么打开ai格式的文件(如何打开ai格式文件怎么打开)

    怎么打开ai格式的文件(如何打开ai格式文件怎么打开)

  • 经常访问怎么删除(怎样删掉经常访问)

    经常访问怎么删除(怎样删掉经常访问)

  • 微信打字键盘怎么调大小(微信打字键盘怎么跑到中间了怎么回事)

    微信打字键盘怎么调大小(微信打字键盘怎么跑到中间了怎么回事)

  • 快手能查看别人的粉丝吗(快手能查看别人的历史记录吗)

    快手能查看别人的粉丝吗(快手能查看别人的历史记录吗)

  • 鸿蒙系统怎么开启NFC并复制复制门禁卡?(鸿蒙系统怎么开发)

    鸿蒙系统怎么开启NFC并复制复制门禁卡?(鸿蒙系统怎么开发)

  • 最早的数码相机是什么(世界上最早的数码相机)

    最早的数码相机是什么(世界上最早的数码相机)

  • 小规模纳税人销售自建不动产
  • 以现金支付
  • 清退加班费
  • 赔偿损失费用发票怎么开
  • 一般计税预缴增值税3%怎么办
  • 港资企业定义
  • 小规模纳税人发票怎么做账
  • 扣缴附加税怎么做分录
  • 纳税筹划成本支出怎么算
  • 单位支付给职工的一次性补助金怎么入账
  • 企业开办时间是什么意思
  • 企业职工遣散费标准
  • 防伪税控发票
  • 清算备付金的会计科目
  • 企业年金个人所得税扣除标准
  • 税局代开专票如何做账务处理?
  • 转让长期股权投资交什么税
  • 工程改造合同印花税
  • 所得税预缴申报表
  • 个体工商户税收怎么算
  • 保安公司增值服务
  • 普通增值税 税点
  • 利润表所得税费用计算公式
  • 超过单张发票限额
  • 税务增加办税人员怎么操作
  • 外购货物评估减值要转出进项税额吗?
  • 银行承兑汇票的转让一般通过什么渠道
  • 申请专利的顺序
  • 电脑每次开机都要选择系统怎么办
  • centos6.5下载
  • 什么是suv汽车
  • 下列关于企业发生的税费说法正确的是
  • windows11怎么设置锁屏时间
  • PHP:spl_autoload_call()的用法_spl函数
  • 交易性金融资产的交易费用计入哪里
  • 二手商铺要缴纳契税吗
  • php strrev
  • 强制划缴税款
  • cesium三维地球
  • 头歌java第一课
  • linux suid
  • 公司更衣柜费用怎么算
  • 财务人离职了怎么说
  • 非成品油发票为什么不能抵扣
  • 出租改自用房产税
  • 企业的所有分类
  • 加工费能直接抵税吗
  • cms静态页面生成原理
  • phpcms教程
  • 织梦如何使用
  • 一般纳税人给小规模开普票的税率
  • 员工意外伤害险入什么会计科目
  • 出口佣金账务处理
  • 固定资产净残值率
  • 工地上报销项目有哪些
  • 进口货物的库存商品金额依据
  • 对公支付宝提现怎么取消
  • 创建mysql表sql语句
  • 判断某个字段的值是否在指定的范围内
  • win10小娜语音激活
  • Mail.app增强插件:Universal Mailer介绍
  • linux进入操作系统
  • zhp.exe是什么进程
  • windows设置
  • kali渗透工具安装
  • Linux系统root密码忘记怎么重置
  • linux忘了root密码
  • 虚拟光驱uiso
  • cocos2d 网页
  • Sublime Text + decoda 调试Quick-cocos2d-x 游戏
  • javascript闭包函数
  • 批处理删除重复值
  • 详解金球奖之争
  • Android spinner 的使用
  • python获取entry里输入的值
  • 保险的佣金一般是多少
  • 资源税选矿和原油的区别
  • 沈阳市税务局全称
  • 车辆整备质量怎么填
  • 晋中税务局领导班子简历
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设