微信小程序webview(H5页面)调用微信小程序支付

2023-10-31

1.业务描述:微信小程序商城入口进入的页面是商城H5页面,在H5页面进行微信支付如何实现;

2.微信小程序(webview访问H5页面)必须使用微信小程序支付;

如何实现以及实现方式以及支付后页面返回功能:

商品详情(h5页面)-->商品确认页(h5页面)-->收银台(h5页面)(点击调用小程序支付页面并关闭收银台)-->进入小程序支付页面(小程序)(根据支付结果判断下一步跳转页面)

支付成功跳转落地页(h5页面)(点击返回-->商品详情)

支付失败跳转回收银台(h5页面)(点击返回-->商品详情)

1).收银台页面

//store - action
import wx from 'weixin-js-sdk'

 /**
         * 微信JSSDK调用小程序页面并传递支付信息 vuex--action
         * @param {*} param0
         * @param {*} payType
         */
        AWechatJsPay ({ state, commit, dispatch, rootState }) {
            const openId = rootState.wechat.openId
            const params = { openId, payMethod: 'JSAPI', payType: '1' }
            return dispatch('AGetPaymentSignInfo', params).then(res => {
                const { data: signature, error } = res
                if (error) {
                    return Promise.resolve(error)
                }
                const payParamsStr = encodeURIComponent(JSON.stringify(signature));
                const paymentQuery = encodeURIComponent(location.hash.split('?')[1]);
                
                const url=`../wxpay/wxpay?payParams=${payParamsStr}&paymentQuery=${paymentQuery}`;
                console.log('url---payParams:', url, signature);
                //跳转到小程序支付界面wxPay
                return new Promise((resolve) =>{
                    wx.miniProgram.navigateTo({
                      url,
                      success: function(){
                        resolve()
                      },
                      fail: function(){
                        resolve('调起支付失败')
                      }
                    });
                })
            })
        }

//vue - js
 store.dispatch('payment/AWechatJsPay').then(res => {
      res && Toast(res)
      !res && router.back(); //调起小程序支付后关闭收银台
 })

2).小程序支付代码

// pages/wxpay/wxpay.wxml
<view class='wrapper'></view>
// pages/wxpay/wxpay.js
Page({
  onLoad: function (options) {
    console.log('支付开始');
    console.log('======',options);
    if(options){
      const _this = this;
      const { payParams, paymentQuery } = options;
      const payParam = JSON.parse(decodeURIComponent(payParams));
      const params = { paymentQuery: decodeURIComponent(paymentQuery) }
      wx.requestPayment({
        ...payParam,
        'success': function (res) {
          console.log('=======支付成功==========', res);
          params.type = "success";
          params.msg = "支付成功";
          _this.goNextStep(params);
        },
        'fail': function (res) {
          let msg="支付失败";
          if (res.errMsg.indexOf("fail cancel"))
          {
            msg="支付取消";
          }
          console.log('=========未支付========', msg)
          params.type = "fail";
          params.msg = msg;
          _this.goNextStep(params);
        }
      })
    }
  },
  //进行测试
  goNextStep: function(params){
    const { type, msg, paymentQuery } = params;
    const queryStr =  type === 'fail' ? paymentQuery : 'payResult=payResult'
    const data = { type, msg, queryStr }
    // 开启存储
    wx.setStorage({
      key: "ProductShopPayment",
      data,
      success() {
        wx.navigateBack({  
          delta: 1, //返回1个页面
        }); 
      }
    }) 
  }
})

3).微信小城市商城入口页面

// shop.wxml 
 <web-view src="{{targetUrl}}"></web-view>
