vue 移动端H5微信支付和支付宝支付

2023-10-27

业务场景介绍:

H5移动端支持微信支付 [ 微信支付分为微信内支付(JSAPI支付官方API)和微信外支付(H5支付官方API)] && 支付宝支付 [手机网站支付转 APP 支付 官方API ]

订单生成逻辑:前端请求后端提交订单,后端去和微信或者支付宝对接生成订单(后续支付都是这个逻辑进行的对接)

一、移动端微信支付,vue中如何玩?

在移动端微信支付分为微信内支付和微信外支付。
1.在订单组件中选择支付方式之后在支付页面先去判断是否是在微信内:

//判断是否微信
        is_weixn(){
          var ua = window.navigator.userAgent.toLowerCase();
          if (ua.match(/MicroMessenger/i) == 'micromessenger'){
            return true;
          } else {
            return false;
          }
        },

2.触发立即支付方法,根据微信内外的不同请求后端不同的接口,如果是微信外支付非常简单了~
3.【微信外支付】下面先看微信外支付,官方文档也写的很清楚,后端返回一个url地址,前端的工作就是拿到这个url地址进行跳转就可以了,看一下2-3步代码:

 handelPay() {
          if(this.wechatpayType == 'wxpay'){
           // console.log("微信内支付")
            let data={
              amount:this.number,
            }
            this.$http.insideWeChatPay(data).then( res => {
              if(res.data.code === 200){
                this.weChatParameter=res.data.data
               // console.log(this.weChatParameter,"微信内支付需要参数")
                this.weixinPay()
              }else{
                Toast({
                  message: res.data.msg,
                  position: 'middle',
                  duration: 1000
                });
              }
            });
          } else if(this.wechatpayType == 'wxpay_php'){
           // console.log("微信外支付")
            let data={
              amount:this.number,
            }
            this.$http.outsideWeChatPay(data).then( res => {
              if(res.data.code === 200){
                let url=res.data.data
                window.location.replace(url)   //这里是后端返回的URL直接进行跳转即可完成微信外支付
              }else{
                Toast({
                  message: res.data.msg,
                  position: 'middle',
                  duration: 1000
                });
              }
            });
          }
        },

4.在调起支付的页面监听从其他页面返回的事件,进行一些刷新业务逻辑的实现即可,至此微信外支付已经完成。

document.addEventListener("visibilitychange", function() {
    //需要的操作
});

5.【微信内支付】微信内支付比起微信外支付稍微复杂一点,但是也不难,(3步骤代码里面已经请求支付方式接口拿到了微信内支付所需要的参数)根据官方API
微信内置js对象 WeixinJSBridge,进行开发,至此微信浏览器内支付已经完成

		 //解决微信内置对象报错
        weixinPay(data){
          var vm= this;
          if (typeof WeixinJSBridge == "undefined"){
            if( document.addEventListener ){
              document.addEventListener('WeixinJSBridgeReady', vm.onBridgeReady(data), false);
            }else if (document.attachEvent){
              document.attachEvent('WeixinJSBridgeReady', vm.onBridgeReady(data));
              document.attachEvent('onWeixinJSBridgeReady',vm.onBridgeReady(data));
            }
          }else{
            vm.onBridgeReady();
          }
        },
        //微信内置浏览器类,weChatParameter对象中的参数是3.步骤代码中从后端获取的数据
        onBridgeReady(){
          var  vm = this;
          var timestamp=Math.round(vm.weChatParameter.timeStamp).toString();
          WeixinJSBridge.invoke(
            'getBrandWCPayRequest',{
              debug:true,
              "appId":vm.weChatParameter.appId,     //公众号名称,由商户传入
              "timeStamp":timestamp, //时间戳,自1970年以来的秒数
              "nonceStr":vm.weChatParameter.nonceStr, //随机串
              "package":vm.weChatParameter.package,
              "signType":vm.weChatParameter.signType, //微信签名方式:
              "paySign":vm.weChatParameter.paySign, //微信签名
              jsApiList: [
                'chooseWXPay'
              ]
            },
            function(res){
              // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
              if(res.err_msg == "get_brand_wcpay_request:ok" ){
                Toast({
                  message: '支付成功',
                  position: 'middle',
                  duration: 3000
                });
                vm.number=null
                vm.$router.go(-1)
                //window.location.href = vm.BASE_URL + 'index.html#/depositResult'
              }else{
                Toast({
                  message: '支付失败',
                  position: 'middle',
                  duration: 3000
                });
              }
            }
          );
        },

