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;
}