pay.js 5.68 KB
/**
 * 支付成功页
 * @author: jing.li<jing.li@yoho.cn>
 * @date: 2016/10/25
 */

'use strict';

const api = global.yoho.API;
const serviceAPI = global.yoho.ServiceAPI;
const utils = '../../../utils';
const productProcess = require(`${utils}/product-process`);
const _ = require('lodash');
const ApipayConfig = global.yoho.config.alipayConfig;
const md5 = require('md5');

// 资源位
const _getBanner = (param) => {
    return serviceAPI.get('operations/api/v5/resource/get', {
        content_code: param.contentCode,
        platform: 'iphone'
    }, { code: 200 }).then((result) => {

        result = result.data;

        return result;
    });
};

// 购买此商品的用户也购买了
const _getOthersBuy2 = (param) => {
    return api.get('', {
        method: 'app.recommend.purchased',
        productSkn: param.skn,
        udid: param.uid,
        rec_pos: '100005',
        limit: 2,
        client_id: param.client_id
    }, { code: 200 }).then((result) => {

        if (result && result.data && result.data.product_list) {
            return productProcess.processProductList(result.data.product_list);
        }

    });
};

// 订单信息
const _getOtherDetail = (param) => {
    return api.get('', {
        method: 'app.SpaceOrders.detail',
        uid: param.uid,
        order_code: param.orderCode
    }, { code: 200 }).then((result) => {

        return result;

    });
};

// 购买此商品的用户也购买了,要先从订单详情获取商品skn
const _getOthersBuy = (param) => {
    return api.all([
        _getOtherDetail(param)
    ]).then((result) => {

        let goodSkn = '';

        if (result && result[0] && result[0].data && result[0].data.order_goods) {
            goodSkn = result[0].data.order_goods[0].product_skn;
        }

        return _getOthersBuy2(Object.assign(param, { skn: goodSkn }));

    }).then((result) => {

        return result;
    });
};

// 货到付款
const getPayCod = (param) => {
    return api.all([
        _getBanner(param),
        _getOthersBuy(param),
        _getOtherDetail(param)
    ]).then((result) => {

        let resu = {
            match: true,
            banner: [],
            othersBuy: []
        };

        if (result && result[0]) {
            _.forEach(result[0], function(val) {
                if (val.template_name === 'single_image') {
                    resu.banner = val;
                } else if (val.template_name === 'text') {
                    resu.prompt = val.data;
                }
            });
        }

        if (result && result[1]) {
            resu.othersBuy = result[1];
        }

        if (result && result[2] && result[2].data && result[2].data.payment_amount) {
            resu.payment = result[2].data.payment_amount;

        } else {
            resu.match = false;
        }

        resu.orderCode = param.orderCode;

        resu.orderUrl = '/home/orders/detail?order_code=' + param.orderCode;

        return resu;
    });
};

const _raw = (args) => {
    let keys = Object.keys(args);

    keys = keys.filter(k => {
        let keyValueCheck =
            k === 'sign' ||
            k === 'sign_type' ||
            k === 'code' ||
            args[k] === '' ||
            args[k] === 'undefined';

        return !keyValueCheck;
    }).sort();

    return keys.map(k => {
        return k + '=' + decodeURI(args[k]);
    }).join('&');
};

/**
 * 验证返回结果的正确性
 */
const _checkResponse = (params) => {
    if (!params.sign) {
        return false;
    }
    let rawResult = _raw(params);
    let sign = rawResult + ApipayConfig.alipayKey;
    let md5Result = md5(sign);

    return md5Result === params.sign;
};


/**
 * 支付宝支付结果校验
 */
const alipayResultVerify = (params) => {
    let checkResult = {};

    if (params.q) {
        delete params.q;
    }

    if (!_checkResponse(params)) {
        checkResult.payResult = false;
    } else {
        _.assign(checkResult, {
            bankName: '',
            orderCode: params.out_trade_no,
            payResult: params.trade_status === 'TRADE_SUCCESS',
            payTime: params.gmt_payment || '',
            totalFee: params.total_fee,
            resultMsg: params.notify_type,
            payOrderCode: params.out_trade_no,
            tradeNo: params.trade_no,
            bankBillNo: ''
        });
    }

    return checkResult;
};

// 支付宝支付
const getPayAli = (param) => {
    return api.all([
        _getBanner(param),
        _getOthersBuy(param),
        _getOtherDetail(param)
    ]).then((result) => {

        let resu = {
            match: true,
            banner: [],
            othersBuy: []
        };

        if (result && result[0]) {
            _.forEach(result[0], function(val) {
                if (val.template_name === 'single_image') {
                    resu.banner = val;
                } else if (val.template_name === 'text') {
                    resu.prompt = val.data;
                }
            });
        }

        if (result && result[1]) {
            resu.othersBuy = result[1];
        }

        if (result && result[2] && result[2].data && result[2].data.payment_amount) {
            resu.packageTitle = _.get(result[2], 'data.package_title', '');
            if (param.isPay && param.isPay === true) {
                resu.payment = '0.00';
                resu.payWay = false;
            } else {
                resu.payWay = true;
                resu.payment = result[2].data.payment_amount;
            }

        } else {
            resu.match = false;
        }

        resu.orderCode = param.orderCode;

        resu.orderUrl = '/home/orders/detail?order_code=' + param.orderCode;

        return resu;
    });
};

module.exports = {
    getPayCod,
    getPayAli,
    alipayResultVerify
};