小程序、H5、APP中的微信支付概述和实战总结

news2024/12/23 17:32:36

最近开发的一个微信小程序的项目结束了,里面用到了支付相关的api,借着项目总结一下小程序各种场景支付的逻辑。

在这里插入图片描述

1. 微信支付概述

1.1 微信支付的重要性

微信支付作为中国领先的移动支付方式之一,其便捷性、安全性以及广泛的用户基础使其成为商家和开发者不可忽视的支付渠道。根据2024年的数据统计,微信支付的日交易量已超过十亿笔,覆盖线上线下多种支付场景。

微信支付的普及不仅极大地方便了用户的日常支付行为,也促进了移动支付技术的发展和应用。其安全性通过多重加密和风险控制机制得到了保障,增强了用户对移动支付的信心。

1.2 微信支付在不同平台的应用

微信支付的应用范围广泛,涵盖了微信小程序、公众号H5以及移动应用(App)等多个平台。以下是各个平台微信支付的简要说明:

  • 微信小程序支付:用户在小程序中选择商品或服务后,可以直接通过微信支付完成交易,无需跳转至其他应用,提高了支付的流畅性和用户体验。
  • 公众号H5支付:通过微信公众号访问的H5页面,用户同样可以利用微信支付进行交易,这为公众号运营者提供了便捷的收款渠道。
  • App支付:在移动端App中集成微信支付功能,用户在App内完成支付操作,享受一站式服务体验,同时也为App开发者带来了更多的商业机会和收益。

微信支付的跨平台特性,使得开发者能够根据不同平台的特点和用户需求,灵活地实现支付功能,为用户提供更加丰富和便捷的支付选项。

2. uni-app微信支付实现

2.1 微信小程序支付

2.1.1 获取openid和code

在微信小程序中实现支付功能,首先需要获取用户的openid。通过调用wx.login()接口,可以获得一个唯一标识用户身份的code,进而通过后端接口使用这个code来交换获取openid。openid是用户在微信生态中的唯一标识,对于确保支付安全至关重要。

  • 根据微信官方文档,小程序支付的openid获取流程如下:
    wx.login({
      success (res) {
        if (res.code) {
          // 发起网络请求获取openid
          uni.request({
            url: '你的后端接口地址',
            method: 'GET',
            data: {
              code: res.code // 将前端获取的code传给后端
            },
            success: function(res) {
              console.log(res.data.openid)
            }
          })
        } else {
          console.log('获取用户登录态失败!' + res.errMsg)
        }
      }
    })
    

2.1.2 创建订单和获取orderId

在获取到openid后,接下来需要创建订单并获取orderId。这通常涉及到调用后端服务,提交订单详情,如商品信息、金额等,然后由后端生成订单,并返回一个唯一的orderId。

  • 创建订单的后端请求示例:
    uni.request({
      url: '你的后端订单创建接口',
      method: 'POST',
      data: {
        openId: '用户的openid',
        goodsDetail: '商品详情', // 包括商品金额、数量等信息
      },
      success: function(res) {
        console.log(res.data.orderId)
      }
    })
    

2.1.3 调用支付核心参数和发起支付

最后一步是调用后端接口获取支付核心参数,并使用wx.requestPayment()方法发起支付。核心参数包括时间戳、随机字符串、预支付交易会话标识、签名算法和签名等。

  • 获取支付核心参数的后端请求示例:
    uni.request({
      url: '你的后端支付参数接口',
      method: 'POST',
      data: {
        orderId: '订单ID',
        openId: '用户的openid'
      },
      success: function(res) {
        // 调用微信支付接口
        wx.requestPayment({
          timeStamp: res.data.timeStamp,
          nonceStr: res.data.nonceStr,
          package: res.data.package,
          signType: res.data.signType,
          paySign: res.data.paySign,
          success: function(res) {
            console.log('支付成功', res)
          },
          fail: function(res) {
            console.log('支付失败', res)
          }
        })
      }
    })
    

以上流程是uni-app在微信小程序中实现微信支付的一般步骤。需要注意的是,所有的支付操作都需要在用户与商户有明确交易意愿的前提下进行,确保支付过程的安全性和合规性。

3. 公众号H5支付实现

3.1 JSAPI支付方式

3.1.1 获取JSAPI核心参数

