Anda di halaman 1dari 17

Service Catalog Bridging BPJS - RS

Daftar isi
Overview
TOOLS TESTING WEB SERVICE
SIGNATURE
Java
PHP
C#
VB.Net
Ruby
Phyton
Cocoa (iOS and Mac)
Daftar Service
1. cari peserta berdasarkan no.kartu BPJS
2. cari peserta berdasarkan NIK
Format_Peserta
3. cari data rujukan berdasarkan no.rujukan
4. cari data rujukan berdasarkan no.kartu BPJS
Format_Rujukan
5. cari daftar pasien yang di-rujuk berdasarkan tanggal rujukan
Format_Rujukan_list
6. pembuatan SEP
7. Update tanggal pulang pada SEP >> hanya ada pada Web Service lokal
8. Menyimpan mapping data transaksi >> hanya ada pada Web Service lokal
9. Menghapus data transaksi SEP >> hanya ada pada Web Service lokal

Overview
Secara umum, hampir setiap pemanggilan web-service, harus dicantumkan beberapa
variabel yang dibutuhkan untuk menambahkan informasi ataupun untuk proses validasi
yang dikirim pada HTTP Header, antara lain:
Nama Header
Nama Header
Accept
X-cons-id
X-timestamp

Contoh Nilai
application/xml,
application/json
743627386
234234234

Keterangan
format data yang diinginkan
consumer ID dari ASKES
generated unix-based
timestamp

X-signature

DogC5UiQurNcigrBdQ3QN5oYv generated signature dengan


XeUF5E82I/LHUcI9v0=
pola HMAC-256

1.

Accept, diisi sesuai permintaan dari client. Jika menginginkan hasil balik dari
web-service dalam format XML, maka diisi dengan application/xml. Ataupun jika
menginginkan hasil balik dari web-service dalam berupa JSON, maka dapat diisi
dengan application/json. Secara default (jika tidak ditulis) maka hasil balik berupa
JSON.
2.
X-cons-id, merupakan kode consumer (pengakses web-service). Kode ini akan
diberikan oleh ASKES.
3.
X-timestamp, merupakan waktu yang akan di-generate oleh client saat ingin
memanggil setiap service. Format waktu ini ditulis dengan format unix-based-time
(berisi angka, tidak dalam format tanggal sebagaimana mestinya). Format waktu
mengacu ke Waktu Indonesia bagian Barat (WIB). Jika client berlokasi pada
WITA/WIT, pastikan saat generate timestamp, arahkan/hardcode ke WIB/GMT+7.
4.
X-signature, merupakan hasil dari pembuatan signature yang dibuat oleh
client. Signature yang digunakan menggunakan pola HMAC-SHA256.
Untuk dapat mengakses web-service dari BPJS Kesehatan (service provider), pemanggil web
service (service consumer) akan mendapatkan:

Consumer ID

Consumer Secret
Informasi Consumer Secret, hanya disimpan oleh service consumer. Tidak dikirim ke server
web-service, hal ini untuk menjaga pengamanan yang lebih baik. Sedangkan kebutuhan
Consumer Secret ini adalah untuk men-generate Signature (X-signature).
Contoh:
consumerID : 1234
consumerSecret : pwd
timestamp : 433223232
variabel1 : consumerID&timestamp
variabel1 : 1234&433223232
Signature : HMAC-256(value : key)
Signature : HMAC-256(value : key)
value : variabel1
key : consumerSecret
Signature : HMAC-256(variabel1 : consumerSecret)

TOOLS TESTING WEB SERVICE


Sebelum mengakses web service melalui aplikasi, bisa digunakan tools tambahan (addons). Add-ons ini bisa di dapat dari software tambahan atau extension dari masing-masing
browser favorit anda. Berikut link aplikasi Advanced Rest Client yang bisa digunakan dan didownload dari Chrome Web Store.

SIGNATURE
Metode signature yang digunakan adalah menggunakan HMAC-SHA256, dimana paramater
saat generate signature dibutuhkan parameter message dan key.
Berikut contoh hasil generate HMAC-SHA256
message : aaa
key : bbb
hasil generate HMAC-SHA256 : 20BKS3PWnD3XU4JbSSZvVlGi2WWnDa8Sv9uHJ+wsELA=
Diatas adalah hasil generate dari server BPJS Kesehatan
Berikut contoh pembuatan signature dari berbagai platform:

1.

import
import
import
import
import

Java

