前端实现微信支付(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
  • vue中的防抖和节流

    在Vue中 防抖和节流是两种常用的优化技术 用于限制事件的触发频率 以提高页面性能 防抖 Debounce 是指在事件被触发后 等待一段时间后再执行回调函数 如果在这段等待时间内 事件又被触发 则重新计时 防抖通常用于限制重复触发频率较高的
  • ECMAScript简介及特性介绍

    ECMAScript 简称ES 是JavaScript的规范 同时也是被广泛采用和实现的脚本语言标准 从最初的1996年推出第一版至今 ECMAScript已经经历了数十年的发展和改进 成为了互联网开发中的重要基石之一 本文将对ECMASc
  • Web 安全漏洞之 OS 命令注入

    什么是 OS 命令注入 上周我们分享了一篇 Web 安全漏洞之 SQL 注入 其原理简单来说就是因为 SQL 是一种结构化字符串语言 攻击者利用可以随意构造语句的漏洞构造了开发者意料之外的语句 而今天要讲的 OS 命令注入其实原理和 SQL
  • WEB前端常见受攻击方式及解决办法总结

    一个网址建立后 如果不注意安全问题 就很容易被人攻击 下面讨论一下集中漏洞情况和放置攻击的方法 一 SQL注入 所谓的SQL注入 就是通过把SQL命令插入到web表单提交或输入域名或页面请求的查询字符串 最终达到欺骗服务器执行恶意的SQL命
  • 每天10个前端小知识 <Day 6>

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

    前端面试基础知识题 1 typeof 与 instanceof 有什么区别 typeof与instanceof都是判断数据类型的方法 区别如下 typeof会返回一个变量的基本类型 instanceof返回的是一个布尔值 instanceo
  • 前端基础:回顾es6相关知识

    Author note 题记 ECMAscript is international standard of javascript ECMA 是 js的国际标准版语言 let and const 为什么之前用var现在需要用let cons
  • 【计算机毕业设计】毕业生就业管理微信小程序_lm9q0

    腾讯公司在2017年1月19日发布了一款不需要下载 不需要卸载 不需要存储的软件叫微信小程序 受到了很多人的喜欢 微信小程序自2017年发布至今 依托微信的社交属性和庞大的用户基数 已经渗透到生活的方方面面 1 微信小程序可以将基于微信平台
  • 【计算机毕业设计】微信小程序反诈科普平台

    相比于以前的传统手工管理方式 智能化的管理方式可以大幅降低反诈科普平台的运营人员成本 实现了反诈科普平台的标准化 制度化 程序化的管理 有效地防止了反诈科普平台的随意管理 提高了信息的处理速度和精确度 能够及时 准确地查询和修正反诈科普 一
  • 探索Web开发的未来——使用KendoReact服务器组件

    Kendo UI 是带有jQuery Angular React和Vue库的JavaScript UI组件的最终集合 无论选择哪种JavaScript框架 都可以快速构建高性能响应式Web应用程序 通过可自定义的UI组件 Kendo UI可
  • 点击存储到固定时间清除存储

    这段代码 无意间想到的 随便写了下来 运行 根据点击之后传递一个参数 将他存入本地存储 方便测试为10秒 10秒后触发下一个事件 清除本地存储 结束
  • 低代码-添加按钮组件设计

    效果图 可拆分为以下细节 按钮列表 删除 两个操作需同步删除 点击外侧删除 点击复选框删除 添加 点击复选框添加 示例代码 技术栈 vue3 arco design ts less tailwindcss
  • 低代码配置-列表页组件设计

    保存 表单属性存放 bill 筛选项配置存放 filterLayout 列表按钮存放 buttonLayout 列表布局存放 listLayout api存放 api 数据结构 layout 存放表单基础配置 bill 存放按钮基础配置 b
  • 面试官随便问几个问题就知道你究竟做没做过微信支付宝支付

    面试官随便问几个问题就知道你究竟做没做过微信支付宝支付 你知道直连模式和服务商模式吗 网上的课程一般给你演示的都是直连模式 而企业中有不少是申请成为了服务商 因为里面有佣金提成 我粗俗地解释 直连模式 就是说你是一个会做生意的老板 自己会搞
  • vue实现 marquee(走马灯)

    样式 代码 div class marquee prompt div class list prompt span class prompt item span div div data return listPrompt xxx xxxx
  • 微信小程序|SSM微信小程序的学生选课系统

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • 计算机Java项目|springboot校园台球厅人员与设备管理系统

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • 获取年与年之间的所有年份

    function getYearsBetween startYear endYear var years 存放结果的数组 for var year startYear year lt endYear year years push year
  • 如何在 Python 脚本中使用 Google OAuth2

    在使用 Python 脚本将视频上传到 YouTube 频道时 若希望将视频上传到第二个频道 需要解决 OAuth2 授权的问题 解决方案 创建新的 Google Cloud 项目 from google oauth2 import ser

随机推荐

  • 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 什么是微信支付 在什么业务场景会使用到微信支付 微信支付是微信内置微信浏览器 其他浏览器不支持 或者微信小程序的支付接口 主要