在公众号H5支付中,JSAPI支付是一种常用的方式。首先需要获取JSAPI所需的核心参数,这些参数通常包括appId、timeStamp、nonceStr、package、signType和paySign。

  • appId:公众号的ID,用于标识公众号。
  • timeStamp:时间戳,从1970年1月1日00:00:00至今的秒数,用于确保请求的时效性。
  • nonceStr:随机字符串,长度为32个字符以下,用于确保签名的随机性。
  • package:统一下单接口返回的prepay_id参数值,用于标识本次支付的订单。
  • signType:签名算法类型,通常使用RSA。
  • paySign:签名字符串,用于验证请求的合法性。

获取这些参数通常需要调用后端接口,后端会根据订单信息和微信支付的要求生成这些参数。以下是一个示例代码,展示如何通过uni.request调用后端接口获取JSAPI核心参数:

uni.request({
  url: '后端接口地址,获取支付核心数据',
  method: 'POST',
  data: { 传入接口需要的参数,如订单ID,openId等 },
  success(res) {
    // 调用下方支付方法
    wxpay(res.data)
    console.log(res.data)
    // 接口会返回以下核心参数
    // appId     公众号ID
    // timeStamp 时间戳
    // nonceStr  随机字符串
    // package   统一下单接口返回的 prepay_id 参数值
    // signType  微信签名方式RSA
    // paySign   微信签名
  }
})

3.1.2 通过JSAPI发起支付

一旦获取了JSAPI的核心参数,就可以使用这些参数通过JSAPI发起支付。这个过程需要在微信浏览器中进行,因为微信浏览器提供了WeixinJSBridge对象,用于调用微信支付。

  • 检测WeixinJSBridge:首先需要检测WeixinJSBridge对象是否存在,如果存在则直接调用支付,如果不存在则监听WeixinJSBridgeReady事件,当事件触发时再调用支付。

  • 调用支付:使用WeixinJSBridge.invoke方法调用getBrandWCPayRequest,传入获取到的核心参数,完成支付流程。

以下是一个示例代码,展示如何通过JSAPI发起支付:

function wxpay(data) {
  if (typeof WeixinJSBridge == "undefined") {
    if (document.addEventListener) {
      document.addEventListener('WeixinJSBridgeReady', onBridgeReady(data), false);
    } else if (document.attachEvent) {
      document.attachEvent('WeixinJSBridgeReady', onBridgeReady(data));
      document.attachEvent('onWeixinJSBridgeReady', onBridgeReady(data));
    }
  } else {
    onBridgeReady(data);
  }
}

function onBridgeReady(data) {
  WeixinJSBridge.invoke(
    'getBrandWCPayRequest', {
      "appId": data.appId, //公众号
      "timeStamp": data.timeStamp, //时间戳
      "nonceStr": data.nonceStr, //随机串
      "package": data.package, //prepay_id
      "signType": data.signType, //微信签名方式RSA
      "paySign": data.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") {

      }
    });
}

通过这种方式,可以在公众号H5页面中实现微信支付功能,为用户提供便捷的支付体验。

4. App内微信支付实现

4.1 App微信支付流程

App微信支付流程是移动端应用中常见的支付方式,它允许用户在App内直接完成支付操作,提高了用户体验和支付效率。以下是App微信支付的实现流程:

  • 登录获取OpenID:首先,需要调用微信登录接口uni.login获取用户授权的code,然后通过后端接口使用code换取用户的OpenID。

    uni.login({
      provider: "weixin",
      success: function(event){
        const {openid, access_token} = event.authResult;
        // 获取用户信息
        uni.getUserInfo({
          provider: 'weixin',
          success: function(info) {
            // 获取用户信息成功, 调用后端接口进行完成登录
          }
        })
      },
      fail: function (err) {
        // 登录授权失败
        // err.code是错误码
      }
    })
    
  
