request.js 12.3 KB
import Promise from '../vendors/es6-promise';
import objectAssign from '../vendors/object-assign';
import trimObject from '../utils/trimObject';
import queryString from '../vendors/query-string';
import md5 from '../vendors/md5';
import {API_HOST,APP_VERSION, CLIENT_TYPE, PRIVATE_KEY} from '../libs/config';
import { getYHStorageSync } from '../utils/util';

let crypto =  require('./cryptojs/cryptojs.js').Crypto
let p1SecretKey = "yoho9646yoho9646"
let ClientInitConfigMehtod = "resources.simple.pice"
let ClientConfigHasRequested = 0

function getPrivateKey(){
  return new Promise(function(resolve,reject){
    let app = getApp()
    let p2SecretKey = app && app.globalData && app.globalData.p2SecretKey;
    if (!p2SecretKey){
      p2SecretKey = getYHStorageSync("p2SecretKey","request")
    }

    if (p2SecretKey){
      resolve(p2SecretKey)
    }else{

      let data = {
        "udid": app.globalData.udid,
        "method": 'resources.simple.pice'
      }
      let method = "GET"
      let header = {
        'Content-Type': 'application/x-www-form-urlencoded'
      }

      wx.request({
        url: API_HOST,
        data,
        method,
        header: header,
        success: function (res) {
          // console.log("res:", res)
          if (res && res.data && res.data.data && res.data.data.sk) {
            app.globalData.p2SecretKey = res.data.data.sk;
            wx.setStorage({
              key: "p2SecretKey",
              data: res.data.data.sk
            });

            resolve(app.globalData.p2SecretKey)
          }
        },
        fail: function (err) {
          let code = err.code ? err.code : 800;
          let message = err.message ? err.message : '';
          let isPrivatekeyError = true 
          reject({ code, message, isPrivatekeyError});
          // console.log("err:",err)
        }
      });

    }
  })
}

function request(method = 'GET') {
    return function(url, params = {}) {
        return getPrivateKey()
          .then(key => {
            return new Promise(function (resolve, reject) {
              let app = getApp();
              if (params && !params.hasOwnProperty('uid')) {
                let uid = app && app.globalData && app.globalData.userInfo && app.globalData.userInfo.uid ? app.globalData.userInfo.uid : 0;
                params.uid = uid;
              }
              let sessionkey = app && app.globalData && app.globalData.sessionkey ? app.globalData.sessionkey : '';
              params.session_key = sessionkey;
              params.source_type = "wechat";
              params.client_type = "miniapp";
              if (!params.business_line) {
                params.business_line = "minappLuck";
              }
              params.user_source = "wechat"

              if (params && !params.hasOwnProperty('udid')) {
                let udid = app && app.globalData && app.globalData.udid ? app.globalData.udid : "";
                if (udid.length == 0) {
                  udid = getYHStorageSync('udid','request');
                }
                params.udid = udid;
              }

              let body = _createBody(params);
              let queryStrigPair = _signParam(body, true);
              let data = '';

              if (method === 'GET' || method === 'HEAD' || method === 'DELETE') {
                url = url + '?' + queryStrigPair;
              }

              if (method !== 'GET' && method !== 'HEAD') {
                data = queryStrigPair;
              }

              //加签
              let resultString = "";
              if ((params.hasOwnProperty("method") && params["method"] === ClientInitConfigMehtod)) {
              } else {
                let p2SecretKey = app && app.globalData && app.globalData.p2SecretKey ? app.globalData.p2SecretKey : '';
                if (p2SecretKey == '') {
                  p2SecretKey = getYHStorageSync("p2SecretKey",'request')
                }
                resultString = crypto.HMAC(crypto.SHA256, _signParam(body, false), p2SecretKey, "")
              }
              let header = {
                'Content-Type': 'application/x-www-form-urlencoded',
                'x-yoho-verify': resultString,
                'Cookies': 'JSESSIONID=' + sessionkey,
              }

              wx.request({
                url,
                data,
                method,
                header: header,
                success: function (res) {
                  let statusCode = res.statusCode,
                    errMsg = res.errMsg,
                    data = res.data;

                  if (statusCode == 200) {
                    resolve(data);
                  } else {
                    let code = statusCode;
                    let message = res.errMsg ? res.errMsg : '';
                    reject({ code, message });
                  }
                },
                fail: function (err) {
                  let code = err.code ? err.code : 800;
                  let message = err.message ? err.message : '';
                  reject({ code, message });
                }
              });
            })
          })
          .catch(error => {
            if (!error || !error.isPrivatekeyError) return
            return new Promise(function (resolve, reject) {
              let app = getApp();
              if (params && !params.hasOwnProperty('uid')) {
                let uid = app && app.globalData && app.globalData.userInfo && app.globalData.userInfo.uid ? app.globalData.userInfo.uid : 0;
                params.uid = uid;
              }
              let sessionkey = app && app.globalData && app.globalData.sessionkey ? app.globalData.sessionkey : '';
              params.session_key = sessionkey;
              params.source_type = "wechat";
              params.client_type = "miniapp";
              params.business_line = "minappLuck";
              params.user_source = "wechat"

              if (params && !params.hasOwnProperty('udid')) {
                let udid = app && app.globalData && app.globalData.udid ? app.globalData.udid : "";
                if (udid.length == 0) {
                  udid = getYHStorageSync('udid','request');
                }
                params.udid = udid;
              }

              let body = _createBody(params);
              let queryStrigPair = _signParam(body, true);
              let data = '';

              if (method === 'GET' || method === 'HEAD' || method === 'DELETE') {
                url = url + '?' + queryStrigPair;
              }

              if (method !== 'GET' && method !== 'HEAD') {
                data = queryStrigPair;
              }

              //加签
              let resultString = "";
              if ((params.hasOwnProperty("method") && params["method"] === ClientInitConfigMehtod)) {
              } else {
                let p2SecretKey = app && app.globalData && app.globalData.p2SecretKey ? app.globalData.p2SecretKey : '';
                if (p2SecretKey == '') {
                  p2SecretKey = getYHStorageSync("p2SecretKey",'request')
                }
                resultString = crypto.HMAC(crypto.SHA256, _signParam(body, false), p2SecretKey, "")
              }
              let header = {
                'Content-Type': 'application/x-www-form-urlencoded',
                'x-yoho-verify': resultString,
                'Cookies': 'JSESSIONID=' + sessionkey,
              }

              wx.request({
                url,
                data,
                method,
                header: header,
                success: function (res) {
                  let statusCode = res.statusCode,
                    errMsg = res.errMsg,
                    data = res.data;

                  if (statusCode == 200) {
                    resolve(data);
                  } else {
                    let code = statusCode;
                    let message = res.errMsg ? res.errMsg : '';
                    reject({ code, message });
                  }
                },
                fail: function (err) {
                  let code = err.code ? err.code : 800;
                  let message = err.message ? err.message : '';
                  reject({ code, message });
                }
              });
            })
          })
    }
}

function uploadLogData(method = 'POST') {
  return function (url, params = {}) {
    return new Promise(function (resolve, reject) {
      let app = getApp();
      let data = { '_mlogs': JSON.stringify(params) }
      let sid = app && app.globalData && app.globalData.sid ? app.globalData.sid : '';
      let header = {
        'content-type': "application/x-www-form-urlencoded",
        'x-yoho-sid': md5(sid),
      }
      wx.request({
        url,
        data,
        method,
        header,
      });
    })
  }
}

function appReport(method = 'POST') {
  return function (url, params = {}) {
    return new Promise(function (resolve, reject) {
      let app = getApp();
      let data = JSON.stringify(params)
      let sid = app && app.globalData && app.globalData.sid ? app.globalData.sid : '';
      let header = {
        'content-type': "application/json",
        'x-yoho-sid': md5(sid),
      }
      wx.request({
        url,
        data,
        method,
        header,
      });
    })
  }
}

function _publicParams() {
    let app_version = APP_VERSION;
    let os_version = '';
    let client_type = CLIENT_TYPE;
    let screen_size = '';
    let privateKey = PRIVATE_KEY;
    let v = '7';

    try {
        let res = wx.getSystemInfoSync();
        screen_size = res.windowWidth + 'x' + res.windowHeight;
        os_version = res.version;
    } catch (e) {
        // Do something when catch error
    }

    // app_version = '5.6.0';
    // os_version = '10.3';
    // screen_size = '320x568';
    // let uid = '0';
    // let udid = 'acea1c6170ecca417c67979a406156950bcf4fe5';
    // let physical_channel = 1;


    return {
        app_version,
        os_version,
        client_type,
        screen_size,
        // physical_channel,
        // udid,
        v,
        // uid,
    };
}

function _createBody(body) {
    let defaultBody = _publicParams();
    let newBody = objectAssign(defaultBody, body);
    return newBody;
}

function _signParam(params,opt) {
    let private_key = PRIVATE_KEY;
    let allParams = objectAssign(params, {private_key});

    allParams = trimObject(allParams);	// 去除首尾空格
    let paramsPair = queryString.stringify(allParams, {encode: false});
    let client_secret = md5(paramsPair);

    delete allParams.private_key;

    let resultParams = objectAssign(allParams, {client_secret});
    let resultString;
    if (opt === true){
        resultString = queryString.stringify(resultParams,{encode: true});
    }else{
        resultString = queryString.stringify(resultParams,{encode: false});
    }
    return resultString;
}

function _signParam(params,opt) {
    let private_key = PRIVATE_KEY;
    let allParams = objectAssign(params, {private_key});

    allParams = trimObject(allParams);	// 去除首尾空格
    let paramsPair = queryString.stringify(allParams, {encode: false});
    let client_secret = md5(paramsPair);

    delete allParams.private_key;

    let resultParams = objectAssign(allParams, {client_secret});
    let resultString;
    if (opt === true){
        resultString = queryString.stringify(resultParams,{encode: true});
    }else{
        resultString = queryString.stringify(resultParams,{encode: false});
    }
    return resultString;
}

function sign_body(params,url){
  let app = getApp();
  let body = _createBody(params);
  let queryStrigPair = _signParam(body, true);
  let data = '';

  url = url.indexOf('?') >= 0 ? url + '&' + queryStrigPair : url + '?' + queryStrigPair;

  //加签
  let resultString = "";
  let p2SecretKey = app && app.globalData && app.globalData.p2SecretKey ? app.globalData.p2SecretKey : '';
  if (p2SecretKey == '') {
    p2SecretKey = getYHStorageSync("p2SecretKey",'request')
  }
  resultString = crypto.HMAC(crypto.SHA256, _signParam(body, false), p2SecretKey, "")

  // console.log('url',url)
  // console.log('resultString', resultString)

  let response = {}
  response.signString = resultString
  response.url = url
  return response
}

export const GET = request('GET');
export const POST = request('POST');
export const PUT = request('PUT');
export const DELETE = request('DELETE');
export const UPLOAD_LOG = uploadLogData('POST')
export const APP_REPORT = appReport('POST')

module.exports = {
  sign_body,
  APP_REPORT,
  UPLOAD_LOG,
  GET,
  POST,
}