前端实现微信支付(H5,微信小程序)

2023-11-16

一、微信支付(H5,微信小程序)

通常一些电商项目使用到微信支付操作,所以简单地介绍一下微信支付的具体流程。

1.1 什么是微信支付?在什么业务场景会使用到微信支付?

微信支付是微信内置微信浏览器(其他浏览器不支持)或者微信小程序的支付接口,主要负责用户对商家执行支付操作的流程。
例如常见的电商在下单环节,就需要通过使用微信支付接口,唤醒支付金额以及输入支付密码界面。再通过支付是否成功,跳转到相应的支付成功,支付取消或者支付失败页面。

1.2 通常微信的支付流程

通常支付会分成两种形式:
一、在商品详情页跳转到下单页面去执行支付(此时订单未创建),对应以下的1.2.1 订单未创建的下单支付流程
二、在订单页面处于待支付去支付(此时订单已经创建了),对应以下的1.2.2 订单已创建的下单支付流程

1.2.1 订单未创建的下单支付流程

具体大概流程如下所述:

  1. 在下单页面,用户通过表单输入自己的收货信息等。
  2. 点击下单按钮,按钮事件中通过接口post请求把用户的收货信息等放在body内,后端会返回一个订单编号给前端。(订单创建接口)
  3. 前端拿到此订单编号时,再通过接口post请求把第2步拿到的订单编号放在body内,后端会返回一组支付签名的数据给前端。(订单支付签名接口)
  4. 前端再使用微信自带支付接口(以JSAPI 支付接口为例子),使用此接口时,把第3步获得的支付签名数据参数传给微信支付服务器。
  5. 此时用户界面上会唤起支付页面,就是用户输入支付密码的界面。
  6. 在接口JSAPI 支付接口返回,书写三种if的判断条件:
    ① 用户点击关闭支付密码界面,JSAPI 支付接口就会返回res.err_msg=“get_brand_wcpay_request:cancel”,即用户取消支付,前端书写跳转路由跳到支付取消页面;
    ② 用户支付密码输错后,JSAPI 支付接口就会返回res.err_msg == “get_brand_wcpay_request:fail”,即用户支付失败,前端书写跳转路由跳到支付失败页面;
    ③ 用户支付密码正确后,JSAPI 支付接口就会返回res.err_msg == “get_brand_wcpay_request:ok”,即用户支付成功,前端书写跳转路由跳到支付成功页面;

1.2.2 订单已创建的下单支付流程

具体大概流程如下所述:

  1. 用户进入待支付的订单列表页面,此时后端会通过接口把所有的该用户待支付的订单以及它对应的订单编号传给前端(用户订单列表接口),前端做列表展示。
  2. 用户点击其中一个待支付的订单中继续支付的按钮。按钮事件先把一个待支付的订单的订单编号拿出来。
  3. 接着继续进行1.2.1的第3-6步操作,直至这个订单完成支付流程。

1.3 微信的支付接口

现在一般微信的支付接口会分成两种:
一、JSAPI 支付接口
二、微信公众号的JSSDK中的wx.chooseWXPay
通常支付接口会封装好放在全局中,以便前端调用可以减少重复书写。

1.3.1 JSAPI 支付接口相关代码

// 检测支付环境中的 WeixinJSBridge
   if (typeof WeixinJSBridge == "undefined") {
      if (document.addEventListener) {
        document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
      } else if (document.attachEvent) {
        document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
        document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
      }
    } else {
      onBridgeReady();
    }

    function onBridgeReady() {
        WeixinJSBridge.invoke(
          'getBrandWCPayRequest', {
            "appId": "appId", //公众号名称,由商户传入
            "timeStamp": "timeStamp", //时间戳,自1970年以来的秒数
            "nonceStr": "nonceStr", //随机串
            "package": "package",
            "signType": "MD5", //微信签名方式:
            "paySign": "paySign" //微信签名
          },
          function(res) {
            // 支付成功
            if (res.err_msg == "get_brand_wcpay_request:ok") {
              // 使用以上方式判断前端返回,微信团队郑重提示:
              //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
            }
            // 支付过程中用户取消
            if (res.err_msg == "get_brand_wcpay_request:cancel") {

            }
            // 支付失败
            if (res.err_msg == "get_brand_wcpay_request:fail") {

            }
            /**
            * 其它
            * 1、请检查预支付会话标识prepay_id是否已失效
            * 2、请求的appid与下单接口的appid是否一致
            * */
            if (res.err_msg == "调用支付JSAPI缺少参数:total_fee") {

            }
          });
      }