6.微信内部浏览器支付也可以封装一下,在全局都可以直接调用:


//微信浏览器支付
function wxpay(params,callback){
  if (typeof WeixinJSBridge == "undefined"){
     if( document.addEventListener ){
         document.addEventListener('WeixinJSBridgeReady', onBridgeReady(params,callback), false);
     }else if (document.attachEvent){
         document.attachEvent('WeixinJSBridgeReady', onBridgeReady(params,callback)); 
         document.attachEvent('onWeixinJSBridgeReady', onBridgeReady(params,callback));
     }
  }else{
     onBridgeReady(params,callback);
  } 
}

function onBridgeReady(params,callback){
    var that = this
   WeixinJSBridge.invoke(
       'getBrandWCPayRequest', {
           "appId":params.appId,          
           "timeStamp":params.timeStamp,         
           "nonceStr":params.nonceStr, 
           "package":params.package,     
           "signType":params.signType, 
           "paySign":params.paySign 
       },
       function(res){  
          callback(res)
       }
   ); 
  }

7.组件中调用微信支付:

this.commonUtils.wxpay(res.data.data,function(payResult){
 	if(payResult.err_msg == "get_brand_wcpay_request:ok" ){
			//执行
     	} 
})

二、移动端支付宝支付,vue中如何玩?

其实支付宝支付也有H5支付和支付宝浏览器支付,这里只做H5支付,因为已经满足了业务需求。
1.支付宝中的H5支付和PC端的一样,主要是后端的工作量,后端完成订单的生成之后返给前端的是form表单,前端只需要负责做页面的跳转即可:

 	//立即支付按钮
      onSubmit() {
        if (this.payWay == 1) {
        	//支付宝支付
          	this.$router.push({path: '/aliPay', query: {orderId: this.orderId}});
        } else if (this.payWay == 2) {
         //微信支付,这里跳转到本文的微信支付模块的3.步骤handelPay方法
        }
      },

2.选择支付宝方式之后进入支付宝承载页面:

<template>
  <div v-html="html"></div>
</template>
<script>
    export default {
      data(){
        return{
          html:''
        }
      },
      methods:{
        fetchVideoPay(){
          let param={
            orderId: this.$route.query.orderId
          };
          this.$api.orderpage.videoAliPay(param).then( res => {
            this.html = res.data;
            this.$nextTick(() => {
              document.forms[0].submit()   //渲染支付宝支付页面
            })
          })
        }
      },
      mounted(){
        this.fetchVideoPay()
      }
    }
</script>

当然不想写承载页的还有其他方法调起支付,具体逻辑具体分析,根据不同的业务类型去变通比如:

const div = document.createElement('div');
div.innerHTML = (res.data);  //res.data是返回的表单
document.body.appendChild(div);
document.forms.alipaysubmit.submit();

