UniApp实现多端支付功能完整实现指南

📚 本文将分享UniApp多端支付功能的完整实现方案,包含微信支付、支付宝支付的详细配置和实现过程。

作者:沈大大

更新时间:2025-03-10

一、支付功能概述

1.1 文章要点

  • 支付业务流程
  • 多端支付实现
  • 安全性保障
  • 异常处理
  • 最佳实践

1.2 技术栈

{
   
  "开发环境": "HBuilderX 3.8.0+",
  "前端框架": "Vue3 + UniApp",
  "状态管理": "Pinia",
  "网络请求": "uni.request",
  "开发语言": "TypeScript"
}

二、支付基础知识

2.1 支付流程

// 基本支付流程
1. 用户选择商品 -> 创建订单
2. 调用支付接口 -> 获取支付参数
3. 发起支付请求 -> 等待支付结果
4. 接收支付通知 -> 更新订单状态
5. 处理订单后续 -> 完成交易流程

2.2 支付参数说明

2.2.1 通用参数
// 支付参数接口定义
interface PaymentParams {
   
  // 商户订单号
  outTradeNo: string;
  // 订单金额(单位:分)
  totalFee: number;
  // 商品描述
  body: string;
  // 支付类型
  payType: 'wxpay' | 'alipay';
  // 用户标识
  openId?: string;
  // 支付超时时间
  timeExpire?: string;
}
2.2.2 微信支付参数
// 微信支付配置
interface WxPayConfig {
   
  // 微信支付商户号
  mchId: string;
  // 微信支付应用ID
  appId: string;
  // 微信支付密钥
  key: string;
  // 支付证书路径(退款等需要)
  certPath?: string;
  // 支付证书密钥路径
  keyPath?: string;
  // 回调通知地址
  notifyUrl: string;
}

// 微信支付请求参数
interface WxPaymentParams {
   
  // 时间戳
  timeStamp: string;
  // 随机字符串
  nonceStr: string;
  // 订单详情扩展字符串
  package: string;
  // 签名方式
  signType: 'MD5' | 'HMAC-SHA256';
  // 签名
  paySign: string;
}
2.2.3 支付宝支付参数
// 支付宝配置
interface AlipayConfig {
   
  // 支付宝应用ID
  appId: string;
  // 商户私钥
  privateKey: string;
  // 支付宝公钥
  publicKey: string;
  // 回调通知地址
  notifyUrl: string;
  // 支付宝网关
  gateway: string;
}

// 支付宝支付请求参数
interface AlipaymentParams {
   
  // 商户订单号
  outTradeNo: string;
  // 订单金额
  totalAmount: string;
  // 订单标题
  subject: string;
  // 产品码
  productCode: string;
  // 订单描述
  body?: string;
  // 超时时间
  timeoutExpress?: string;
}

三、微信支付实现

3.1 微信小程序支付

3.1.1 配置说明
  1. 登录微信商户平台,获取必要的配置信息:

    • 商户号(mchId)
    • 商户密钥(key)
    • 支付证书
  2. 在小程序管理后台配置:

    • 支付域名
    • 回调通知地址
3.1.2 完整实现
// 支付服务封装
class WxPayService {
   
  private config: WxPayConfig;
  
  constructor(config: WxPayConfig) {
   
    this.config = config;
  }
  
  // 生成支付参数
  private generatePayParams(orderInfo: any): WxPaymentParams {
   
    const params = {
   
      appId: this.config.appId,
      timeStamp: String(Date.now()),
      nonceStr: this.generateNonceStr(),
      package: `prepay_id=${
     orderInfo.prepayId}`,
      signType: 'MD5' as const
    };
    
    // 生成签名
    const paySign = this.generateSign(params);
    
    return {
   
      ...params,
      paySign
    };
  }
  
  // 创建支付订单
  async createOrder(params: PaymentParams) {
   
    try {
   
      // 1. 生成统一下单参数
      const orderParams = {
   
        appid: this.config.appId,
        mch_id: this.config.mchId,
        nonce_str: this.generateNonceStr(),
        body: params.body,
        out_trade_no: params.outTradeNo,
        total_fee: params.totalFee,
        spbill_create_ip: '127.0.0.1', // 客户端IP
        notify_url: this.config.notifyUrl,
        trade_type: 'JSAPI', // 小程序取值如此
        openid: params.openId // 用户openid
      };
      
      // 2. 生成签名
      const sign = this.generateSign(orderParams);
      
      // 3. 请求统一下单API
      const result = await uni.request({
   
        url: 'https://api.mch.weixin.qq.com/pay/unifiedorder',
        method: 'POST',
        data: {
   
          ...orderParams,
          sign
        }
      });
      
      // 4. 生成支付参数
      return this.generatePayParams(result.data);
    } catch (error) {
   
      throw new Error('创建订单失败:' + error.message);
    }
  }

  // 发起支付
  async requestPayment(payParams: WxPaymentParams): Promise<any> {
   
    return new Promise((resolve, reject)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值