// shop.js
//获取应用实例
const wxApp = getApp()
Page({
  data: {
    targetUrl:''
  },
  onLoad(options){
    const urlbase = wxApp.globalData.eshopBaseUrl+'?v='+ Date.now() + '/#/productList';
    const users = {
      userId: '1',
      openId: 'o',
      userName: '张三',
      phone: '123324234534'
    }
    const userInfo = encodeURIComponent(JSON.stringify(users));
    this.setData({
      targetUrl: urlbase + '?userInfo=' +userInfo
    });
    // 首次要清空存储去掉不可预测的意外存储
    wx.removeStorage({key: 'ProductShopPayment'})
  },
  // 页面再次显示的钩子
  onShow(){
    console.log('=====onShow: ProductShopPayment用于商城微信小程序支付页面回调标识====')
    const _this = this;
    wx.getStorage({
      key: "ProductShopPayment",
      success(res) {
        // 每次取完值后进行清空处理
        wx.removeStorage({ key: 'ProductShopPayment' });
        console.log('支付后回调', res.data)
        // type:支付结果,mag: 支付结果信息提示可用于tips, queryStr:回调页面数据入参,支付成功进入落地页,支付失败跳到收银台
        const { type, msg, queryStr} = res.data
        if(res.data){
          const path = type==='success' ? "/#/result" : "/#/payment"
          const url = wxApp.globalData.eshopBaseUrl+'?v='+ Date.now() + path+ '?' + queryStr;
          _this.setData({
            targetUrl: url
          });
        }
      }
    })
  }

})

难点:梳理需求业务流程

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

微信小程序webview(H5页面)调用微信小程序支付 的相关文章

  • 使用 Javascript/Web Audio API 访问/处理系统音频

    是否可以使用 Web Audio API 访问系统音频 以便对其进行可视化或应用均衡器 看起来可以将系统音频连接到 Web Audio API 可以访问的输入设备 即Web Audio API 获取声卡的输出 https stackover
  • 验证以防止角度形式出现重复的形式值

    我有几个表单数组 我需要进行验证 以便每个表单行中的特定字段在所有表单数组中必须是唯一的 如果任何值出现多次 则两个表单字段都必须标记为红色 我设法编写了一个函数 以便如果这些字段有任何更改 该函数将返回 true false 但我不确定如
  • 解析:Promise.when 有很多 Promise?

    解析文档 https www parse com docs js symbols Parse Promise html when https www parse com docs js symbols Parse Promise html
  • Bootstrap 按钮的检查状态

    我想在 Bootstrap 3 0 2 中设置组复选框的选中状态 docs http getbootstrap com javascript buttons html div class btn group div
  • 如何使用 Angular 1.5 中的组件为每个页面设置标题

    我最近开始使用 Angular 1 5 组件 我的应用程序中有多个页面 所以我决定创建一个
  • 如何将webview内容划分为多个页面

    我必须使用 Android 上的 PdfDocument 从 webView 创建 PDF https developer android com reference android graphics pdf PdfDocument htm
  • 裁剪响应式全宽图像

    我必须剪辑跨越整个宽度的图像 以下事情对我不起作用 剪辑 这需要绝对位置 因此块元素不会堆叠在下面 背景位置 缩放时无法正确剪辑 放大时剪辑的部分会增加 反之亦然 包装器 包装器高度取决于浏览器宽度 因此其值应该是动态的 我使用了 seti
  • 如何提高 highcharts 图表创建和渲染的性能

    我本地有一个文件JSON格式化数据 我创造了一点点PHP脚本在调用时回显该文件的输出AJAX 数据文件的大小是59k 我按照 highcharts 建议禁用动画和阴影 当我加载图表时 渲染需要非常非常长的时间 我已经粘贴了下面的脚本 我有什
  • 在 vuejs 上将 \n 替换为新行

    我正在尝试将 n 字符替换为来自端点的数据的新行 I tried p item licensedocument legal documentText replace r n r n g br p 并没有奏效 当我将replace 写入问题末
  • 使用 JSONP 时出现“无效标签”?

    我的 JSONP 请求有问题 数据不会显示 Firebug 显示 无效标签 错误 我的 JavaScript ajax url link dataType jsonp beforeSend function xhr var base64 b
  • jQuery/JavaScript“this”指针混淆

    当函数时 this 的行为bar被称为让我困惑 请参阅下面的代码 当从单击处理程序调用 bar 时 有什么方法可以将 this 安排为普通的旧 js 对象实例 而不是 html 元素 a class with a method functi
  • Opera Mobile 9.7 Beta 设置焦点 [重复]

    这个问题在这里已经有答案了 我们使用手持式扫描仪将物品移入和移出库存 扫描仪运行一个 ASP 页 该页提交表单以移动项目 我们最近购买了一台运行 Windows Mobile 6 1 的新扫描仪 很快就意识到 Mobile IE 完全没用
  • 禁用 HTML 验证。如何为全局每个表单设置“novalidate”?

    我想知道是否可以做一些事情来禁用应用程序中每个表单的 HTML 验证 有什么办法可以做到这一点或者我应该添加novalidate每个表单标签的属性 看来唯一的方法是添加novalidate使用 JavaScript jQuery 为每个表单
  • Meteor:即使设置了 ANDROID_HOME 也未设置

    操作系统 Ubuntu 14 04 框架 流星1 1 0 2 应用名称 Songofy 这是输出meteor install sdk android meteor install sdk android Found Android bund
  • 将 ngModel 绑定到自定义指令

    所以我已经在这个问题上工作了一个星期了 但我似乎无法理解整个指令的事情 我读了很多帖子 揭秘指令 http www toptal com angular js angular js demystifying directives 指令 ht
  • 单击行内的按钮时防止触发表行 onclick 事件

    我有一个带有 ONCLICK 事件的表行 切换下面的附加数据 在其中一个行单元格内有一个按钮 单击时执行 AJAX 操作 当我单击按钮时 行的 onclick 事件也会触发 并且会发生附加数据在 AJAX 调用完成之前出现 这对我来说是一个
  • Beforeunload 无法将用户重定向到另一个页面,当用户尝试关闭窗口/选项卡时,如何将用户重定向到另一个页面/URL?

    我的以下代码无法将用户重定向到另一个页面 window on beforeunload function window location href http www google com 我希望用户在尝试关闭选项卡时被重定向到另一个页面 实
  • Tizen SDK:找不到变量:tizen

    我正在尝试使用 Tizen SDK 创建一个 Web 应用程序 当我启动应用程序时 一切都很好 但是当我在模拟器上按 后退 按钮时 没有任何反应 并且我看到一条消息 55435 js main js 9 ReferenceError 找不到
  • iOS 上 Safari 中的 shift 键

    有没有办法在javascript中判断手机键盘上是否按下了shift键 并将其与大写锁定 按两次shift键 区分开来 一些事实 首先 让我们看一下有关 iOS 键盘的一些事实 我假设您已经知道了 当您进入键盘模式时 shift键始终处于激
  • 构造函数可以返回什么值来避免返回 this ?

    确切的情况是什么 returnJavascript 中的语句可以返回除this当使用构造函数调用时new关键词 Example function Foo return something var foo new Foo 如果我没记错的话 如

