Node.js集成支付宝接口注意事项

签名

使用node.js自带的加密模块crypto和字符编码模块iconv-lite
根据支付宝接口文档参数格式得到签名之前的字符串beforeSignStr,然后一定要编码为gbk格式再进行签名。

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写的,注意:表单字符串编码也要设置为gbk

//请求表单
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格式再进行签名。

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" );
}

总结

  1. 在node中请求参数和响应参数都要转换为gbk才能正常签名和验签。
  2. 如果你使用的是沙箱模式,请注意请求参数time_express订单超时时间不能设置超过15h(尽管文档说明最大可以设置15d),否则支付宝无法响应订单。
  3. noical_url不响应,可能是响应头:'content-type' : 'application/x-www-form-urlencoded; text/html..的问题,导致bodyparse解析不出来,可以在bodyparse之前增加一个中间件,判断响应头是否从支付宝过来的,然后修改为正常的'content-type' : 'application/x-www-form-urlencoded'
  4. 如果验签不通过,最好用支付宝自带的验签工具测试下,如果依然不行那可能是你用的公钥不对,不能使用应用公钥,应该使用支付宝公钥。

转载于:https://www.cnblogs.com/roddy/p/7510881.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值