java.io.ByteArrayOutputStream;
java.io.IOException;
java.io.UnsupportedEncodingException;
java.net.URLEncoder;
java.security.GeneralSecurityException;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.bouncycastle.util.encoders.Base64Encoder;
public class BpjsApi {
public static void main(String[] args) throws GeneralSecurityException, IOException {
String secretKey = "secretKey";
String salt = "0123456789";
String generateHmacSHA256Signature = generateHmacSHA256Signature(salt,
secretKey);
System.out.println("Signature: " + generateHmacSHA256Signature);
String urlEncodedSign = URLEncoder.encode(generateHmacSHA256Signature, "UTF8");
}

System.out.println("Url encoded value: " + urlEncodedSign);

public static String generateHmacSHA256Signature(String data, String key)

throws GeneralSecurityException {
byte[] hmacData = null;
try {
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes("UTF-8"),
"HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(secretKey);
hmacData = mac.doFinal(data.getBytes("UTF-8"));
return new Base64Encoder().encode(hmacData);
} catch (UnsupportedEncodingException e) {
throw new GeneralSecurityException(e);
}
}
}

2.

PHP

<?php
$data = "testtesttest";
$secretKey = "secretkey";
// Computes the signature by hashing the salt with the secret key as the key
$signature = hash_hmac('sha256', $data, $secretKey, true);
// base64 encode
$encodedSignature = base64_encode($signature);
// urlencode
// $encodedSignature = urlencode($encodedSignature);
echo "Voila! A signature: " . $encodedSignature;
?>

3.

C#

