본 API 연동규격 설명서를 관심을 가져주셔서 감사합니다.
우리는 개발자가 사용할 수 있는 API를 제공하며, 액세스가 간단하고 사용하기 쉽게 만들어져 있습니다.
AES/MD5 암호화의 두 가지 방법으로 API보안 연결을 지원하고 있습니다.
각 플랫폼별로 호출 예제와 테스트를 제공하고 있으니 문서를 자세히 숙지하신 후에 사용하시기 바랍니다.
질문이 있으시면 고객 서비스, 기술 지원에 문의하십시오.
SMS API는 HTTP/HTTPS를 사용하며 REST 원칙을 따르도록 설계된 웹 서비스 인터페이스이며 거의 모든 클라이언트와 프로그래밍 언어를 사용하여 REST API와 상호 작용할 수 있습니다. 간단한 HTTP/HTTPS POST 요청을 보내 쉽게 액세스할 수 있습니다.
참고:
이 인터페이스는 주로 SMS 단일 전송 시나리오에 적용되며, 특수 시나리오에서는 대량 전송을 지원할 수 있지만(최대 1,000개의 휴대폰 번호로 동일한 내용의 문자 메시지를 보낼 수 있지만 대량 전송은 다소 지연될 수 있습니다.)
팁:
HTTP 헤더 정보:
Accept:application/json; charset=utf-8;
Content-Type:multipart/form-data; charset=utf-8;
URL:https://api.munjawa.com/SmsApi/v1/SendSms
액세스 방법: POST
http 지원: https 및 http 액세스가 지원되며 https
사용하는 것이 좋습니다
매개 변수 이름입니다 | 유형입니다 | 필수 패스 여부 | 입니다설명입니다 | 예입니다 |
---|---|---|---|---|
header | String | 네 | 계정 설정 - API 관리 보기에서 사용자 고유 ID를 사용합니다 | 9b11127a9701975c734b8aee81ee3526 |
data | String | 네 | data의 데이터는 암호화되어야 합니다. 매개 변수: type - 전송 영역, apikind - 전송 유형, countrycode - 국가 코드, reservedtype - 약속 유형, reservedtime - 약속 시간, 모바일 - 사용자 휴대폰 번호, content - SMS 콘텐츠, contacts - 수신자 휴대폰 번호입니다. | {"type":0,"apikind":1,"countrycode":82, "reservedtype":0,"reservedtime":"", "mobile":"01057420006","content":"The is a test", "contacts":"01057420000,01057420001"} |
참고 사항:
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace NetCoreTest
{
internal class Program
{
static void Main(string[] args)
{
string secretkey = "9Rwkkl8hTiech/KSEinXPfwWiDYQfeJA1KubmDgi34ay4dutIfm0oUj7oqxQlmnA";
string apikey = "8ee3dc19bb124e7ea7eb0433c4f90ffc";
var res = UserSendSms(apikey, secretkey);
Console.WriteLine(res. Result);
}
static async Task UserSendSms(string apikey, string secretkey)
{
string url = "https://munjawa.com/SmsApi/v1/SendSms";
Dictionary values = new Dictionary();
values. Add("type", "0");
values. Add("apikind", "1");
values. Add("countrycode", "82");
values. Add("reservedtype", "0");
values. Add("reservedtime", null);
values. Add("mobile", "01057420006");
values. Add("content", "SMS 테스트 보내기");
values. Add("contacts", "01057420000,01057420001");
string data_json = Newtonsoft.Json.JsonConvert.SerializeObject(values);
NameValueCollection nameValues = new NameValueCollection();
nameValues.Add("Header", apikey);
try
{
string upload_data = await AesEncrypt(secretkey, data_json);
nameValues.Add("Data", upload_data);
}
catch (Exception ex)
{
return ex. Message;
}
var json = HttpPost(url, nameValues). Result;
return json;
}
static async Task HttpPost(string url, NameValueCollection postDataStr)
{
string responseData = "";
try
{
using (var client = new WebClient())
{
byte[] bytes = client. UploadValues(url, postDataStr);
responseData = Encoding.UTF8.GetString(bytes);
}
}
catch (Exception ex)
{
return ex. Message;
}
return responseData;
}
public static async Task AesEncrypt(string key, string data)
{
try
{
byte[] bKey = Convert.FromBase64String(key);
byte[] aesKey = new byte[32];
byte[] aesIV = new byte[16];
Array.Copy(bKey, 0, aesKey, 0, 32);
Array.Copy(bKey, 32, aesIV, 0, 16);
AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
aes.IV = aesIV;
aes. Key = aesKey;
aes. Mode = CipherMode.CBC;
aes. Padding = PaddingMode.PKCS7;
byte[] bdata = Encoding.UTF8.GetBytes(data);
using (ICryptoTransform encrypt = aes. CreateEncryptor())
{
byte[] destin = encrypt. TransformFinalBlock(bdata, 0, bdata. Length);
return Convert.ToBase64String(destin);
}
}
catch (Exception ex)
{
return ex. Message;
}
}
}
}
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace NETFramework
{
internal class Program
{
static void Main(string[] args)
{
string secretkey = "9Rwkkl8hTiech/KSEinXPfwWiDYQfeJA1KubmDgi34ay4dutIfm0oUj7oqxQlmnA";
string apikey = "8ee3dc19bb124e7ea7eb0433c4f90ffc";
var res = UserSendSms(apikey, secretkey);
Console.WriteLine(res. Result);
}
문자 메시지를 보냅니다
static async Task UserSendSms(string apikey, string secretkey)
{
string url = "https://munjawa.com/SmsApi/v1/SendSms";
Dictionary values = new Dictionary();
values. Add("type", "0");
values. Add("apikind", "1");
values. Add("countrycode", "82");
values. Add("reservedtype", "0");
values. Add("reservedtime", null);
values. Add("mobile", "01057420006");
values. Add("content", "SMS 테스트 보내기");
values. Add("contacts", "01057420000,01057420001");
string data_json = Newtonsoft.Json.JsonConvert.SerializeObject(values);
NameValueCollection nameValues = new NameValueCollection();
nameValues.Add("Header", apikey);
try
{
string upload_data = await AesEncrypt(secretkey, data_json);
nameValues.Add("Data", upload_data);
}
catch (Exception ex)
{
return ex. Message;
}
var json = HttpPost(url, nameValues). Result;
return json;
}
static async Task HttpPost(string url, NameValueCollection postDataStr)
{
string responseData = "";
try
{
using (var client = new WebClient())
{
byte[] bytes = client. UploadValues(url, postDataStr);
responseData = Encoding.UTF8.GetString(bytes);
}
}
catch (Exception ex)
{
return ex. Message;
}
return responseData;
}
public static async Task AesEncrypt(string key, string data)
{
try
{
byte[] bKey = Convert.FromBase64String(key);
byte[] aesKey = new byte[32];
byte[] aesIV = new byte[16];
Array.Copy(bKey, 0, aesKey, 0, 32);
Array.Copy(bKey, 32, aesIV, 0, 16);
AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
aes.IV = aesIV;
aes. Key = aesKey;
aes. Mode = CipherMode.CBC;
aes. Padding = PaddingMode.PKCS7;
byte[] bdata = Encoding.UTF8.GetBytes(data);
using (ICryptoTransform encrypt = aes. CreateEncryptor())
{
byte[] destin = encrypt. TransformFinalBlock(bdata, 0, bdata. Length);
return Convert.ToBase64String(destin);
}
}
catch (Exception ex)
{
return ex. Message;
}
}
}
}
<?php
require_once 'AES.php';
$securityKey = "9Rwkkl8hTiech/KSEinXPfwWiDYQfeJA1KubmDgi34ay4dutIfm0oUj7oqxQlmnA";
$aesTool = new Aes($securityKey, 'AES-256-CBC');
$apikey = "8ee3dc19bb124e7ea7eb0433c4f90ffc"; apikey로 수정하고 공식 웹 사이트에 로그인하여 얻을 수 있습니다
$ch = curl_init();
/* 인증 방법 설정 */
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Accept:text/plain; charset=utf-8',
'Content-Type:application/x-www-form-urlencoded', 'charset=utf-8'
));
/* 반환 결과를 스트림으로 설정 */
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
/* 시간 초과 설정*/
curl_setopt($ch, CURLOPT_TIMEOUT, 3000);
/* 통신 방법 설정 */
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
문자 메시지를 보냅니다
$paramsStr = '{"type":0,"apikind":1,"countrycode":82, "reservedtype":0,"reservedtime":"", "mobile":"01057420006","content":"The is a test", "contacts":" 01057420000,01057420001"}';
$cipherText = $aesTool->encrypt($paramsStr);
$data = array('header' => $apikey, 'data' => $cipherText);
$json_data = UserSendSms($ch, $data);
$array = json_decode($json_data, true);
print_r($array);
문자 메시지를 보냅니다
function UserSendSms($ch, $data)
{
curl_setopt($ch, CURLOPT_URL, 'https://munjawa.com/SmsApi/v1/SendSms');
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
$result = curl_exec($ch);
$error = curl_error($ch);
checkErr($result, $error);
return $result;
}
function checkErr($result, $error)
{
if ($result === false) {
echo 'Curl error: ' . $error;
} else {
echo '오류 없이 작업 완료';
}
}
?>
<?
class Aes
{
/**
* 암호화
* @param string $plainText 일반 텍스트
* @return bool|string
*/
public function encrypt(string $plainText)
{
$originData = (openssl_encrypt($this->addPkcs7Padding($plainText, 16), $this->method, $this->securityKey, OPENSSL_NO_PADDING, $this->iv));
return $originData === false ? false : base64_encode($originData);
}
}
?>
AesUtils.java
package com.example;
import java.lang.reflect.Array;
import java.security.Security;
import java.util.Arrays;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public class AesUtils {
private static final String key = "9Rwkkl8hTiech/KSEinXPfwWiDYQfeJA1KubmDgi34ay4dutIfm0oUj7oqxQlmnA";
private static final String iv = "EJ9iIPhzB4I5UDfs";
static {
try {
Security.addProvider(new BouncyCastleProvider());
} catch (Exception e) {
e.printStackTrace();
}
}
public static String encryptAES(String data) throws Exception {
try {
byte[] aesKey = AesUtils.decode(key);
byte[] bkey = Arrays.copyOf(aesKey, 32);
byte[] bIV = Arrays.copyOfRange(aesKey, 32, 48);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
SecretKeySpec keyspec = new SecretKeySpec(bkey, "AES");
IvParameterSpec ivspec = new IvParameterSpec(bIV);
cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
byte[] encrypted = cipher.doFinal(data.getBytes("UTF-8"));
BASE64 트랜스코딩.
return AesUtils.encode(encrypted).trim();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static String encode(byte[] byteArray) {
return new String(new Base64().encode(byteArray));
}
public static byte[] decode(String base64EncodedString) {
return new Base64().decode(base64EncodedString);
}
}
Main.java
package com.example;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.gson.Gson;
public class Main {
private static String URI_GET_SENDSMS = "https://munjawa.com/SmsApi/v1/SendSms";
public static void main(String[] args) throws IOException, URISyntaxException {
String apikey = "8ee3dc19bb124e7ea7eb0433c4f90ffc";
System.out.println(Main.userSendSms(apikey));
}
/**
* 문자 메시지를 보냅니다
*
* json 형식 문자열을 @return
* @throws java.io.IOException
*/
public static String userSendSms(String apikey) throws IOException, URISyntaxException {
Map dataDic = new HashMap();
dataDic.put("type", "0");
dataDic.put("apikind", "1");
dataDic.put("countrycode", "82");
dataDic.put("reservedtype", "0");
dataDic.put("reservedtime", null);
dataDic.put("mobile", "01057420006");
dataDic.put("content", "테스트입니다");
dataDic.put("sendDate", "01057420000,01057420001");
Gson gsonData = new Gson();
String data = gsonData.toJson(dataDic);
String enDataDic = "";
try {
enDataDic = AesUtils.encryptAES(data);
} catch (Exception e) {
e.printStackTrace();
}
Map params = new HashMap();
params.put("header", apikey);
params.put("data", enDataDic);
return post(URI_GET_REPORTLIST, params);
}
public static String post(String url, Map paramsMap) {
CloseableHttpClient client = HttpClients.createDefault();
String responseText = "";
CloseableHttpResponse response = null;
try {
HttpPost httpPost = new HttpPost(url);
httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");
if (paramsMap != null && paramsMap.size()> 0) {
List paramList = new ArrayList();
for (Map.Entry param : paramsMap.entrySet()) {
NameValuePair pair = new BasicNameValuePair(param.getKey(), param.getValue());
paramList.add(pair);
}
httpPost.setEntity(new UrlEncodedFormEntity(paramList, "UTF-8"));
}
response = client.execute(httpPost);
HttpEntity entity = response.getEntity();
if (entity != null) {
responseText = EntityUtils.toString(entity);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
response.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return responseText;
}
}
var crypto = require( 'crypto' );
var request = require('request').defaults({rejectUnauthorized: false});
var algorithm = 'aes-256-cbc';
const base64 = 'he8MTjKMVGSwcKMEqhZgyjy7PAZESXQENVv/eqjaZlXGG8cW2x2WW4J7vLdwuQj7=';
const buff = Buffer.from(base64, 'base64');
var key = buff.slice(0, 32);
var iv = buff.slice(-16);
var data = '{"type":0,"apikind":1,"countrycode":82,"reservedtype":0,"reservedtime":"","mobile":"01011111111","content":"The is a test","contacts":"01022222222,01033333333"} ';
function encrypt(data) {
var cipher = crypto.createCipheriv(algorithm, key, iv);
var cipherChunks = [];
cipherChunks.push(cipher.update(data, 'utf8', 'base64'));
cipherChunks.push(cipher.final('base64'));
return cipherChunks.join('');
}
var dataList = {
header: '97d568ee656a429ba2f6b60e5ca55694',
data: encrypt(data)
}
request({
url:'https://munjawa.com/SmsApi/v1/SendSms',
method: "POST",
json: true,
form: dataList
}, function(error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body);
}
});
import requests
import base64
from Crypto.Cipher import AES
# from Crypto.Util.Padding import pad
# import time
import json
class SmsApiTest:
def SendSms():
post_url = 'https://munjawa.com/SmsApi/v1/SendSms'
p_json = {
'type': '0',
'apikind': '1',
'countrycode': '82',
'reservedtype': '0',
'reservedtime': 'null',
'mobile': '01057420006',
'content': 'this is a test',
'contacts': '0057420000,01057420001'
}
e = a.aes_encrypt(json.dumps(p_json))
request_param = {
'header': '8ee3dc19bb124e7ea7eb0433c4f90ffc',
'data': e
}
res = SmsApiTest.request_post(post_url, request_param)
print(res)
def request_post(url, param):
fails = 0
while True:
try:
if fails>= 20:
break
req = requests.post(url=url,
data=param,
timeout=1000,
verify=False)
if req.status_code == 200:
text = req.json()
else:
continue
except Exception:
fails += 1
print('네트워크 연결 문제, 다시 요청 시도 중: ', fails)
else:
break
return text
class Encrypt:
def __init__(self, aeskey, iv):
self.key = aeskey
self.iv = iv
def pkcs7padding(self, text):
PKCS7로 채우기
bs = 16
length = len(text)
bytes_length = len(text.encode('utf-8'))
padding_size = length if (bytes_length == length) else bytes_length
padding = bs - padding_size % bs
padding_text = chr(padding) * padding
self.coding = chr(padding)
return text + padding_text
def aes_encrypt(self, content):
""" "AES 암호화""
cipher = AES.new(self.key, AES. MODE_CBC, self.iv)
# 일반 텍스트를 처리합니다
content_padding = self.pkcs7padding(content)
# 암호화
encrypt_bytes = cipher.encrypt(content_padding.encode('utf-8'))
# 다시 코딩합니다
result = str(base64.b64encode(encrypt_bytes), encoding='utf-8')
return result
if __name__ == '__main__':
apikey = '8ee3dc19bb124e7ea7eb0433c4f90ffc'
key = '9Rwkkl8hTiech/KSEinXPfwWiDYQfeJA1KubmDgi34ay4dutIfm0oUj7oqxQlmnA'
bkey = bytearray(base64.b64decode(key))
aeskey = bkey[0:32]
iv = bkey[32:]
a = Encrypt(aeskey, iv)
req = SmsApiTest
res = req. SendSms()
package main
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"encoding/base64"
"fmt"
"io/ioutil"
"log"
"net/http"
"net/url"
"strings"
)
func main() {
apikey := "8ee3dc19bb124e7ea7eb0433c4f90ffc"
key := "9Rwkkl8hTiech/KSEinXPfwWiDYQfeJA1KubmDgi34ay4dutIfm0oUj7oqxQlmnA"
SendSmsPost(apikey, key)
}
func SendSmsPost(apikey, secretkey string) {
url_post := "https://munjawa.com/SmsApi/v1/SendSms"
if err != nil {
log. Print("error:", err)
return
}
orignData := []byte("{'type':'0','apikind':'1','countrycode':'82','reservedtype':'0','reservedtime':'null','mobile':'01057420006','content':'this is a test','contacts':' 0057420000,01057420001',}")
log. Print("원본:", string(orignData))
encrypted := AesEncryptCBC(orignData, bkey)
encydata := base64. StdEncoding.EncodeToString(encrypted)
log. Println(base64):, encydata
decrypted := AesDecryptCBC(encrypted, bkey)
log. Println([암호 해독 결과:], string(decrypted))
urlValues := url. Values{}
urlValues.Add("header", apikey)
urlValues.Add("data", encydata)
resp, _ := http. PostForm(url_post, urlValues)
body, _ := ioutil. ReadAll(resp. Body)
fmt. Println(string(body))
}
func AesEncryptCBC(origData []byte, key []byte) (encrypted []byte) {
키 그룹화
NewCipher 함수는 입력 k의 길이를 16, 24 또는 32로 제한합니다
aesKey := key[0:32]
block, _ := aes. NewCipher(aesKey)
blockSize := block. BlockSize() // 키 블록의 길이를 가져옵니다
aesIv := key[32:48]
origData = PKCS7Padding(origData, blockSize) // 전체 코드를 보완합니다
blockMode := cipher. NewCBCEncrypter(block, aesIv) // 암호화 모드
encrypted = make([]byte, len(origData)) // 배열을 만듭니다
blockMode.CryptBlocks(encrypted, origData) // 암호화
return encrypted
}
PKCS7로 채웁니다
func PKCS7Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padtext := bytes. Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padtext...)
}
func PKCS7UnPadding(origData []byte) []byte {
length := len(origData)
unpadding := int(origData[length-1])
return origData[:(length - unpadding)]
}
매개 변수 이름입니다 | 유형입니다 | 설명입니다 | 예입니다 |
---|---|---|---|
code | Integer | 요청 상태 코드입니다. | 0 |
message | String | 상태를 반환합니다 | OK |
detail | String | 호출 인터페이스의 성공 여부에 대한 설명입니다 | SUCCESS |
data | String | 데이터를 반환합니다 | {"OrderId":26,"TotalCount":2,"PayAmount":50.000000000000000000000000000} |
{
"code": 0,
"message":"OK",
"detail":"SUCCESS",
"data":"{"OrderId":26,"TotalCount":2,"PayAmount":50.000000000000000000000000000}"
}
이 인터페이스가 켜져 있는 경우 72시간 동안 새 프로덕션에 대한 상태 보고서 데이터를 독립적으로 저장합니다. 이 인터페이스를 통해 새로 생성된 상태 보고서를 가져올 수 있습니다. 성공적으로 획득한 데이터는 삭제됩니다.
참고 사항:
HTTP 헤더 정보:
Accept:application/json; charset=utf-8;
Content-Type:application/x-www-form-urlencoded; charset=utf-8;
URL:https://api.munjawa.com/SmsApi/v1/QueryReport
액세스 방법: POST
http 지원: https 및 http 액세스가 지원되며 https
사용하는 것이 좋습니다
매개 변수 이름입니다 | 유형입니다 | 필수입니다 | 설명입니다 | 예입니다 |
---|---|---|---|---|
header | String | 네 | 계정 설정 - API 관리 보기에서 사용자 고유 ID를 사용합니다 | 9b11127a9701975c734b8aee81ee3526 |
data | String | 네 | date의 데이터는 암호화되어야 합니다. 매개 변수: sendDate - 보낸 날짜; | {"sendDate":"2022-07-15"} |
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace NetCoreTest
{
internal class Program
{
static void Main(string[] args)
{
string secretkey = "9Rwkkl8hTiech/KSEinXPfwWiDYQfeJA1KubmDgi34ay4dutIfm0oUj7oqxQlmnA";
string apikey = "8ee3dc19bb124e7ea7eb0433c4f90ffc";
var res = GetReport(apikey, secretkey);
Console.WriteLine(res. Result);
}
static async Task GetReport(string apikey, string secretkey)
{
string url = "https://munjawa.com/SmsApi/v1/QueryReport";
string date = "2022-07-15";
Dictionary values = new Dictionary();
values. Add("sendDate", date);
string data_json = Newtonsoft.Json.JsonConvert.SerializeObject(values);
NameValueCollection nameValues = new NameValueCollection();
nameValues.Add("Header", apikey);
try
{
string upload_data = await AesEncrypt(secretkey, data_json);
nameValues.Add("Data", upload_data);
}
catch (Exception ex)
{
return ex. Message;
}
var json = HttpPost(url, nameValues). Result;
return json;
}
static async Task HttpPost(string url, NameValueCollection postDataStr)
{
string responseData = "";
try
{
using (var client = new WebClient())
{
byte[] bytes = client. UploadValues(url, postDataStr);
responseData = Encoding.UTF8.GetString(bytes);
}
}
catch (Exception ex)
{
return ex. Message;
}
return responseData;
}
public static async Task AesEncrypt(string key, string data)
{
try
{
byte[] bKey = Convert.FromBase64String(key);
byte[] aesKey = new byte[32];
byte[] aesIV = new byte[16];
Array.Copy(bKey, 0, aesKey, 0, 32);
Array.Copy(bKey, 32, aesIV, 0, 16);
AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
aes.IV = aesIV;
aes. Key = aesKey;
aes. Mode = CipherMode.CBC;
aes. Padding = PaddingMode.PKCS7;
byte[] bdata = Encoding.UTF8.GetBytes(data);
using (ICryptoTransform encrypt = aes. CreateEncryptor())
{
byte[] destin = encrypt. TransformFinalBlock(bdata, 0, bdata. Length);
return Convert.ToBase64String(destin);
}
}
catch (Exception ex)
{
return ex. Message;
}
}
}
}
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace NETFramework
{
internal class Program
{
static void Main(string[] args)
{
string secretkey = "9Rwkkl8hTiech/KSEinXPfwWiDYQfeJA1KubmDgi34ay4dutIfm0oUj7oqxQlmnA";
string apikey = "8ee3dc19bb124e7ea7eb0433c4f90ffc";
var res = GetReport(apikey, secretkey);
Console.WriteLine(res. Result);
}
보고서를 가져옵니다
static async Task GetReport(string apikey, string secretkey)
{
string url = "https://munjawa.com/SmsApi/v1/QueryReport";
string date = "2022-07-15";
Dictionary values = new Dictionary();
values. Add("sendDate", date);
string data_json = Newtonsoft.Json.JsonConvert.SerializeObject(values);
NameValueCollection nameValues = new NameValueCollection();
nameValues.Add("Header", apikey);
try
{
string upload_data = await AesEncrypt(secretkey, data_json);
nameValues.Add("Data", upload_data);
}
catch (Exception ex)
{
return ex. Message;
}
var json = HttpPost(url, nameValues). Result;
return json;
}
static async Task HttpPost(string url, NameValueCollection postDataStr)
{
string responseData = "";
try
{
using (var client = new WebClient())
{
byte[] bytes = client. UploadValues(url, postDataStr);
responseData = Encoding.UTF8.GetString(bytes);
}
}
catch (Exception ex)
{
return ex. Message;
}
return responseData;
}
public static async Task AesEncrypt(string key, string data)
{
try
{
byte[] bKey = Convert.FromBase64String(key);
byte[] aesKey = new byte[32];
byte[] aesIV = new byte[16];
Array.Copy(bKey, 0, aesKey, 0, 32);
Array.Copy(bKey, 32, aesIV, 0, 16);
AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
aes.IV = aesIV;
aes. Key = aesKey;
aes. Mode = CipherMode.CBC;
aes. Padding = PaddingMode.PKCS7;
byte[] bdata = Encoding.UTF8.GetBytes(data);
using (ICryptoTransform encrypt = aes. CreateEncryptor())
{
byte[] destin = encrypt. TransformFinalBlock(bdata, 0, bdata. Length);
return Convert.ToBase64String(destin);
}
}
catch (Exception ex)
{
return ex. Message;
}
}
}
}
<?php
require_once 'AES.php';
$securityKey = "9Rwkkl8hTiech/KSEinXPfwWiDYQfeJA1KubmDgi34ay4dutIfm0oUj7oqxQlmnA";
$aesTool = new Aes($securityKey, 'AES-256-CBC');
$apikey = "8ee3dc19bb124e7ea7eb0433c4f90ffc"; apikey로 수정하고 공식 웹 사이트에 로그인하여 얻을 수 있습니다
$ch = curl_init();
/* 인증 방법 설정 */
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Accept:text/plain; charset=utf-8',
'Content-Type:application/x-www-form-urlencoded', 'charset=utf-8'
));
/* 반환 결과를 스트림으로 설정 */
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
/* 시간 초과 설정*/
curl_setopt($ch, CURLOPT_TIMEOUT, 3000);
/* 통신 방법 설정 */
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
보고서 보내기를 가져옵니다
$paramsStr = '{"sendDate":"2022-07-15"}';
$cipherText = $aesTool->encrypt($paramsStr);
$data = array('header' => $apikey, 'data' => $cipherText);
$json_data = GetReport($ch, $data);
$array = json_decode($json_data, true);
print_r($array);
보고서 보내기를 가져옵니다
function GetReport($ch, $data)
{
curl_setopt($ch, CURLOPT_URL, 'https://munjawa.com/SmsApi/v1/QueryReport');
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
$result = curl_exec($ch);
$error = curl_error($ch);
checkErr($result, $error);
return $result;
}
function checkErr($result, $error)
{
if ($result === false) {
echo 'Curl error: ' . $error;
} else {
echo '오류 없이 작업 완료';
}
}
?>
<?
class Aes
{
/**
* 암호화
* @param string $plainText 일반 텍스트
* @return bool|string
*/
public function encrypt(string $plainText)
{
$originData = (openssl_encrypt($this->addPkcs7Padding($plainText, 16), $this->method, $this->securityKey, OPENSSL_NO_PADDING, $this->iv));
return $originData === false ? false : base64_encode($originData);
}
}
?>
AesUtils.java
package com.example;
import java.lang.reflect.Array;
import java.security.Security;
import java.util.Arrays;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public class AesUtils {
private static final String key = "9Rwkkl8hTiech/KSEinXPfwWiDYQfeJA1KubmDgi34ay4dutIfm0oUj7oqxQlmnA";
private static final String iv = "EJ9iIPhzB4I5UDfs";
static {
try {
Security.addProvider(new BouncyCastleProvider());
} catch (Exception e) {
e.printStackTrace();
}
}
public static String encryptAES(String data) throws Exception {
try {
byte[] aesKey = AesUtils.decode(key);
byte[] bkey = Arrays.copyOf(aesKey, 32);
byte[] bIV = Arrays.copyOfRange(aesKey, 32, 48);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
SecretKeySpec keyspec = new SecretKeySpec(bkey, "AES");
IvParameterSpec ivspec = new IvParameterSpec(bIV);
cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
byte[] encrypted = cipher.doFinal(data.getBytes("UTF-8"));
BASE64 트랜스코딩.
return AesUtils.encode(encrypted).trim();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static String encode(byte[] byteArray) {
return new String(new Base64().encode(byteArray));
}
public static byte[] decode(String base64EncodedString) {
return new Base64().decode(base64EncodedString);
}
}
Main.java
package com.example;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.gson.Gson;
public class Main {
private static String URI_GET_REPORTLIST = "https://munjawa.com/SmsApi/v1/Queryreport";
public static void main(String[] args) throws IOException, URISyntaxException {
String apikey = "8ee3dc19bb124e7ea7eb0433c4f90ffc";
System.out.println(Main.getReport(apikey));
}
/**
* 전송 보고서를 가져옵니다
*
* json 형식 문자열을 @return
* @throws java.io.IOException
*/
public static String getReport(String apikey) throws IOException, URISyntaxException {
Map dataDic = new HashMap();
dataDic.put("sendDate", "2022-07-15");
Gson gsonData = new Gson();
String data = gsonData.toJson(dataDic);
String enDataDic = "";
try {
enDataDic = AesUtils.encryptAES(data);
} catch (Exception e) {
e.printStackTrace();
}
Map params = new HashMap();
params.put("header", apikey);
params.put("data", enDataDic);
return post(URI_GET_REPORTLIST, params);
}
public static String post(String url, Map paramsMap) {
CloseableHttpClient client = HttpClients.createDefault();
String responseText = "";
CloseableHttpResponse response = null;
try {
HttpPost httpPost = new HttpPost(url);
httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");
if (paramsMap != null && paramsMap.size()> 0) {
List paramList = new ArrayList();
for (Map.Entry param : paramsMap.entrySet()) {
NameValuePair pair = new BasicNameValuePair(param.getKey(), param.getValue());
paramList.add(pair);
}
httpPost.setEntity(new UrlEncodedFormEntity(paramList, "UTF-8"));
}
response = client.execute(httpPost);
HttpEntity entity = response.getEntity();
if (entity != null) {
responseText = EntityUtils.toString(entity);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
response.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return responseText;
}
}
var crypto = require( 'crypto' );
var request = require('request').defaults({rejectUnauthorized: false});
var algorithm = 'aes-256-cbc';
const base64 = 'he8MTjKMVGSwcKMEqhZgyjy7PAZESXQENVv/eqjaZlXGG8cW2x2WW4J7vLdwuQj7=';
const buff = Buffer.from(base64, 'base64');
var key = buff.slice(0, 32);
var iv = buff.slice(-16);
var data = '{"sendDate":"2022-07-20"}';
function encrypt(data) {
var cipher = crypto.createCipheriv(algorithm, key, iv);
var cipherChunks = [];
cipherChunks.push(cipher.update(data, 'utf8', 'base64'));
cipherChunks.push(cipher.final('base64'));
return cipherChunks.join('');
}
var dataList = {
header: '97d568ee656a429ba2f6b60e5ca55694',
data: encrypt(data
}
request({
url:'https://munjawa.com/SmsApi/v1/QueryReport',
method: "POST",
json: true,
form: dataList
}, function(error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body);
}
});
import requests
import base64
from Crypto.Cipher import AES
# from Crypto.Util.Padding import pad
# import time
import json
class SmsApiTest:
def GetReport():
post_url = 'https://munjawa.com/SmsApi/v1/QueryReport'
p_json = {'sendDate': '2022-07-15'}
e = a.aes_encrypt(json.dumps(p_json))
request_param = {
'header': '8ee3dc19bb124e7ea7eb0433c4f90ffc',
'data': e
}
res = SmsApiTest.request_post(post_url, request_param)
print(res)
def request_post(url, param):
fails = 0
while True:
try:
if fails>= 20:
break
req = requests.post(url=url,
data=param,
timeout=1000,
verify=False)
if req.status_code == 200:
text = req.json()
else:
continue
except Exception:
fails += 1
print('네트워크 연결 문제, 다시 요청 시도 중: ', fails)
else:
break
return text
class Encrypt:
def __init__(self, aeskey, iv):
self.key = aeskey
self.iv = iv
def pkcs7padding(self, text):
PKCS7로 채우기
bs = 16
length = len(text)
bytes_length = len(text.encode('utf-8'))
padding_size = length if (bytes_length == length) else bytes_length
padding = bs - padding_size % bs
padding_text = chr(padding) * padding
self.coding = chr(padding)
return text + padding_text
def aes_encrypt(self, content):
""" "AES 암호화""
cipher = AES.new(self.key, AES. MODE_CBC, self.iv)
# 일반 텍스트를 처리합니다
content_padding = self.pkcs7padding(content)
# 암호화
encrypt_bytes = cipher.encrypt(content_padding.encode('utf-8'))
# 다시 코딩합니다
result = str(base64.b64encode(encrypt_bytes), encoding='utf-8')
return result
if __name__ == '__main__':
apikey = '8ee3dc19bb124e7ea7eb0433c4f90ffc'
key = '9Rwkkl8hTiech/KSEinXPfwWiDYQfeJA1KubmDgi34ay4dutIfm0oUj7oqxQlmnA'
bkey = bytearray(base64.b64decode(key))
aeskey = bkey[0:32]
iv = bkey[32:]
a = Encrypt(aeskey, iv)
req = SmsApiTest
res = req. GetReport()
package main
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"encoding/base64"
"fmt"
"io/ioutil"
"log"
"net/http"
"net/url"
"strings"
)
func main() {
apikey := "8ee3dc19bb124e7ea7eb0433c4f90ffc"
key := "9Rwkkl8hTiech/KSEinXPfwWiDYQfeJA1KubmDgi34ay4dutIfm0oUj7oqxQlmnA"
GetReport(apikey, key)
}
func GetReport(apikey, secretkey string) {
url_post := "https://munjawa.com/SmsApi/v1/QueryReport"
bkey, err := base64. StdEncoding.DecodeString(secretkey)
if err != nil {
log. Print("error:", err)
return
}
orignData := []byte("{'sendDate':'2022-07-15'}")
log. Print("원본:", string(orignData))
encrypted := AesEncryptCBC(orignData, bkey)
encydata := base64. StdEncoding.EncodeToString(encrypted)
log. Println(base64):, encydata
decrypted := AesDecryptCBC(encrypted, bkey)
log. Println([암호 해독 결과:], string(decrypted))
urlValues := url. Values{}
urlValues.Add("header", apikey)
urlValues.Add("data", encydata)
resp, _ := http. PostForm(url_post, urlValues)
body, _ := ioutil. ReadAll(resp. Body)
fmt. Println(string(body))
}
func AesEncryptCBC(origData []byte, key []byte) (encrypted []byte) {
키 그룹화
NewCipher 함수는 입력 k의 길이를 16, 24 또는 32로 제한합니다
aesKey := key[0:32]
block, _ := aes. NewCipher(aesKey)
blockSize := block. BlockSize() // 키 블록의 길이를 가져옵니다
aesIv := key[32:48]
origData = PKCS7Padding(origData, blockSize) // 전체 코드를 보완합니다
blockMode := cipher. NewCBCEncrypter(block, aesIv) // 암호화 모드
encrypted = make([]byte, len(origData)) // 배열을 만듭니다
blockMode.CryptBlocks(encrypted, origData) // 암호화
return encrypted
}
PKCS7로 채웁니다
func PKCS7Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padtext := bytes. Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padtext...)
}
func PKCS7UnPadding(origData []byte) []byte {
length := len(origData)
unpadding := int(origData[length-1])
return origData[:(length - unpadding)]
}
매개 변수 이름입니다 | 유형입니다 | 설명입니다 | 예입니다 |
---|---|---|---|
code | Integer | 요청 상태 코드입니다. | 0 |
message | String | 상태를 반환합니다 | OK |
detail | String | 호출 인터페이스의 성공 여부에 대한 설명입니다 | SUCCESS |
data | String | 데이터를 반환합니다 | [{"OrderId":9,"Mobile":"01057420006","Content":"태양의 달 8월입니다~!\n태양같은 에너지를 당신께 선물합니다.\n활기찬 한달 보내세요.*^_^*","TotalCount":2,"SuccessCount":2, "FailCount":0,"CreateTime":"2022-07-15T14:36:17.16408"}, {"OrderId":10,"Mobile":"01057420006","Content":"aaaa", "TotalCount":4,"SuccessCount":4,"FailCount":0, "CreateTime":"2022-07-15T14:57:16.916"}] |
{
"code":0,
"message":"OK",
"detail":"SUCCESS",
"data":"[{"OrderId":9,"Mobile":"01057420006",
"Content":"태양의 달 8월입니다~!\n태양같은 에너지를 당신께 선물합니다.\n활기찬 한달 보내세요.*^_^*",
"TotalCount":2,"SuccessCount":2,"FailCount":0,"CreateTime":"2022-07-15T14:36:17.16408"},
{"OrderId":10,"Mobile":"01057420006","Content":"aaaa","TotalCount":4,"SuccessCount":4,
"FailCount":0,"CreateTime":"2022-07-15T14:57:16.916"}]"
}
이 인터페이스가 켜져 있는 경우 72시간 동안 새 프로덕션에 대한 상태 보고서 데이터를 독립적으로 저장합니다. 이 인터페이스를 통해 새로 생성된 상태 보고서를 가져올 수 있습니다. 성공적으로 획득한 데이터는 삭제됩니다.
참고 사항:
HTTP 헤더 정보:
Accept:application/json; charset=utf-8;
Content-Type:multipart/form-data; charset=utf-8;
URL:https://api.munjawa.com/SmsApi/v1/QueryReportDetail
액세스 방법: POST
http 지원: https 및 http 액세스가 지원되며 https
사용하는 것이 좋습니다
매개 변수 이름입니다 | 유형입니다 | 필수입니다 | 설명입니다 | 예입니다 |
---|---|---|---|---|
header | String | 네 | 계정 설정 - API 관리 보기에서 사용자 고유 ID를 사용합니다 | 9b11127a9701975c734b8aee81ee3526 |
data | String | 네 | data의 매개 변수는 암호화가 필요합니다. 매개변수: orderid - 주문 번호; | {"orderid":"14"} |
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace NetCoreTest
{
internal class Program
{
static void Main(string[] args)
{
string secretkey = "9Rwkkl8hTiech/KSEinXPfwWiDYQfeJA1KubmDgi34ay4dutIfm0oUj7oqxQlmnA";
string apikey = "8ee3dc19bb124e7ea7eb0433c4f90ffc";
var res = GetReportDetail(apikey, secretkey);
Console.WriteLine(res. Result);
}
static async Task GetReportDetail(string apikey, string secretkey)
{
string url = "https://munjawa.com/SmsApi/v1/QueryReportDetail";
string orderid = "14";
Dictionary values = new Dictionary();
values. Add("orderid", orderid);
string data_json = Newtonsoft.Json.JsonConvert.SerializeObject(values);
NameValueCollection nameValues = new NameValueCollection();
nameValues.Add("Header", apikey);
try
{
string upload_data = await AesEncrypt(secretkey, data_json);
nameValues.Add("Data", upload_data);
}
catch (Exception ex)
{
return ex. Message;
}
var json = HttpPost(url, nameValues). Result;
return json;
}
static async Task HttpPost(string url, NameValueCollection postDataStr)
{
string responseData = "";
try
{
using (var client = new WebClient())
{
byte[] bytes = client. UploadValues(url, postDataStr);
responseData = Encoding.UTF8.GetString(bytes);
}
}
catch (Exception ex)
{
return ex. Message;
}
return responseData;
}
public static async Task AesEncrypt(string key, string data)
{
try
{
byte[] bKey = Convert.FromBase64String(key);
byte[] aesKey = new byte[32];
byte[] aesIV = new byte[16];
Array.Copy(bKey, 0, aesKey, 0, 32);
Array.Copy(bKey, 32, aesIV, 0, 16);
AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
aes.IV = aesIV;
aes. Key = aesKey;
aes. Mode = CipherMode.CBC;
aes. Padding = PaddingMode.PKCS7;
byte[] bdata = Encoding.UTF8.GetBytes(data);
using (ICryptoTransform encrypt = aes. CreateEncryptor())
{
byte[] destin = encrypt. TransformFinalBlock(bdata, 0, bdata. Length);
return Convert.ToBase64String(destin);
}
}
catch (Exception ex)
{
return ex. Message;
}
}
}
}
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace NETFramework
{
internal class Program
{
static void Main(string[] args)
{
string secretkey = "9Rwkkl8hTiech/KSEinXPfwWiDYQfeJA1KubmDgi34ay4dutIfm0oUj7oqxQlmnA";
string apikey = "8ee3dc19bb124e7ea7eb0433c4f90ffc";
var res = GetReportDetail(apikey, secretkey);
Console.WriteLine(res. Result);
}
보고서 세부 정보를 가져옵니다
static async Task GetReportDetail(string apikey, string secretkey)
{
string url = "https://munjawa.com/SmsApi/v1/QueryReportDetail";
string orderid = "14";
Dictionary values = new Dictionary();
values. Add("orderid", orderid);
string data_json = Newtonsoft.Json.JsonConvert.SerializeObject(values);
NameValueCollection nameValues = new NameValueCollection();
nameValues.Add("Header", apikey);
try
{
string upload_data = await AesEncrypt(secretkey, data_json);
nameValues.Add("Data", upload_data);
}
catch (Exception ex)
{
return ex. Message;
}
var json = HttpPost(url, nameValues). Result;
return json;
}
static async Task HttpPost(string url, NameValueCollection postDataStr)
{
string responseData = "";
try
{
using (var client = new WebClient())
{
byte[] bytes = client. UploadValues(url, postDataStr);
responseData = Encoding.UTF8.GetString(bytes);
}
}
catch (Exception ex)
{
return ex. Message;
}
return responseData;
}
public static async Task AesEncrypt(string key, string data)
{
try
{
byte[] bKey = Convert.FromBase64String(key);
byte[] aesKey = new byte[32];
byte[] aesIV = new byte[16];
Array.Copy(bKey, 0, aesKey, 0, 32);
Array.Copy(bKey, 32, aesIV, 0, 16);
AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
aes.IV = aesIV;
aes. Key = aesKey;
aes. Mode = CipherMode.CBC;
aes. Padding = PaddingMode.PKCS7;
byte[] bdata = Encoding.UTF8.GetBytes(data);
using (ICryptoTransform encrypt = aes. CreateEncryptor())
{
byte[] destin = encrypt. TransformFinalBlock(bdata, 0, bdata. Length);
return Convert.ToBase64String(destin);
}
}
catch (Exception ex)
{
return ex. Message;
}
}
}
}
<?php
require_once 'AES.php';
$securityKey = "9Rwkkl8hTiech/KSEinXPfwWiDYQfeJA1KubmDgi34ay4dutIfm0oUj7oqxQlmnA";
$aesTool = new Aes($securityKey, 'AES-256-CBC');
$apikey = "8ee3dc19bb124e7ea7eb0433c4f90ffc"; apikey로 수정하고 공식 웹 사이트에 로그인하여 얻을 수 있습니다
$ch = curl_init();
/* 인증 방법 설정 */
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Accept:text/plain; charset=utf-8',
'Content-Type:application/x-www-form-urlencoded', 'charset=utf-8'
));
/* 반환 결과를 스트림으로 설정 */
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
/* 시간 초과 설정*/
curl_setopt($ch, CURLOPT_TIMEOUT, 3000);
/* 통신 방법 설정 */
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
전송 세부 정보를 가져옵니다
$paramsStr = '{"orderid":"14"}';
$cipherText = $aesTool->encrypt($paramsStr);
$data = array('header' => $apikey, 'data' => $cipherText);
$json_data = GetReportDetail($ch, $data);
$array = json_decode($json_data, true);
print_r($array);
전송 세부 정보를 가져옵니다
function GetReportDetail($ch, $data)
{
curl_setopt($ch, CURLOPT_URL, 'https://munjawa.com/SmsApi/v1/QueryReportDetail');
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
$result = curl_exec($ch);
$error = curl_error($ch);
checkErr($result, $error);
return $result;
}
function checkErr($result, $error)
{
if ($result === false) {
echo 'Curl error: ' . $error;
} else {
echo '오류 없이 작업 완료';
}
}
?>
<?
class Aes
{
/**
* 암호화
* @param string $plainText 일반 텍스트
* @return bool|string
*/
public function encrypt(string $plainText)
{
$originData = (openssl_encrypt($this->addPkcs7Padding($plainText, 16), $this->method, $this->securityKey, OPENSSL_NO_PADDING, $this->iv));
return $originData === false ? false : base64_encode($originData);
}
}
?>
AesUtils.java
package com.example;
import java.lang.reflect.Array;
import java.security.Security;
import java.util.Arrays;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public class AesUtils {
private static final String key = "9Rwkkl8hTiech/KSEinXPfwWiDYQfeJA1KubmDgi34ay4dutIfm0oUj7oqxQlmnA";
private static final String iv = "EJ9iIPhzB4I5UDfs";
static {
try {
Security.addProvider(new BouncyCastleProvider());
} catch (Exception e) {
e.printStackTrace();
}
}
public static String encryptAES(String data) throws Exception {
try {
byte[] aesKey = AesUtils.decode(key);
byte[] bkey = Arrays.copyOf(aesKey, 32);
byte[] bIV = Arrays.copyOfRange(aesKey, 32, 48);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
SecretKeySpec keyspec = new SecretKeySpec(bkey, "AES");
IvParameterSpec ivspec = new IvParameterSpec(bIV);
cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
byte[] encrypted = cipher.doFinal(data.getBytes("UTF-8"));
BASE64 트랜스코딩.
return AesUtils.encode(encrypted).trim();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static String encode(byte[] byteArray) {
return new String(new Base64().encode(byteArray));
}
public static byte[] decode(String base64EncodedString) {
return new Base64().decode(base64EncodedString);
}
}
Main.java
package com.example;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.gson.Gson;
public class Main {
private static String URI_GET_REPORTLIST = "https://munjawa.com/SmsApi/v1/QueryReportDetail";
public static void main(String[] args) throws IOException, URISyntaxException {
String apikey = "8ee3dc19bb124e7ea7eb0433c4f90ffc";
System.out.println(Main.getReport(apikey));
}
/**
* 전송 보고서를 가져옵니다
*
* json 형식 문자열을 @return
* @throws java.io.IOException
*/
public static String getReportDetail(String apikey) throws IOException, URISyntaxException {
Map dataDic = new HashMap();
dataDic.put("orderid", "14");
Gson gsonData = new Gson();
String data = gsonData.toJson(dataDic);
String enDataDic = "";
try {
enDataDic = AesUtils.encryptAES(data);
} catch (Exception e) {
e.printStackTrace();
}
Map params = new HashMap();
params.put("header", apikey);
params.put("data", enDataDic);
return post(URI_GET_REPORTLIST, params);
}
public static String post(String url, Map paramsMap) {
CloseableHttpClient client = HttpClients.createDefault();
String responseText = "";
CloseableHttpResponse response = null;
try {
HttpPost httpPost = new HttpPost(url);
httpPost.addHeader("Content-Type", "multipart/form-data");
if (paramsMap != null && paramsMap.size() > 0) {
List paramList = new ArrayList();
for (Map.Entry param : paramsMap.entrySet()) {
NameValuePair pair = new BasicNameValuePair(param.getKey(), param.getValue());
paramList.add(pair);
}
httpPost.setEntity(new UrlEncodedFormEntity(paramList, "UTF-8"));
}
response = client.execute(httpPost);
HttpEntity entity = response.getEntity();
if (entity != null) {
responseText = EntityUtils.toString(entity);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
response.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return responseText;
}
}
var crypto = require( 'crypto' );
var request = require('request').defaults({rejectUnauthorized: false});
var algorithm = 'aes-256-cbc';
const base64 = 'he8MTjKMVGSwcKMEqhZgyjy7PAZESXQENVv/eqjaZlXGG8cW2x2WW4J7vLdwuQj7=';
const buff = Buffer.from(base64, 'base64');
var key = buff.slice(0, 32);
var iv = buff.slice(-16);
var data = '{"orderid":"18"}';
function encrypt(data) {
var cipher = crypto.createCipheriv(algorithm, key, iv);
var cipherChunks = [];
cipherChunks.push(cipher.update(data, 'utf8', 'base64'));
cipherChunks.push(cipher.final('base64'));
return cipherChunks.join('');
}
var dataList = {
header: '97d568ee656a429ba2f6b60e5ca55694',
data: encrypt(data)
}
request({
url:'https://munjawa.com/v1/QueryReportDetail',
method: "POST",
json: true,
form: dataList
}, function(error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body);
}
});
import requests
import base64
from Crypto.Cipher import AES
# from Crypto.Util.Padding import pad
# import time
import json
class SmsApiTest:
def GetReportDetail():
post_url = 'https://munjawa.com/SmsApi/v1/QueryReportDetail'
p_json = {'orderid':'14'}
e = a.aes_encrypt(json.dumps(p_json))
request_param = {
'header': '8ee3dc19bb124e7ea7eb0433c4f90ffc',
'data': e
}
res = SmsApiTest.request_post(post_url, request_param)
print(res)
def request_post(url, param):
fails = 0
while True:
try:
if fails >= 20:
break
req = requests.post(url=url,
data=param,
timeout=1000,
verify=False)
if req.status_code == 200:
text = req.json()
else:
continue
except Exception:
fails += 1
print('네트워크 연결 문제, 다시 요청 시도 중: ', fails)
else:
break
return text
class Encrypt:
def __init__(self, aeskey, iv):
self.key = aeskey
self.iv = iv
def pkcs7padding(self, text):
PKCS7로 채우기
bs = 16
length = len(text)
bytes_length = len(text.encode('utf-8'))
padding_size = length if (bytes_length == length) else bytes_length
padding = bs - padding_size % bs
padding_text = chr(padding) * padding
self.coding = chr(padding)
return text + padding_text
def aes_encrypt(self, content):
""" "AES 암호화""
cipher = AES.new(self.key, AES. MODE_CBC, self.iv)
# 일반 텍스트를 처리합니다
content_padding = self.pkcs7padding(content)
# 암호화
encrypt_bytes = cipher.encrypt(content_padding.encode('utf-8'))
# 다시 코딩합니다
result = str(base64.b64encode(encrypt_bytes), encoding='utf-8')
return result
if __name__ == '__main__':
apikey = '8ee3dc19bb124e7ea7eb0433c4f90ffc'
key = '9Rwkkl8hTiech/KSEinXPfwWiDYQfeJA1KubmDgi34ay4dutIfm0oUj7oqxQlmnA'
bkey = bytearray(base64.b64decode(key))
aeskey = bkey[0:32]
iv = bkey[32:]
a = Encrypt(aeskey, iv)
req = SmsApiTest
res = req. GetReportDetail()
package main
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"encoding/base64"
"fmt"
"io/ioutil"
"log"
"net/http"
"net/url"
"strings"
)
func main() {
apikey := "8ee3dc19bb124e7ea7eb0433c4f90ffc"
key := "9Rwkkl8hTiech/KSEinXPfwWiDYQfeJA1KubmDgi34ay4dutIfm0oUj7oqxQlmnA"
GetReportDetail(apikey, key)
}
func GetReportDetail(apikey, secretkey string) {
url_post := "https://munjawa.com/SmsApi/v1/QueryReportDetail"
bkey, err := base64. StdEncoding.DecodeString(secretkey)
if err != nil {
log. Print("error:", err)
return
}
orignData := []byte("{'orderid':14}")
log. Print("원본:", string(orignData))
encrypted := AesEncryptCBC(orignData, bkey)
encydata := base64. StdEncoding.EncodeToString(encrypted)
log. Println(base64):, encydata
decrypted := AesDecryptCBC(encrypted, bkey)
log. Println([암호 해독 결과:], string(decrypted))
urlValues := url. Values{}
urlValues.Add("header", apikey)
urlValues.Add("data", encydata)
resp, _ := http. PostForm(url_post, urlValues)
body, _ := ioutil. ReadAll(resp. Body)
fmt. Println(string(body))
}
func AesEncryptCBC(origData []byte, key []byte) (encrypted []byte) {
키 그룹화
NewCipher 함수는 입력 k의 길이를 16, 24 또는 32로 제한합니다
aesKey := key[0:32]
block, _ := aes. NewCipher(aesKey)
blockSize := block. BlockSize() // 키 블록의 길이를 가져옵니다
aesIv := key[32:48]
origData = PKCS7Padding(origData, blockSize) // 전체 코드를 보완합니다
blockMode := cipher. NewCBCEncrypter(block, aesIv) // 암호화 모드
encrypted = make([]byte, len(origData)) // 배열을 만듭니다
blockMode.CryptBlocks(encrypted, origData) // 암호화
return encrypted
}
PKCS7로 채웁니다
func PKCS7Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padtext := bytes. Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padtext...)
}
func PKCS7UnPadding(origData []byte) []byte {
length := len(origData)
unpadding := int(origData[length-1])
return origData[:(length - unpadding)]
}
매개 변수 이름입니다 | 유형입니다 | 설명입니다 | 예입니다 |
---|---|---|---|
code | Integer | 요청 상태 코드입니다. | 0 |
message | String | 상태를 반환합니다 | OK |
detail | String | 호출 인터페이스의 성공 여부에 대한 설명입니다 | SUCCESS |
data | String | 데이터를 반환합니다 | [{"OrderId":14,"Seq":1,"PhoneNum":"01057420001","SendStatus":4, "SendTime":"2022-07-19T18:44:58.394974"},{"OrderId":14,"Seq":2, "PhoneNum":"01057420000","SendStatus":4,"SendTime":"2022-07-19T18:44:58.395239"}] |
{
"code":0,
"message":"OK",
"detail":"SUCCESS",
"data":"[{"OrderId":14,"Seq":1,"PhoneNum":"01057420001","SendStatus":4,
"SendTime":"2022-07-19T18:44:58.394974"},{"OrderId":14,"Seq":2,
"PhoneNum":"01057420000","SendStatus":4,"SendTime":"2022-07-19T18:44:58.395239"}]"
}
잔액 조회 API, 이 인터페이스는 사용자가 현재 잔액을 조회하는 데 사용됩니다.
참고 사항:
HTTP 헤더 정보:
Accept:application/json; charset=utf-8;
Content-Type:application/x-www-form-urlencoded; charset=utf-8;
URL:https://api.munjawa.com/SmsApi/v1/QueryBalance
액세스 방법: POST
http 지원: https 및 http 액세스가 지원되며 https
사용하는 것이 좋습니다
매개 변수 이름입니다 | 유형입니다 | 필수입니다 | 설명입니다 | 예입니다 |
---|---|---|---|---|
apikey | String | 네 | 계정 설정 - API 관리 보기에서 사용자 고유 ID를 사용합니다 | 9b11127a9701975c734b8aee81ee3526 |
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace NetCoreTest
{
internal class Program
{
static void Main(string[] args)
{
string apikey = "8ee3dc19bb124e7ea7eb0433c4f90ffc";
var res = GetUserInfo(apikey);
Console.WriteLine(res. Result);
}
static Task GetUserInfo(string apikey)
{
string url = "https://munjawa.com/SmsApi/v1/QueryBalance";
NameValueCollection nameValues = new NameValueCollection();
nameValues.Add("apikey", apikey);
var json = HttpPost(url, nameValues);
return json;
}
static async Task HttpPost(string url, NameValueCollection postDataStr)
{
string responseData = "";
try
{
using (var client = new WebClient())
{
byte[] bytes = client. UploadValues(url, postDataStr);
responseData = Encoding.UTF8.GetString(bytes);
}
}
catch (Exception ex)
{
return ex. Message;
}
return responseData;
}
}
}
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace NETFramework
{
internal class Program
{
static void Main(string[] args)
{
string apikey = "8ee3dc19bb124e7ea7eb0433c4f90ffc";
var res = GetUserInfo(apikey);
Console.WriteLine(res. Result);
}
계정 잔액을 가져옵니다
static Task GetUserInfo(string apikey)
{
string url = "https://munjawa.com/SmsApi/v1/QueryBalance";
NameValueCollection nameValues = new NameValueCollection();
nameValues.Add("apikey", apikey);
var json = HttpPost(url, nameValues);
return json;
}
static async Task HttpPost(string url, NameValueCollection postDataStr)
{
string responseData = "";
try
{
using (var client = new WebClient())
{
byte[] bytes = client. UploadValues(url, postDataStr);
responseData = Encoding.UTF8.GetString(bytes);
}
}
catch (Exception ex)
{
return ex. Message;
}
return responseData;
}
}
}
<?php
$apikey = "8ee3dc19bb124e7ea7eb0433c4f90ffc"; apikey로 수정하고 공식 웹 사이트에 로그인하여 얻을 수 있습니다
$ch = curl_init();
/* 인증 방법 설정 */
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Accept:text/plain; charset=utf-8',
'Content-Type:application/x-www-form-urlencoded', 'charset=utf-8'
));
/* 반환 결과를 스트림으로 설정 */
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
/* 시간 초과 설정*/
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
/* 통신 방법 설정 */
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
사용자 정보를 얻습니다
$json_data = get_user($ch, $apikey);
$array = json_decode($json_data, true);
print_r($array);
계정 정보를 가져옵니다
function get_user($ch, $apikey)
{
curl_setopt($ch, CURLOPT_URL, 'https://munjawa.com/SmsApi/v1/QueryBalance');
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('apikey' => $apikey)));
$result = curl_exec($ch);
$error = curl_error($ch);
checkErr($result, $error);
return $result;
}
function checkErr($result, $error)
{
if ($result === false) {
echo 'Curl error: ' . $error;
} else {
echo '오류 없이 작업 완료';
}
}
?>
Main.java
package com.example;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.gson.Gson;
public class Main {
private static String URI_GET_USER_INFO = "https://munjawa.com/SmsApi/v1/QueryBalance";
public static void main(String[] args) throws IOException, URISyntaxException {
String apikey = "8ee3dc19bb124e7ea7eb0433c4f90ffc";
System.out.println(Main.getUserInfo(apikey));
}
/**
* 계정 정보를 가져옵니다
*
* json 형식 문자열을 @return
* @throws java.io.IOException
*/
public static String getUserInfo(String apikey) throws IOException, URISyntaxException {
Map params = new HashMap();
params.put("apikey", apikey);
return post(URI_GET_USER_INFO, params);
}
}
var request = require('request').defaults({rejectUnauthorized: false});
var data = {
apikey: "97d568ee656a429ba2f6b60e5ca55694"
}
request({
url:'https://munjawa.com/SmsApi/v1/QueryBalance',
method: "POST",
json: true,
form: data
}, function(error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body);
}
});
import requests
import base64
from Crypto.Cipher import AES
# from Crypto.Util.Padding import pad
# import time
import json
class SmsApiTest:
def GetBalance():
post_url = 'https://munjawa.com/SmsApi/v1/QueryBalance'
request_param = {'apikey': apikey}
res = SmsApiTest.request_post(post_url, request_param)
print(res)
if __name__ == '__main__':
apikey = '8ee3dc19bb124e7ea7eb0433c4f90ffc'
req = SmsApiTest
res = req. GetBalance()
package main
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"encoding/base64"
"fmt"
"io/ioutil"
"log"
"net/http"
"net/url"
"strings"
)
func main() {
apikey := "8ee3dc19bb124e7ea7eb0433c4f90ffc"
GetBalance(apikey)
}
func GetBalance(apikey string) {
url := "https://munjawa.com/SmsApi/v1/QueryBalance"
method := "POST"
payload := strings. NewReader("apikey=" + apikey)
client := &http. Client{}
req, err := http. NewRequest(method, url, payload)
if err != nil {
fmt. Println(err)
return
}
req. Header.Set("Content-Type", "application/x-www-form-urlencoded")
res, err := client. Do(req)
if err != nil {
fmt. Println(err)
return
}
defer res. Body.Close()
body, err := ioutil. ReadAll(res. Body)
if err != nil {
fmt. Println(err)
return
}
fmt. Println(string(body))
}
매개 변수 이름입니다 | 유형입니다 | 설명입니다 | 예입니다 |
---|---|---|---|
code | Integer | 요청 상태 코드입니다. | 0 |
message | String | 상태를 반환합니다 | OK |
detail | String | 호출 인터페이스의 성공 여부에 대한 설명입니다 | SUCCESS |
data | String | 데이터를 반환합니다 | {"UserId":"01057420006","Cash":42275.880000000000000000000000, "Point":50.000000000000000000000000000} |
{
"code": 0,
"message": "OK",
"deatil": "SUCCESS"
"mobile": "{"UserId":"01057420006","Cash":42275.880000000000000000000000,"Point":50.000000000000000000000000000}"
}
API가 2.0으로 업그레이드되었습니다. API 2.0은 새로운 사용자가 API 2.0을 직접 사용할 수 있도록 더 많은 기능을 제공하며, 이전 사용자는 기본적으로 API 2.0 권한을 가지며 2.0 인터페이스를 따라 개발해야 하는 경우 사용할 수 있습니다.
참고: