在移动支付普及的今天,二维码支付因其便捷性成为主流支付方式之一。对于Android开发者而言,掌握二维码支付的生成技术至关重要。本文将系统讲解Android应用中生成支付二维码的专业实现方案,涵盖数据结构、安全机制、核心代码及优化实践。

支付二维码本质是携带支付信息的编码图形,通常包含以下结构化数据:
| 字段名 | 数据类型 | 说明 |
|---|---|---|
| merchant_id | String | 商户唯一标识 |
| amount | Decimal | 支付金额(单位:元) |
| timestamp | Long | 时间戳(防重放) |
| order_id | String | 订单唯一编号 |
| signature | String | 数据签名(防篡改) |
1. 构造支付信息
采用JSON格式组织支付数据,需遵循支付平台规范(如微信/支付宝开放平台):
{
"mch_id": "1234567890",
"total_fee": 9.99,
"out_trade_no": "20230815123456",
"time_expire": "20230815133000"
}
2. 生成数据签名
使用HMAC-SHA256等加密算法保障数据完整性:
String sign = HMACUtils.encode(apiKey, jsonData);
3. 二维码编码
推荐使用成熟库处理编码过程:
| 库名称 | 特点 | 依赖 |
|---|---|---|
| ZXing | Google开源方案 | implementation 'com.google.zxing:core:3.5.1' |
| Barcode API | Android原生支持 | android.graphics.Bitmap |
| QRGen | 简化API设计 | implementation 'com.github.kenglxn.QRGen:android:3.0.1' |
ZXing基础实现示例:
MultiFormatWriter writer = new MultiFormatWriter();
BitMatrix matrix = writer.encode(paymentJson, BarcodeFormat.QR_CODE, 500, 500);
Bitmap qrBitmap = Bitmap.createBitmap(500, 500, Bitmap.Config.RGB_565);
for (int x = 0; x < 500; x++) {
for (int y = 0; y < 500; y++) {
qrBitmap.setPixel(x, y, matrix.get(x, y) ? Color.BLACK : Color.WHITE);
}
}
支付类二维码需防范数据篡改和中间人攻击:
| 风险类型 | 防护方案 | 实现要点 |
|---|---|---|
| 数据伪造 | 数字签名 | 服务端签名验证 |
| 重放攻击 | 时效控制 | 二维码有效期≤5分钟 |
| 信息泄露 | 传输加密 | TLS1.3+HTTPS传输 |
需实现异步通知接口处理支付结果:
@PostMapping("/payment/callback")
public String handlePaymentNotify(@RequestBody PaymentNotifyDTO dto) {
if (verifySign(dto)) { // 验证签名
updateOrderStatus(dto.getOrderId(), dto.getStatus());
return "success";
}
return "fail";
}
提升用户体验的关键细节:
1. 动态刷新机制:支付失败时自动更新二维码
2. 容错率配置:设置QR_ERROR_CORRECTION_L级别(7%容错)
3. 多尺寸适配:根据屏幕密度动态调整二维码尺寸
除基础支付功能外,还可扩展实现:
• 合并支付:单二维码支持多订单支付
• 离线支付:通过蓝牙/NFC传输二维码数据
• 支付码海报:结合Canvas生成推广海报
通过上述技术方案,Android应用可高效、安全地实现二维码支付功能。需特别注意:密钥管理应使用Android KeyStore系统,敏感数据禁止明文存储,支付结果必须以服务端回调为准。随着动态二维码技术的发展,未来可进一步探索二维码加密刷新等进阶方案。