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.Appidlet secret = weixinData.AppSecretlet 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() + 1let 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) => {// 申請的APIv3let 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//獲取openidgetOpenid(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