下面是详解NodeJs支付宝移动支付签名及验签的完整攻略:
1. NodeJs中使用支付宝移动支付签名及验签
1.1. 签名
在支付宝移动支付中,签名是用于防止数据篡改的重要手段。在NodeJs中,使用以下代码可生成签名:
const crypto = require('crypto');
function getSign(params, privateKey) {
const unsortedString = Object.keys(params).sort().map(key => {
return key + '=' + params[key];
}).join('&');
const sign = crypto.createSign('RSA-SHA256');
sign.update(unsortedString);
return sign.sign(privateKey, 'base64');
}
其中,params是待签名的参数,privateKey是私钥。具体步骤如下:
- 按照参数名字母升序排序;
- 将所有参数名和参数值串在一起;
- 按照上述签名方式生成签名。
1.2. 验签
验签是在接收到支付宝返回的数据后,验证数据的真实性的一种方式。在NodeJs中,使用以下代码可进行验签:
const crypto = require('crypto');
function verifySign(params, publicKey) {
const sign = params.sign;
const signType = params.sign_type;
delete params.sign;
const unsortedString = Object.keys(params).sort().map(key => {
return key + '=' + params[key];
}).join('&');
const verify = crypto.createVerify(`RSA-${signType}`);
verify.update(unsortedString);
return verify.verify(publicKey, sign, 'base64');
}
其中,params是支付宝返回的所有参数,publicKey是公钥。具体步骤如下:
- 将待验签参数中的sign参数和sign_type参数值剔除;
- 将所有参数名和参数值串在一起;
- 按照上述验签方式验证签名。
2. 示例说明
2.1. 示例一:签名
假设有如下待签名的参数:
const params = {
app_id: '2018060600000000',
method: 'alipay.trade.page.pay',
format: 'JSON',
charset: 'utf-8',
sign_type: 'RSA2',
timestamp: '2018-06-06 15:45:57',
version: '1.0',
notify_url: 'http://www.baidu.com',
return_url: 'https://qr-test.antfin.com/home/uniqId/123',
biz_content: '{"out_trade_no":"20150320010101001","product_code":"FAST_INSTANT_TRADE_PAY","total_amount":88.88,"subject":"Iphone6 16G"}'
};
其中,私钥为:
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCbZoq0txOE8ppd9fzRh/LanK+sDO0M8s5GZeT95sX2QiLGxTtS13Jm
使用上述的getSign方法可生成如下签名:
ee4yMmbLNfXVorXsL7tarlWHtHtliFiPQyFzM0qySv+0TJ8tKBjlP3LAsyFGpJyKHKnCJbYBxq4GVEAKnoSvBXu8i5bB+35N8xR9ZrC
2.2. 示例二:验签
假设支付宝返回的参数如下:
const params = {
"gmt_create": "2015-04-01 10:55:55",
"charset": "utf-8",
"seller_email": "test@alipay.com",
"subject": "大乐透2等奖",
"sign": "ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE",
"buyer_id": "2088101117955611",
"invoice_amount": "20.00",
"notify_id": "ac05099524730693a8b330c5ecf72da9786",
"fund_bill_list": "[{\"amount\":\"10.00\",\"fundChannel\":\"ALIPAYACCOUNT\"}]",
"notify_type": "trade_status_sync",
"trade_status": "TRADE_SUCCESS",
"receipt_amount": "15.00",
"app_id": "2018020102122555",
"buyer_pay_amount": "15.00",
"sign_type": "RSA2",
"seller_id": "2088102116777220",
"gmt_payment": "2015-04-01 10:54:45",
"notify_time": "2015-04-01 10:56:59",
"version": "1.0",
"out_trade_no": "6823789339978248",
"total_amount": "20.00",
"trade_no": "20150320010101001"
};
其中,公钥为:
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsWFoF1XtzWXuYXKPBHpkJLYMs/IgZVd4mvZ/YSC0atxoWTD7aXK+xvc2i9UG0kZ
使用上述的verifySign方法可验证签名是否合法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解NodeJs支付宝移动支付签名及验签 - Python技术站