namespace BpjsIntegration
{
class Program
{

static void Main()


{
var data = "testtesttest";
var secretKey = "secretkey";
// Initialize the keyed hash object using the secret key as the key
HMACSHA256 hashObject =
new HMACSHA256(Encoding.UTF8.GetBytes(secretKey));
// Computes the signature by hashing the salt with the secret key as the key
var signature = hashObject.ComputeHash(Encoding.UTF8.GetBytes(data));
// Base 64 Encode
var encodedSignature = Convert.ToBase64String(signature);
// URLEncode
encodedSignature = System.Web.HttpUtility.UrlEncode(encodedSignature);
Console.WriteLine("Voila! A signature: " + encodedSignature);
Console.ReadKey();
}

4.

VB.Net

Imports System.Security.Cryptography
Imports System.Text
Namespace BpjsIntegration
Class Program
Private Shared Sub Main()
Dim data = "testtesttest"
Dim secretKey = "secretkey"
' Initialize the keyed hash object using the secret key as the key
Dim hashObject As New HMACSHA256(Encoding.UTF8.GetBytes(secretKey))
' Computes the signature by hashing the salt with the secret key as the key
Dim signature = hashObject.ComputeHash(Encoding.UTF8.GetBytes(data))
' Base 64 Encode
Dim encodedSignature = Convert.ToBase64String(signature)
' URLEncode
encodedSignature = System.Web.HttpUtility.UrlEncode(encodedSignature)

Console.WriteLine("Voila! A signature: " & encodedSignature)


Console.ReadKey()
End Sub
End Class
End Namespace

5.

Ruby

# Required Libraries
require 'openssl'
require 'base64'
require 'URI'
data = "testtesttest"
secret_key = "secretkey"
# URL encode
def urlncode(string)
URI.escape(string, Regexp.new("[Generating an API
Signature^#{URI::PATTERN::UNRESERVED}]"))
end
# Computes the signature by hashing the salt with the secret key as the key
hash = OpenSSL::HMAC.digest('sha256', secret_key, data)
# base64 encode...
signature = urlncode(Base64.encode64(hash));

6.

import
import
import
import
import

Phyton

hashlib
random
base64
urllib
hmac

data = "testtesttest"
secretkey = "secretkey"
# Computes the signature by hashing the data with the secret key as the key
signature = hmac.new(secretkey, msg=data, digestmod=hashlib.sha256).digest()

# base64 encode...
encodedSignature = base64.encodestring(signature).replace('\n', '')
# urlencode...
encodedSignature = urllib.quote(encodedSignature)
print "Voila! A signature: " + encodedSignature

7.

Cocoa (iOS and Mac)

-(NSUInteger)GenerateSalt
{
// random number (change the modulus to the length you'd like)
NSUInteger r = arc4random() % 100000;
return r;
}
-(NSString *)GenerateSignatureUsingSalt:(NSUInteger)salt
{
/*
Make sure you import:
#import <CommonCrypto/CommonHMAC.h>
*/
NSString *key = SECRET_KEY;
// define your Secret Key
string
NSString *data = [NSString stringWithFormat:@"%u", salt];
// convert your
random number
const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding];
const char *cData = [data cStringUsingEncoding:NSUTF8StringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
// Hash the salt with the secret key
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
// Create a data structure
NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC
length:sizeof(cHMAC)];
// Base64-encode the signature
NSString *hash = [HMAC base64Encoding];
// URL-encode the signature
NSString * signatureURL = (NSString
*)CFURLCreateStringByAddingPercentEscapes(NULL,

(CFStringRef)hash,
NULL,

%#[]% ",

(CFStringRef)@"!*'\"();:@&=+$,/?
kCFStringEncodingUTF8 );

return signatureURL;
}

Daftar Service
Service yang tersedia adalah sebagai berikut:

1. cari peserta berdasarkan no.kartu BPJS


URL : http://api.asterix.co.id/SepWebRest/peserta/{noKartu}
Parameter:
noKartu : no kartu BPJS
Output:
Format_Peserta
Contoh:
URL : http://api.asterix.co.id/SepWebRest/peserta/0000142495694

2. cari peserta berdasarkan NIK


URL : http://api.asterix.co.id/SepWebRest/peserta/nik/{nik}
Parameter:
Nik : nomor induk kependudukan / no e-KTP
Output:
Format_Peserta
Contoh:
URL : http://api.asterix.co.id/SepWebRest/peserta/nik/0101010106810101

Format_Peserta
{
{

"response":{
"peserta":{
"noKartu":"0000142495694",
"nik":" ",
"nama":"MUJADID ANWAR HASAN",
"pisa":"2",
"sex":"P",
"tglLahir":"1979-05-13 00:00:00",
"tglCetakKartu":"1979-05-13 00:00:00",
"provUmum":{
"kdProvider":"1301U007",
"nmProvider":"MAULIDA JUNIAR, dr",
"kdCabang":null,
"nmCabang":null
},
"jenisPeserta":{
"kdJenisPeserta":"1",
"nmJenisPeserta":"PNS PUSAT"
},
"kelasTanggungan":{
"kdKelas":null,
"nmKelas":null
}
}
},"metaData":{
"message":"200",
"code":200
}
}

3. cari data rujukan berdasarkan no.rujukan


URL : http://api.asterix.co.id/SepWebRest/rujukan/{noRujukan}
Parameter :
noRujukan : no rujukan pasien BPJS melalui aplikasi PCare (Puskesmas/dokkel)
Output:
Format_Rujukan
Contoh:
URL : http://api.asterix.co.id/SepWebRest/rujukan/000108011213Y000004

4. cari data rujukan berdasarkan no.kartu


BPJS
URL : http://api.asterix.co.id/SepWebRest/rujukan/peserta/{noKartu}

Parameter:
noKartu : no kartu BPJS
Output:
Format_Rujukan
Contoh:
URL : http://api.asterix.co.id/SepWebRest/rujukan/peserta/0001089159052

Format_Rujukan
{
{
"response":{
"item":{
"noKunjungan":"000108011213Y000004",
"tglKunjungan":"2013-12-14 00:00:00",
"provKunjungan":{
"kdProvider":"00010801",
"nmProvider":"PUSK LANGSA BARO",
"kdCabang":null,
"nmCabang":null
},
"peserta":{
"noKartu":"0001089159052",
"nik":"",
"nama":"mr ganteng kaya sholeh",
"pisa":"2",
"sex":"L",
"tglLahir":"1984-06-16 00:00:00",
"tglCetakKartu":null,
"provUmum":{
"kdProvider":"00010801",
"nmProvider":"PUSK LANGSA BARO",
"kdCabang":null,
"nmCabang":null
},
"jenisPeserta":null,
"kelasTanggungan":null
},
"keluhan":"sakit gigi",
"diagnosa":{
"kdDiag":"K05",
"nmDiag":"GINGTIVIS AND PERIODONTAL DISEA."
},
"catatan":"rujuk",
"pemFisikLain":"",
"provRujukan":{
"kdProvider":"0105R001",
"nmProvider":"RSU LANGSA",

"kdCabang":null,
"nmCabang":null
},
"poliRujukan":{
"kdPoli":"GIG",
"nmPoli":"Poli Gigi"
}

}
}
,"metaData":{
"message":"200",
"code":200
}
}

5. cari daftar pasien yang di-rujuk


berdasarkan tanggal rujukan
URL: http://api.asterix.co.id/SepWebRest/rujukan/tglrujuk/{tglRujukan}/query?
start={start}&limit={limit}
Paramter :
{tglRujukan} = tanggal dengan format yyyy-MM-dd
{start} = start/mulai urutan data
{limit} = jumlah data
Output:
Format_Rujukan_list
Contoh:
URL: http://api.asterix.co.id/SepWebRest/rujukan/tglrujuk/2013-12-14/query?
start=1&limit=10
Mengambil data dari urutan no.1 sebanyak 10 data
URL: http://api.asterix.co.id/SepWebRest/rujukan/tglrujuk/2013-12-14/query?
start=11&limit=10
Mengambil data dari urutan no.11 sebanyak 10 data
Fungsi {start} dan {limit} berguna untuk paging pada layout tampilan aplikasi, dengan
parameter {start} selalu berubah sesuai parameter, sedangkan parameter {limit} selalu
sama.
- menampilkan {start} {limit} dari {count} records
- menampilkan 1 10 dari 73 records

Format_Rujukan_list
{
{

"response":{
"start":1,
"limit":10,
"count":7,
"list":[{
"noKunjungan":"000108031213Y000005",
"tglKunjungan":"2013-12-14 00:00:00",
"provKunjungan":{
"kdProvider":"00010803",
"nmProvider":"PUSK LANGSA KOTA",
"kdCabang":null,
"nmCabang":null
},
"peserta":{
"noKartu":"0000149156998",
"nik":" ",
"nama":"ITA ELLYZA",
"pisa":"3",
"sex":"P",
"tglLahir":"1979-04-17 00:00:00",
"tglCetakKartu":null,
"provUmum":{
"kdProvider":"00010803",
"nmProvider":"PUSK LANGSA KOTA",
"kdCabang":null,
"nmCabang":null
},
"jenisPeserta":null,
"kelasTanggungan":null
},
"keluhan":"dispepsia",
"diagnosa":{
"kdDiag":"M23",
"nmDiag":"INTERNAL DERANGEMENT OF KNEE"
},
"catatan":",,,,,,,,,,",
"pemFisikLain":"",
"provRujukan":{
"kdProvider":"0105R001",
"nmProvider":"RSU LANGSA",
"kdCabang":null,
"nmCabang":null
},
"poliRujukan":{
"kdPoli":"INT",
"nmPoli":"Poli Penyakit Dalam"
}
},
....
....
....
....
{

"noKunjungan":"000108031213Y000009",
"tglKunjungan":"2013-12-14 00:00:00",
"provKunjungan":{
"kdProvider":"00010803",
"nmProvider":"PUSK LANGSA KOTA",
"kdCabang":null,
"nmCabang":null
},
"peserta":{
"noKartu":"0001089159276",
"nik":"1174023107830003",
"nama":"DEDE KURNIAWAN",
"pisa":"1",
"sex":"L",
"tglLahir":"1985-07-07 00:00:00",
"tglCetakKartu":null,
"provUmum":{
"kdProvider":"00010803",
"nmProvider":"PUSK LANGSA KOTA",
"kdCabang":null,
"nmCabang":null
},
"jenisPeserta":null,
"kelasTanggungan":null
},
"keluhan":"gigi berlubang",
"diagnosa":{
"kdDiag":"K02",
"nmDiag":"DENTAL CARIES"
},
"catatan":"cabut",
"pemFisikLain":"",
"provRujukan":{
"kdProvider":"0105R001",
"nmProvider":"RSU LANGSA",
"kdCabang":null,
"nmCabang":null
},
"poliRujukan":{
"kdPoli":"GIG",
"nmPoli":"Poli Gigi"
}
}]
},"metaData":{
"message":"200",
"code":200
}
}

6. pembuatan SEP

(hanya untuk testing data. Untuk production, akan di-deploy WebService pada server
lokal di RS)
URL: http://api.asterix.co.id/SepWebRest/sep/create/
Request Method : POST
Header :
Content-type: application/xml
x-cons-id: .
x-timestamp: .
x-signature: ...
Data:
<request>
<request>
<data>
<t_sep>
<noKartu>1234567890123</noKartu>
<tglSep>2013-07-26 13:05:03</tglSep>
<tglRujukan>2013-07-26 13:05:03</tglRujukan>
<noRujukan>1234590000300003</noRujukan>
<ppkRujukan>09010100</ppkRujukan>
<ppkPelayanan>0901R001</ppkPelayanan>
<jnsPelayanan>1</jnsPelayanan>
<catatan>dari WS</catatan>
<diagAwal>B010</diagAwal>
<poliTujuan>SAR</poliTujuan>
<klsRawat>02</klsRawat>
<user>JD</user>
<noMr>1234</noMr>
</t_sep>
</data>
</request>

Keterangan:
noKartu : no kartu BPJS
tglSep : tanggal kedatangan/tanggal transaksi
tglRujukan : tanggal kunjungan ke puskesmas/dokter keluarga
noRujukan : no rujukan dari puskesmas/dokter keluarga
ppkRujukan : kode puskesmas/dokter keluarga (versi BPJS)
ppkPelayanan: kode RS anda (versi BPJS), akan di-validasi oleh service, pastikan
gunakan userID service yang sesuai
jnsPelayanan : 1: Rawat Inap, 2: Rawat Jalan
catatan : catatan tambahan
diagAwal : diagnosa dari puskesmas/dokter keluarga (ICD X, sama seperti INA-CBG)
poliTujuan : poli tujuan di RS
klsRawat : kelas rawat tanggungan peserta
user : username pengguna aplikasi
noMr : no medical records RS dari pasien

7. Update tanggal pulang pada SEP >> hanya


ada pada Web Service lokal
Terjadi penolakan saat pembuatan SEP jika sistem mengidentifikasi bahwa pasien masih
dalam status menginap. Untuk mengisi tanggal pulang pada sistem BPJS/SEP, hanya dapat
dilakukan dengan menerima file hasil entrian dari sistem INA-CBGs (kemenkes). Namun hal
ini biasa dilakukan/diberikan oleh pihak RS kepada pihak BPJS pada beberapa hari
kemudian.
Untuk mengantisipasi kasus penolakan terhadap pasien, dibutuhkan suatu sistem yang
dapat meng-update data pasien pada BPJS melalui sistem RS. Disinilah fungsi ini berguna
untuk meng-update tanggal pulang pasien pada data BPJS yang mana saat sistem RS
melakukan update tanggal pulang pada sistem RS, sekaligus mengakses WebService ini
agar data pasien terupdate pada server BPJS.
URL: http://IP_ADDRESS:PORT/SepLokalRest/sep/updtglplg/
Request Method : PUT
Header :
Content-type: application/xml
x-cons-id: .
x-timestamp: .
x-signature: ...
Data:
<request>
<request>
<data>
<t_sep>
<noSep>1234567890123456789</noSep>
<tglPlg>2013-07-26 13:05:03</tglPlg>
<ppkPelayanan>0901R001</ppkPelayanan>
</t_sep>
</data>
</request>
Keterangan:
noSep : no transaksi SEP
tglPlg : tanggal pulang pasien
ppkPelayanan: kode RS anda (versi BPJS), akan di-validasi oleh service, pastikan
gunakan userID service yang sesuai

8. Menyimpan mapping data transaksi >>


hanya ada pada Web Service lokal
Setelah sistem RS men-generate SEP dan menyimpan transaksi pendaftaran pada sistem
RS, maka data masing-masing no transaksi unik disimpan pada 2 sistem (BPJS dan RS).
Fungsi ini berguna untuk menyimpan no transaksi tersebut, agar nantinya dapat melakukan
audit trail yang lebih efisien

URL: http://IP_ADDRESS:PORT/SepLokalRest/sep/map/trans/
Request Method : POST
Header :
Content-type: application/xml
x-cons-id: .
x-timestamp: .
x-signature: ...
Data:
<request>
<request>
<data>
<t_map_sep>
<noSep>1234567890123456789</noSep>
<noTrans>98765432109876543210</noTrans>
<ppkPelayanan>0901R001</ppkPelayanan>
</t_map_sep>
</data>
</request>
Keterangan:
noSep : no transaksi SEP
noTrans : no transaksi pada aplikasi RS
ppkPelayanan: kode RS anda (versi BPJS), akan di-validasi oleh service, pastikan
gunakan userID service yang sesuai

9. Menghapus data transaksi SEP >> hanya


ada pada Web Service lokal
Data SEP yang dapat dihapus hanya jika data tersebut belum dibuatkan FPK/tagihan ke
Kantor Cabang BPJS setempat.
URL: http://IP_ADDRESS:PORT/SepLokalRest/sep/
Request Method : DELETE
Header :
Content-type: application/xml
x-cons-id: .
x-timestamp: .
x-signature: ...
Data:
<request>
<request>
<data>
<t_sep>
<noSep>1234567890123456789</noSep>
<ppkPelayanan>0901R001</ppkPelayanan>
</t_sep>

</data>
</request>
Keterangan:
noSep : no transaksi SEP
ppkPelayanan: kode RS anda (versi BPJS), akan di-validasi oleh service, pastikan
gunakan userID service yang sesuai

Dipublikasikan oleh Google DriveLaporkan Penyalahgunaan


Dimutakhirkan secara otomatis setiap 5 menit