支付宝PC端支付接口流程
1、前端点击支付按钮,向后端发起一个ajax请求(get请求,带order_id)
2、后端收到order_id,根据支付宝的规则生成支付的url,返回前端
3、ajax收到成功的响应,从响应中取出url,并向这个url发起请求
4、支付宝的服务器收到请求,返回一个支付页面
5、买家登录账号或扫码进行支付
6、支付宝回调前端的success页面(访问前端的http://127.0.0.1:8080/success?xxx=xx&yy=yy),
这时请求中会携带本次支付结果的相关信息
7、这个success页面获取请求中携带的参数,同时采用ajax的方式向后端发起get请求,携带获取的参数
8、后端验证支付结果,修改订单状态,返回success页面需要的data数据
9、success页面加载数据,展示支付结果
10、为了防止用户在支付之后将页面关掉,支付宝服务器会再隔一段时间向后端发送一个携带支付结果的post请求,
以保证后端能拿到结果,修改订单状态。
一、登录支付宝开放平台,并进入沙箱环境
1.登录
2.进入我的控制台
3.进入开发者中心
4.点击研发服务,进入沙箱环境
PS:若您只是用于个人项目演示,千万不要选择“我的应用”里的“创建应用”,创建完成后(并且审核通过后),产品签约是需要营业执照的,并且应用一旦上线,是无法删除的;
二、创建Node项目
这里使用的是Egg.js
直接使用脚手架,即可快速生成项目
$ mkdir egg-example && cd egg-example
$ npm init egg --type=simple
$ npm i
三、Coding
(1) 设置RSA2密钥
1.1 下载支付宝密钥生成器
1.2 选择密钥格式和长度后,生成密钥
1.3 将生成的公钥填入到沙箱环境的RSA2中
1.4 保存后点击查看,支付宝公钥
(2)Coding
2.1 创建app/controller/alipay.js 和 config/pem/
config/pem/alipay_public_key.pem : 支付宝公钥
config/pem/public_key.pem : 应用公钥
config/pem/private_key.pem : 应用私钥
【注意】将支付宝公钥 alipay_public_key.pem,将上述生成的字符串添加到该文件,并且字符串前后加上秘钥所需描述:“-----BEGIN PUBLIC KEY-----”、“-----END PUBLIC KEY-----”
2.2 router.js
"use strict";
/**
* @param {Egg.Application} app - egg application
*/
module.exports = app => {
const { router, controller } = app;
router.get("/", controller.home.index);
router.get("/alipay", controller.alipay.index);
};
2.3 alipay.js
"use strict";
const fs = require("fs");
const path = require("path");
const AlipaySDK = require("alipay-sdk").default;
const AlipayFormData = require("alipay-sdk/lib/form").default;
const Controller = require("egg").Controller;
class AlipayController extends Controller {
async index() {
const { ctx } = this;
const alipaySdk = new AlipaySDK({
appId: "2**********9", // 你自己的沙箱黄环境的appId
privateKey: fs.readFileSync(
path.join(__dirname, "../../config/pem/app_private_key.pem"),
"ascii"
), // 私钥
signType: "RSA2", // 签名类型
alipayPublicKey: fs.readFileSync(
path.join(__dirname, "../../config/pem/alipay_public_key.pem"),
"ascii"
), // 支付宝公钥(不是应用公钥)
gateway: "https://openapi.alipaydev.com/gateway.do", // 网关地址
timeout: 5000, // 网关超时时间
camelcase: true // 是否把网关返回的下划线 key 转换为驼峰写法
});
/**
* 返回支付链接(PC支付接口)
*/
const formData = new AlipayFormData();
formData.setMethod("get");
formData.addField("appId", "2**************9");
formData.addField("charset", "utf-8");
formData.addField("signType", "RSA2");
formData.addField("bizContent", {
outTradeNo: "1569380127322",// 【必选】商户订单号:64个字符内,包含数字,字母,下划线;需要保证在商户端不重复
productCode: "FAST_INSTANT_TRADE_PAY",// 【必选】销售产品码,目前仅支持FAST_INSTANT_TRADE_PAY
totalAmount: "0.01",// 【必选】订单总金额,精确到小数点后两位
subject: "test",// 【必选】 订单标题
body: "test" // 【可选】订单描述
});
/**
* exec对应参数:
* method(调用支付宝api)
* params(api请求的参数(包含“公共请求参数”和“业务参数”))
* options(validateSign,formData,log)
*/
const result = await alipaySdk.exec(
"alipay.trade.page.pay",
{},
{ formData }
);
console.log(result); // result为可以跳转到支付连接的url
ctx.body = result;
}
}
module.exports = AlipayController;
业务参数
2.4 运行项目
npm run dev
打开 http://127.0.0.1:7001/alipay ,将 result 的结果的链接打开,就可以支付喽
PS:下载沙箱环境里的沙箱版支付宝,登录买家账号,进行支付
Vue node.js实现支付宝支付(沙箱测试)
蚂蚁金服开放平台 node sdk