使用node.js自带的加密模块crypto和字符编码模块iconv-lite
根据支付宝接口文档参数格式获得签名以前的字符串beforeSignStr,而后必定要编码为gbk格式再进行签名。html
let crypto = require('crypto'); const iconv = require('iconv-lite'); // RSA2签名 function getSign( beforeSignStr ) { let sign = crypto.createSign('RSA-SHA256'); return sign.update( iconv.encode( beforeSignStr, "gbk" ) ).sign( 私钥字符串, "base64" ); }
我这里是直接参考支付宝PHP接口SDK写的,注意:表单字符串编码也要设置为gbkjava
//请求表单 function getRequestForm( requestBody ) { let form = "<form id='alipaysubmit' name='alipaysubmit' action='" + 请求支付宝url + "' accept-charset='gbk' method='POST'>"; for( let key in requestBody ) { form += "<input type='hidden' name='" + key + "' value='" + requestBody[key] + "'/>"; } form += "<input type='submit' value='ok' style='display:none;'></form><script>document.forms['alipaysubmit'].submit();</script>"; return form; }
验签须要用到加密模块crypto、字符串编码模块iconv-lite、url编码模块urlencode
根据支付宝接口文档参数格式获得验签以前的字符串beforeVerifyStr,而后必定要编码为gbk格式再进行签名。node
let crypto = require('crypto'); const urlencode = require('urlencode'); const iconv = require('iconv-lite'); // 获得验签结果 function getVerifySign( beforeVerifyStr ) { let verify = crypto.createVerify('RSA-SHA256'); return verify.update( iconv.encode( urlencode.decode( beforeVerifyStr, "gbk" ), "gbk" ) ).verify( 公钥字符串, 支付宝响应签名, "base64" ); }
- 在node中请求参数和响应参数都要转换为gbk才能正常签名和验签。
- 若是你使用的是沙箱模式,请注意请求参数
time_express
订单超时时间不能设置超过15h(尽管文档说明最大能够设置15d),不然支付宝没法响应订单。- noical_url不响应,多是响应头:
'content-type' : 'application/x-www-form-urlencoded; text/html..
的问题,致使bodyparse解析不出来,能够在bodyparse以前增长一个中间件,判断响应头是否从支付宝过来的,而后修改成正常的'content-type' : 'application/x-www-form-urlencoded'
。- 若是验签不经过,最好用支付宝自带的验签工具测试下,若是依然不行那多是你用的公钥不对,不能使用应用公钥,应该使用支付宝公钥。