Saya mencoba untuk mendapatkan akses ke API penyedia pembayaran kami, tetapi saya terus mendapatkan respons 403 (dilarang). Saya sudah tiga kali memeriksa kredensial dan mereka benar. Berikut adalah petunjuk otentikasi:

Setiap permintaan ke API harus diautentikasi dengan menggunakan header permintaan HTTP Otorisasi.

Tempatkan stempel waktu di tajuk "Stempel waktu". Nilainya harus waktu pesan dibuat dan dikirim dalam UTC.

Header otorisasi dihitung untuk setiap permintaan menggunakan rumus berikut.

base64 ({MerchantId}: sha512 (RequestBody + SecretWord + Timestamp))

Contoh:

'Timestamp': 2016-11-16 13:21:02

'Authorization': Svea TQ1Q0MzNDJERkQxRDRDRTgxQzM2NjNGRjAwMTg3RTE3M0NDNg==

Dokumentasi lengkap Disini.

Berikut adalah kode yang saya punya:

import axios from "axios";
import CryptoJS from "crypto-js";

// Below function returns the date in the following format "#YYYY#-#MM#-#DD# #hh#:#mm#:#ss#" in UTC time. 
//Code for customFormat is omitted but it returns a string in the expected for`enter code here`mat.
 
      function customDate() {
        let now = new Date();
        return now.customFormat("#YYYY#-#MM#-#DD# #hh#:#mm#:#ss#");
      }

      let timeStamp = customDate();
      let id = 123456; //Not the actual id, but same format (6 digits).
      let secret = "AaBb123C345De"; //Not the actual secret. Actual secret is a long string of digits and letters
      let body = "";

      let hashString = CryptoJS.SHA512(
        `${body}${secret}${timeStamp}`
      ).toString();

      hashString = hashString.replace(/\-/, "");

      console.log(timeStamp);

      axios
        .get(
          "https://paymentadminapi.svea.com/api/v1/orders/123",
          {
            headers: {
              "Timestamp": timeStamp,
              "Authorization": "Svea " + btoa(`${id}:${hashString}`),
            },
          }
        )
        .then((res) => {
          console.log(res.data);
        })
        .catch((error) => {
          console.error(error);
        });

Ini seharusnya mendapatkan nomor pesanan tertentu (123 dalam kode contoh ini) tetapi tidak berfungsi (respons 403), jadi adakah yang bisa tolong beri tahu saya apa yang saya lakukan salah? Terima kasih!

0
GW123 23 Mei 2021, 00:44

1 menjawab

Jawaban Terbaik

Saya menemukan jawabannya. Kesalahan manusia sederhana. customDate mengembalikan tanggal hari ini dalam format ini, 2021-05-25 08:20:02 tetapi ini adalah format yang diharapkan, 2021-5-25 8:20:2. Satu digit bila jumlahnya kurang dari 10.

Saya mengganti fungsi customDate dengan ini:

      const now = new Date();
      const year = now.getUTCFullYear();
      const month = now.getUTCMonth() +1; // January = 0
      const day = now.getUTCDate();
      const hour = now.getUTCHours();
      const minute = now.getUTCMinutes();
      const sec = now.getUTCSeconds();

      const timeStamp = `${year}-${month}-${day} ${hour}:${minute}:${sec}`;

Sekarang bekerja. Mungkin ada cara yang lebih baik untuk mendapatkan tanggal dalam format UTC tertentu, tetapi inilah yang berhasil bagi saya.

0
GW123 25 Mei 2021, 08:48