3.进入到支付宝支付页(至此但有一个问题,调起支付后,用户中途取消支付或者点返回键会整个网页一起关闭退出,或者一直在进入支付页面,不知道有没有更好的SEO方案)
在这里插入图片描述
**PC端的微信和支付宝支付 点击查看 **

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue 移动端H5微信支付和支付宝支付 的相关文章

  • 前端实现导出excel表格(合并表头)

    需求 勾选行导出为excel表格 合并表头 一 安装插件 npm install save file saver xlsx 运行项目报如下警告的话 运行npm install xlsx 0 16 0 save 来降低版本号 最初我安装的版本
  • vue:实现锚点双向滚动/文章章节联动滚动效果

    文章目录 需求描述 实现思路 示例代码 参考网址 需求描述 需要实现类似doc中文档大纲的效果 点击对应章节的名称时定位到相应的正文 而当正文滚动时 高亮显示对应的章节名称 实现思路 其实笔者一开始想到的是利用a标签页内跳转 也就是 锚点
  • 包管理工具那么多,怎么选?npm、yarn 和 pnpm 三者比较及使用详解!

    1 简介 在 Vue 项目中 我们需要使用许多第三方依赖库 如 Vue Router Vuex Axios Element UI 等等 这些依赖库通常以 NPM 包的形式提供 而且在使用时需要进行版本管理 因此 我们需要使用一个包管理工具来
  • Vue 组件化

    什么是组件化 任何一个人处理信息的逻辑能力都是有限的 所以 当面对一个非常复杂的问题时 我们不太可能一次性搞定一大堆的内容 但是 我们人有一种天生的能力 就是将问题进行拆解 如果将一个复杂的问题 拆分成很多个可以处理的小问题 再将其放在整体
  • ip正则表达式

    var Sip rule value callback gt if 2 5 0 5 0 4 d 0 1 d 1 2 2 5 0 5 0 4 d 0 1 d 1 2 3 test value false callback new Error
  • 8.全配置自动生成模块前后端

    文章目录 学习资料 配置式开发全新的模块 快速实现 字典管理 代码生成器详细属性设置 全智能模块开发 查询调整 多表连接 药品模块 生产厂家下拉框 学习资料 https www bilibili com video BV13g411Y7GS
  • vue动态绑定video视频src问题解决

    做个项目 视频部分需要先后台上传 然后前端页面显示 然后就遇到了视频动态获取地址的问题 一开始想着很简单 使用v model双向绑定就行了 结果试了下并不行 后面开始度娘 尝试过很多人说的 refs解决 结果并不行 虽然浏览器中看地址确实绑
  • ant-design-vue 全局和局部引入组件

    1 全局引入 在main js里面引入 import Vue from vue import ant design vue dist antd css import Antd from ant design vue Vue use Antd
  • Vue出现弹出层时,禁止底部页面跟随滑动

    背景 最近在写一个vue项目 当出现弹出层时 发现底部页面跟随滚动 但是产品不想要这种效果 于是找各种资料 发现很多说法 但是试了试 发现有的根本就不行 比如说有人提出用vue中提供的 touchmove prevent方法来解决 但是我试
  • uni-app项目中使用scss语法

    最近正在学习uni app开发 我先把文档浅略翻了遍 发现组件和接口几乎都是按照微信小程序走 但是视图层上的语法又是按照vue的语法走的 所以开发过程一定要注意这点 然后我想在uni app项目中使用scss语法 但是具体怎么安装呢 历经曲
  • vue element select下拉框树形多选

    components 文件下新建 SelectTree文件 index vue SelectTree index vue
  • vue——vue-video-player插件实现rtmp直播流

    更新 flash已不可再使用 大家另寻出路吧 安装前首先需要注意几个点 vue video player插件 其实就是 video js 集成到 vue 中 所以千万不要再安装 video js 可能会出错 视频流我这个项目选择rtmp格式
  • 【vue3】elementplus日期组件英文转中文

    vue3 elementplus日期组件英文转中文 1 在main js或者main ts中加入 即可解决 import ElementPlus from element plus import element plus dist inde
  • Vue学习之watch侦听器:案例实现翻译功能

    watch侦听器 作用 监视数据的变化 当数据发生变化时 执行一些业务逻辑或者是异步操作 执行的场景例如在线翻译 当文本区域的内容发生变化时 会发生翻译内容的同时更新 语法 简单的写法 简单数据类型 可以直接的进行监听 完整的写法 添加额外
  • 基于vue2+海康威视web开发包3.2 无插件版本开发的监控系统

    文章目录 前言 一 插件准备 二 使用步骤 前言 项目最终效果为 可以预览 并且可以使用云台控制 购买的海康威视摄像头必须可以开启websocket 一 插件准备 插件下载地址 下载WEB无插件开发包V3 2 并加入到vue项目中 下载后解
  • [黑马程序员TypeScript笔记]------一篇就够了

    文章目录 1 TypeScript 介绍 TypeScript 是什么 TypeScript 为什么要为 JS 添加类型支持 TypeScript 相比 JS 的优势 2 TypeScript 初体验 安装编译 TS 的工具包
  • vue项目日期处理day.js

    dayjs安装 1 npm 安装 npm install dayjs save 2 项目使用 import dayjs from dayjs ES 2015 dayjs format 使用介绍 1 秒 获取或设置秒 接受0到59的数字 如果
  • (vue)el-popover鼠标移入提示效果

    vue el popover鼠标移入提示效果 效果 代码
  • vue的组件

    在Vue中 组件是可复用的代码块 用于构建用户界面 Vue的组件系统允许您将界面拆分为独立的 可重复使用的部件 提供了更好的代码组织和复用性 以下是在Vue中创建组件的基本步骤 创建一个组件实例 可以使用Vue extend 方法创建一个V
  • 黑豹程序员-字符串中查找出重复的字符串

    Collections frequency codeList element 字符串element 在codeList集合中重复的次数 List

