Send OTP

API Payment
  1. Ini adalah API untuk mengirim OTP via SMS kepada user Prakerja
  2. Parameter yang perlu dikirim adalah prakerja_id, course_code, amount, dan schedule_code
  3. Prakerja akan melakukan validasi:
    • Apakah schedule_code ada dan valid?
    • Apakah schedule_code dan course_code memiliki kecocokan?
    • Apakah tanggal pembelian kurang dari tanggal mulai pelatihan atau pelatihan telah dimulai?
    • Apakah masih ada kuota untuk pelatihan yang akan dibeli?
    • Apakah usia dan pendidikan pembeli pelatihan (user Prakerja) sesuai syarat pelatihan?
  4. DP diwajibkan melakukan error mapping untuk validasi diatas
  5. Seluruh balikan error validasi dijelaskan dibagian bawah halaman ini

Request

1curl --location -g --request POST 'https://api.prakerja.go.id/api/v1/integration/payment/send-otp' \
2--header 'Content-Type: application/json' \
3--header 'client_code: CLIENT_CODE' \
4--header 'signature: SIGNATURE' \
5--header 'timestamp: TIMESTAMP_UNIX_IN_SECONDS' \
6--data-raw '{
7  "user_platform_id" : "USER_PLATFORM_ID",
8  "prakerja_id": "PRAKERJA_ID",
9  "course_code": "COURSE_CODE",
10  "schedule_code": "SCHEDULE_CODE",
11  "amount": AMOUNT
12}'
Endpoint Path
Method
POST
Header
KeyValue
Content-Typeapplication/json
client_codeUnique Client ID yang disediakan Prakerja ke DP / LP.
Prakerja akan menyediakan credential yaitu kombinasi client_code dan sign_key ke DP / LP.
signatureSignature dibuat dari raw_signature yang di-hashing menggunakan algoritma HMAC-SHA1 dengan sign_key yang disediakan Prakerja ke DP / LP
timestamp

Format nilai waktu dalam satuan detik yang digunakan saat melakukan hit API

Contoh 1698289216 = 26-10-2023 10:00:16 WIB = 2023-10-26T10:00:16+07:00

Body (Payload)
FieldTypeDescription
prakerja_idstring, requiredKartu Prakerja ID milik user Prakerja
user_platform_idstring, requiredUser ID yang terdaftar pada sistem DP
course_codestring, requiredID Pelatihan yang akan dibeli
amountinteger, requiredHarga pelatihan
schedule_codestring, requiredKode jadwal pelatihan

Response

Success Response

Response 200 OK

1{
2  "success": true,
3  "message": "OK",
4  "data": {
5    "payment_token": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhbW91bnQiOjEwMDAwLCJjbGllbnRfY29kZSI6ImthbWFyLXN1aHUtY3JlZGVudGlhbCIsImNvdXJzZV9pZCI6MSwiY3JlYXRlZF9hdCI6MTU4NDk3NDU1MiwicHJha2VyamFfaWQiOiIzIn0.I0UG-4mT4fHOB7qBIg42IbbmL5tgWYsXN0DpPf2E09RipjIFS9GUpSV0FyTuesF55tcFDMJLALeicL6t4_kWvQ",
6    "phone_number": "081XXXXXX002"
7  }
8}

Response Detail

FieldTypeDescription
successbooleanStatus hit API,
  • true : sukses
  • false : gagal
