AdonisJs バックエンド サービス ドッキング外部インターフェイスのノード JS 実装 BA 認定

AdonisJs バックエンド サービス ドッキング外部インターフェイスのノード JS 実装 BA 認定

公式のドッキング ドキュメントには JAVA、php、Python の実装ケースのみが含まれており、js の実装バージョンはありません。継続的な探索とテストと検証の後、ドッキングは正常に完了しました。関連するコードを共有します。必要な学生はそれを必要とします。どなたでも、もっと良い方法があれば、私にメッセージを残して、一緒に進歩することを楽しみにしています〜

署名メソッドの実装を生成する

/**
 * 生成签名
 * @param {String} data 待加密字符串
 * @param {String} key 公共秘钥
 */
const genSign = (data,key) => {
    
    
  // 第一个参数为加密字符串,第二个参数为公共秘钥
  var hash = CryptoJS.HmacSHA1(data, key);
  var base64 = CryptoJS.enc.Base64.stringify(hash);
  return base64.toString();
}

署名メソッドの実装を検証する

/**
 * 验证签名
 * @param {Object} request 请求
 * @param {Object} response 响应
 */
const checkSign = ({
     
     request, response}) => {
    
    
  let clientId = Env.get('CLIENTID');
  let clientSecret = Env.get('CLIENTSECRET');
  let date = request.headers.date;
  let authorization = request.headers.authorization;
  let stringToSign = request.method + " " + request.url + "\n" + date;
  //console.log(stringToSign);

  if (!authorization || !date) {
    
    
    return false;
  }

  const currSign = genSign(stringToSign,clientSecret);
  let checkAuth = "MWS " + clientId + ":" + currSign;
  //console.log(checkAuth);

  return checkAuth == authorization;
}

相手の注文番号の入力パラメータがint19桁のため、JSON.parseを直接使用すると精度が落ち、17桁以降が0になってしまいます。 以下のコードを導入することで問題を解決できます。

import JSONbig from 'json-bigint'
console.log(JSONbig.parse(str));

戻りパラメータの orderId も int19 桁の json 文字列である必要があります。最初に JSONbig.stringify で処理した後、json 文字列には orderId は表示されません。その後、orderId の値が文字列文字に変換され、 json string に変換してからその文字列を処理し、orderId 値の両端の '' を削除すると、問題は解決します。

リクエストインターフェイスのJSコード実装:

/**
 * 发送请求到对方接口
 * @param {Object} dataJSON 提交的JSON数据
 */
const request = async (dataJSON) => {
    
    
  try {
    
    
    let partnerId = Env.get('PARTNERID');
    let clientId = Env.get('CLIENTID');
    let clientSecret = Env.get('CLIENTSECRET');
    let noticeUrl = Env.get('CONSUME_NOTICE');//请求地址

    //格式化签名日期(Wed, 02 Nov 2022 00:49:01 GMT)
    let curDateStr = moment(new Date()).subtract(8,'hours').toString();
    let tmStr = curDateStr.substring(0,curDateStr.indexOf('+'));
    tmStr = tmStr.split(' ');
    let sortDateStr = tmStr[0] + ', '+ tmStr[2] + ' ' + tmStr[1] + ' ' + tmStr[3] + ' ' + tmStr[4] + ' ' + tmStr[5];
    //格式化验签请求地址
    let signUrl = noticeUrl.substring(noticeUrl.indexOf('com/')+3);
    let stringToSign = "POST "+signUrl+"\n" + sortDateStr;
    console.log('Meituan stringToSign:', stringToSign);
    const currSign = genSign(stringToSign,clientSecret);
    let auth = "MWS " + clientId + ":" + currSign;

    // 设置请求头数据
    const config = {
    
    
      url: signUrl,
      method: 'POST',
      headers: {
    
    
        'PartnerId': partnerId,
        'Authorization': auth,
        'Date': sortDateStr,
        'Content-Type': 'application/json;charset=UTF-8'
      },
    };
	
	//去掉orderId值两头的单引号.
    let reqStr = dealResponseOrderId(JSON.stringify(dataJSON));
    console.log('reqStr:', reqStr);
    const response = await Axios.post(noticeUrl, reqStr,config);
    const data = response.data;
    console.log(response.data);

    if (data.code == 200) {
    
    
      return {
    
    
        success: true,
        data: data,
      };
    } else {
    
    
      return {
    
    
        success: false,
        message: data.describe
      }
    }
  } catch (error) {
    
    
    console.error(error);
    return {
    
    
      success: false
    }
  }
}

戻り値の両側の一重引用符を削除してください。書き方が少し荒いので、気に入らない場合はスプレーしないでください~

/**
 * 处理返回orderId(去掉返回值左右两边的字符串标识"").
 * @param {Object} obj 
 */
 const dealResponseOrderId = (responseStr) => {
    
    
  if (responseStr.indexOf('"orderId"') == -1) {
    
    
    return responseStr;
  }
  let tmpStrs = responseStr.split('"orderId":"');
  let resultStr = tmpStrs[1].substring(0,tmpStrs[1].indexOf('"'));
  let result = tmpStrs[0]+'"orderId":'+resultStr+tmpStrs[1].substring(resultStr.length+1);
	return result;
}

おすすめ

転載: blog.csdn.net/liangbao568/article/details/127648386