alipay / alipay-sdk-nodejs-all

支付宝开放平台 Alipay SDK for Node.js
https://docs.open.alipay.com/54/103419/
Other
407 stars 64 forks source link

使用证书模式返回订单参数异常 #75

Closed Tammeny closed 3 years ago

Tammeny commented 3 years ago

应用状态:1.已上线;2.APP支付已签约。 使用公钥模式是能够正常支付,但使用证书模式时,出现报错"商家订单参数异常,请尝试返回后重新付款或联系商家确认(ALIN10146)。以下是参数加签代码,请问有哪里写的不对吗?感谢:

const fs = require('fs');
const path = require('path');
const AlipaySdk = require('alipay-sdk').default;
const aliUtil = require('alipay-sdk/lib/util');
alipaySdk = new AlipaySdk({
    appId: 'xxxxxxxx',
    privateKey: fs.readFileSync(`${process.cwd()}/key/alipay-private-key.pem`, 'ascii'),
    alipayRootCertPath: path.join(__dirname, '../key/alipayRootCert.crt'),
    appCertPath: path.join(__dirname, '../key/appCertPublicKey_2021**********66.crt'),
    alipayPublicCertPath: path.join(__dirname, '../key/alipayCertPublicKey_RSA2.crt'),
});
const params = {
  bizContent: {
    out_trade_no: 1600064968073,
    subject: 'test',
    total_amount: 100,
    body: 'test',
    notifyUrl: 'xxx',
  }
}
const signData = aliUtil.sign('alipay.trade.app.pay', params, alipaySdk.config);
const { url,  execParams } = alipaySdk.formatUrl('', signData);
const orderString = (url + '&biz_content=' + encodeURIComponent(execParams.biz_content)).substr(1);
console.info('APP端支付宝支付参数:', orderString);
Tammeny commented 3 years ago

分析sdk源码发现是alipay-sdk/lib/alipay.js文件下的参数白名单问题,官方写的是:

// 需要放在 url 中的参数列表
const urlArgs = [
    'app_id', 'method', 'format', 'charset',
    'sign_type', 'sign', 'timestamp', 'version',
    'notify_url', 'return_url', 'auth_token', 'app_auth_token',
    'appCertSn', 'alipayRootCertSn',
    'ws_service_url',
];

实际上在参数经过aliUtil.sign加签方法后,返回的参数已经被转换成下划线了,所以加签返回的alipay_root_cert_snapp_cert_sn并不在白名单里,导致最终传回到APP的支付参数缺少了这两个字段。