/* * 支付 * @Author: Targaryen * @Date: 2017-01-04 15:17:51 * @Last Modified by: Targaryen * @Last Modified time: 2017-02-17 09:52:57 */ 'use strict'; const mRoot = '../models'; const payModel = require(`${mRoot}/pay`); const payTool = payModel.payTool; const headerModel = require('../../../doraemon/models/header'); // 头部model const co = require('bluebird').coroutine; const helpers = global.yoho.helpers; const Payment = require('../helpers/payment'); const WxPay = require('../helpers/pay/wechat'); const common = require('../helpers/pay/common'); /** * 支付中心 * @param req * @param res * @param next */ const payCenter = (req, res, next) => { let orderCode = req.query.order_code; let uid = req.user.uid; let sessionKey = req.session.TOKEN; let userAgent = req.get('User-Agent'); let hasWxShare = Boolean(userAgent.match(/MicroMessenger/i) && userAgent.match(/MicroMessenger/i).length > 0); if (!orderCode || !uid) { res.redirect('/'); } if (sessionKey) { sessionKey = sessionKey.substr(0, sessionKey.length - 8); } co(function* () { let orderDetail = yield payModel.payCenter({ orderCode: orderCode, uid: uid, sessionKey: sessionKey }); /* 判断订单是否已付款, 已付款跳到订单详情页 */ if (orderDetail.isPay) { return res.redirect(helpers.urlFormat('/cart/shopping/pay/payZero', {order_code: orderCode})); } if (hasWxShare) { let openId = req.cookies['weixinOpenId' + orderCode]; if (!openId) { let getOpenidResult = yield WxPay.getOpenid(req.query.code, req.originalUrl); if (getOpenidResult.openid) { openId = getOpenidResult.openid; } if (getOpenidResult.redirectUrl) { return res.redirect(getOpenidResult.redirectUrl); } if (openId) { res.cookie('weixinOpenId' + orderCode, openId, { domain: 'yohobuy.com', expires: new Date(Date.now() + 24 * 60 * 60 * 1000) }); } } } let responseData = { pageHeader: headerModel.setNav({ navTitle: '支付中心', backUrl: 'javascript:void(0);' }), module: 'cart', page: 'pay', title: '支付中心 | Yoho!Buy有货 | 潮流购物逛不停', payAppInfo: payTool.payAppInfo(orderCode), orderCode: orderCode, hasWxShare: hasWxShare, orderTotal: orderDetail.payment_amount || 0, orderTotalFormat: parseInt(orderDetail.payment_amount, 10), orderCount: payTool.calBuyNumCount(orderDetail.order_goods), uid: uid, isOldUser: Boolean(req.cookies._isOldUser && req.cookies._isOldUser === '4') }; res.render('pay/pay-center', responseData); })().catch(next); }; /** * 统一支付入口 * @param req * @param res */ const pay = (req, res, next) => { let orderCode = req.query.order_code; let user = req.user; let uid = req.user.uid; let sessionKey = req.session.TOKEN; let payment = req.query.payment; let paymentCode = common.getPaymentCode(payment); let openId = req.cookies['weixinOpenId' + orderCode]; if (!orderCode || !uid || !sessionKey) { return res.redirect('/'); } co(function* () { let orderDetail = yield payModel.getOtherDetail({ uid: uid, orderCode: orderCode, sessionKey: sessionKey }); if (!orderDetail || !orderDetail.data) { return res.json({ code: 400, msg: '没有找到该订单!' }); } if (orderDetail.data.is_cancel === 'Y') { let url = helpers.urlFormat('/home/orders/detail', { order_code: orderCode }); return res.json({ code: 400, msg: '订单已经取消' }).redirect(url); } Payment.pay(user, orderDetail.data, payment, { protocol: req.protocol, openId: openId }).then(result => { if (result && paymentCode === payModel.payments.wechat) { return res.json(result); } if (result && result.data && result.data.href && paymentCode === payModel.payments.alipay) { return res.redirect(result.data.href); } else { return res.redirect('/'); } }); })().catch(next); }; // 货到付款 const payCod = (req, res, next) => { let headerData = headerModel.setNav({ navTitle: '支付完成' }); let responseData = { pageHeader: headerData, module: 'cart', page: 'pay', title: '支付中心 | Yoho!Buy有货 | 潮流购物逛不停' }; let sessionKey = req.session.TOKEN; let param = { uid: req.user.uid, udid: req.sessionID || require('md5')(req.ip) || 'yoho', orderCode: req.query.order_code, contentCode: '78d0fb6c97d691863286edcb4d8abfa9', client_id: req.cookies._yasvd || '', sessionKey: sessionKey && sessionKey.substr(0, sessionKey.length - 8) || '' }; // 如果没有uid,跳转到首页 if (!param.uid) { res.redirect('/'); return; } payModel.getPayCod(param).then(result => { if (result.match === true) { res.render('pay/pay-cod', Object.assign(responseData, result)); } else { res.redirect('/'); } }).catch(next); }; // 支付宝支付结果页 const payAli = (req, res, next) => { let headerData = headerModel.setNav({ navTitle: '支付完成' }); let responseData = { pageHeader: headerData, module: 'cart', page: 'pay', title: '支付中心 | Yoho!Buy有货 | 潮流购物逛不停' }; let responseFailure = { pageHeader: headerModel.setNav({ navTitle: '支付中心', navBtn: false }), title: '支付中心 | Yoho!Buy有货 | 潮流购物逛不停' }; let param = { uid: req.user.uid, udid: req.sessionID || require('md5')(req.ip) || 'yoho', orderCode: req.query.out_trade_no, contentCode: '78d0fb6c97d691863286edcb4d8abfa9' }; // 如果没有uid,跳转到首页 if (!param.uid) { res.redirect('/'); return; } let verifyResult = payModel.alipayResultVerify(req.query); // 支付宝支付校验 if (!verifyResult.payResult) { return res.render('pay/pay-failure', responseFailure); } payModel.getPayAli(param).then(result => { if (result.match === true) { res.render('pay/pay-ali', Object.assign(responseData, result)); } else { res.redirect('/'); } }).catch(next); }; // 零元支付 const payZero = (req, res, next) => { let headerData = headerModel.setNav({ navTitle: '支付完成' }); let responseData = { pageHeader: headerData, module: 'cart', page: 'pay', title: '支付中心 | Yoho!Buy有货 | 潮流购物逛不停' }; let param = { uid: req.user.uid, udid: req.sessionID || require('md5')(req.ip) || 'yoho', orderCode: req.query.order_code, contentCode: '78d0fb6c97d691863286edcb4d8abfa9', isPay: true }; // 如果没有uid,跳转到首页 if (!param.uid) { res.redirect('/'); return; } payModel.getPayAli(param).then(result => { if (result.match === true) { res.render('pay/pay-ali', Object.assign(responseData, result)); } else { res.redirect('/'); } }).catch(next); }; module.exports = { payCenter, pay, payCod, payAli, payZero };