zoukankan      html  css  js  c++  java
  • nodejs 支付宝app支付

    【链接】单笔转账到支付宝账户产品介绍更新时间:
    https://docs.open.alipay.com/309

    const crypto = require('crypto')

    const moment = require('moment')

    1.返回给移动端签名字符串:

    router.post('createAliPayment', async (ctx, next) => {
    const orderInfo = await model.order.findOne({
    'orderStatus.status': {
    $in: [1, 9]
    },
    orderCode: ctx.params.orderCode,
    createdBy: ctx.user.userid,
    isDelete: false
    }, {
    _id: 0,
    orderCode: 1,
    transCode: 1,
    orderProducts: 1,
    CNYCharge: 1
    })
    if (!orderInfo) {
    throw {
    status: 20001,
    message: 'paying orderInfo not exists'
    }
    return
    }
    let aliPaySignObj = {
    app_id: '支付宝商户Id',
    method: 'alipay.trade.app.pay',
    charset: 'utf-8',
    sign_type: 'RSA2',
    timestamp: moment().format('YYYY-MM-DD HH:mm:ss'),
    version: '1.0',
    notify_url: `${config.notify_ulr}`,
    biz_content: JSON.stringify({
    body: '冰糖葫芦',
    subject: '冰糖葫芦',
    out_trade_no: orderInfo.orderCode,
    timeout_express: '15m',
    total_amount: Number(orderInfo.CNYCharge).toString(),
    product_code: 'QUICK_MSECURITY_PAY'
    })
    };
    let signStr = '',
    encodeStr = '';
    for (let n of Object.keys(aliPaySignObj).sort()) {
    signStr += (n + '=' + aliPaySignObj[n] + '&');
    encodeStr += (n + '=' + encodeURIComponent(aliPaySignObj[n]) + '&');
    }
    signStr = signStr.substring(0, signStr.length - 1);
    var signer = crypto.createSign('RSA-SHA256').update(signStr);
    let privateKey = fse.readFileSync(path.join(__dirname, '../alipay_private_key.pem')).toString();
    let sign = signer.sign(privateKey, 'base64')
    ctx.body = {
    encodeStr: encodeStr + 'sign=' + encodeURIComponent(sign)
    }
    })

    2.支付宝回调

    router.post('notifyFromAliPay', async (ctx, next) => {
    const resData = ctx.params;
    if (!(resData && resData.trade_status && resData.trade_status == 'TRADE_SUCCESS')) {
    ctx.body = 'fail';
    return;
    }
    //1.验证签名信息
    let signStr = '';
    for (let n of Object.keys(resData).sort()) {
    if (n !== 'sign' && n !== 'sign_type') {
    signStr += (n + '=' + decodeURIComponent(resData[n]) + '&');
    }
    }
    signStr = signStr.substring(0, signStr.length - 1);
    let signer = crypto.createVerify('RSA-SHA256').update(signStr);
    const aliPublicKey = fse.readFileSync(path.join(__dirname, "../alipay_public_key.pem")).toString();
    const sign = signer.verify(aliPublicKey, resData.sign, 'base64');
    if (!sign) {
    ctx.body = 'fail';
    return;
    }
    const orderCodePhoto = resData.out_trade_no;
    const orderDb = await model.order.findOne({
    orderCode: orderCodePhoto
    }, {
    _id: 0,
    siteId: 1,
    CNYCharge: 1,
    usePPCodes: 1,
    orderProducts: 1,
    virtualProducts: 1,
    createdBy: 1,
    charge: 1
    })
    if (!orderDb) {
    throw new Error('alipay notify orderCode not exists !')
    }
    let queryAlipayParams = {
    app_id: '支付宝商户Id',
    method: 'alipay.trade.query',
    charset: 'utf-8',
    sign_type: 'RSA2',
    timestamp: moment().format('YYYY-MM-DD HH:mm:ss'),
    version: '1.0',
    biz_content: JSON.stringify({
    out_trade_no: orderCodePhoto,
    trade_no: resData.trade_no
    })
    }
    let signString = '',
    encodeStr = '';
    for (let n of Object.keys(queryAlipayParams).sort()) {
    signString += (n + '=' + queryAlipayParams[n] + '&');
    encodeStr += (n + '=' + encodeURIComponent(queryAlipayParams[n]) + '&');
    }
    signString = signString.substring(0, signString.length - 1);
    var signQuery = crypto.createSign('RSA-SHA256').update(signString);
    let privateKey = fse.readFileSync(path.join(__dirname, '../alipay_private_key.pem')).toString();
    let signrs = encodeURIComponent(signQuery.sign(privateKey, 'base64'));
    const querParams = encodeStr + `sign=${signrs}`;
    const queryAlipayResult = await request.getAsync({
    url: 'https://openapi.alipay.com/gateway.do?' + querParams
    })
    const aplipayQueryResult = queryAlipayResult && JSON.parse(queryAlipayResult.body) || '';
    if (!aplipayQueryResult) {
    ctx.body = 'fail';
    return;
    }
    const aplipayqr = aplipayQueryResult.alipay_trade_query_response;
    if (!(aplipayqr.code == '10000' && aplipayqr.msg == 'Success' && aplipayqr.trade_status == 'TRADE_SUCCESS' && Number(aplipayqr.total_amount) == orderDb.CNYCharge)) {
    ctx.body = 'fail';
    return;
    }
    try {
    ctx.body = 'success';
    //更新业务操作
    } catch (err) {
    throw new Error(err)
    }
    }

    总结:1.nodejs app支付,后端做的就是以上两步,剩下的就是app端的事了。

             2.以上代码,复制,稍微改改就成了

  • 相关阅读:
    华为OSPF与ACL综合应用
    综合练习2 设置访问权限,Easy-IP访问外网,内外网访问
    综合练习1,划分vlan,单臂路由,DHCP服务及其限制网段、租期,设置根桥,OSPF路由通告综合练习
    在eNSP下使用Hybird接口
    在eNSP上配置VLAN的Trunk端口
    在ensp上模拟企业网络场景并Access接口加入相应VLAN
    网络安全设备
    WooYun虚拟机的搭建以及配置
    IIS web服务器访问日志
    apache访问日志目录以及术语返回码
  • 原文地址:https://www.cnblogs.com/qiyc/p/9877533.html
Copyright © 2011-2022 走看看