详解微信小程序调用支付接口支付

下面是详解微信小程序调用支付接口支付的完整攻略。

1.注册商户号并开通支付功能

首先要进行商户号的注册和支付功能的开通,具体可以参考微信支付的官方文档。

2.生成预支付订单

生成预支付订单需要调用支付接口,具体步骤如下:

2.1.获取access_token

在请求之前需要获取access_token,如果已获取,则跳过此步骤。获取方法可以参考微信小程序的官方文档。

2.2.获取openid

获取openid需要用户授权,可以参考微信小程序的官方文档。

2.3.构造请求参数

请求参数的构造包括以下字段:

  • 应用ID(appid)
  • 商户号(mch_id)
  • 随机字符串(nonce_str)
  • 商品描述(body)
  • 商户订单号(out_trade_no)
  • 标价金额(total_fee)
  • 终端IP(spbill_create_ip)
  • 通知地址(notify_url)
  • 交易类型(trade_type)
  • 用户openid(openid)
  • 签名(sign)

其中,签名的构造需要使用商户密钥(key)和签名类型(sign_type),具体可以参考微信支付的官方文档。

2.4.发送请求获取预支付ID

构造完请求参数后,将其转换为xml格式,发送请求获取预支付ID,具体可以参考微信支付的官方文档。请求成功后,将返回以下参数:

  • 预支付ID(prepay_id)
  • 随机字符串(nonce_str)

3.调起支付

调起支付需要构造以下字段:

  • 应用ID(appId)
  • 时间戳(timeStamp)
  • 随机字符串(nonceStr)
  • 订单详情扩展字符串(package)
  • 签名类型(signType)
  • 签名(paySign)

其中,订单详情扩展字符串的构造需要使用预支付ID和签名类型(signType),具体可以参考微信支付的官方文档。

示例1:生成预支付订单

// 获取access_token
wx.request({
  url: 'https://api.weixin.qq.com/cgi-bin/token',
  data: {
    grant_type: 'client_credential',
    appid: 'your_appid',
    secret: 'your_secret'
  },
  success(res) {
    // 获取openid
    wx.login({
      success(res) {
        wx.request({
          url: 'https://api.weixin.qq.com/sns/jscode2session',
          data: {
            appid: 'your_appid',
            secret: 'your_secret',
            js_code: res.code,
            grant_type: 'authorization_code'
          },
          success(res) {
            const openid = res.openid
            const nonce_str = Math.random().toString(36).substr(2, 15)

            // 构造请求参数
            const params = {
              appid: 'your_appid',
              mch_id: 'your_mch_id',
              nonce_str: nonce_str,
              body: 'test',
              out_trade_no: 'your_trade_no',
              total_fee: 1,
              spbill_create_ip: 'your_ip',
              notify_url: 'your_notify_url',
              trade_type: 'JSAPI',
              openid: openid
            }

            // 构造签名
            const sign = wxpaysign({ key: 'your_key', ...params })

            // 构造xml格式参数
            const xmlParams = Object.keys(params).map(key => `<${key}>${params[key]}</${key}>`).join('') + `<sign>${sign}</sign>`

            // 发送请求获取预支付ID
            wx.request({
              url: 'https://api.mch.weixin.qq.com/pay/unifiedorder',
              method: 'POST',
              header: {
                'Content-Type': 'application/xml'
              },
              data: xmlParams,
              success(res) {
                const result = parseXml(res.data)

                console.log(result)
              }
            })
          }
        })
      }
    })
  }
})

// 解析xml格式数据
function parseXml(xml) {
  const xmlParser = new DOMParser().parseFromString(xml, 'text/xml')
  const nodes = xmlParser.childNodes[0].childNodes

  const result = {}
  for (let i = 0; i < nodes.length; i++) {
    result[nodes[i].nodeName] = nodes[i].textContent
  }

  return result
}

// 签名算法
function wxpaysign(params) {
  const str = Object.keys(params).sort().map(key => `${key}=${params[key]}`).join('&') + '&key=' + params.key
  return md5(str).toUpperCase()
}

示例2:调起支付

const nonceStr = Math.random().toString(36).substr(2, 15)
const timeStamp = Math.floor(Date.now() / 1000)

// 构造订单详情扩展字符串
const packageStr = `prepay_id=your_prepay_id`

// 构造签名
const sign = wxpaysign({
  appId: 'your_appid',
  timeStamp: timeStamp,
  nonceStr: nonceStr,
  package: packageStr,
  signType: 'MD5',
  key: 'your_key'
})

