沙箱环境 使用 Node.js 打通支付宝支付

沙箱环境 (Beta) 是协助开发者进行接口功能开发及主要功能联调的辅助环境,模拟了开放平台部分产品的主要功能和主要逻辑 。可用于在产品上线前了解环境、组合和调试各种接口 。
沙箱环境配置打开 支付宝开发者中心 并登录,点击 => 进入我的控制台(也可能登录之后自动进入),

沙箱环境 使用 Node.js 打通支付宝支付

文章插图
 
在开发者中心中点击开发服务下的研发服务,就进入沙箱环境页面了,
沙箱环境 使用 Node.js 打通支付宝支付

文章插图
 
在沙箱应用可以看到基本配置 。
沙箱环境 使用 Node.js 打通支付宝支付

文章插图
 
密钥配置点击 RSA2(SHA256)密钥 设置,
沙箱环境 使用 Node.js 打通支付宝支付

文章插图
 
点击 支付宝密钥生成器,下载对应版本的工具,下载完成后将工具安装在不包含空格的目录中,
沙箱环境 使用 Node.js 打通支付宝支付

文章插图
 
【沙箱环境 使用 Node.js 打通支付宝支付】然后点打开,点击生成密钥,即可生成商户应用私钥与商户应用公钥 。然后点击复制公钥 。
沙箱环境 使用 Node.js 打通支付宝支付

文章插图
 
回到沙箱界面,选择公钥,并把刚刚复制的公钥粘贴进去;
沙箱环境 使用 Node.js 打通支付宝支付

文章插图
 
然后就可以得到支付宝公钥了,代码中会用到 。
沙箱环境 使用 Node.js 打通支付宝支付

文章插图
 
node API 配置首先安装 Alipay SDK:
npm install alipay-sdk -S// sdk 配置语法alipaySdk.exec(method, params, options);
  • method:字符串类型,调用的 Api,比如 alipay.trade.page.pay ;
  • params:可选参数,对象结构,Api 的请求参数;
  • options:包含
    • validateSign:布尔值,是否对返回值验签,需要依赖支付宝公钥;
    • formData:对象结构,文件上传类接口的请求参数;
    • log:对象结构,存在时会调用 info、error 方法写日志 。
由于每次调用 AlipaySdk 的 API 都是同一个对象,所以该对象只需要实例化一次:
// alipay.js 这里单独存放一个文件中,需要时引入即可const AlipaySdk = require('alipay-sdk').default; // 引入 SDKconst alipaySdk =newAlipaySdk({AppId: 'appId', // 开放平台上创建应用时生成的 appIdsignType: 'RSA2', // 签名算法,默认 RSA2gateway: 'https://openapi.alipaydev.com/gateway.do', // 支付宝网关地址,沙箱环境下使用时需要修改alipayPublicKey: 'public_key', // 支付宝公钥,需要对结果验签时候必填privateKey: 'private_key', // 应用私钥字符串});module.exports = alipaySdk;要完成支付,需要以下几个步骤,
  • 服务器端需要调用支付 API alipay.trade.page.pay 来获取支付页面的地址;
  • 将得到的支付地址发给客户端,由客户端进行页面跳转;
先来看看服务端接口的实现:
var express = require('express');var router = express.Router();const alipaySdk = require('../utils/alipay');const AlipayFormData = require('alipay-sdk/lib/form').default; // alipay.trade.page.pay 返回的内容为 Form 表单router.post('/pcpay', (req, res) => {(async () => {// 调用 setMethod 并传入 get,会返回可以跳转到支付页面的 urlconst formData = new AlipayFormData();formData.setMethod('get');// 通过 addField 增加参数// 在用户支付完成之后,支付宝服务器会根据传入的 notify_url,以 POST 请求的形式将支付结果作为参数通知到商户系统 。formData.addField('notifyUrl', 'http://www.com/notify'); // 支付成功回调地址,必须为可以直接访问的地址,不能带参数formData.addField('bizContent', {outTradeNo: req.body.outTradeNo, // 商户订单号,64个字符以内、可包含字母、数字、下划线,且不能重复productCode: 'FAST_INSTANT_TRADE_PAY', // 销售产品码,与支付宝签约的产品码名称,仅支持FAST_INSTANT_TRADE_PAYtotalAmount: '0.01', // 订单总金额,单位为元,精确到小数点后两位subject: '商品', // 订单标题body: '商品详情', // 订单描述});// 如果需要支付后跳转到商户界面,可以增加属性"returnUrl"const result = await alipaySdk.exec('alipay.trade.page.pay', // 统一收单下单并支付页面接口{}, // api 请求的参数(包含“公共请求参数”和“业务参数”){ formData: formData },);// result 为可以跳转到支付链接的 urlres.json({url: result});})();});


推荐阅读