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

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

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日

相关文章

  • 小程序图片长按识别功能的实现方法

    下面是针对“小程序图片长按识别功能的实现方法”的完整攻略,需要注意的是,这篇攻略主要针对的是基于微信小程序平台的开发。 1. 实现原理 在小程序中,我们可以通过长按图片的方式触发基于微信小程序平台提供的 wx.previewImage() API 将图片打开,并通过设置 showMenuItems 值为 true,让用户可以通过长按图片实现“识别图片中的文字…

    PHP 2023年5月30日
    00
  • php提取数字拼接数组的具体操作

    PHP提取数字拼接数组是一种常见的操作,一般用于对一串字符串中的数字进行提取、处理和存储。以下是在PHP中提取数字拼接数组的具体操作攻略。 步骤一:匹配数字 要提取一串字符串中的数字,需要使用正则表达式来匹配数字。在PHP中,可以使用 preg_match_all 函数来实现。它的语法如下: preg_match_all($pattern, $string,…

    PHP 2023年5月26日
    00
  • PHP数组去重比较快的实现方式

    PHP数组去重的实现方式有多种,其中较快的实现方式有两种:使用array_flip函数和使用array_unique函数。 方式一:使用array_flip函数 使用array_flip函数的大致步骤如下: 遍历原数组,将原数组的值作为键,新数组的值为1生成一个新的数组。 使用array_keys函数获取新数组的键列表,即去重后的数组。 下面是示例代码: /…

    PHP 2023年5月26日
    00
  • php数组添加元素方法小结

    下面我将详细讲解如何使用PHP数组添加元素的方法。 1. 使用array_push()函数 使用array_push()函数可以将一个或多个元素添加到数组末尾。该函数接收两个参数,第一个参数是要添加元素的数组,第二个参数可以是一个单独的值,也可以是一个包含多个值的数组。 下面是一个示例: $fruits = array("apple", …

    PHP 2023年5月26日
    00
  • PHP使用内置函数file_put_contents写入文件及追加内容的方法

    下面是使用内置函数file_put_contents写入文件及追加内容的方法的完整攻略。 file_put_contents函数简介 file_put_contents函数是PHP内置的用于把一个字符串写入文件的函数,并且可以实现文件追加的功能。可以很方便的将一个字符串写入到一个文件中。 函数原型为: bool file_put_contents(strin…

    PHP 2023年5月26日
    00
  • php从右向左/从左向右截取字符串的实现方法

    要实现从右向左或从左向右截取字符串,可以使用PHP中的substr函数。该函数有三个参数:字符串、开始位置和长度。开始位置从0开始计数。 从左向右截取字符串的示例: $str = "Hello World"; $sub_str = substr($str, 0, 5); // 获取从开始位置到第5个字符的子串 echo $sub_str;…

    PHP 2023年5月26日
    00
  • php+mysql实现简单的增删改查功能

    为了讲解这个问题,我们需要明确一些概念。PHP和MySQL都是网站开发中常用的技术,其中PHP用于实现网站的业务逻辑,而MySQL则主要用于数据的存储和管理。下面我将从以下几个方面逐一讲解如何使用PHP和MySQL实现简单的增删改查功能。 1. 搭建PHP开发环境 首先,我们需要安装PHP的开发环境,比如XAMPP,它是一个免费的、易于安装和使用的PHP开发…

    PHP 2023年5月27日
    00
  • PHP自动识别字符集并完成转码详解

    下面是关于”PHP自动识别字符集并完成转码”的完整攻略: 1.什么是字符集转码? 在不同的编码方案中,同样的字母或符号可能会以不同的二进制形式进行编码存储,这种编码方式称为字符编码。字符集就是一系列字符的集合,并按照一定的规则进行编码集合形成的编码方式。字符集转码就是将不同字符集编码的文本转换成特定编码的文本,以便于我们进行正确的输出和使用。 2.PHP自动…

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