联系我们:

Telegram:@deekpay8

如何通过API集成孟加拉原生支付?

I

孟加拉原生支付API集成指南

作为支付平台专家,我将为您介绍如何通过API集成孟加拉国的原生支付系统。

主要支付方式

  1. bKash – 孟加拉最大的移动钱包
  2. Nagad – 政府支持的电子金融服务
  3. Rocket (DBBL Mobile Banking) – Dutch-Bangla银行的移动银行服务
  4. 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最佳实践建议

  1. 幂等性设计
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();

// ...正常处理逻辑...
});

  1. 异步任务队列:使用Redis或RabbitMQ将支付成功事件加入队列,避免超时问题。

  2. 重试机制:对失败的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反洗钱监控要点

针对大额交易的合规处理:

  1. 阈值监控
-- BD本地规定单笔超过50万BDT需额外验证  
SELECT * FROM transactions
WHERE amount > 500000 AND status='completed'
AND created_at > NOW() - INTERVAL '24 HOURS';

  1. 客户身份分层验证(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;
}