随机推荐

  • Java 获取当前日期时间字符串速度测试2306221507

    Java 获取当前日期时间字符串速度测试2306221507 测试代码 import java text SimpleDateFormat import java time import java time format DateTimeF
  • 微众银行区块链张开翔:数字时代的身份基础设施建设

    6月24日 中钞区块链技术研究院 飞天诚信科技股份有限公司 微众银行等17家单位共同发起成立分布式数字身份产业联盟 DID Alliance 简称DIDA 共建分布式数字身份基础设施 打造可信开放数字新生态 本文系微众银行区块链首席架构师张
  • vaspkit使用_vaspkit.014安装使用说明 -

    vaspkit 0 14 修正版发布 安装下载指南 1 下载网址 http www pudn com downloads221 sourcecode unix linux detail1038949 html 免费的 2 利用xshell将
  • 微信小程序之间的参数传递、获取

    一 获取当前页面参数 js onLoad async function options var pages getCurrentPages 获取加载的页面 var currentPage pages pages length 1 获取当前页
  • 记·Linux挖矿病毒应急响应

    一 前言 朋友说他的机器被用来挖矿了 叫我帮他处理一下 正好锻炼锻炼应急响应能力 二 处置 top查看cup发现占用300 确实是被用来挖矿了 查看异常进程9926的pid端口 发现为空查找不到连接情况 怎么回事 查看全部端口网络连接 发现
  • javaAPI(五):比较器Comparable和Comparator

    前言 java中的对象 正常情况下 只能进行比较 或 不能使用 gt 或 lt 的 但是再开发场景中 我们需要对多个对象进行排序 言外之意 就需要比较对象的大小 如何实现 使用两个接口中的一个 Comparable 自然排序 1 像Stri
  • 区块链架构有哪些?

    本文将整理汇总目前常见的区块链各种架构 通过汇总分析 区块链的架构基本都大同小异 前面详细介绍几个 后面的就不重复介绍了 个人技术公众号 解决方案工程师 欢迎同领域的朋友关注 相互交流 一 区块链原理架构 技术层面 区块链的结构如下图所示
  • python中使用numpy.load()读取npz文件遇到的一个小问题

    import numpy as np np load data npz 报错 OSError Errno 22 Invalid argument 之后发现问题 我将 npz文件下载之后修改了名字 如果代码中指定了特定的文件名 例如 xxx
  • Webservice实践(五)基于CXF的服务端开发

    本节将实践目前最流行的第二种web service 发布和调试框架 CXF Apache CXF 是一个开放源代码框架 提供了用于方便地构建和开发 Web 服务的可靠基础架构 它允许创建高性能和可扩展的服务 您可以将这样的服务部署在 Tom
  • 我的世界如何开直连服务器,我的世界服务器如何连接 连接服务器教程

    我的世界分单人模式和多人模式 在游戏中我们一般是玩单人模式的 可是在偌大的世界中室友你一个人 你是否会觉得寂寞呢 下面小编就来介绍下如何进入多人模式 希望大家喜欢 多人模式服务器可以自己创建 也可以加入他人的服务器 那么怎么加入服务器呢 下
  • Python之列表

    标题 列表 什么是列表 列表的创建 列表的删除 列表的访问 列表的常用方法 append insert extend pop remove clear count index list filter reduce lambda 列表支持的运
  • Tomcat:eclipse首选项中没有tomcat?

    为eclipse添加tomcat插件 近期因为兴趣 找了一个javaweb的纯SSM的项目 但是发现我的eclipse4 7版本的 首选项中竟然没有tomcat 所以在网上找了很多方法 终于找到一个很有用的博客 有俩种方法 方法一 一 下载
  • 【OpenCV学习笔记】【函数学习】四(origin+imageData+cvcopy()函数+CvMemStorage 类型+CvPoint类型)

    1 origin 在使用opencv显示图像时会出现图像倒立的情况 这与IplImage的origin属性有关系 origin为0表示顶左结构 即图像的原点是左上角 如果为1为左下角 一般从硬盘读入的图片或者通过cvCreateImage方
  • 289. 生命游戏(Java)

    题目描述 根据 百度百科 生命游戏 简称为生命 是英国数学家约翰 何顿 康威在 1970 年发明的细胞自动机 给定一个包含 m n 个格子的面板 每一个格子都可以看成是一个细胞 每个细胞都具有一个初始状态 1 即为活细胞 live 或 0
  • Python期末实训,爬虫实验报告

    Python爬取豆瓣电影 版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net qq 45774645 article details 11
  • 华为手机微信聊天记录删除怎么恢复?基于华为电脑助手备份的恢复方法

    华为手机最新的微信记录恢复方法 简单有效 HiSuite是华为手机官方的手机电脑助手管理软件 可以把手机设备上的数据备份至电脑 支持联系人 短信 应用程序等的备份 同样HiSuite也可以把微信库文件完整地备份到电脑上 这样就可以扫描微信库
  • 如何编写REST API

    编写REST API REST API规范 编写REST API 实际上就是编写处理HTTP请求的async函数 不过 REST请求和普通的HTTP请求有几个特殊的地方 REST请求仍然是标准的HTTP请求 但是 除了GET请求外 POST
  • Oracle 动态sql 实现方式

    1 2 Sample Program 10 Dynamic SQL Method 4 3 4 This program connects you to ORACLE using your username and 5 password th
  • 后端接口判断字段必填_ERP系统会计凭证中的那些必填项

    作者 Jelly 声明 本文章仅代表原作者观点 仅用于SAP软件的应用与学习 不代表SAP公司 01 凭证日期 凭证日期是必填的 凭证日期填写原始单据的日期 02 过账日期 过账日期是必填的 凭证正式过账到系统的日期 系统默认凭证记账当日
  • 微信小程序webview(H5页面)调用微信小程序支付

    1 业务描述 微信小程序商城入口进入的页面是商城H5页面 在H5页面进行微信支付如何实现 2 微信小程序 webview访问H5页面 必须使用微信小程序支付 如何实现以及实现方式以及支付后页面返回功能 商品详情 h5页面 gt 商品确认页