messagestringDeskripsi status hit API
data.payment_tokenstringDigunakan sebagai payment_token pada request header Authorization: Payment {{payment_token}} API Payment Authorize.
data.phone_numberstringNomor HP yang telah dikirimi OTP
Error Response
  • Termasuk juga list error general response
  • Response 400 Bad Request rekening/e-wallet belum tersambung di akun Prakerja
    1{
    2  "code": "ERRTRX40040",
    3  "message": "Rekening/e-wallet kamu belum tersambung di akun Prakerja, silakan sambungkan terlebih dahulu untuk melakukan pembelian pelatihan.",
    4  "success": false
    5}
  • Response 400 Bad Request cut off akhir tahun
    1{
    2  "code": "ERRTRX40042",
    3  "message": "Maaf layanan untuk pembelian pelatihan sedang ditutup.",
    4  "success": false
    5}
  • Response 400 Bad Request Prakerja Balance kosong
    1{
    2  "code": "ERRTRX40043",
    3  "message": "Saldo akun kamu belum masuk. Silakan melakukan pembelian ketika saldo mencukupi.",
    4  "success": false
    5}
  • Response 400 Bad Request Akun fraud
    1{
    2  "code": "ERRTRX40044",
    3  "message": "Pembelian gagal. Akun kamu tidak aktif.",
    4  "success": false
    5}
  • Response 400 Bad Request pembelian gagal, karena melebihi batas waktu untuk pembayaran pertama
    1{
    2  "code": "ERRTRX40046",
    3  "message": "Pembelian gagal, karena melebihi batas waktu.",
    4  "success": false
    5}
  • Response 400 Bad Request Saldo tidak mencukupi
    1{
    2  "code": "ERRTRX40047",
    3  "message": "Pembelian gagal. Saldo kamu tidak mencukupi untuk melakukan pembelian ini.",
    4  "success": false
    5}
  • Response 400 Bad Request pelatihan sudah pernah dibeli
    1{
    2  "code": "ERRTRX40048",
    3  "message": "Pembelian gagal. Pelatihan ini sudah pernah kamu beli sebelumnya.",
    4  "success": false
    5}
  • Response 400 Bad Request pembelian gagal, ada pelatihan yang belum diselesaikan
    1{
    2  "code": "ERRTRX40049",
    3  "message": "Pembelian gagal. Kamu masih memiliki pelatihan yang belum selesai.",
    4  "success": false
    5}
  • Response 400 Bad Request pembelian gagal, ada pelatihan yang belum diberi rating dan ulasan
    1{
    2  "code": "ERRTRX40050",
    3  "message": "Pembelian gagal. Kamu masih memiliki pelatihan yang belum diberi rating dan ulasan.",
    4  "success": false
    5}
  • Response 400 Bad Request pembelian gagal, karena melebihi batas waktu sejak pelatihan pertama diulas
    1{
    2  "code": "ERRTRX18790",
    3  "message": "Pembelian gagal, karena melebihi batas waktu sejak pelatihan pertama diulas.",
    4  "success": false
    5}
  • Response 400 Bad Request kuota pelatihan habis
    1{
    2  "code": "ERRTRX40041",
    3  "message": "Kuota pelatihan habis, kamu dapat beli di lain waktu atau beli pelatihan lain.",
    4  "success": false
    5}
  • Response 400 Bad Request kapasitas kelas pelatihan habis
    1{
    2  "code": "ERRPLT4002",
    3  "message": "Pembelian gagal. Kapasitas kelas sudah mencapai batas maksimal.",
    4  "success": false
    5}
  • Response 400 Bad Request jadwal tidak ditemukan
    1{
    2  "code": "ERRSCH4006",
    3  "message": "Kode jadwal tidak ditemukan.",
    4  "success": false
    5}
  • Response 400 Bad Request course_code dan schedule_code tidak sesuai
    1{
    2  "code": "ERRSCH4007",
    3  "message": "Jadwal pelatihan dan kode pelatihan tidak sesuai.",
    4  "success": false
    5}
  • Response 400 Bad Request waktu pembelian pelatihan sudah lewat
    1{
    2  "code": "ERRTRX40020",
    3  "message": "Pembelian Gagal. Waktu Pembelian Pelatihan ini Sudah Lewat",
    4  "success": false
    5}
  • Response 400 Bad Request umur user Prakerja tidak memenuhi syarat pelatihan yang ingin dibeli
    1{
    2  "code": "ERRPLT40015",
    3  "message": "Pembelian gagal. Umur kamu tidak memenuhi syarat untuk pelatihan ini.",
    4  "success": false
    5}
  • Response 400 Bad Request pendidikan user Prakerja tidak memenuhi syarat pelatihan yang ingin dibeli
    1{
    2  "code": "ERRPLT40016",
    3  "message": "Pembelian gagal. Pendidikan kamu tidak memenuhi syarat untuk pelatihan ini.",
    4  "success": false
    5}
  • Response 400 Bad Request pelatihan tidak tersedia
    1{
    2  "code": "ERRPLT40013",
    3  "message": "Pelatihan tidak tersedia.",
    4  "success": false
    5}
  • Response 400 Bad Request melebihi batas pengiriman OTP
    1{
    2  "code": "ERRPLT40022",
    3  "message": "Anda telah mencapai batas pengiriman OTP, cobalah 1 jam kemudian.",
    4  "success": false
    5}
  • Response 400 Bad Request waktu tunggu untuk mengirim OTP lagi (tiap 15 menit)
    1{
    2  "code": "ERRPLT40012",
    3  "message": "Tunggu 15 menit untuk kirim otp kembali.",
    4  "success": false
    5}
  • Response 400 Bad Request missing parameter user Platform ID
    1{
    2  "code": "ERRUSR7040",
    3  "message": "Terjadi Kesalahan. User Platform ID tidak boleh kosong.",
    4  "success": false
    5}
  • Response 400 Bad Request Pembelian Gagal. Anda telah membeli pelatihan sebelumnya dengan No. Prakerja lain. Silahkan cek kembali riwayat pembelian atau No. Prakerja anda.
    1{
    2  "code": "ERRUSR7038",
    3  "message": "Pembelian Gagal. Anda telah membeli pelatihan sebelumnya dengan No. Prakerja lain. Silahkan cek kembali riwayat pembelian atau No. Prakerja anda.",
    4  "success": false
    5}
  • Response 400 Bad Request satu Prakerja ID hanya boleh membeli di satu ID Digital Platform
    1{
    2  "code": "ERRUSR7039",
    3  "message": "Pembelian Gagal. Satu nomor prakerja hanya bisa membeli di satu akun digital platform.",
    4  "success": false
    5}
  • Response 400 Bad Request Amount tidak valid
    1{
    2  "code": "ERRPLT40010",
    3  "message": "Amount anda tidak valid karena lebih besar dari harga sebenarnya.",
    4  "success": false
    5}
  • Response 400 Bad Request Suspend Pelatihan pada Digital Platform
    1{
    2  "code": "ERRPPA40026",
    3  "message": "Pembelian tidak dapat dilakukan, silakan coba beli pelatihan lainnya.",
    4  "success": false
    5}
  • Response 400 Bad Request Suspend Digital Platform
    1{
    2  "code": "ERRPPA40027",
    3  "message": "Pembelian tidak dapat dilakukan, silakan coba beli di digital platform lainnya.",
    4  "success": false
    5}
Try this API
 
Example Code
1// Generated by Prakerja Generator
2// for complete documentation please visit https://developer.prakerja.go.id
3
4const crypto = require('crypto-js');
5const axios = require('axios');
6
7const client_code = ''; // provided by Prakerja
8const timestamp = Math.round((new Date()).getTime() / 1000); // generate current timestamp
9const method = 'POST'; // API Method
10const endpoint = '/api/v1/integration/payment/send-otp'; // API Redeem Status Endpoint
11
12const data = {};
13
14const input = client_code + timestamp + method + endpoint + JSON.stringify(data); // create signature input
15const sign_key = ''; // provided by Prakerja
16
17const signature = crypto.HmacSHA1(input, sign_key).toString(crypto.enc.Hex); // generate signature
18
19axios({
20method: 'post',
21url: 'https://testapi123.prakerja.go.id' + endpoint,
22headers: {
23  'Content-Type': 'application/json',
24  'client_code': client_code,
25  'signature': signature,
26  'timestamp': timestamp,
27},
28data
29})
30.then((response) => {
31console.log(response.data)
32})
33.catch((error) => {
34console.log(error.response.data)
35});
1<?php
2// Generated by Prakerja Generator
3// for complete documentation please visit https://developer.prakerja.go.id
4
5$client_code = ''; // provided by Prakerja
6$timestamp = time(); // generate current timestamp
7$method = 'POST'; // API Method
8$endpoint = '/api/v1/integration/payment/send-otp'; // API Redeem Status Endpoint
9
10$data = [];
11
12$input = $client_code . $timestamp . $method . $endpoint . json_encode($data); // create signature input
13$sign_key = ''; // provided by Prakerja
14
15$signature = hash_hmac('sha1', $input, $sign_key); // generate signature
16
17$headers = [
18'Content-Type: application/json',
19'client_code: ' . $client_code,
20'signature: ' . $signature,
21'timestamp: ' . $timestamp,
22];
23
24$ch = curl_init();
25curl_setopt($ch, CURLOPT_URL,            'https://testapi123.prakerja.go.id' . $endpoint );
26curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
27curl_setopt($ch, CURLOPT_POST,           1);
28curl_setopt($ch, CURLOPT_HTTPHEADER,     $headers); 
29curl_setopt($ch, CURLOPT_POSTFIELDS,     json_encode($data));
30$result = curl_exec($ch);
31curl_close ($ch);
32
33print_r("result: ");
34print_r($result);
1# Generated by Prakerja Generator
2# for complete documentation please visit https://developer.prakerja.go.id
3
4from hashlib import sha1
5import hmac
6import time
7import json
8import requests
9
10client_code = '' # provided by Prakerja
11timestamp = str(int(time.time())) # generate current timestamp
12method = 'POST' # API Method
13endpoint = '/api/v1/integration/payment/send-otp' # API Redeem Status Endpoint
14
15data = {}
16
17# create signature input
18input = client_code + timestamp + method + endpoint + json.dumps(data, separators=(',', ':'))
19
20sign_key = '' # provided by Prakerja
21
22# generate signature
23signature = hmac.new(sign_key.encode("utf-8"), input.encode("utf-8"), sha1).hexdigest()
24
25headers = {
26'Content-Type': 'application/json',
27'client_code': client_code,
28'signature': signature,
29'timestamp': timestamp
30}
31
32result = requests.post(
33'https://testapi123.prakerja.go.id' + endpoint,
34headers=headers,
35data=json.dumps(data)
36)
37
38print('result: ')
39print(result.text)
1# Generated by Prakerja Generator
2# for complete documentation please visit https://developer.prakerja.go.id
3
4require 'base64'
5require 'cgi'
6require 'openssl'
7require 'net/http'
8require 'uri'
9require 'json'
10
11client_code = '' # provided by Prakerja
12timestamp = String(Time.now.to_i) # generate current timestamp
13method = 'POST' # API Method
14endpoint = '/api/v1/integration/payment/send-otp' # API Redeem Status Endpoint
15
16data = {}
17
18# create signature input
19input = client_code + timestamp + method + endpoint + JSON.generate(data, quirks_mode: true)
20
21key = '' # provided by Prakerja
22
23signature = OpenSSL::HMAC.hexdigest(OpenSSL::Digest::Digest.new('sha1'), key.encode("ASCII"), input.encode("ASCII"))
24
25uri = URI.parse('https://testapi123.prakerja.go.id' + endpoint)
26request = Net::HTTP::Post.new(uri)
27request.content_type = "application/json"
28request.body = JSON.generate(data, quirks_mode: true)
29request['Client_code'] = client_code
30request['Signature'] = signature
31request['Timestamp'] = timestamp
32
33req_options = {
34use_ssl: uri.scheme == "https",
35}
36
37result = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
38http.request(request)
39end
40
41# result.code
42# result.body
43puts 'result: ' + result.body