从上述代码中我们可以看出,先会检测支付环境中的 WeixinJSBridge,个人认为是为了判断执行代码是否处于微信环境。在执行WeixinJSBridge.invoke()的接口请求时,会用到一组支付签名的数据,这正是通过后端请求支付签名所给的。
分别为以下五种数据:

  • appId为公众号名称
  • timeStamp为时间戳,自1970年以来的秒数
  • nonceStr为随机串
  • package为订单详情扩展字符串
  • signType为微信签名方式,默认为MD5
  • paySign为微信签名,通过签名生成算法生成
    (注意:在调用支付接口的参数,支付签名的数据中的字段名受大小写敏感)

1.3.2 微信公众号的JSSDK中的wx.chooseWXPay

1.3.2.1 使用wx.chooseWXPay的前置条件

wx.chooseWXPay使用前需要先准备jweixin-1.6.0.js文件,并在需要使用的页面引用此JS文件。具体使用说明可以查看微信官方JSSDK文档

1.3.2.2 wx.chooseWXPay相关代码

let WeChatPay = function() {
// 2、引入js后、获取公众号校验信息
    let timestamp = '',
      nonceStr = '',
      signature = '';
    let v = {
      // 用于换取微信校验信息的参数:要求不可以包含 “#” 号
      url: location.split('#')[0]
    };

    // 3、通过config接口注入权限验证配置(需要同步进行,在获取到校验信息后方可注入config,否则校验失败!)
    wx.config({
      debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
      appId: '', // 必填,公众号的唯一标识
      timestamp: , // 必填,生成签名的时间戳
      nonceStr: '', // 必填,生成签名的随机串
      signature: '', // 必填,签名
      jsApiList: ["checkJsApi", "chooseWXPay", "updateAppMessageShareData", "updateTimelineShareData"] // 必填,需要使用的JS接口列表
    });

    axios.post('/wx/pay/orderPay_XXXX', data).then(res => {
      // 支付成功状态
      if (res.code == 200) {
        // 获取支付必备的参数
        let {
          nonceStr,
          package,
          signType,
          paySign
        } = res.data;
        // 4、通过ready接口处理成功验证
        wx.ready(function() {
          /* 微信支付 */
          wx.chooseWXPay({
            timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
            nonceStr: nonceStr, // 支付签名随机串,不长于 32 位
            package: package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
            signType: signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
            paySign: paySign, // 支付签名
            success: function(res) {
              // 前端判断返回方式,微信团队郑重提示:不保证绝对可靠,切记!
              if (res.errMsg == 'chooseWXPay:ok') {
                // 【支付成功】
              } else if (res.errMsg == 'chooseWXPay:cancel') {
                // 【支付取消】:用户取消支付不会进入这个判断,而是进入complate和cancel函数
              } else {

              }
            },
            complete: function(res) {
              // 接口调用完成时执行的回调函数,无论成功或失败都会执行
              if (res.errMsg == 'chooseWXPay:ok') {
                // 【支付成功】:支付成功提示页面,点击完成按钮之后
                wx.closeWindow(); /* 关闭微信窗口,调用时需要在config中进行校验 */
              } else if (res.errMsg == 'chooseWXPay:cancel') {
                // 【支付取消】
              } else {

              }
              /**
              * iOS和Android支付成功点击“完成”后都会进入success和complete函数,都返回'chooseWXPay:ok'
              * (也有人说Android支付成功不进入success函数,)
              * 原因是【iOS和Android返回数据不同。支付成功后Android返回 {"errMsg":"getBrandWCPayRequest:ok"},iOS返回{"err_Info":"success","errMsg":"chooseWXPay:ok"},故Android找不到success方法,导致失败】
              * */
            },
            fail: function(err) {
              // 接口调用失败
            },
            cancel: function(err) {
              // 用户点击取消时的回调函数:用户取消支付后实际上进入cancel 和 complate函数
            }
          });
        });
      }
    }).catch(err => {
      console.log('支付失败:', err);
    });
  }

观察上述代码,对比之前的JS API支付接口,可以看多出了2,3两步,需要进行config接口的权限认证,下面支付场景就不多叙述了,重点看第2,3步。
在此中不但需要支付签名的数据,还是用到了jsApiList的字符串数组。那jsApiList的字符串数组是什么用呢?在下面1.3.2.3 jsApiList 会具体说明一下。

