1.准备商户号、企业级小程序(或者个体工商户级别的)
2.在小程序端调用uni.login获取code,传递给后端
uni.login({
success: loginRes => {
uni.request({
url: "http://127.0.0.1:3003/wxpay/pay",
data: {
code: loginRes.code
},
method: "get",
success: res => {
},
fail: err => {
}
})
}
})
3.在nodejs端,
let express = require("express");
let router = express.Router();
const WxPay = require('wechatpay-node-v3');
const fs = require('fs');
let api = require("../api/index");
var path = require('path');
let weixinData = require('../utils/weixinData');
const qs = require('querystring')
//根据code查找openid
function getOpenid(code){
return new Promise((resolve, reject) => {
let appid = weixinData.Appid
let secret = weixinData.AppSecret
let params = {
appid,
secret,
js_code:code
}
let formData = qs.stringify(params)
let openIdUrl = "https://api.weixin.qq.com/sns/jscode2session?" + formData + "&grant_type=authorization_code"
api.get(openIdUrl).then( res => {
resolve(res.data.openid)
})
})
}
// 创建支付实例
const pay = new WxPay({
appid: 'wx9fc72986dc9287b6',
mchid: '1674432158',
publicKey: fs.readFileSync(path.resolve(__dirname, 'apiclient_cert.pem')), // 公钥
privateKey: fs.readFileSync(path.resolve(__dirname, 'apiclient_key.pem')), // 秘钥
key: 'zlc010903zlc010903zlc010903wcpwc'
});
// 订单号生成函数
function randomNumber() {
const now = new Date()
let month = now.getMonth() + 1
let day = now.getDate()
let hour = now.getHours()
let minutes = now.getMinutes()
let seconds = now.getSeconds()
month = month < 10 ? "0" + month : month;
day = day < 10 ? "0" + day : day;
hour = hour < 10 ? "0" + hour : hour;
minutes = minutes < 10 ? "0" + minutes : minutes;
seconds = seconds < 10 ? "0" + seconds : seconds;
let orderCode = now.getFullYear().toString() + month.toString() + day + hour + minutes + seconds + (Math.round(Math.random() * 1000000)).toString();
return orderCode;
}
let notify = async (req, res) => {
// 申请的APIv3
let key = 'zlc010903zlc010903zlc010903wcpwc';
let { ciphertext, associated_data, nonce } = req.body.resource;
// 解密回调信息
const result = pay.decipher_gcm(ciphertext, associated_data, nonce, key);
// 拿到订单号
let { out_trade_no } = result;
if (result.trade_state == 'SUCCESS') {
// 支付成功之后需要进行的业务逻辑
console.log('支付成功')
}
}
// 拿到支付所需参数
let payInfo = (req, res) => {
let { code } = req.query
//获取openid
getOpenid(code).then(async resolve => {
const params = {
mchid: '1674432158',
description: '支付测试', // 订单描述
out_trade_no: randomNumber(), // 订单号,一般每次发起支付都要不一样,可使用随机数生成
notify_url: 'http://127.0.0.1:3003/wxpay/notify_url',
amount: {
total: 1, // 支付金额,单位为分
currency: 'CNY'
},
payer: {
openid: resolve, // 微信小程序用户的openid,一般需要前端发送过来
},
scene_info: {
payer_client_ip: 'ip', // 支付者ip,这个不用理会也没有问题
},
};
const result = await pay.transactions_jsapi(params);
// 将结果响应给微信小程序前端
res.send(result);
})
}
// 回调路由
router.post('/notify_url', notify)
router.get('/pay', payInfo);
module.exports = router