随机推荐

  • C语言字符串及其函数

    C语言中没有类似于C 或Java中的string类型 如果要在C中表示字符串 可用字符数组的形式 数组的概念可戳此链接了解 在C 中 string类库可以更简单的表示和使用字符串 可戳此链接了解string类 C语言中字符串是以空字符 0结
  • FRP中安全地暴露内网服务

    导读 之前的教程介绍的frp内网穿透都是用tcp模式 但是tcp模式是直接把端口映射到公网IP上 很容易被扫描爆破 还是存在一定的风险 我们可以使用frp提供的stcp模式来避免公开暴露端口 同时访问者也要运行一个frpc作为接收转发 fr
  • angular4中ngModel双向绑定在限制输入情况下与value值不一致的问题及尝试的解决方法

    近期公司的一个后台项目在使用angular4进行开发 随着项目的推进和迭代开发 需要对有的input框的value值进行限制输入 例如目前项目的一些input框只允许输入数字和 这两种形式的内容 就在input标签的中添加了 keyup 属
  • html中怎么引入外部css文件路径,怎么引入外部css文件样式?

    怎么引入外部css文件样式 来给html标记添加各种样式 下面本篇文章就来给大家介绍一下引入外部css文件样式的方法 希望对大家有所帮助 方法1 使用来引入外部的css文件 在网页的标签对中使用标记来引入外部样式表文件 使用html规则引入
  • ddl是什么意思网络语_ddl是什么意思(网络语ddl是什么梗)

    每文一言 潜能 我等皆具之资 01 DDL 其真身为deadline 又名死亡之线 常现于众学士之眼 或如任务上缴之日 排它念 存己欲 三刻之内便可将之 绳之以法 实乃天网恢恢 疏而不漏 亦如大考之时 废寝忘食 通宵达旦 以一目十行之势 饱
  • C++默认模板自变量(Default Template Arguments)

    一 类模板的默认模板自变量 我们可以对 class templates 定义其 template parameters 的默认值 这称为 default template arguments 默认模板自变量 默认模板自变量值甚至可以引用前一
  • tomcat重要参数调优

    一 3个参数搞定并发配置 作为一个能承接高并发互联网请求的Web容器 首当其冲的当然是海量请求的冲击 幸运的是Tomcat支持NIO 我们可以通过调整线程数和并发配置 让它表现出最佳的性能 maxThreads tomcat接收客户端请求的
  • MySQL基础(附练习题+答案)

    一 数据库简介 1 数据库系统 1 1数据库 DataBase 简称DB 指的是长期保存在计算机上的一些数据 按照一定的规则组织起来 意义 可以被多个用户或者多个应用共享 存储 维护和管理数据的集合 mysql sqlite 1 2数据库管
  • STM32系列(HAL库)——F103C8T6通过MPU6050+DMP姿态解算读取角度及温度

    1 软件准备 1 编程平台 Keil5 2 CubeMX 3 XCOM 串口调试助手 4 文件资料包 点击跳转下载 2 硬件准备 1 一个捡来的MPU6050 2 F1的板子 本例使用经典F103C8T6 3 ST link 下载器 4 U
  • YOLO数据集实现数据增强的方法(裁剪、平移 、旋转、改变亮度、加噪声等)

    前言 最近我在做论文实验时从MSCOCO数据集中筛选了符合条件的1260张图片 但数据样本太少了 于是我就利用数据增强的方法实现了带标签的样本扩充 最后扩充为7560张图片 本文就来记录一下过程 有不懂的地方欢迎留言噢 目录 前言 一 什么
  • mix_transformer_demo

    代码 原代码为mix transformer 官方代码 我改了一些地方做适配 目的是做研究 并了解一下mix transformer 原来的代码的segformer head 的normalize那里的config的type是SyncBN
  • 为什么3D建模成为副业标配?

    其实在副业大时代的潮流下找到一份适合自己的副业兼职 改变现状 并不是一件很困难的事情 如果你喜欢游戏 喜欢动漫 对影视动画制作感兴趣 热爱画画 模型等等 3D建模是你副业兼职的最好选择 3D建模 通俗来讲是通过三维制作软件 构建出具有三维数
  • WSL1升级为WSL2

    首先需要启用组件 使用管理员打开Powershell并运行 Enable WindowsOptionalFeature Online FeatureName VirtualMachinePlatform 启用后会要求重启计算机 从https
  • Python全栈(七)Flask框架之4.Flask模板继承与案例练习

    Flask模板继承与案例练习 一 模版继承 二 配置静态资源文件 三 模板案例 一 模版继承 Flask中的模板可以继承 把模板中重复出现的元素抽取出来放在父模板中 子模板再根据自己的需要进行改写 通常 在父模板中定义公用的部分 通过定义b
  • Swift 变量

    变量是一种使用方便的占位符 用于引用计算机内存地址 Swift 每个变量都指定了特定的类型 该类型决定了变量占用内存的大小 不同的数据类型也决定可存储值的范围 上一章节我们已经为大家介绍了基本的数据类型 包括整形Int 浮点数Double和
  • WPF System.Windows.Data Error: 17 数据校验模板绑定错误

    错误定位 Path AdornedElement Validation Errors 0 ErrorContent 修改为 Path AdornedElement Validation Errors CurrentItem ErrorCon
  • linux下创建samba共享

    参考网上哪位大神的忘记了 用的是ubuntu 首先 sudo apt get install samba 安装好后在 etc samba 目录下面改一下smb conf文件 保存之前的 cd etc samba mv smb conf sm
  • Rust更适合经验较少的程序员?

    随着 Rust被亚马逊 谷歌等大厂青睐 越来越多的开发者加入学习大军 但接触之后 不少人纷纷嗟叹 Rust 太难了 在2020年Rust调查报告中 当被问及为什么会停止使用Rust时 有35 的开发者表示他们还没学会 可能是因为没有时间 也
  • 求平均成绩(C语言---AC)

    Problem Description 假设一个班有n n lt 50 个学生 每人考m m lt 5 门课 求每个学生的平均成绩和每门课的平均成绩 并输出各科成绩均大于等于平均成绩的学生数量 Input 输入数据有多个测试实例 每个测试实
  • vue 移动端H5微信支付和支付宝支付

    业务场景介绍 H5移动端支持微信支付 微信支付分为微信内支付 JSAPI支付官方API 和微信外支付 H5支付官方API 支付宝支付 手机网站支付转 APP 支付 官方API 订单生成逻辑 前端请求后端提交订单 后端去和微信或者支付宝对接生