alipay.js 3.37 KB
/**
 *
 * @author: jiangfeng<jeff.jiang@yoho.cn>
 * @date: 16/7/22
 */

'use strict';

// const config = global.yoho.config;
const helpers = global.yoho.helpers;

// const common = require('./common');
const sign = require('./sign');
const _ = require('lodash');
const md5 = require('md5');
const logger = global.yoho.logger;
const PAY_URL = 'https://mapi.alipay.com/gateway.do?';

module.exports = class extends global.yoho.BaseModel {
    constructor(ctx) {
        super(ctx);
    }

    // // 原node生成预支付订单
    // pay(user, order, param, protocol) {
    //     let payParams = JSON.parse(param.payParams);
    //     let extraParam = JSON.stringify({
    //         sign_id_ext: user.uid,
    //         defaultbank: param.bankCode || ''
    //     });
    //     let params = {
    //         service: 'create_direct_pay_by_user',
    //         partner: payParams.merchant_id,
    //         _input_charset: 'utf-8',
    //         notify_url: config.domains.serviceNotify + 'payment/alipay_notify',
    //         return_url: protocol + ':' + helpers.urlFormat('/shopping/newpay/callback/alipay'),
    //         subject: '有货订单号:' + order.order_code,
    //         out_trade_no: order.order_code,
    //         it_b_pay: common.getPayExpireMin(order.pay_expire) + 'm',
    //         total_fee: order.payment_amount,
    //         payment_type: '1',
    //         seller_email: payParams.merchant_other_code,
    //         extra_common_param: extraParam
    //     };

    //     let signStr = md5(sign.raw(params) + payParams.merchant_key);
    //     let body = sign.rawUncode(params) + '&sign=' + signStr + '&sign_type=MD5';
    //     return {
    //         code: 200,
    //         data: {
    //             href: PAY_URL + body
    //         }
    //     };
    // }
    pay(user, order, param, protocol) {
        let options = {
            uid: user.uid,
            order_code: order.order_code,
            payment_code: param.paymentCode,
            return_url: protocol + ':' + helpers.urlFormat('/shopping/newpay/callback/alipay')
        };

        return this.post({
            api: global.yoho.ServiceAPI,
            url: '/payment/alipay_data',
            data: options
        }).then(result => {
            if (result.code === 200) {
                return {
                    code: 200,
                    data: {
                        href: PAY_URL + _.get(result, 'data.payParams', '')
                    }
                };
            }

            return result;
        });
    }

    notify(data, param) { // eslint-disable-line
        // let payParams = JSON.parse(param.payParams || '{}');
        let orderCode = parseInt(data.out_trade_no, 10);

        logger.info(`Alipay notify, params = ${JSON.stringify(data)}`);

        // if (!this.checkNotify(data, payParams)) {
        //     return {payResult: -1};
        // }

        return {
            bankName: '',
            orderCode: orderCode,
            payResult: data.trade_status === 'TRADE_SUCCESS' ? 200 : 400,
            totalFee: data.total_fee,
            tradeNo: data.trade_no,
            bankBillNo: ''
        };
    }

    checkNotify(data, payParams) {
        let signValue = data.sign;

        delete data.sign;
        delete data.sign_type;
        delete data.code;

        let signStr = md5(sign.raw(data) + payParams.merchant_key);

        return signValue === signStr;
    }
};