|
@@ -1,5 +1,6 @@
|
|
|
const API = require("../../lib/API.js")
|
|
const API = require("../../lib/API.js")
|
|
|
const db = require("../../plugin/DataBase/db.js")
|
|
const db = require("../../plugin/DataBase/db.js")
|
|
|
|
|
+const Redis = require('../../plugin/DataBase/Redis')
|
|
|
const { BaseStdResponse } = require("../../BaseStdResponse.js")
|
|
const { BaseStdResponse } = require("../../BaseStdResponse.js")
|
|
|
const AccessControl = require("../../lib/AccessControl.js")
|
|
const AccessControl = require("../../lib/AccessControl.js")
|
|
|
const crypto = require('crypto')
|
|
const crypto = require('crypto')
|
|
@@ -8,15 +9,17 @@ const config = require('../../config.json')
|
|
|
function generateOrderId() {
|
|
function generateOrderId() {
|
|
|
const now = new Date()
|
|
const now = new Date()
|
|
|
const pad = (n, w = 2) => n.toString().padStart(w, '0')
|
|
const pad = (n, w = 2) => n.toString().padStart(w, '0')
|
|
|
- return `${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}`
|
|
|
|
|
- + `${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}`
|
|
|
|
|
- + `${pad(now.getMilliseconds(), 3)}`
|
|
|
|
|
|
|
+ return `${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}` +
|
|
|
|
|
+ `${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}` +
|
|
|
|
|
+ `${pad(now.getMilliseconds(), 3)}`
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function generatePaymentSign(params, key) {
|
|
function generatePaymentSign(params, key) {
|
|
|
- const sorted = Object.keys(params).sort();
|
|
|
|
|
- const query = sorted.map(k => `${k}=${params[k]}`).join('&') + `&key=${key}`;
|
|
|
|
|
- return crypto.createHash('md5').update(query, 'utf8').digest('hex');
|
|
|
|
|
|
|
+ const sorted = Object.keys(params).sort()
|
|
|
|
|
+ const query = sorted.map(k => `${k}=${params[k]}`).join('&') + key
|
|
|
|
|
+ console.log(query)
|
|
|
|
|
+
|
|
|
|
|
+ return crypto.createHash('md5').update(query, 'utf8').digest('hex')
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
class CreateOrder extends API {
|
|
class CreateOrder extends API {
|
|
@@ -44,7 +47,6 @@ class CreateOrder extends API {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
|
- // 查询商品信息
|
|
|
|
|
const goodsSql = 'SELECT name, price, num, state FROM goods WHERE id = ?'
|
|
const goodsSql = 'SELECT name, price, num, state FROM goods WHERE id = ?'
|
|
|
const goodsRows = await db.query(goodsSql, [goods_id])
|
|
const goodsRows = await db.query(goodsSql, [goods_id])
|
|
|
|
|
|
|
@@ -65,59 +67,68 @@ class CreateOrder extends API {
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- const createTime = new Date().getTime()
|
|
|
|
|
|
|
+ const createTime = Date.now()
|
|
|
const orderId = generateOrderId()
|
|
const orderId = generateOrderId()
|
|
|
|
|
|
|
|
const insertSql = `
|
|
const insertSql = `
|
|
|
INSERT INTO orders (orderId, create_user, create_time, goods_id, price, pay_type)
|
|
INSERT INTO orders (orderId, create_user, create_time, goods_id, price, pay_type)
|
|
|
VALUES (?, ?, ?, ?, ?, ?)
|
|
VALUES (?, ?, ?, ?, ?, ?)
|
|
|
`
|
|
`
|
|
|
- const insertParams = [orderId, uuid, createTime, goods_id, goods.price, pay_type]
|
|
|
|
|
- const result = await db.query(insertSql, insertParams)
|
|
|
|
|
|
|
+ const result = await db.query(insertSql, [
|
|
|
|
|
+ orderId, uuid, createTime, goods_id, goods.price, pay_type
|
|
|
|
|
+ ])
|
|
|
|
|
|
|
|
const updateSql = 'UPDATE goods SET num = num - 1 WHERE id = ?'
|
|
const updateSql = 'UPDATE goods SET num = num - 1 WHERE id = ?'
|
|
|
await db.query(updateSql, [goods_id])
|
|
await db.query(updateSql, [goods_id])
|
|
|
|
|
|
|
|
if (result && result.affectedRows > 0) {
|
|
if (result && result.affectedRows > 0) {
|
|
|
- const paymentConfig = config.pay
|
|
|
|
|
|
|
+ const paymentConfig = config.pay || {}
|
|
|
|
|
+
|
|
|
|
|
+ if (!paymentConfig.pid || !paymentConfig.url || !paymentConfig.key || !paymentConfig.return_url) {
|
|
|
|
|
+ return res.json({
|
|
|
|
|
+ ...BaseStdResponse.ERR,
|
|
|
|
|
+ msg: '支付配置错误,请联系管理员'
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
const payParams = {
|
|
const payParams = {
|
|
|
pid: paymentConfig.pid,
|
|
pid: paymentConfig.pid,
|
|
|
type: pay_type,
|
|
type: pay_type,
|
|
|
out_trade_no: orderId,
|
|
out_trade_no: orderId,
|
|
|
notify_url: config.url + '/Order/CallBack',
|
|
notify_url: config.url + '/Order/CallBack',
|
|
|
- return_url: paymentConfig.return_url,
|
|
|
|
|
|
|
+ return_url: paymentConfig.return_url + orderId,
|
|
|
name: goods.name,
|
|
name: goods.name,
|
|
|
- money: goods.price.toFixed(2),
|
|
|
|
|
- sitename: paymentConfig.sitename
|
|
|
|
|
|
|
+ money: goods.price
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- const sign = generatePaymentSign(payParams, paymentConfig.key);
|
|
|
|
|
|
|
+ const sign = generatePaymentSign(payParams, paymentConfig.key)
|
|
|
payParams.sign = sign
|
|
payParams.sign = sign
|
|
|
payParams.sign_type = 'MD5'
|
|
payParams.sign_type = 'MD5'
|
|
|
|
|
|
|
|
- // 构造支付URL
|
|
|
|
|
- const queryString = new URLSearchParams(payParams).toString();
|
|
|
|
|
- const payUrl = `${paymentConfig.url}?${queryString}`;
|
|
|
|
|
|
|
+ await Redis.set(`payData:${orderId}`, JSON.stringify(payParams), {
|
|
|
|
|
+ EX: 300
|
|
|
|
|
+ })
|
|
|
|
|
|
|
|
return res.json({
|
|
return res.json({
|
|
|
...BaseStdResponse.OK,
|
|
...BaseStdResponse.OK,
|
|
|
id: orderId,
|
|
id: orderId,
|
|
|
- payUrl
|
|
|
|
|
|
|
+ pay: {
|
|
|
|
|
+ payUrl: paymentConfig.url,
|
|
|
|
|
+ payData: payParams
|
|
|
|
|
+ }
|
|
|
})
|
|
})
|
|
|
} else {
|
|
} else {
|
|
|
return res.json({
|
|
return res.json({
|
|
|
...BaseStdResponse.ERR,
|
|
...BaseStdResponse.ERR,
|
|
|
- msg: '创建订单失败!请联系客服',
|
|
|
|
|
|
|
+ msg: '创建订单失败',
|
|
|
endpoint: 7894378
|
|
endpoint: 7894378
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
} catch (err) {
|
|
} catch (err) {
|
|
|
this.logger.error(`创建订单失败!${err.stack}`)
|
|
this.logger.error(`创建订单失败!${err.stack}`)
|
|
|
return res.json({
|
|
return res.json({
|
|
|
...BaseStdResponse.ERR,
|
|
...BaseStdResponse.ERR,
|
|
|
- msg: "创建订单失败!请联系客服",
|
|
|
|
|
|
|
+ msg: "创建订单异常,请联系管理员"
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|