EventHook
Event хүлээн авах
Нэхэмжлэл төлөгдсөн, цуцлагдсан, хугацаа нь дууссан үед манай сервер мерчантын бүртгүүлсэн event хүлээн авах хаяг руу дараах бүтэцтэйгээр Event явуулна. Event-н дата нь ирэхдээ цахим гарын үсэгтэй ирэх бөгөөд гарын үсгийг ЛэндМН-с өгсөн public key-н тусламжтай баталгаажуулна. Хэрвээ баталгаажуулалт хийхгүй тохиолдолд нэхэмжлэлийг лавлах api дуудаж тухайн нэхэмжлэлийг баталгаажуулж болно.
Event хүлээн авах:
METHOD | URL | HEADER |
---|---|---|
POST | eventHookUrl | content-type: application/x-www-form-urlencoded signature: signature |
eventHookUrl
Мерчантын event хүлээж авах URL.
signature
Илгээж буй хүсэлтийн өгөгдлийг private key-р баталгаажуулсан signature
.
Parameters
Параметер | Төрөл | Заавал | Тайлбар |
---|---|---|---|
eventType | String | Тийм | [invoice.paid, invoice.cancelled, invoice.expired] гэсэн event -үүд |
data | JsonData | Тийм | Event-ын дата |
signature | String | Тийм | Дээрхи явуулж байгаа дата private key -р sign хийгдсэн гарын үсэг байна. Манайхаас авсан public key-ний тусламжтайгаар баталгаажуулж болно. |
eventType
Нэхэмжлэлийн төлөв өөрчлөгдөх үед "invoice.paid", "invoice.cancelled" мөн "invoice.expired" гэсэн event-үүд илгээнэ.
data
data нь нэхэмжлэлийн дэлгэрэнгүй мэдээллийг агуулна.
Data-ны дэлгэрэнгүй
Параметер | Төрөл | Тайлбар |
---|---|---|
invoiceNumber | String | Нэхэмжлэлийн дугаар. |
description | JsonData | Нэхэмжлэлийн гүйлгээний утга. |
status | String | Нэхэмжлэлийн төлөв: 0: Хүлээгдэж байгаа 1: Төлөгдсөн 2: Цуцлагдсан 3: Хугацаа нь дууссан. |
amount | String | Нэхэмжлэгдсэн мөнгөн дүн. |
tracking_data | String | Анх нэхэмжлэл үүсгэх үед мерчант талаас оруулж өгсөн дата. |
createdAt | String | Нэхэмжлэл үүссэн огноо. |
expireDate | String | Нэхэмжлэл дуусах огноо. |
paidDate | String | Нэхэмжлэл төлөгдсөн огноо. Хэрвээ төлөгдөөгүй тохиолдолд null ирнэ. |
invoiceNumber
Нэхэмжлэлийн дугаар.
description
Нэхэмжлэлийн гүйлгээний утга.
status
Нэхэмжлэлийн одоогийн төлөв. Төлөв нь нэхэмжлэл төлөгдсөн эсэх, цуцлагдсан эсэх, хүчинтэй хугацаа нь дууссан эсэх эсвэл төлөгдөөгүй хүлээгдэж байгааг илэрхийлнэ.
amount
Нэхэмжлэлийн мөнгөн дүн.
tracking_data
trackingData нь Мерчант нэхэмжлэлийг таних зорилготой өөрийн мэдээллээ хадгалах талбар.
createdAt
createdAt нь нэхэмжлэл үүсгэсэн огноо.
expireDate
expireDate нь нэхэмжлэл цуцлагдсан огноо.
paidDate
paidDate нь нэхэмжлэлийн төлөгдсөн огноо.
Хүсэлт илгээж буй жишээ:
Мерчантын үүсгэсэн 20000 төгрөгний 112233 гэсэн дугаартай нэхэмжлэл төлөгдөх үед.
curl --request POST \
--url https://{merchant.domain}/lendmn/webhook \
--header 'Content-Type: application/json' \
--data '{
"eventType": "invoice.paid",
"data": {
"invoiceNumber": "112233",
"description": "Нэхэмжлэл",
"status": 1,
"amount": 20000,
"trackingData": {
"orderId": "#123456"
},
"createdAt": "2018-10-17T08:17:04+08:00",
"expireDate": "2018-10-17T08:30:04+08:00",
"paidDate": "2018-10-17T08:25:04+08:00"
},
"signature": "A5g80fRClZCy1OogeBqNjqNkb0nhdehdutOb8739a...39a="
}'
Public key-ээр өгөгдөл баталгаажуулах:
Public key-ээр JSON өгөгдлийг баталгаажуулахад доорх асуудлууд тулгардаг:
- Кирилл үсгийн асуудал
- Дарааллын алдаа
- Algorithm
Хэл хэлийн онцлогоос болж өөр өөр асуудал үүсэж болно. Тиймээс баталгаажуулалт хийх жишээ оруулав.
Node
const crypto = require('crypto')
const fs = require('fs')
const publicKey = fs.readFileSync('./../public.test.pem', 'utf-8')
const input = fs.readFileSync('./input.txt', 'utf-8')
let data = JSON.parse(input)
let signature = data.signature
delete data.signature
data = JSON.stringify(data)
const verifier = crypto.createVerify('sha256')
verifier.update(data)
verifier.end()
signature = new Buffer(signature, 'base64')
const verified = verifier.verify(publicKey, signature)
console.log(verified)
Python
def verify_sign(public_key_loc, signature, data):
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA256
from base64 import b64decode
pub_key = open(public_key_loc, "r").read()
rsakey = RSA.importKey(pub_key)
signer = PKCS1_v1_5.new(rsakey)
digest = SHA256.new()
digest.update(data)
if signer.verify(digest, b64decode(signature)):
return True
return False
import json
import ast
import base64
from collections import OrderedDict
text_file = open("./input.txt", "r")
dataString = text_file.read()
dataDict = json.loads(dataString, object_pairs_hook=OrderedDict)
signature = dataDict['signature']
dataDict.pop('signature', None)
dataDict = json.dumps(dataDict, separators=(",", ":"))
print verify_sign('./../public.test.pem', signature, dataDict)
Ruby
require 'openssl'
require 'base64'
require 'json'
public_key = '../public.test.pem'
input = './input.txt'
# read data and seperate signature
data = JSON.parse(File.read(input))
signature = data['signature']
data.delete('signature')
pubkey = OpenSSL::PKey::RSA.new(File.read(public_key))
signature = Base64.decode64(signature)
if pubkey.verify(OpenSSL::Digest::SHA256.new, signature, data.to_json)
puts 'VALID'
else
puts 'INVALID'
end
PHP
<?php
$public_key = '../public.test.pem';
$input = './input.txt';
// Read Data
$data = file_get_contents($input);
$dataArray = json_decode($data, true);
// Seperate signature
$signature = $dataArray['signature'];
unset($dataArray['signature']);
$data = json_encode($dataArray, JSON_UNESCAPED_UNICODE);
$public_key_pem = openssl_pkey_get_public(file_get_contents($public_key));
$r = openssl_verify($data, base64_decode($signature), $public_key_pem, 'sha256WithRSAEncryption');
if ($r) {
echo "VALID";
} else {
echo "INVALID";
}
echo "\n";