您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

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

时间:2020-09-17 11:08:06  来源:  作者:

沙箱环境 (Beta) 是协助开发者进行接口功能开发及主要功能联调的辅助环境,模拟了开放平台部分产品的主要功能和主要逻辑。可用于在产品上线前了解环境、组合和调试各种接口。

沙箱环境配置

打开 支付宝开发者中心 并登录,点击 => 进入我的控制台(也可能登录之后自动进入),

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

 

在开发者中心中点击开发服务下的研发服务,就进入沙箱环境页面了,

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

 

在沙箱应用可以看到基本配置。

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

 

密钥配置

点击 RSA2(SHA256)密钥 设置,

使用 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; // 引入 SDK
const alipaySdk =  new  AlipaySdk({
  AppId: 'appId', // 开放平台上创建应用时生成的 appId
  signType: 'RSA2', // 签名算法,默认 RSA2
  gateway: '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,会返回可以跳转到支付页面的 url
        const 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_PAY
            totalAmount: '0.01', // 订单总金额,单位为元,精确到小数点后两位
            subject: '商品', // 订单标题
            body: '商品详情', // 订单描述
        });        // 如果需要支付后跳转到商户界面,可以增加属性"returnUrl"
        const result = await alipaySdk.exec(
            'alipay.trade.page.pay', // 统一收单下单并支付页面接口
            {}, // api 请求的参数(包含“公共请求参数”和“业务参数”)
            { formData: formData },        );        // result 为可以跳转到支付链接的 url
        res.json({            url: result        });    })();});

然后就是前端页面,这个比较简单,就是点击支付按钮,向服务器发起请求,拿到返回的支付页面地址后进行跳转:

$.ajax({
    method: 'POST',
    url: '/alipay/pcpay',
    data: {        outTradeNo // 商户订单号,必须保证唯一,生成方法有很多,可以去看我的代码    }}).done(function(res) {
    window.open(res.url, '_blank');
}).fail(function(err) {
    console.log(err);
});

如果上诉没有问题,我们应该能看到这样的页面:

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

 

如果是使用沙箱环境,必须下载沙箱钱包来完成支付,下载地方如下所示:

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

 

下载完成后,使用沙箱提供的账号登陆即可,随便充值,随便消费,其实沙箱钱包里就是一个数字而已。

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

 

然后这里补充一个点,就是前端如何判断用户是否已经支付。我们都知道前端的手段是不被信任的,所以不能依赖前端来判断,唯一可靠的方法是使用支付宝 API 中的 alipay.trade.query 来查询是否已经完成支付。

可以通过前端发送订单号到服务器进行查询,服务器向支付宝服务器查询该订单号支付的相关信息,通过交易状态来确定是否已经完成支付,具体服务器配置如下:

const axIOS = require('axios');
const alipaySdk = require('../utils/alipay');
const AlipayFormData = require('alipay-sdk/lib/form').default;
router.get('/query', function(req, res) {
    (async function() {
        const { outTradeNo } = req.query;        const formData = new AlipayFormData();        formData.setMethod('get');
        formData.addField('bizContent', {
          outTradeNo        });        // 通过该接口主动查询订单状态        const result = await alipaySdk.exec(          'alipay.trade.query', 
          {},           { formData: formData },        );        axios({          method: 'GET',
          url: result        })        .then(data => {
          let r = data.data.alipay_trade_query_response;          if(r.code === '10000') { // 接口调用成功
            switch(r.trade_status) {              case 'WAIT_BUYER_PAY':
                res.send('交易创建,等待买家付款');
                break;
              case 'TRADE_CLOSED':
                res.send('未付款交易超时关闭,或支付完成后全额退款');
                break;
              case 'TRADE_SUCCESS':
                res.send('交易支付成功');
                break;
              case 'TRADE_FINISHED':
                res.send('交易结束,不可退款');
                break;
            }          } else if(r.code === '40004') {
            res.send('交易不存在');
          }        })        .catch(err => {          res.json({            msg: '查询失败',
            err          });        });    })();});

【本文转载自我的微信公众号-飞舟技术社区】

【喜欢我的文章欢迎 转发 点赞 与 关注,我会经常与大家分享前端的知识点的】



Tags: Node.js   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
yargs 是一个用来处理命令行参数的包,可以帮你处理自行设置的命令行标志和输入的任何类型的数据,其中包括布尔值、浮点数和字符串等。这个包非常简单明了,不需要在项目中编写大量的样板代码。...【详细内容】
2020-10-10  Tags: Node.js  点击:(64)  评论:(0)  加入收藏
沙箱环境 (Beta) 是协助开发者进行接口功能开发及主要功能联调的辅助环境,模拟了开放平台部分产品的主要功能和主要逻辑。可用于在产品上线前了解环境、组合和调试各种接口。...【详细内容】
2020-09-17  Tags: Node.js  点击:(187)  评论:(0)  加入收藏
Java天天 2020-03-11 16:28:57 微服务已成为在 Node.js 中构建可扩展且强大的云应用的主流方法。同时也存在一些门槛,其中一些难点需要你在以下方面做出决策: 组织项目结构...【详细内容】
2020-03-15  Tags: Node.js  点击:(127)  评论:(0)  加入收藏
我们平时在开发部署 Node.js 应用的过程中,对于应用进程启动的耗时很少有人会关注,大多数的应用 5 分钟左右就可以启动完成,这个过程中会涉及到和集团很多系统的交互,这个耗时...【详细内容】
2019-09-20  Tags: Node.js  点击:(147)  评论:(0)  加入收藏
▌简易百科推荐
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(1)  评论:(0)  加入收藏
程序是如何被执行的  程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(9)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(19)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(23)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(24)  评论:(0)  加入收藏
一个项目的大部分API,测试用例在参数和参数值等信息会有很多相似的地方。我们可以复制API,复制用例来快速生成,然后做细微调整既可以满足我们的测试需求1.复制API:在菜单发布单...【详细内容】
2021-12-14  AutoMeter    Tags:AutoMeter   点击:(20)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条