- **创建订单获取订单ID**:登录成功后,需要调用后端接口创建订单,并获取订单ID。
  
  ```javascript
  uni.request({
    url: '后端接口地址,获取订单id',
    method: 'POST',
    data: { 传入接口需要的参数,如商品金额,商品个数等 },
    success(res) {
      console.log(res.data.orderId)
    }
  })
  • 获取支付核心参数:调用后端接口获取支付核心参数,包括时间戳、随机字符串、预支付交易会话标识(prepay_id)、签名算法和签名。

    uni.request({
      url: '后端接口地址,获取支付核心数据',
      method: 'POST',
      data: { 传入接口需要的参数,如订单ID},
      success(res) {
        console.log(res.data)
        // 接口会返回以下核心参数
        // timeStamp 时间戳
        // nonceStr 随机字符串
        // package 统一下单接口返回的 prepay_id 参数值
        // signType 签名算法
        // paySign 签名
      }
    })
    
  • 发起支付:使用uni.requestPayment方法发起支付,传递支付核心参数。

    uni.requestPayment({
      provider: 'wxpay',
      orderInfo: data.orderInfo, // 微信、支付宝订单数据 【注意微信的订单信息,键值应该全部是小写,不能采用驼峰命名】
      nonceStr: data.noncestr,
      package: data.package,
      timeStamp: data.timestamp,
      signType: data.signType,
      paySign: data.paySign,
      success: function (res) {
        if (e.errMsg == "requestPayment:ok") {
          console.log('支付成功')
        }else{
          console.log('支付失败')
        }
      },
      fail: function (err) {
        console.log('支付失败:' + JSON.stringify(err));
      }
    });
    

4.2 使用uni.requestPayment进行支付

uni.requestPayment是uni-app提供的一个统一支付API,它能够根据运行的平台自动调用相应的支付接口。以下是使用uni.requestPayment进行支付的关键步骤:

  • 参数准备:在调用uni.requestPayment之前,需要准备好支付所需的参数,包括服务提供商(provider)、订单信息(orderInfo)、时间戳(timeStamp)、随机字符串(nonceStr)、预支付交易会话标识(package)、签名算法(signType)和签名(paySign)。

  • 调用支付接口:使用uni.requestPayment方法发起支付请求,并传入准备好的参数。

    uni.requestPayment({
      provider: 'wxpay',
      orderInfo: data.orderInfo,
      nonceStr: data.noncestr,
      package: data.package,
      timeStamp: data.timestamp,
      signType: data.signType,
      paySign: data.paySign,
      success: function (res) {
        if (res.errMsg == "requestPayment:ok") {
          console.log('支付成功');
        } else {
          console.log('支付失败');
        }
      },
      fail: function (err) {
        console.log('支付失败:' + JSON.stringify(err));
      }
    });
    
  • 处理支付结果:在支付成功后,可以通过回调函数中的success参数获取支付结果,并进行相应的业务处理。如果支付失败,则可以通过fail参数获取错误信息,并提示用户。

通过上述步骤,开发者可以在uni-app中实现App内微信支付功能,为用户提供便捷的支付体验。

5. 错误处理和调试技巧

5.1 常见错误及解决方法

在uniapp实现微信支付的过程中,开发者可能会遇到各种问题。以下是一些常见的错误及其解决方法:

  • 问题一:支付场景非法

    • 原因:后端在创建预支付接口时未将trade_type修改为JSAPI模式。
    • 解决方法:确保后端创建预支付订单时,trade_type参数设置正确,符合微信支付的要求。
  • 问题二:支付验证签名失败

    • 原因:后端生成签名时填写的appid不正确,或者小程序appid与应用的appid不一致。
    • 解决方法:检查并确保使用的appid与小程序或应用的appid一致,且签名过程中使用正确的密钥。
  • 问题三:调用支付JSAPI缺少参数:total_fee

    • 原因:调用支付接口时,必要的参数total_fee(总金额,单位为分)未正确传递。
    • 解决方法:检查并确保所有必要的支付参数都已经包含在调用中,特别是total_fee
  • 问题四:支付请求超时

    • 原因:网络问题或者服务器处理时间过长导致支付请求超时。
    • 解决方法:优化服务器端的处理逻辑,减少响应时间;同时检查客户端的网络连接,并提供超时重试机制。
  • 问题五:支付结果未知或不一致

    • 原因:支付完成后,回调或前端结果处理逻辑存在问题,导致无法正确判断支付状态。
    • 解决方法:确保支付完成后,服务器端能够接收到微信的支付结果通知,并正确处理;前端需要根据回调结果更新支付状态。
  • 问题六:支付过程中用户取消

    • 原因:用户在支付过程中主动取消支付操作。
    • 解决方法:前端需要正确处理用户取消支付的情况,给用户相应的提示,并记录取消支付的事件以供后续分析。
  • 问题七:支付接口调用失败

    • 原因:调用支付接口时,可能由于参数错误、网络问题或微信服务器问题导致调用失败。
    • 解决方法:检查调用参数是否正确,确保网络连接正常,如果问题持续存在,可以联系微信商户平台获取支持。
  • 问题八:H5支付在某些浏览器或环境下无法调起

    • 原因:H5支付依赖于微信浏览器或特定的JSSDK,某些环境下可能存在兼容性问题。
    • 解决方法:确保使用的浏览器支持微信支付,如果问题依旧,尝试更新或更换浏览器,同时检查JSSDK的版本和配置是否正确。
  • 调试技巧

    • 使用console.log输出关键变量和状态,以便快速定位问题。
    • 利用debugger语句在代码中设置断点,进行逐步调试。
    • 检查网络请求和响应,使用浏览器的开发者工具查看详细的请求和响应数据。
    • 对于跨平台问题,使用条件编译和运行时检查来确保代码的正确执行。

通过上述的常见错误及解决方法,开发者可以更加高效地处理uniapp实现微信支付过程中遇到的问题,并提升支付功能的稳定性和用户体验。

6. 安全性和最佳实践

6.1 数据加密和签名机制

在实现uniapp微信支付的过程中,确保交易的安全性是至关重要的。以下是一些关键的安全措施和最佳实践:

  • 数据传输安全:使用HTTPS协议来加密客户端和服务器之间的所有通信,确保传输的数据不被截获或篡改。
  • 敏感信息保护:对于敏感信息如支付金额、用户身份信息等,必须在服务器端进行处理,避免在客户端暴露。
  • 签名机制:微信支付要求对支付请求进行签名,以确保请求的完整性和真实性。使用安全的签名算法(如RSA)对支付参数进行签名,并在服务器端进行验证。
  • 密钥管理:支付密钥应该严格保密,并且定期更换。建议使用专门的密钥管理系统来存储和访问密钥。
  • 订单状态验证:在支付完成后,通过微信提供的查询接口来验证订单状态,确保支付操作的准确性。
  • 异常处理:实现完善的异常处理机制,对于支付过程中出现的任何异常情况都能够及时响应并妥善处理。
  • 日志记录:记录详细的支付日志,包括请求和响应数据,以便在出现问题时进行追踪和分析。
  • 合规性:确保支付流程符合相关法律法规和行业标准,例如PCI DSS(支付卡行业数据安全标准)。
  • 前端安全:避免在前端JavaScript中硬编码任何支付相关的敏感信息,以防止XSS攻击等安全风险。
  • 服务器安全:确保服务器安全,及时更新系统和应用程序的安全补丁,使用防火墙和入侵检测系统来防御潜在的攻击。

通过实施上述措施,可以在使用uniapp实现微信支付时,最大程度地保护用户数据和交易安全。

如果这篇文章对你有所帮助,欢迎点赞、分享和留言,让更多的人受益。感谢你的细心阅读,如果你发现了任何错误或需要补充的地方,请随时告诉我,我会尽快处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1960789.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

已解决丨怎么快速的让IP地址实现HTTPS访问?

要快速让IP地址实现HTTPS访问,可以遵循以下简洁步骤: 1. 确认公网IP地址 确保你拥有一个固定的公网IP地址,因为HTTPS访问需要通过互联网上的公网IP进行。 2. 选择证书颁发机构(CA) 选择一个受信任的证书颁发机构&a…

从PLC到云端,ZP3000系列网关助力工业数字化转型

ZP3000系列远程控制网关是一款专为满足现代工业自动化和远程监控需求而设计且功能强大的通讯模块。它的多接口设计和灵活配置能力,使得它能够适应多种复杂的工业通信和监控场景。以下是关于ZP3000系列远程控制网关的详细特点和应用场景: 产品特点 双以太…

playwright 模拟F11 全屏

直接上源代码 import multiprocessing import time from multiprocessing import Processfrom playwright.sync_api import sync_playwrightdef run(playwright):# 使用 Chromium 浏览器运行 设置 headlessFalse 以打开可视化窗口browser playwright.chromium.launch(headles…

C语言——设计TVM(地铁自动售票机)机软件。

输入站数,计算费用,计费规则,6站2元,7-10站3元,11站以上为4元。 输入钱数,计算找零(找零时优先找回面额大的钞票),找零方式为各种面额张数,可识别面额: 100,50,20,10,5,1…

linux中mysql的安装使用(普通版版本+docker版本)

linux中mysql的安装使用 一、普通安装1.下载安装包2.流程 二、用docker安装1.拉取mysql镜像2.启动镜像3.开启权限第一种情况第二种情况 三、用Navicat连接 一、普通安装 1.下载安装包 挑选个你喜欢的目录,用wget下载并且解压 wget http://dev.mysql.com/get/Down…

指针!!C语言 字符串篇(第四篇)

目录 一. sizeof和strlen的对比 二. 数组和指针笔试题解析 2.1 一维数组 2.2 字符数组 2.3 二维数组 一. sizeof和strlen的对比 在C语言中有两个比较相似的知识点,就是sizeof和strlen,下面我们来讲一下它们两者之间有什么不同之处? &a…

python脚本制作循环执行命令行

python import subprocess import sysif __name____main__:ret 1while ret!0:ret subprocess.call(sys.argv[1:], textTrue)pack pip install pyinstaller pyinstaller --onefile loop.py pyinstaller -i *.ico loop.py #指定ico图标 使用场景 使用上面生成的loop.exe调用c…

前端开发者必备:揭秘谷歌F12调试的隐藏技巧!

前言 使用断点(breakpoint)是调试 JavaScript 代码的一种非常有效的方式。通过在代码的关键位置设置断点,可以阻止页面的状态变化,从而方便地检查和修改页面的当前状态。 1. 使用 setTimeout 配合 debugger 和 console.log setTi…

调用百度的大模型API接口实现AI对话!手把手教程!

本文介绍如何使用百度的大模型API接口实现一个AI对话项目 1 注册百度云 2 获取API接口 3 配置环境 4 代码编写与运行 5 chat models 1 注册百度云 搜索百度云,打开官网注册,充值一点点大米(收费很低,大概生成几个句子花费一毛…

立仪光谱共焦传感器应用测量之:汽车连接器高度差测量

01 检测要求,要求测量汽车连接器的高度差 02 检测方式 根据观察,我们采用立仪科技光谱共焦H4UC控制器搭配D65A52系列镜头,角度最大,外径最大,量程大,可以有效应用于测量弧面,大角度面等零件。 0…

【嵌入式之RTOS】什么是著名的食客问题

目录 一、问题描述 二、四个条件 三、实际应用中的意义 著名的“食客问题”(Dining Philosophers Problem)是一个经典的计算机科学问题,用来说明并发编程中的资源竞争和死锁问题。这个问题最初是由荷兰计算机科学家Edsger Dijkstra提出的…

秘密实验室开服教程(SCP: Secret Laboratory)

1、购买后登录服务器(百度莱卡云) 购买服务器后,如下图👇,面板信息都在产品详情页面内 注意:请不要用你的莱卡云账号信息去登陆服务器面板 进入控制面板后会出现正在安装的界面,安装时长约5分…

【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析

前言: 接上篇,排序算法除了选择排序(希尔排序)和插入排序(堆排序)之外,还用交换排序(冒泡排序、快速排序)和归并排序已经非比较排序,本篇来深层解析这些排序算…

2 卷积神经网络CNN

文章目录 LeNet-5AlexNetGoogLeNetResNet 本章代码均在kaggle上运行成功 LeNet-5 import torch import torch.nn as nn from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pyplot as plt from matplotlib_inline impo…

木马后门实验

实验拓扑 实验步骤 防火墙 配置防火墙—充当边界NAT路由器 边界防火墙实现内部 DHCP 分配和边界NAT需求,其配置如下 登录网页 编辑接口 配置e0/0 配置e0/1 编辑策略 测试:内部主机能获得IP,且能与外部kali通信 kali 接下来开启 kali 虚…

【视频讲解】后端增删改查接口有什么用?

B站视频地址 B站视频地址 前言 “后端增删改查接口有什么用”,其实这句话可以拆解为下面3个问题。 接口是什么意思?后端接口是什么意思?后端接口中的增删改查接口有什么用? 1、接口 概念:接口的概念在不同的领域中…

BUGKU-WEB-好像需要密码

如果点击start attrack 后出现 Payload set 1: Invalid number settings 的提示,先点hex 后点 decimal 再开始start attrack,这是一个软件bug,需要手动让它刷新。 解题思路 先随便输入测试:admin看看源码吧那就爆破了 据说&…

项目比赛经验分享:如何抓住“黄金一分钟”

项目比赛经验分享:如何抓住“黄金一分钟” 前言引起注意:用事实和故事开场明确痛点:描述问题和影响介绍解决方案:简明扼要激发兴趣:使用视觉辅助概述演讲结构:清晰的路线图我的开场白示例结语 前言 在创新的…

【小超嵌入式】 交叉编译工具安装过程

1、下载交叉编译工具链 ● 确定目标平台: 首先,你需要确定你的目标平台是什么,比如ARM、MIPS等。不同的目标平台需要不同的交叉编译工具链。 ● 获取工具链: 官方网站:通常可以从交叉编译器的官方网站下载适用于你的…

一番赏小程序开发,为消费者带来更多新鲜体验

一番赏作为经典的潮玩方式,深受消费者的喜爱,一番赏还会与不同的热门IP合作,不断推出新的赏品,吸引众多粉丝。赏品的内容非常丰富,从手办、公仔玩具等,还设有隐藏款和最终赏商品,对玩家拥有着非…