0

微信文档非常迟钝,部分原因是管理授权的复杂方法。

4

1 回答 1

0

此答案适用于小程序。使用中文版的文档,英文版已经过时了。

首先,您需要准备以下信息。请注意,其中涉及两个控制台:微信和微信支付。这些准备工作需要几天时间来处理,因此请在开始开发支付功能之前获取它们。

  1. App Id aka appid 和 App Secret :您的应用在微信控制台提交审核后,您可以获取它。

  2. Merchant Id aka mchid : 您可以在微信支付控制台提交企业账户审批后,以及将您的小程序链接到您的微信支付账户后获取。

  3. CA 证书:微信支付现在使用 CA 颁发的证书,可以在微信支付控制台的 App Security 中生成。它会自动附带apiclient_key.pem您需要的证书以及您可以在控制台中找到的证书序列号。

  4. 微信和微信支付控制台上分配一个HTTPS完全限定域名。微信支付控制台。有一个相当奇怪的行为,它会提示您进行短信验证,但之后您需要重复提示您输入短信的操作。

现在你可以开始了。你需要一个服务器,因为只有在微信控制台中注册的经过验证和批准的 HTTPS 完全限定域名才能从小程序访问

  1. 从 获取临时代码wx.login。如果您再次调用,此代码过期,因此请在继续之前检查会话是否有效。wx.loginwx.checkSession

  2. 现在,向https://api.weixin.qq.com/sns/jscode2session?appid=${appid}&secret=${appsecret}&js_code=${code}&grant_type=authorization_code( https://developers.weixin.qq.com/miniprogram/en/dev/api-backend/open-api/login/auth.code2Session.html ) 发出 GET 请求。这将为您返回openId访问其他项目所需的权限。

  3. 此时,您应该将 openId 绑定到数据库中的某个内部 id。

  4. 现在您需要创建一个交易时段。这个比较复杂(https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_1.shtmlhttps://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_0 .shtml)。这需要微信自定义授权方案。如果您使用的是 NodeJS,它看起来如下所示:

const { v4: uuidv4 } = require('uuid')
var crypto = require('crypto')
var fs = require('fs')

const pem = fs.readFileSync('./certs/apiclient_key.pem')
const key = pem.toString('ascii')

let minifiedRawData = JSON.stringify(JSON.parse(JSON.stringify(rawData)))
const currentUnixTime = parseInt((new Date().getTime() / 1000).toFixed(0))
const randomString = uuidv4()
// weixin uses a CA authorised certificate but uses a custom authorisation scheme.
let sign = crypto.createSign('RSA-SHA256')
sign.update(
  `POST\n/v3/pay/transactions/jsapi\n${currentUnixTime}\n${randomString}\n${minifiedRawData}\n`
)
const token = sign.sign(key, 'base64')
const r = await axios.post(
  `https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi`,
  rawData,
  {
    headers: {
      Authorization: `WECHATPAY2-SHA256-RSA2048 mchid="${mchid}",nonce_str="${randomString}",signature="${token}",timestamp="${currentUnixTime}",serial_no="${certSerialNumber}"`
    }
  }
)

请注意所有错误消息都是中文的。这将为您提供prepay_id最终可以在您的微信应用程序中使用的。

  1. https://developers.weixin.qq.com/miniprogram/en/dev/api/open-api/payment/wx.requestPayment.html错误。不要使用这个。这已经过时了。请改用https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_4.shtml。使用您在 4. 中创建的相同算法生成签名。您需要将 randomString、timestamp、signature 和 prepay_id 发送到前端,以便前端使用小程序发出请求。

  2. 使用 wx.requestPayment 就可以了。

于 2021-07-05T15:57:28.953 回答