孟加拉原生支付API集成指南
作为支付平台专家,我将为您介绍如何通过API集成孟加拉国的原生支付系统。
主要支付方式
- bKash – 孟加拉最大的移动钱包
- Nagad – 政府支持的电子金融服务
- Rocket (DBBL Mobile Banking) – Dutch-Bangla银行的移动银行服务
- Upay – United Commercial Bank的移动支付解决方案
API集成步骤
1. bKash API集成
POST /checkout/create HTTP/1.1
Host: api.bkash.com
Content-Type: application/json
Authorization: Bearer {access_token}
{
"amount": "1000",
"currency": "BDT",
"intent": "sale",
"merchantInvoiceNumber": "INV12345"
}
2. Nagad API集成流程
- 注册商户账户并获取Merchant ID和API密钥
- 使用PGW(付款网关)接口进行交易处理:
const nagadPayment = {
merchantId: 'YOUR_MERCHANT_ID',
orderId: generateUniqueOrderID(),
amount: '500',
};
SSLCommerz整合方案(聚合多个本地支付)
SSLCommerz是孟加拉流行的聚合支付网关,支持多种本地付款方式:
$sslcommerz = new SslCommerz([
'store_id' => 'your_store_id',
'store_passwd' => 'your_store_password',
'total_amount' => $amount,
// ...其他参数...
]);
Sandbox测试环境建议
所有主要提供商都提供沙盒环境:
- bKash Sandbox URL:
https://tokenized.sandbox.bka.sh
- Nagad测试门户需要申请开发者账户获取凭证
Webhook配置示例(以bKash为例)
@app.route('/bkash/callback', methods=['POST'])
def bkash_callback():
payment_data = request.json
#验证签名和状态码(SUCCESS/FAILED)
if payment_data['status'] == 'SUCCESS':
#更新订单状态为已付款
return jsonify({'status':200})
FAQ常见问题解决
Q:如何处理退款?
A:bKash/Nagad都有专门的退款API端点,需保留原始交易ID。通常有24小时处理时间。
Q:汇率转换如何处理?
A:Bangladesh Bank规定所有国内交易必须以BDT结算。国际卡交易会自动按央行汇率转换。
孟加拉原生支付API集成进阶指南
深入技术实现细节
1. bKash深度集成要点
Token管理流程
// 获取访问令牌示例
public String getBkashToken() {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://tokenized.sandbox.bka.sh/tokenized/checkout/token/grant"))
.header("username", "YOUR_APP_KEY")
.header("password", "YOUR_APP_SECRET")
.POST(HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
// 解析响应获取token (有效期通常为1小时)
}
Webhook安全验证
- 必须验证X-BKASH-SIGNATURE请求头
- SHA256WithRSA签名算法验证回调真实性
2. Nagad高级功能实现
批量付款处理
def nagad_batch_payment(beneficiaries):
batch_id = str(uuid.uuid4())
payload = {
"batchReference": batch_id,
"totalAmount": sum(b['amount'] for b in beneficiaries),
"transactions": [
{
"accountNumber": b['mobile'],
"amount": b['amount'],
# ...其他必填字段...
} for b in beneficiaries
]
}
response = requests.post(
'https://api.nagad.com/payments/batch',
headers={'X-NAGAD-AUTH': api_key},
json=payload)
SSLCommerz特殊场景处理
MFS(Mobile Financial Services)专用参数配置
$post_data['mfs'] = array(
'agentMobileNo' => '017XXXXXXXX', //代理商号码(如适用)
'walletType' => 'BKASH', // BKASH/NAGAD/ROCKET等
);
Webhook最佳实践建议
- 幂等性设计:
router.post('/payment-callback', async (req, res) => {
const txnId = req.body.paymentID;
// 检查是否已处理过该交易(防重复)
const existingTxn = await Transaction.findOne({txnId});
if(existingTxn) return res.status(200).send();
// ...正常处理逻辑...
});
-
异步任务队列:使用Redis或RabbitMQ将支付成功事件加入队列,避免超时问题。
-
重试机制:对失败的webhook调用实施指数退避重试策略。
PCI DSS合规要求(针对卡支付)
即使通过本地MFS网关,仍需注意:
- TLS1.2+强制要求(禁用SSLv3/TLS1.0)
- PAN数据不得存储原始值(需tokenization)
- SAQ A-EP自评估问卷适用大多数API集成场景
孟加拉支付API集成的安全与合规深度解析
高级安全实施方案
1. 端到端加密方案(以bKash为例)
请求加密流程:
from cryptography.hazmat.primitives import serialization, hashes
from cryptography.hazmat.primitives.asymmetric import padding
def encrypt_request(payload):
# 加载bKash公钥证书
with open("bkash_public.pem", "rb") as key_file:
public_key = serialization.load_pem_public_key(key_file.read())
# RSA-OAEP加密
ciphertext = public_key.encrypt(
json.dumps(payload).encode(),
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
return base64.b64encode(ciphertext).decode()
2. JWT签名验证(Nagad标准)
// Nagad回调JWT验证示例
public boolean verifyNagadJWT(String jwtToken) {
DecodedJWT decoded = JWT.decode(jwtToken);
Algorithm algorithm = Algorithm.RSA256(
(RSAPublicKey) getPublicKey(),
null);
try {
JWTVerifier verifier = JWT.require(algorithm)
.withIssuer("nagad-pg")
.build();
verifier.verify(decoded); // throws exception if invalid
return true;
} catch (Exception e) { ... }
}
BanglaQR集成规范
孟加拉央行强制要求的统一二维码支付标准:
QR生成参数:
{
"merchantId": "BD0012345",
"storeId": "SHOP123",
"terminalId": "POS01",
"amount": {"value":1500,"currency":"BDT"},
"billNumber": "#INV2023-4567",
// ...其他必填字段...
}
动态QR码刷新机制建议:
- TTL设置为300秒(5分钟)
- QR失效后自动重新生成新交易ID
AML反洗钱监控要点
针对大额交易的合规处理:
- 阈值监控:
-- BD本地规定单笔超过50万BDT需额外验证
SELECT * FROM transactions
WHERE amount > 500000 AND status='completed'
AND created_at > NOW() - INTERVAL '24 HOURS';
- 客户身份分层验证(KYC):
- Tier1: <10万BDT/月(仅手机号验证)
- Tier2: <50万BDT/月(需NID照片+自拍比对)
BTRC电信监管特殊要求
移动钱包交易必须包含:
Header | Description | Example |
---|---|---|
X-MFS-Channel | 交易发起渠道 | APP/WEB/USSD |
X-Subscriber-MSISDN | SIM卡注册号码 (如果有) | +88017XXXXXXXX |
Webhook防重放攻击方案
func VerifyWebhook(w http.ResponseWriter, r *http.Request) {
nonce := r.Header.Get("X-Nonce")
timestamp := r.Header.Get("X-Timestamp")
signature := r.Header.Get("X-Signature")
// Nonce有效期检查(防止重放)
if cache.Has(nonce) {
w.WriteHeader(http.StatusBadRequest)
return
}
cache.SetWithTTL(nonce, true, time.Minute*5)
// HMAC验签逻辑...
}
API限流最佳实践配置示例
对于高并发场景的推荐设置:
# Nginx限流配置示例(Nagad API网关)
limit_req_zone $binary_remote_addr zone=mfsapi:10m rate=30r/s;
location /payment-api/ {
limit_req zone=mfsapi burst=20 nodelay;
proxy_pass https://backend-mfs;
}