Commit 3eea291f authored by 李尚科's avatar 李尚科

weixin pay fix

parent f8dbaabb
Pipeline #13578 passed with stage
in 32 seconds
......@@ -32,7 +32,7 @@ class OrderController extends Controller {
const { ctx } = this;
const order_id = ctx.params.order_id;
const result = await ctx.service.credit.common.unifiedOrder('wexin', order_id);
const result = await ctx.service.credit.order.unifiedOrder('wexin', order_id);
ctx.success({ result });
}
......@@ -53,21 +53,23 @@ class OrderController extends Controller {
const ret_obj = await ctx.helper.xmlTojson(getxml);
ctx.logger.info({ notice_params: ret_obj });
const ret = await ctx.service.credit.common.WexinNotify(ret_obj);
ctx.success({ ret_obj, ret });
if (ret) {
ctx.success("<xml><return_code>SUCCESS</return_code><return_msg>OK</return_msg></xml>");
return;
}
ctx.success("<xml><return_code>FAIL</return_code><return_msg>UNKONW</return_msg></xml>");
return;
ctx.success("<xml><return_code>SUCCESS</return_code><return_msg>OK</return_msg></xml>");
}
async checkPay() {
const { ctx } = this;
const order_id = ctx.params.order_id;
const is_pay = ctx.service.credit.order.checkOrderPay(order_id);
const is_pay = await ctx.service.credit.order.checkOrderPay(order_id);
let result = false;
if (is_pay) {
result = true;
}
ctx.success({ result });
}
......
......@@ -3,10 +3,12 @@
module.exports = app => {
const router = app.router.namespace(app.config.projectRootPath + '/credit');
router.get('third', '/home', 'credit.order.getMyCredit');
router.get('third', '/history/:type', 'credit.order.getRecord');
router.get('third', '/order/pay/:order_id', 'credit.order.payOrder');
router.post('third', '/order/pay_notice', 'credit.order.payNotice');
router.get('/home', 'credit.order.getMyCredit');
router.get('/history/:type', 'credit.order.getRecord');
router.post('/order/pay/:order_id', 'credit.order.payOrder');
router.get('/order/pay/:order_id', 'credit.order.payOrder');
router.post('/order/pay_notice', 'credit.order.payNotice');
router.get('/order/check_pay/:order_id', 'credit.order.checkPay');
//我的信用-黑名单报告
router.get('/blacklist/report/:report_id', 'credit.blacklist.getBlacklistReport');//获取报告信息
......
......@@ -64,66 +64,21 @@ class CommonService extends Service {
return sign;
}
async unifiedOrder(type, order_id) {
const { ctx } = this;
const order = await ctx.service.credit.order.getOrderInfo(order_id);
const price = order.price * 100 - order.preferential_price * 100;
console.info(price);
if (price <= 0) {
ctx.failed('error price');
}
if (type === 'wexin') {
let body = '黑名单报告检测支付';
if (order.type === 2) {
body = '个人通话风险检测支付';
}
const data = {
body,
order_id,
trade_no: moment().valueOf() + ctx.helper.PrefixInteger(order_id, 11),
total_fee: price,
notify_url: '',
product_id: order.order_no,
scene_info: { h5_info: { type: 'Wap', wap_url: this.config.PHP_URL, wap_name: '我的信用' }, },
};
const ret = await this.WexinUnifiedOrder(data);
const pay_data = {
order_id,
trade_no: data.trade_no,
description: data.body,
prepay_id: ret.prepay_id || 0,
amount: data.total_fee,
unifiedorder_result: JSON.stringify(ret),
client_ip: ctx.helper.getClientIP(),
};
await this.addCreditPay(pay_data);
return { url: ret.mweb_url, order_id: order_id, trade_no: data.trade_no };
} else if (type === 'alipay') {
//TODO
}
return false;
}
async WexinUnifiedOrder(params) {
const { ctx } = this;
const { body, trade_no, total_fee, notify_url, product_id, scene_info } = params;
const appid = '';
const mch_id = '';
const appid = this.config.MCH_APPID;
const mch_id = this.config.MCH_ID;
const trade_type = 'MWEB';
const nonce_str = ctx.helper.createNoncestr();
const spbill_create_ip = ctx.helper.getClientIP();
// const spbill_create_ip = ctx.helper.getClientIP();
const spbill_create_ip = '122.224.130.226';
let json_data = {
appid,
mch_id,
body,
trade_no,
out_trade_no: trade_no,
total_fee,
spbill_create_ip,
notify_url,
......@@ -135,9 +90,10 @@ class CommonService extends Service {
const sign = this.getWexinSign(json_data);
json_data.sign = sign;
const xml_data = ctx.helper.jsonToxml(json_data);
console.info(xml_data);
const url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
const result_wexin = await ctx.curl(url, { timeout: 3000, method: 'POST', data: xml_data, headers: { 'content-type': 'text/html', }, streaming: false, dataType: 'text', });
console.info(result_wexin);
const result_wexin = await ctx.curl(url, { timeout: 3000, method: 'POST', data: xml_data, });
if (result_wexin.status !== 200) {
ctx.failed('wexin pay failed');
}
......@@ -150,34 +106,16 @@ class CommonService extends Service {
let error_msg = 'wexin pay error';
if (!ret.return_code || ret.return_code !== 'SUCCESS') {
error_msg = ret.return_msg || error_msg;
// ctx.failed(error_msg);
ctx.failed(error_msg);
}
if (!ret.result_code || ret.result_code !== 'SUCCESS') {
error_msg = ret.err_code_des || error_msg;
// ctx.failed(error_msg);
ctx.failed(error_msg);
}
return ret;
}
async addCreditPay(params) {
const { ctx } = this;
const { order_id, trade_no, prepay_id, amount, description, unifiedorder_result, client_ip } = params;
const data = {
order_id,
trade_no,
prepay_id,
amount,
description,
unifiedorder_result,
client_ip,
}
const ret = await ctx.prometheusModel.CreditPay.add(data);
return ret;
}
async alipay() {
}
......@@ -186,11 +124,14 @@ class CommonService extends Service {
const { ctx } = this;
const { transaction_id, trade_no } = params;
const pay_info = await ctx.prometheusModel.CreditPay.one({ where: { trade_no: out_trade_no } });
if (!pay_info || pay_info.order_id) {
if (!transaction_id && !trade_no) {
return false;
}
const pay_info = await ctx.prometheusModel.CreditPay.one({ where: { trade_no } });
if (!pay_info || !pay_info.order_id) {
ctx.failed('pay info error');
}
const order_info = await ctx.service.credit.common.getOrderInfo(pay_info.order_id);
const order_info = await ctx.service.credit.order.getOrderInfo(pay_info.order_id);
const nonce_str = ctx.helper.createNoncestr();
const url = 'https://api.mch.weixin.qq.com/pay/orderquery';
let data_obj = {
......@@ -206,17 +147,22 @@ class CommonService extends Service {
const xml_data = ctx.helper.jsonToxml(data_obj);
const result_wexin = await ctx.curl(url, { timeout: 3000, method: 'POST', data: xml_data, headers: { 'content-type': 'text/html', }, streaming: false, dataType: 'text', });
if (result_wexin.status) {
if (result_wexin.status !== 200) {
ctx.failed('wexin orderquery error1');
}
const ret = await ctx.helper.xmlTojson(result_wexin.data);
if (ret.return_code !== 'SUCCESS' && ret.result_code !== 'SUCCESS') {
ctx.failed('wexin orderquery error2');
}
let ret_data = {};
for (let key in ret) {
ret_data[key] = ret[key][0];
}
ctx.logger.info(JSON.stringify({ query_wexinpay_param: params, query_wexinpay_result: ret_data }));
let error_msg = 'wexin orderquery error2';
if (ret_data.return_code !== 'SUCCESS' && ret_data.result_code !== 'SUCCESS') {
error_msg = ret_data.return_msg ? ret_data.return_msg : error_msg;
ctx.failed(error_msg);
}
if (ret_data.trade_state === 'SUCCESS') {
return false;
}
......@@ -237,8 +183,7 @@ class CommonService extends Service {
async WexinNotify(result) {
const { ctx } = this;
// && result.appid === this.config.MCH_APPID
if (result) {
if (result && result.appid[0] === this.config.MCH_APPID) {
let sign_data = {};
for (let key in result) {
sign_data[key] = result[key][0];
......@@ -246,7 +191,7 @@ class CommonService extends Service {
if (sign_data.return_code && sign_data.return_code === 'SUCCESS' && sign_data.result_code && sign_data.result_code === 'SUCCESS') {
const wexin_return_sign = sign_data.sign;
delete sign_data.sign;
const sign = this.getSign(sign_data);
const sign = this.getWexinSign(sign_data);
const out_trade_no = sign_data.out_trade_no;
const total_fee = sign_data.total_fee;
const pay_info = await ctx.prometheusModel.CreditPay.findOne({ where: { trade_no: out_trade_no }, order: [['id', 'desc']] });
......@@ -257,13 +202,14 @@ class CommonService extends Service {
if (!order || !order.id) {
ctx.failed('error order');
}
if (order && order.pay_status === 1) {
return true;
}
const price = order.price * 100 - order.preferential_price * 100;
if (total_fee == price && sign == wexin_return_sign) {
if (total_fee == price && wexin_return_sign === sign) {
const state_time = moment().format('YYYY-MM-DD HH:mm:ss');
await ctx.prometheusModel.CreditPay.edit({ where: { id: pay_info.id }, params: { pay_result: JSON.stringify(result), status: 1 } });
await ctx.prometheusModel.CreditPay.edit({ where: { id: pay_info.id }, params: { pay_result: JSON.stringify(result), transaction_id: sign_data.transaction_id, status: 1 } });
await ctx.prometheusModel.CreditOrder.update({ state: '已支付', state_time: state_time, pay_status: 1 }, { where: { id: order.id } });
console.info('7777777777777777777777');
return true;
}
}
......@@ -288,8 +234,9 @@ class CommonService extends Service {
for (let key in ret) {
str += key + '=' + ret[key] + '&';
}
const mch_key = this.config.MCH_KEY;
const mch_key = app.config.MCH_KEY;
// console.info(str + 'key=' + mch_key);
const sign = ctx.helper.md5(str + 'key=' + mch_key).toLocaleUpperCase();
return sign;
......
......@@ -137,7 +137,22 @@ class OrderService extends Service {
if (order && order.pay_status === 1) {
return true;
}
if (!order || !order.id) {
ctx.failed('error order');
}
if (order && order.pay_status === 1) {
return true;
}
const credit_pay = await ctx.prometheusModel.CreditPay.one({ where: { order_id }, order: [['id', 'desc']] });
if (!credit_pay || !credit_pay.id) {
ctx.failed('error credit pay');
}
const { transaction_id, trade_no } = credit_pay;
const wexin_check_pay_ret = await ctx.service.credit.common.WexinCheckPay({ transaction_id, trade_no });
if (wexin_check_pay_ret) {
return true;
}
return false;
}
/**
......@@ -180,6 +195,75 @@ class OrderService extends Service {
}
}
}
}
async unifiedOrder(type, order_id) {
const { ctx } = this;
const order = await ctx.service.credit.order.getOrderInfo(order_id);
if (order && order.pay_status === 1) {
ctx.failed('订单已支付无需重复支付');
}
const price = order.price * 100 - order.preferential_price * 100;
if (price <= 0) {
ctx.failed('error price');
}
if (type === 'wexin') {
let body = '黑名单报告检测支付';
if (order.type === 2) {
body = '个人通话风险检测支付';
}
const data = {
body,
order_id,
trade_no: moment().valueOf() + ctx.helper.PrefixInteger(order_id, 11),
total_fee: price,
notify_url: 'https://dev-nginx.jianbing.com/51business/api/credit/order/pay_notice',
product_id: order.order_no,
scene_info: JSON.stringify({ h5_info: { type: 'Wap', wap_url: this.config.PHP_URL, wap_name: '我的信用' }, }),
};
const ret = await ctx.service.credit.common.WexinUnifiedOrder(data);
const pay_data = {
order_id,
trade_no: data.trade_no,
description: data.body,
prepay_id: ret.prepay_id || 0,
amount: data.total_fee,
unifiedorder_result: JSON.stringify(ret),
client_ip: ctx.helper.getClientIP(),
};
await this.addCreditPay(pay_data);
return { url: ret.mweb_url, order_id: order_id, trade_no: data.trade_no };
} else if (type === 'alipay') {
//TODO
}
return false;
}
async addCreditPay(params) {
const { ctx } = this;
const { order_id, trade_no, prepay_id, amount, description, unifiedorder_result, client_ip } = params;
const data = {
order_id,
trade_no,
prepay_id,
amount,
description,
unifiedorder_result,
client_ip,
}
const ret = await ctx.prometheusModel.CreditPay.add(data);
return ret;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment