Send OTP
API Payment
- Ini adalah API untuk mengirim OTP via SMS kepada user Prakerja
- Parameter yang perlu dikirim adalah prakerja_id, course_code, amount, dan schedule_code
- 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?
- DP diwajibkan melakukan error mapping untuk validasi diatas
- 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
/api/v1/integration/payment/send-otp
Method
POSTHeader
Key | Value |
---|---|
Content-Type | application/json |
client_code | Unique Client ID yang disediakan Prakerja ke DP / LP. Prakerja akan menyediakan credential yaitu kombinasi client_code dan sign_key ke DP / LP. |
signature | Signature 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 Timestamp digunakan di --header 'timestamp:' yang nilainya harus sama persis dengan timestamp yang digunakan untuk membuat signature. |
Body (Payload)
Field | Type | Description |
---|---|---|
prakerja_id | string, required | Kartu Prakerja ID milik user Prakerja |
user_platform_id | string, required | User ID yang terdaftar pada sistem DP |
course_code | string, required | ID Pelatihan yang akan dibeli |
amount | integer, required | Harga pelatihan |
schedule_code | string, required | Kode 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
Field | Type | Description |
---|---|---|
success | boolean | Status hit API,
|
message | string | Deskripsi status hit API |
data.payment_token | string | Digunakan sebagai payment_token pada request header Authorization: Payment {{payment_token}} API Payment Authorize. |
data.phone_number | string | Nomor 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