微信的文档相当生硬,部分原因是错综复杂的授权管理方法。
发布于 2021-07-05 23:57:29
这个答案是针对小程序的。请使用中文版本的文档,英文版本已过时。
首先,您需要准备以下信息。需要注意的是,这里涉及到两台主机:微信和微信支付。这些准备工作需要几天的时间来处理,所以在开始开发支付功能之前,请先获取它们。
apiclient_key.pem,以及您可以在控制台中找到的证书序列号。现在您已经准备好开始了。为此,您需要一台服务器,因为只有在微信控制台注册的认证通过的HTTPS全限定域名,才能从小程序访问
wx.login获取临时代码。如果您再次调用wx.login,此代码将过期,因此在继续之前,请使用wx.checkSession检查会话是否有效。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。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,您最终可以在您的微信应用程序中使用它。
https://stackoverflow.com/questions/68258984
复制相似问题