nodejs 支付宝接口

  1. 支付宝配置
    1. 文件读取
    在这里插入图片描述
    需要生成密钥软件:支付宝开放平台开发助手这

设置密钥如上图
随后直接生成密钥
先别忙关软件,还要复制应用公钥
在这里插入图片描述
设置的时候将应用公钥 放进去,保存!
在这里插入图片描述
其他设置暂时不设
就这样就行了!
2. 代码
安装使用 alipay 的 SDK方法

npm i alipay-sdk --save
  1. 配置文件
// 支付宝配置文件
// 文件读取 应用私钥
let appPrivateKey = fs.readFileSync(path.join(__dirname,'../sendbox_pem/private_app2048.txt'),'ascii')
// 支付宝 公钥
let alipayPublicKey = fs.readFileSync(path.join(__dirname,'../sendbox_pem/public_alipay.txt'),'ascii')
const alipayConfig = {
  // APPId 应用id
  appId:123225525, 
  // 应用私钥,我这里直接读取它生成的.txt文件
  privateKey:appPrivateKey,
  // 支付宝公钥,一样是读取的.txt文件
  alipayPublicKey:alipayPublicKey,
  // 支付宝网关
  gateway:'https://openapi.alipaydev.com/gateway.do',
  // 编码字符集
  charset:'utf-8',
  // 版本默认 1.0
  version:'1.0',
  // 加密方式,与自己的加密方式对应
  signType:'RSA2'
}
// 将配置 导出
module.exports = {
	alipayConfig 
}
  1. 封装添加支付宝订单方法
// 导入sdk环境 注意这个default
const AlipaySDK = require('alipay-sdk').default
// 引入配置文件 , 路径看自己
const config = require('../config/config')
// 实例化对象
let alipay = new AlipaySDK(config.alipayConfig)
// PC支付接口 alipay.trade.page.pay 返回的内容为 表单
let AlipayFormData = require('alipay-sdk/lib/form').default

/**
 * 创建订单支付宝封装
 * 异步方法
 * @param {Object} goods  商品信息
 */
const createOrder = async (goods) => {
  // 设置调用的接口
  let method = 'alipay.trade.page.pay'
  // 设置公共参数 没使用,后面会尝试使用
  // let params = {
  //   app_id: '2016101500692746', /*应用的id*/
  //   method: method,/*调用接口*/
  //   format: 'JSON', /*返回数据*/
  //   charset: 'utf-8',/*字符编码*/
  //   timestamp: '',/*请求时间戳*/
  //   version: '1.0'/*版本*/
  // }

  // 根据官方给的api文档提供一个参数合集
  let bizContent = {
    out_trade_no: goods.orderNumber, //订单号 时间戳
    product_code: 'FAST_INSTANT_TRADE_PAY', // 商品码
    total_amount: goods.allTotal, // 商品价格
    subject: goods.orderName, // 订单名称
    timeout_express: '5m', // 超时时间
    passback_params: JSON.stringify(goods.pack_params) // 返回一个参数,用于自定义商品信息最后做通知使用
  }
  // 创建formData 对象
  const formData = new AlipayFormData()
  // 调用 setMethod 并传入 get,会返回可以跳转到支付页面的 url
  formData.setMethod('get')
  // 客户支付成功之后会同步跳回的地址 看自己的
  formData.addField('returnUrl','http://192.168.97.240:3000/public/') 
  // 支付宝在用户支付成功之后会异步通知的回调地址,必须在公网ip 才能收到 根据自己的网址
  formData.addField('notifyUrl','http://192.168.97.240:3000/public/')  
  // 将必要的参数集合添加进 form 表单
  formData.addField('bizContent', bizContent); 
  // 异步向支付宝 发送生成订单请求,第二个参数为公共参数,可以为空
  const result = await alipay.exec(method, {}, {
    formData: formData
  })
  console.log(result)
  return result
}
// 导出方法
module.exports = {
  createOrder
}
  1. 方法使用
// 我的方法都封装在 common文件中 肯定是要先导入方法的
let common = require('../common/common')
// 在调用的时候传 从前端获得的商品信息 处理后 goods
let resultOfAlipay = await common.createOrder(goods)
// 将结果(url)返回
res.json({
        status: 200,
        result: resultOfAlipay,
        message: '添加订单成功'
      })

成果
在这里插入图片描述

遇到的坑

  1. 引入模块的时候常常会 忽略 default
// 导入sdk环境 注意这个default
const AlipaySDK = require('alipay-sdk').default
// PC支付接口 alipay.trade.page.pay 返回的内容为 表单
let AlipayFormData = require('alipay-sdk/lib/form').default
  1. 封装 添加支付宝订单方法时候 根据自己的 需求选择 返回的类型
// 调用 setMethod 并传入 get,会返回可以跳转到支付页面的 url
  formData.setMethod('get')

如果没有这个,返回的类型为 form 表单

  1. 运行结果报错 错误代码 invalid-app-id 错误原因: 无效的AppID参数
    1. 检查配置文件的字段有没有写错
    2. 检查配置文件 appId 应用私钥 支付宝公钥 网关 加密方式 是否正确

参考:

  1. 使用 NodeJS 接入支付宝网站支付的 Demo 开发
  2. 蚂蚁金服开放平台 node sdk
发布了50 篇原创文章 · 获赞 23 · 访问量 1221

猜你喜欢

转载自blog.csdn.net/qq_44698161/article/details/103536167