下面是详细攻略:
1. 准备工作
要实现微信支付功能,需要先有一些准备工作,包括:
- 开通微信支付功能并获取相应的api key、商户号、证书等信息
- 安装node.js环境
- 下载并创建一个Node.js项目,可以使用Express或Koa等框架
2. 引入依赖库
使用npm命令可以方便地引入相应的依赖库,可以使用以下命令:
npm install --save xml2js request request-promise-native
其中,xml2js用于将微信支付返回的XML格式数据解析为JavaScript对象;request和request-promise-native用于向微信支付API发起请求并获取响应。
3. 实现支付功能
3.1 生成预支付信息
实现支付功能的第一步是生成预支付信息。具体步骤如下:
- 构造请求参数,包括appid、mch_id、nonce_str、body、out_trade_no、total_fee等,其中appid和mch_id是商户在微信支付平台上的唯一标识,nonce_str是一个随机字符串,body表示商品或支付简要描述,out_trade_no是商户订单号,total_fee是订单总金额。
- 将参数按照ASCII码从小到大排序,然后将各个参数按照key=value的格式用&符号拼接成一个字符串,并加上商户的API密钥key。
- 使用MD5算法对拼接好的字符串进行签名,再将签名sign参数加入请求参数中。
- 将请求参数转换为XML格式,并POST到微信支付API的统一下单接口。
以下是一个Node.js生成预支付信息的示例代码:
const xml2js = require('xml2js')
const rp = require('request-promise-native')
function getPrepayId(req, res) {
const appid = 'your_appid'
const mch_id = 'your_mch_id'
const nonce_str = Math.random().toString(36).substr(2, 15)
const body = 'test'
const out_trade_no = 'test' + (new Date().getTime())
const total_fee = 1
const notify_url = 'http://localhost:3000/notify'
const ip = req.ip.match(/\d+\.\d+\.\d+\.\d+/)[0]
const trade_type = 'NATIVE'
const key = 'your_api_key'
const formData = {
appid,
mch_id,
nonce_str,
body,
out_trade_no,
total_fee,
spbill_create_ip: ip,
notify_url,
trade_type
}
// 签名
formData.sign = sign(formData, key)
const builder = new xml2js.Builder()
const xml = builder.buildObject(formData)
// 请求微信支付API的统一下单接口
return rp({
method: 'POST',
url: 'https://api.mch.weixin.qq.com/pay/unifiedorder',
body: xml
}).then(res => {
return xml2js.parseStringPromise(res)
}).then(result => {
if (result.xml.return_code[0] === 'SUCCESS' && result.xml.result_code[0] === 'SUCCESS') {
return result.xml.prepay_id[0]
} else {
throw new Error('get prepay_id error')
}
})
}
function sign(param, key) {
const querystring = Object.keys(param).filter(key => param[key] !== undefined && param[key] !== '').sort().map(key => `${key}=${param[key]}`).join('&') + `&key=${key}`
const md5 = crypto.createHash('md5')
md5.update(querystring)
const sign = md5.digest('hex').toUpperCase()
return sign
}
3.2 生成支付二维码
生成预支付信息后,可以使用微信支付平台返回的prepay_id生成支付二维码。具体步骤如下:
- 构造请求参数,包括appid、mch_id、nonce_str、prepay_id、trade_type等,其中prepay_id是前面生成的预支付ID,trade_type指定获取的二维码类型。
- 将参数按照ASCII码从小到大排序,然后将各个参数按照key=value的格式用&符号拼接成一个字符串,并加上商户的API密钥key。
- 使用MD5算法对拼接好的字符串进行签名,再将签名sign参数加入请求参数中。
- 将请求参数转换为XML格式,并POST到微信支付API的统一下单接口。
以下是一个Node.js生成支付二维码的示例代码:
function getQRCodeUrl(prepay_id) {
const appid = 'your_appid'
const mch_id = 'your_mch_id'
const nonce_str = Math.random().toString(36).substr(2, 15)
const trade_type = 'NATIVE'
const key = 'your_api_key'
const formData = {
appid,
mch_id,
nonce_str,
prepay_id,
trade_type
}
// 签名
formData.sign = sign(formData, key)
const builder = new xml2js.Builder()
const xml = builder.buildObject(formData)
// 请求二维码链接
return rp({
method: 'POST',
url: 'https://api.mch.weixin.qq.com/pay/unifiedorder',
body: xml
}).then(res => {
return xml2js.parseStringPromise(res)
}).then(result => {
if (result.xml.return_code[0] === 'SUCCESS' && result.xml.result_code[0] === 'SUCCESS') {
return result.xml.code_url[0]
} else {
throw new Error('get qrcode url error')
}
})
}
4. 示例说明
4.1 生成预支付信息
可以使用以下代码来测试生成预支付信息的功能:
app.get('/getPrepayId', async (req, res) => {
try {
const prepay_id = await getPrepayId(req, res)
res.send({
code: 200,
prepay_id
})
} catch (err) {
console.error('getPrepayId error:', err)
res.status(500).send({
code: 500,
message: 'getPrepayId error'
})
}
})
4.2 生成支付二维码
可以使用以下代码来测试生成支付二维码的功能:
app.get('/getQRCodeUrl', async (req, res) => {
try {
const prepay_id = await getPrepayId(req, res)
const qrcode_url = await getQRCodeUrl(prepay_id)
res.send({
code: 200,
qrcode_url
})
} catch (err) {
console.error('getQRCodeUrl error:', err)
res.status(500).send({
code: 500,
message: 'getQRCodeUrl error'
})
}
})
当用户访问/getQRCodeUrl时,会调用getPrepayId和getQRCodeUrl函数,并返回生成的支付二维码URL。用户可以通过扫描该二维码完成支付。
这就是基于Node.js实现微信支付功能的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于nodejs实现微信支付功能 - Python技术站