1.3.2.3 jsApiList

jsApiList里面一组字符串就是一种功能。
例如微信的H5需要同时使用到微信的获取地址getLocation与共享地址库openAddress。
就可以在 wx.config权限认证时,书写你想要是哦用的功能,即jsApiList: [“getLocation”,“openAddress”]。后面wx.功能名调用此功能接口,实现相应的功能。
具体jsApiList里面能书写的功能可以查看微信官方JSSDK文档
通常H5分享到好友或者分享到朋友圈可以使用此功能。分享出去是一个卡片,里面带图片加标题文字。若不执行wx.config权限认证的话,用户直接进行分享操作时,绘制分享出去是一段链接。

1.3.2.4 jssdk朋友圈或好友以卡片的形式分享规则

之前本人项目会遇到H5需要通过jssdk来分享的业务场景,但首次用户A分享到用户B的时候,往往是没有一卡片的形式分享出来。
在收藏卡片样式如下图所示:
在这里插入图片描述
在好友转发界面卡片样式如下图所示:
在这里插入图片描述

在那之后进行网上搜索,发现首次分享的用户可以通过以下三种规则使用其中一种进行分享:

  • 在公众号菜单中的链接打开,才能正常分享
  • 可以通过收藏链接 再打开分享
  • 把链接换成二维码,扫码后进入分享就OK

这是微信官方jssdk的分享规定,H5的分享确实不像微信小程序一样简单,毕竟H5比微信小程序少了上线审核步骤,不太严谨。
网上查了一圈基本都是这些分享方案,所以首次分享的用户最好是通过开发人员分享出来给客户(按照上面三种的分享规则处理),后面用户B或者更后面用户看到就是卡片+标题+简介的样子

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

