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

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

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程序员编程注意事项 作为一名PHP程序员,编写高质量、高可维护性、高可扩展性的代码是非常重要的。以下是一些编程注意事项: 1. 代码风格 良好的代码风格可提高代码的可读性和可维护性。建议遵循 PSR 规范,尤其是 PSR-1 和 PSR-2 标准。可以使用 PHP_CodeSniffer 工具来检测代码风格是否符合 PSR 规范。 以下是示例代码: &…

    PHP 2023年5月23日
    00
  • php面向对象程序设计

    PHP面向对象程序设计完整使用攻略 PHP面向对象程序设计是一种基于对象的编程范式,它将数据和操作封装在一起,以便于代码的复用和维护。本文将详细讲解PHP面向对象程序设计的使用攻略,包括基本概念、类和对象、继承和多态、接口和抽象类、命名空间和自动加载、异常处理和魔术方法等。 基本概念 在PHP中,面向对象程序设计是基于类和对象的编程范式。类是一种抽象的数据类…

    PHP 2023年5月12日
    00
  • php函数之strtr和str_replace的用法详解以及效率分析 原创

    PHP函数之strtr和str_replace的用法详解以及效率分析 str_replace str_replace 函数用于替换字符串中的某些字符。它可以用于一个或多个字符的替换,也可以用于数组和字符串的替换。 mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, in…

    PHP 2023年5月26日
    00
  • php输出全球各个时区列表的方法

    下面是详细的攻略过程。 1. 准备工作 首先,要确定你正在使用的版本支持时区功能。PHP 5.1.0及以上版本都支持使用时区功能。如果你使用的版本较旧,请考虑升级到最新版本。 其次,要确保你已经在PHP配置文件php.ini中设置了正确的时区。如果你没有这样做,你可以像这样在php.ini中设置时区: date.timezone = "Asia/S…

    PHP 2023年5月26日
    00
  • ASP.NET文件上传控件Uploadify的使用方法

    下面我将为您详细讲解“ASP.NET文件上传控件Uploadify的使用方法”的完整攻略。 使用Uploadify控件上传文件 1. 准备工作 在使用Uploadify控件之前,需要下载相关的资源文件,包括JQuery库、Uploadify插件和SWF文件等。这些文件可以在Uploadify的官网上进行下载。 在下载完成后,将这些文件放置在项目的指定目录中,…

    PHP 2023年5月27日
    00
  • 在Linux(Ubuntu)下搭建PHP环境的操作步骤

    下面是在Ubuntu下搭建PHP环境的详细步骤: 1. 安装 PHP 打开终端,输入以下命令: sudo apt-get update sudo apt-get install php 这将会自动安装 PHP 和其它相关组件。安装完成后,可以通过以下命令查看 PHP 版本: php -v 2. 安装 Apache Apache 是一个流行的 Web 服务器,…

    PHP 2023年5月24日
    00
  • PHP输出当前进程所有变量/常量/模块/函数/类的示例

    要在PHP代码中输出当前进程所有变量/常量/模块/函数/类,可通过内置函数 get_defined_vars() 和 get_defined_constants() 来实现,以及使用函数 get_loaded_extensions()、get_defined_functions() 和 get_declared_classes() 来获取相应信息。 下面分别…

    PHP 2023年5月26日
    00
  • PHP 读取Postgresql中的数组

    要在PHP中读取PostgreSQL中的数组,需要按照以下步骤进行操作: 编写SQL查询语句 首先需要编写一条SQL查询语句,来获取PostgreSQL数组中的值。例如,假设你有一个名为”pets”的数组,它包含了每种宠物的名称和年龄,那么你可以使用以下查询语句来获取这个数组中包含的宠物名称: SELECT pets->>’name’ AS pe…

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