支付宝小程序支付模块填坑手记--手把手教你如何使用node.js版本支付宝小程序alipay-sdk对接支付接口alipay.trade.create

刚刚把一个微信小程序转换成支付宝小程序,其中支付宝的支付模块的坑是影像深刻啊,记录一下。

首先是支付宝的文档,关于小程序支付的文档地址:https://opendocs.alipay.com/mini/introduce/pay

文档大方向上是清晰的,但细节上的坑是巨深的,主要集中在 第五步:调用接口 的 第2小点 在服务端调用 alipay.trade.create (统一收单交易创建接口)

我的服务端用的是KOA,支付宝有出一个名字叫alipay-sdk的node.js版本SDK,专门用来应对支付宝服务端SDK调用,但是,我不得不说,这个SDK写的真是很“独(qi)到(pa)”

首先,这个SDK的文档不全,唯一的文档在这https://www.npmjs.com/package/alipay-sdk。按照这个文档接入支付宝的登录模块是没问题的,但是你要想当然地照葫芦画瓢接支付就会很惨。

其次,关于alipay.trade.create接口描述文档也很坑,网上吐槽也很多,主要两点:一是buyer_id为必填,文档却用了“特殊可选”这么个模棱两可的描述;二是total_amount数据类型必须为String,文档却整个Price数据类型。然后我还要补充一点,这个接口的报错信息在返回“参数无效”错误的时候,如果能够指出哪个参数无效是不是会更有利于调试?

再次,支付宝提供了两个版本的API调试工具,一个是网页版的在线调试 https://openhome.alipay.com/platform/demoManage.htm#/alipay.trade.create,另一个是客户端版本的《支付宝开放平台开发助手》  二者在调试alipay.trade.create接口的时候都是返回“参数无效”错误,这个就很是抓狂了....

好了,吐槽完毕,希望官方能对文档和工具予以完善。下面说一下正确的接入姿势

使用alipay-sdk的exec方法调用alipay.trade.create接口时,不能使用这个方法的第二个传参,应该使用其第三个传参,而第三个传参必须用AlipayFormData进行构造,演示代码大致如下


const AlipaySdk = require('alipay-sdk').default;
const AlipayFormData = require('alipay-sdk/lib/form').default;


const alipaySdk = new AlipaySdk({
  appId: '2021001****89607',
  privateKey: fs.readFileSync(path.join(__dirname, '../../config/mayi_private_key.pem'), 'ascii'),
  alipayPublicKey: fs.readFileSync(path.join(__dirname, '../../config/mayi_public_key.pem'), 'ascii'),
  sign_type: 'RSA2',
  charset: 'utf-8'
});


const formData = new AlipayFormData();
formData.setMethod('get');
formData.addField('notifyUrl', 'https://test.*****.com/my_callback');
formData.addField('bizContent', {
  outTradeNo: 'T232222222',
  totalAmount: '1.00', // 必须为支付窜
  subject: '支付标题',
  buyer_id: '2088****' // 这个必填,否则报错“参数无效”,这个值是登陆是获取的user_id
});

const payUrl = await alipaySdk.exec('alipay.trade.create', {}, { formData: formData });
// 注意:exec执行过后返回的只是一个url,必须自己发送http请求去获取服务器返回结果
const response = await utils.httpGetSync(payUrl);

// 检查签名
if (!alipaySdk.checkResponseSign(response, 'alipay_trade_create_response')) {
  throw new Error('支付失败C');
}
const { alipay_trade_create_response: res, sign } = JSON.parse(response);
logger.info('services.order.createMyOrder res=', res);

需要注意几点:

1.privateKey是使用前面提到的 《支付宝开放平台开发助手》生成的,参照教程 https://opendocs.alipay.com/open/291/105971;

2.alipayPublicKey是支付宝公钥,可以在小程序管理后台-设置-开发设置-接口加签方式 中查看;

3.上面写的formData的构建参数已经是最简的了,不能再少了,特别是buyer_id必须有,且为String类型;

4.totalAmount的数据类型是String,不是数字,切记;

5.alipaySdk.exec返回的是url,不是最终我们期望的trade_no数据,需要我们自己使用GET方式发送http请求,以便获取trade_no数据;

6.务必使用alipaySdk.checkResponseSign进行验签,安全第一;

当然,也有做得很好的地方,就是在线人工技术支持很给力,不得不佩服阿里爸爸财大气粗,才能使用这么(贴ang心gui)的服务方式,这个必须点赞。不过还是希望能给把相关的文档和调试工具进一步完善一下,特别是这个alipay-sdk的文档和教程。

你可能感兴趣的:(node.js,支付宝,小程序,支付,node.js,alipay-sdk)