// 调起支付
wx.requestPayment({
  timeStamp: timeStamp.toString(),
  nonceStr: nonceStr,
  package: packageStr,
  signType: 'MD5',
  paySign: sign,
  success(res) {
    console.log(res)
  },
  fail(res) {
    console.log(res)
  }
})

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解微信小程序调用支付接口支付 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • PHP简单计算两个时间差的方法示例

    下面我详细讲解一下“PHP简单计算两个时间差的方法示例”的完整攻略。 1. 问题描述 在开发过程中,我们经常会计算两个时间点之间的时间差,比如计算一个操作经过的时间、计算一个任务执行的时间等。 在PHP中,计算两个时间点之间的时间差是比较简单的,但是需要注意一些细节问题,本文将详细讲解如何在PHP中计算时间差。 2. 方案分析 PHP可以使用time()函数…

    PHP 2023年5月26日
    00
  • 基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解

    基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解 简介: 在PHP开发中,字符串的比较操作是非常常见的操作。为了满足不同需求,PHP代码库中提供了多条字符串比较函数,其中最基础的是strcmp()和strcasecmp()函数。本文将详细介绍这两个函数的使用方法。 strcmp()函数 定义 strcmp()函数是PHP中的字符…

    PHP 2023年5月26日
    00
  • PHP闭包定义与使用简单示例

    下面我将为你详细讲解 “PHP闭包定义与使用简单示例” 的完整攻略。 什么是闭包? 闭包(Closure)是一个能够读取其他函数内部变量的函数,或者是定义在外部函数作用域之外的变量。闭包就是能够将函数内部的局部变量和方法,带到外部去使用的一个机制。 在 PHP 中,闭包通常使用匿名函数(Anonymous Functions)来实现。 闭包的定义 在 PHP…

    PHP 2023年5月26日
    00
  • PHP中CURL方法curl_setopt()函数的参数分享

    curl_setopt()函数简介 curl_setopt()是CURL扩展库中的重要函数,主要用于设置CURL传输选项。它的基本语法如下: curl_setopt($curl, $option, $value); 其中,$curl是CURL句柄,$option是传输选项,$value是传输选项的值。 curl_setopt()函数参数介绍 1. CURLO…

    PHP 2023年5月29日
    00
  • PHP实现的AES加密、解密封装类与用法示例

    PHP实现的AES加密、解密封装类与用法示例 简介 AES是目前最常用的对称加密算法,其应用范围非常广泛,如数据安全传输、文件加密等。PHP作为一种常用的语言,在实现AES加密、解密时也提供了很好的支持。 本文将介绍如何使用PHP实现AES加解密,并封装成简便的类文件。同时,本文会提供两个用例,让读者更好地了解如何使用该功能库。 实现AES加密、解密 PHP…

    PHP 2023年5月26日
    00
  • PHP三种方式实现链式操作详解

    那么接下来我将详细讲解PHP三种方式实现链式操作的攻略: 1. 什么是链式操作? 在PHP中,链式操作是指通过连续调用多个函数或方法,让代码变得更加简洁易读的操作方式。通过链式操作,我们可以在一行代码中完成多个操作。比如,下面是一个链式操作的示例: $user = new User(); $user->setName(‘张三’)->setAge(…

    PHP 2023年5月27日
    00
  • 微信小程序实现聊天室

    完整攻略:微信小程序实现聊天室 作为一种基于微信生态的应用开发方式,微信小程序已经被越来越多的开发者所使用。而其中,实现聊天室类型的应用更是相对热门的开发需求。本文基于微信开发者工具的环境,讲解如何使用小程序实现聊天室应用。 前置条件 在开始实现聊天室前,我们需要创建一个小程序项目并在微信开发者工具中打开。具体对应流程如下: 打开微信开发者工具,选择创建项目…

    PHP 2023年5月23日
    00
  • PHP 代码简洁之道(小结)

    PHP 代码简洁之道(小结) 为什么要写简洁的代码 提高代码可读性 减少检查和调试时间 方便后期维护 如何写简洁的代码 1. 避免深度嵌套 在实际开发中,有时会因为一些条件 or 逻辑的限制导致 if/else, for/while等语句深深嵌套,这是一个代码质量不高的体现,因为嵌套中我们很难一下子理解程序运行的流程以及代码实现的功能,从而给后期的维护和优化…

    PHP 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部