前端实现微信支付(H5,微信小程序) 的相关文章

  • Vue:通过ref获取DOM元素

    一 场景描述 我们在页面的开发过程中 经常需要操作 dom 元素 来实现我们需要的效果 以往 js 中 我们是通过给 dom 添加 id 然后 通过 js 代码 document 来获取这个 dom 简写代码案例 h2 这里是h2标签 h2
  • jquery的contains如何实现精准匹配

    HTML结构
  • filezilla中文目录乱码怎么解决

    FileZilla是一款常用的文件传输工具 但在使用过程中可能会遇到乱码的问题 以下是一些可能的解决方案 设置字符集 在连接上站点后 点击菜单栏的 文件 选项 下拉选择 添加当前连接到站点管理器 在弹出的 站点管理器 窗口中 左侧选择 新站
  • 1-创建小程序项目

    注册 打开https mp weixin qq com 点击 立即注册 选择小程序 获取APPID 登录小程序在 开发管理 gt 开发设置 获取 APPID 开发工具 登录小程序在 开发工具 gt 开发者工具 获取 微信开发者工具 创建小程
  • 事件委托Tab栏切换

  • Firefox浏览器-渗透测试插件推荐

    在日常工作中可能需要一些浏览器插件辅助我们做工作 下面是比较好的 当然不一定对你有用 找到适合自己的即可 FoxyProxy FoxyProxy是一个高级的代理管理工具 它完全替代了Firefox有限的代理功能 它提供比SwitchProx
  • 微信怎么申请小程序商城?一步步教你完成

    随着移动互联网的发展 越来越多的企业和个人开始关注微信小程序 微信小程序是一种不需要下载安装即可使用的应用 它实现了应用 触手可及 的梦想 用户扫一扫或者搜一下就能打开应用 其中 小程序商城因其便捷性和实用性 受到了众多商家的青睐 那么 如
  • 每天10个前端小知识 <Day 6>

    前端面试基础知识题 1 使用js实现二分查找 二分查找 也称为折半查找 是指在有序的数组里找出指定的值 返回该值在数组中的索引 查找步骤如下 从有序数组的最中间元素开始查找 如果该元素正好是指定查找的值 则查找过程结束 否则进行下一步 如果
  • 每天10个前端小知识 <Day 5>

    前端面试基础知识题 1 typeof 与 instanceof 有什么区别 typeof与instanceof都是判断数据类型的方法 区别如下 typeof会返回一个变量的基本类型 instanceof返回的是一个布尔值 instanceo
  • Android SDK开发艺术探索(五)安全与校验

    一 前言 本篇是Android SDK开发艺术探索系列的第五篇文章 介绍了一些SDK开发中安全方面的知识 包括资源完整性 存储安全 权限校验 传输安全 代码混淆等知识 通过基础的安全配置为SDK保驾护航 探索SDK开发在安全方面的最佳实践
  • 基于java的饮食分享平台系统设计与实现

    基于java的饮食分享平台系统设计与实现 I 引言 A 研究背景和动机 近年来 随着人们生活水平的提高和健康意识的增强 饮食健康已经成为越来越多人的关注焦点 因此 一个方便快捷的饮食分享平台就显得尤为重要 基于Java的饮食分享平台系统设计
  • 【计算机毕业设计】微信小程序反诈科普平台

    相比于以前的传统手工管理方式 智能化的管理方式可以大幅降低反诈科普平台的运营人员成本 实现了反诈科普平台的标准化 制度化 程序化的管理 有效地防止了反诈科普平台的随意管理 提高了信息的处理速度和精确度 能够及时 准确地查询和修正反诈科普 一
  • HTML概述、基本语法(表格整理、标签、基本结构)

    一 HTML概述 HTML指的是超文本标记语言 超文本 是指页面内可以包含图片 链接 声音 视频等内容 标记 标签 通过标记符号来告诉浏览器页面该如何显示 我们可以打开浏览器 右击页面 点击 查看网页源代码 来方便了解HTML标签通过浏览器
  • 点击存储到固定时间清除存储

    这段代码 无意间想到的 随便写了下来 运行 根据点击之后传递一个参数 将他存入本地存储 方便测试为10秒 10秒后触发下一个事件 清除本地存储 结束
  • 新手也能看懂的【前端自动化测试入门】!

    前言 最近在网上搜索前端自动化测试相关的文档 但是发现网上的文章都是偏使用 没有把一些基础概念说清楚 导致后续一口气遇到一些 karma Jasmine jest Mocha Chai BDD 等词汇的时候很容易一头雾水 这次一方面整理一下
  • chrome浏览器无法在地址栏输入内容搜索问题解决--图文

    关于日常遇到的小问题解决记录一下 1 导航栏录入信息后跳转错误 2 解决办法 默认百度搜索引擎地址错误 百度正确的搜索格式是 http www baidu com s wd s chrome浏览器中百度的搜索格式是 http www bai
  • Web自动化测试 —— cookie复用

    一 cookie简介 cookie是一些数据 存储于用户电脑的文本文件中 当web服务器想浏览器发送web页面时 在链接关闭后 服务端不会记录用户信息 二 为什么要使用Cookie自动化登录 复用浏览器仍然在每次用例开始都需要人为介入 若用
  • 考虑光伏出力利用率的电动汽车充电站能量调度策略研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据
  • Vue中下载不同文件常用的方式

    1 使用window open方法下载文件
  • 【前端】canvas图片加文字

    注释标记了操作步骤 import React Component createRef from react class CertifyImgRender extends Component bgRef createRef

