支付寶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:下載沙箱環境裏的沙箱版支付寶,登錄買家賬號,進行支付