微信文档非常迟钝,部分原因是管理授权的复杂方法。
1 回答
此答案适用于小程序。使用中文版的文档,英文版已经过时了。
首先,您需要准备以下信息。请注意,其中涉及两个控制台:微信和微信支付。这些准备工作需要几天时间来处理,因此请在开始开发支付功能之前获取它们。
App Id aka appid 和 App Secret :您的应用在微信控制台提交审核后,您可以获取它。
Merchant Id aka mchid : 您可以在微信支付控制台提交企业账户审批后,以及将您的小程序链接到您的微信支付账户后获取。
CA 证书:微信支付现在使用 CA 颁发的证书,可以在微信支付控制台的 App Security 中生成。它会自动附带
apiclient_key.pem
您需要的证书以及您可以在控制台中找到的证书序列号。在微信和微信支付控制台上分配一个HTTPS完全限定域名。微信支付控制台。有一个相当奇怪的行为,它会提示您进行短信验证,但之后您需要重复提示您输入短信的操作。
现在你可以开始了。你需要一个服务器,因为只有在微信控制台中注册的经过验证和批准的 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
访问其他项目所需的权限。此时,您应该将 openId 绑定到数据库中的某个内部 id。
现在您需要创建一个交易时段。这个比较复杂(https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_1.shtml和https://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
最终可以在您的微信应用程序中使用的。
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 发送到前端,以便前端使用小程序发出请求。
使用 wx.requestPayment 就可以了。