随机推荐

  • Linux内核自带SPI设备驱动测试程序分析:spidev_test.c

    在Linux系统中 SPI 的用户模式设备接口的驱动源码位于 drivers spi spidev c 在应用层生成 dev spidev 的节点 可以通过 read write 达到与硬件设备的 SPI 通信 下面介绍spidev驱动移植
  • js获取当前月、上一月和下一月

    获得当前月 function getNowMonth var date new Date var year date getFullYear var month date getMonth 1 month month gt 9 month
  • K8S 基础概念学习

    1 K8S 通过Deployment 实现滚动发布 比如左边的ReplicatSet 的 pod 中 是V1版本的镜像 Deployment通过 再启动一个 ReplicatSet 中启动 pod中 镜像就是V2 2 每个pod 中都有一个
  • 渗透测试工程师面试题大全(二)

    渗透测试工程师面试题大全 二 from backlion大佬 整理 51 sql 注入写文件都有哪些函数 1 select 一句话 into outfile 路径 2 select 一句话 into dumpfile 路径 3 select
  • 如何安装 IntelliJ IDEA 最新版本——详细教程

    IntelliJ IDEA 简称 IDEA 被业界公认为最好的 Java 集成开发工具 尤其在智能代码助手 代码自动提示 代码重构 代码版本管理 Git SVN Maven 单元测试 代码分析等方面有着亮眼的发挥 IDEA 产于捷克 开发人
  • Allure在自动化测试中的应用!

    01 Allure的简介及使用 1 应用场景 自动化的结果一定是通过一个报告来进行体现 Allure 是一个独立的报告插件 生成美观易读的报告 目前支持Python Java PHP C 等语言 为dev QA 提供详尽的测试报告 测试步骤
  • 微信小程序实现视频号跳转

    三种类型 1 跳转到视频号主页 wx openChannelsUserProfile finderUserName 视频号id 2 跳转到视频号视频 wx openChannelsActivity feedId 视频id finderUse
  • 文件上传-图片webshell上传

    图片webshell制作 在服务器端的PHP代码中 对于用户上传的文件做文件类型检查 查看文件格式是否符合上传规范 可以检查文件二进制格式的前几个字节 从而判断文件类型是否正确 针对这种情况可以直接新建要给1 jpg 其中代码内容如下 GI
  • 【数据结构】 二叉树面试题讲解->壹

    文章目录 引言 相同的树 https leetcode cn problems same tree description 题目描述 示例 示例一 示例二 示例三 题目解析 代码实现 另一棵树的子树 https leetcode cn pr
  • 华为OD机试-找出重复代码-2022Q4 A卷-Py/Java/JS

    小明负责维护项目下的代码 需要查找出重复代码 用以支撑后续的代码优化 请你帮助小明找出重复的代码 重复代码查找方法 以字符串形式给出两行代码 字符审长度1 lt length lt 100 由英文字母 数字和空格组成 找出两行代码中的最长公
  • 深度学习之感知器的python实现,及用感知器实现鸢尾花的分类

    机器学习一般用来处理结构化的数据 深度学习一般用来处理非结构化的数据 例如图像 视频 文字等 权重更新过程 如果真实是1 预测是0 则权重会增加 相当于为了达到阈值增加权重 如果真实是0 预测是1 则权重会降低 相当于为了达到阈值减少权重
  • 玩客云通过openwrt作为旁路由

    前置条件 玩客云安装 docker 安装 OpenWrt 这边又两套方案可供选择 下面是具体教程的链接镜像一 https www right com cn forum thread 8024126 1 1 html镜像二 https hub
  • 在Idea中调试ant应用

    Ant调试 Ant调试 ant 是一种非常方便的打包 部署的工具 通过ant 可以一键构建整个项目 虽然MVN也支持这种功能 但是MVN混杂了package管理的功能 并且不是很自由 学习成本比较高 通常 我们调试ant构成的程序 是通过远
  • 零散算法

    1 字符串匹配 朴素的串匹配算法 KMP匹配算法 2 广度优先搜索BFS 3 深度优先搜索DFS 4 狄克斯特拉算法Dijkstra 5 贪婪算法 6 动态规划 7 安全散列算法SHA 用递归分析问题 基于循环写代码 10 关于查找算法 1
  • unity+射线检测

    private Camera aRCamera Ray ray RaycastHit hit aRCamera GameObject Find RenderCamera GetComponent
  • JavaScript节流与防抖

    一 节流 概念 在规定的间隔时间范围内不会重复触发回调 只有大于这个时间间隔才会触发回调 把频繁触发变为少量触发 类似于技能CD 应用 点击按钮 轮播图点击左右箭头 插件lodash js 它里面封装了函数的防抖与节流业务 p 计数器 sp
  • 抓包工具篇|Charles

    1 简介 Charles 是在 Mac 下常用的网络封包截取工具 在做 移动开发时 我们为了调试与服务器端的网络通讯协议 常常需要截取网络封包来分析 Charles 是收费软件 可以免费试用 30 天 试用期过后 未付费的用户仍然可以继续使
  • 怎样使用BAT脚本实现自动按键盘的某个键

    批处理是不行的 用VBS 很简单 例子如下 Set objShell CreateObject Wscript Shell do WScript Sleep 3000 objShell SendKeys F5 WScript Sleep 3
  • Weblogic 12c 集群部署和session复制

    在上一篇Weblogic12c集群搭建的基础上 这一篇介绍Weblogic12c集群应用的部署和session复制 1 启动服务 首先在weblogic12c控制台 启动受托管服务server1 server2 server3 2 将要部署
  • 前端实现微信支付(H5,微信小程序)

    一 微信支付 H5 微信小程序 通常一些电商项目使用到微信支付操作 所以简单地介绍一下微信支付的具体流程 1 1 什么是微信支付 在什么业务场景会使用到微信支付 微信支付是微信内置微信浏览器 其他浏览器不支持 或者微信小程序的支付接口 主要