如何手动完成job文件

注意:

1、windows系统,复制代码到job里面时,需要保存为:UTF-8编码格式的;否则会导致汉字乱码

2、对项目lib/middle文件夹内文件发送变动(目前当修改main.js或者job文件会涉及到),请使用<<技术任务更新通知>>的六条发送邮件


  • 检查这个目录是否存在{DOMAIN}/lib/jobs/. 如果没有则手动创建
  • 新建文件 {jobType}.js 文件. 注意 文件名就是job的名称
  • 粘贴基本代码模板到 {jobType}.js
    (function() {
      module.exports.exec = function(req, data) {
        var finish_data = {};
        var tmp_data = {};
        var inputs = data.data;
        // 用户实际支付了多少钱
        inputs.totalfee = Number(data.data.record.md_amount);
        // 资源id
        inputs.transactionID = data.data.record.md_iid;
        // 付款用户的uid
        inputs.uid = data.data.record.md_uid;
    
        return when.pipeline([
          /*INSBEGIN:JOBPROCESS*/
          !注意! 通常来说,必须要对用户实际支付的钱与应该支付多少钱做一个判断; 如果不做判断,就会出现用户支付一分钱,但是却买了N元钱的东西;
          请手动删除这句话,并且插入相应的代码段
    
          !但是! 如果允许用户支付任意金额,例如充值,那么可以可以不做检查
          /*INSBEGIN:CUSTOM*/
          function() {
            // 用来判断 实付金额 与 应付金额是否相等. 应付金额由自己从数据库中获取.
            var resourcePrice = Number(应付金额由自己从数据库中获取,并且将这里修改为对应的变量);
            /*
            x,y 为参与操作的变量,自动取小数点后两位
            加法(x+y)操作 math.format(math.add(x,y), { notation: 'fixed', precision: 2 });
            减法(x-y)操作 math.format(math.subtract(x,y), { notation: 'fixed', precision: 2 });
            乘法(x*y)操作 math.format(math.multiply(x,y), { notation: 'fixed', precision: 2 });
            除法(x/y)操作 math.format(math.divide(x,y), { notation: 'fixed', precision: 2 });
            */
            // TODO
            if (isNaN(inputs.totalfee) || isNaN(resourcePrice)) {
              throw {
                "status": 200,
                "message": {
                  "success": false,
                  "status": 200,
                  "message": {
                    "error": "totalfee=" + inputs.totalfee + "; resourcePrice=" + resourcePrice + " 不是合法金额"
                  }
                }
              };
            }
            resourcePrice = math.format(resourcePrice, { notation: 'fixed', precision: 2 });
            var totalfee = math.format(inputs.totalfee, { notation: 'fixed', precision: 2 });
            if (!math.equal(totalfee, resourcePrice)) {
              throw {
                "status": 200,
                "message": {
                  "success": false,
                  "status": 200,
                  "message": {
                    "error": "应付金额["+resourcePrice+"]实际支付["+totalfee+"]不匹配!"
                  }
                }
              };
            }
          },
          /*INSEND:CUSTOM*/
          判断通过后的处理逻辑.......
          /*INSEND:JOBPROCESS*/
          function() {
            var default_data = /*INSBEGIN:MARK*/ {} /*INSEND:MARK*/ ;
            return _.extend(default_data, finish_data);
          }
        ]);
      };
    })();
      
  • 模板代码中:
         /*INSBEGIN:CUSTOM*/
          function() {
            // 用来判断 实付金额 与 应付金额是否相等. 应付金额由自己从数据库中获取.
            var resourcePrice = Number(应付金额由自己从数据库中获取,并且将这里修改为对应的变量);
            /*
            x,y 为参与操作的变量,自动取小数点后两位
            加法(x+y)操作 math.format(math.add(x,y), { notation: 'fixed', precision: 2 });
            减法(x-y)操作 math.format(math.subtract(x,y), { notation: 'fixed', precision: 2 });
            乘法(x*y)操作 math.format(math.multiply(x,y), { notation: 'fixed', precision: 2 });
            除法(x/y)操作 math.format(math.divide(x,y), { notation: 'fixed', precision: 2 });
            */
            // TODO
            if (isNaN(inputs.totalfee) || isNaN(resourcePrice)) {
              throw {
                "status": 200,
                "message": {
                  "success": false,
                  "status": 200,
                  "message": {
                    "error": "totalfee=" + inputs.totalfee + "; resourcePrice=" + resourcePrice + " 不是合法金额"
                  }
                }
              };
            }
            resourcePrice = math.format(resourcePrice, { notation: 'fixed', precision: 2 });
            var totalfee = math.format(inputs.totalfee, { notation: 'fixed', precision: 2 });
            if (!math.equal(totalfee, resourcePrice)) {
              throw {
                "status": 200,
                "message": {
                  "success": false,
                  "status": 200,
                  "message": {
                    "error": "应付金额["+resourcePrice+"]实际支付["+totalfee+"]不匹配!"
                  }
                }
              };
            }
          },
          /*INSEND:CUSTOM*/
        
  • 部分可以放到接口中处理

  • 新建一个任意名称的后端视口,并在其中完成job中需要处理的逻辑(插入相关代码段)
  • 拷贝所有所插入的代码段到 /*INSBEGIN:JOBPROCESS*/ 代码段 /*INSEND:JOBPROCESS*/ 代码段 处
  • 保存 {jobType}.js文件. 立即发布--只更新静态资源
  •  

    其他项

  • 发起支付接口中用到的jobid,就是job文件的文件名,不需要后缀
  • job中能接受两个参数, req对象,和data. data的信息为启动job时传入的参数.所以,不同job对参数的约定不同.
  • 支付成功后 job被启动时,并且通过inputs对象能获取如下信息.

      {
        gateway: 'WechatPay_Native',
        transactionID: 'e2c9505971394474a5085c7f40cbd261',
        gatewayTID: '4006562001201610126507572552',
        banktype: 'CFT',
        cashfee: '1',
        issubscribe: 'N',
        openid: 'ofT5Zw5LccA9OMoryujP6Ug-f1_s',
        resultcode: 'SUCCESS',
        returncode: 'SUCCESS',
        timeend: '20161012194701',
        totalfee: '1',
        mch_id: '1374513602',
        appid: 'wx912cdabac8ac5aa5',
        success: true,
        sellerid: '1374513602',
        customerid: 'ofT5Zw5LccA9OMoryujP6Ug-f1_s',
        paymentid: '4006562001201610126507572552',
        record: {
          md_tid: 'e2c95059-7139-4474-a508-5c7f40cbd261',
          md_orderid: null,
          md_state: 1, 
          md_amount: '0.01',// 实际支付金额
          md_currencycode: 'CNY',
          md_customer: null,
          md_customerid: 'ofT5Zw5LccA9OMoryujP6Ug-f1_s',
          md_seller: null,
          md_sellerid: '1374513602',
          md_gateway: 'WechatPay_Native',
          md_paymentid: '4006562001201610126507572552',
          md_paymentdate: Wed Oct 12 2016 19: 23: 54 GMT + 0800(CST),
          md_subject: '一分钱测试',
          md_body: 'asdasdas',
          md_jobid: 'zhifucallback',
          md_jobnum: null,
          md_jobstate: null,
          md_iid: 'cc5e155f0a7f1fc5eab523e02716b91f', // 请求发起付款时传入的 transactionID
          md_prepayid: null,
          md_error: null,
          md_uid: '2df6a5c8ef794b41814f1d1ae04e83a1', // 请求发起付款时的 用户ID
          createdAt: Wed Oct 12 2016 19: 23: 54 GMT + 0800(CST),
          updatedAt: Wed Oct 12 2016 19: 24: 07 GMT + 0800(CST),
          success: true
        }
      }
      

    注意1: 在支付功能中 job被执行到的时候一定是充值成功 如果用户没有支付成功,job是不会被执行到的. 所以job中处理的逻辑就是 用户付款成功后应该如何做