在Flutter中实现微信支付验签,主要涉及验证服务器返回的支付结果签名,确保数据未被篡改。以下是关键步骤和代码示例:
核心步骤
- 获取参数:从支付回调中获取所有参数(如
appid, mch_id, nonce_str, prepay_id, sign 等)。
- 排除签名字段:从参数中移除
sign 字段本身。
- 参数排序:按字典序对参数名进行升序排序。
- 拼接字符串:使用
key=value 格式拼接参数,用 & 连接。
- 生成签名:将拼接的字符串与商户密钥(API Key)连接,进行MD5加密(或HMAC-SHA256,根据配置)。
- 比对签名:将生成的签名与回调中的
sign 字段比对,一致则验签成功。
代码示例
import 'dart:convert';
import 'dart:io';
import 'package:crypto/crypto.dart';
bool verifyWeChatPaySignature(Map<String, dynamic> params, String apiKey) {
// 1. 获取签名并移除sign字段
String receivedSign = params['sign'] ?? '';
params.remove('sign');
// 2. 按字典序排序参数名
List<String> keys = params.keys.toList()..sort();
// 3. 拼接键值对
StringBuffer sb = StringBuffer();
for (String key in keys) {
String value = params[key]?.toString() ?? '';
if (value.isNotEmpty) {
sb.write('$key=$value&');
}
}
// 4. 添加商户密钥
sb.write('key=$apiKey');
// 5. 生成MD5签名(微信支付默认使用MD5)
String generatedSign = md5.convert(utf8.encode(sb.toString())).toString().toUpperCase();
// 6. 比对签名
return generatedSign == receivedSign;
}
注意事项
- 密钥管理:商户密钥(API Key)需安全存储,避免硬编码在客户端。
- 签名类型:确认微信支付配置的签名类型(MD5或HMAC-SHA256),上述示例为MD5。
- 服务端验证:建议在服务端进行验签,客户端仅作参考,避免密钥泄露风险。
通过以上步骤,即可在Flutter中完成微信支付结果的签名验证。